ImageMagick命令执行漏洞分析

ImageMagick是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布,它遵守GPL许可协议,可以运行于大多数的操作系统,ImageMagick的大多数功能的使用都来源于命令行工具。由于其强大的功能以及超强的可操作性,是的这款作图软件深得广大办公人士喜爱。

0x01 漏洞简介

在weibo上看到有人放出了一波最新版的ImageMagick执行命令的截图。根据近期Drops的一篇文章《PostScript语言安全研究(一)ImageMagick新漏洞分析》(http://drops.wiki/index.php/2016/10/15/postscript/) ,猜测可能是ImageMagick解析PostScript脚本导致任意命令执行。

PostScript是1985年由Adobe推出的一种编程语言,最适用于列印图像和文字(无论是在纸、胶片或非物质的CRT都可)。用现今的行话讲,它是页面描述语言。它既可以像程序代码一样具有可读性,又能表示出可任意放大和缩小的矢量图。

1

0x02 漏洞分析

PostScript提供了丰富的文件操作函数,本身也被挖掘出了很多漏洞,我们测试一个Exploit

%!PS
    
    mark
    
    /OutputFile (%pipe%id)     %设置输出外部文件路径名注入命令
    
    (pdfwrite)finddevice       % 使用pdfwrite驱动
    
    putdeviceprops                           
    
    setdevice                                       %设置完成并启动
    
    quit

我们尝试用ghostscript(GhostScript是postscript的一个解释器,Linux上一般都会自带)解析这个postscript脚本。

2

可见,已经成功执行了id这个命令。因为ImageMagick可以处理pdf,所以将这个ps脚本重命名为5.pdf,测试一下ImageMagick是否会受到这个漏洞的影响。

3

显然,并没有执行命令,现在我们分析一下使用ghostscript单独解析可以执行命令,使用ImageMagick没有执行命令的原因。

首先,在通常情况下ImageMagick并不使用文件的后缀来判断文件的类型,而是使用文件的特征(所谓的文件头)来判断是什么文件的,具体在这个函数里

4

函数的调用栈如下ConvertImageCommand -> ReadImages -> ReadImage -> SetImageInfo -> GetMagicInfoi。获取到输入文件后,会有一个结构体存储了这个文件的类型和解析相关函数。之后会通过DecodeImageHandler获取PS脚本的解析函数。

5

6

这里,ImageMagick会用一种特殊的机制“委托”来完成PostScript脚本的解析,所谓“委托”的意思就是把这个流程委托给别的程序来完成。

8

GetDelegateCommands完成了委托命令的获取,让我们看看delegate_info的内容

9

可以注意到ImageMagick用了PostScript的解析器GhostScript来解析我们的脚本,但是需要注意,在参数中增加了-dSAFER,这个参数是GhostScript的一个参数,用来开启GhostScript的安全模式,限制了用到的函数,无法读取文件和执行命令。

当然,我们构造的PostScript脚本也无法执行,我们可以继续验证一下。

10

InvokePostScriptDelegate函数完成最终的委托执行。当然,因为GhostScript开启了安全模式,我们的脚本无法被解析执行的程序会报错。

这时候就得使用一个GhostScript的漏洞CVE-2016-7976,这个CVE的Exploit是这样的:

 %!PS

   currentdevice null true mark /OutputICCProfile (%pipe%id > /dev/tty)

   .putdeviceparams
   quit

我们用ImageMagick和解析这个Exploit试试,已经能成功执行命令。

11

0x03 漏洞防护

1.升级GhostScript到最新版

2.如果网站不需要解析PostScript脚本,则在/etc/ImageMagick/delegate.xml删除ps的委托

0x04 参考文献

http://drops.wiki/index.php/2016/10/15/postscript/

http://baike.baidu.com/item/ImageMagick

http://baike.baidu.com/item/PostScript

如果您需要了解更多内容,可以
加入QQ群:570982169、486207500
直接询问:010-68438880-8669

Spread the word. Share this post!

Meet The Author

Leave Comment