2016年5月4日

2016年5月4日 16:10 阅读 12538
ImageMagick的几个漏洞蛮有意思的,尤其是发现在14年BH中就预言过,于是看了看当时的ppt并简单跟进了一下

几个漏洞中,最好利用的应该是一个命令注入,但老外说是个RCE,我不是太同意,分析复现后应该归为本地命令执行,因为项目开源,可以很方便的看到源码,ImageMagick又个feature叫做delegate,其作用是可以通过外部的lib来处理文件,然而在实现的时候用的是system()来执行command,其中

https://github.com/ImageMagick/ImageMagick/blob/e93e339c0a44cec16c08d78241f7aa3754485004/MagickCore/delegate.c

system(sanitize_command)赋值到status后返回,sanitize_command从command中取值,所以直接看command中的内容

<delegate decode=\"https\" command=\" wget  -q -O  %o   https:%M \"/>
我们取出command来
"wget" -q -O "%o" "https:%M"

很简单的操作,但是拼接url的时候没有任何安全处理,只要指定https协议,就随意拼接,达到命令注入的结果,在看源代码的过程中,发现非常值得吐槽的一个点,就是项目开发人员喜欢把资源文件写到源码里,让我想到了@大鸽子ztz 的一个项目中的故事。。。

构造payload过程也很简单,注意闭合双引号即可,"wget" -q -O "%o" "https://ztz.sb"|commond""

PoC:

./convert 'https://ztz.sb"|id"' ztz.png



有一个比较有意思的利用是,ImageMagick支持svg,mvg这样的格式转换,而如我们所知,svg是基于xml的矢量图,图片是可以定义url来源的,所以我们又一次找到了拼接数据的可控点,mvg同理



看到这里,脑洞开了一下,imagick(//php.net/manual/en/class.imagick.php)作为ImageMagick的PHP扩展,会不会存在相同的问题?作为课外作业,事后可以研究一下

总结一下利用场景,一个比较好玩的本地命令执行,有人可能说了,本地命令执行,场景有限很难用,其实还好,svg内容你自己可控,放到远端让目标和你交互来攻击,再或者,仔细做一下课外作业,imagick在处理图片格式的时候能触发漏洞那就上升到一个远程命令执行了~

一个有趣的课外读物:
https://www.blackhat.com/docs/us-14/materials/us-14-Bongard-Fingerprinting-Web-Application-Platforms-By-Variations-In-PNG-Implementations.pdf

low level security researcher