• 本文作者: 漏洞应急响应中心
  • |
  • 2016年5月6日
  • |
  • 漏洞分析
  • |

ImageMagick 漏洞利用方式及分析

天融信阿尔法实验室 张萌 李喆 黄庆涛 李明政

1 ImageMagick 命令执行漏洞背景介绍

ImageMagick是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。它遵守GPL许可协议。它可以运行于大多数的操作系统。ImageMagick的大多数功能的使用都来源于命令行工具。通常来说,它可以支持以下程序语言: Perl, C, C++, Python, PHP, Ruby, Java;现成的ImageMagick接口(PerlMagick, Magick++, PythonMagick, MagickWand for PHP, RubyMagick, and JMagick)是可利用的。这使得自动的动态的修改创建图片变为可能。ImageMagick支持至少90种图片格式。包括流行的TIFF、JPEG、GIF、PNG、PDF以及PhotoCD等格式。它是一套功能强大、稳定而且开源的工具集和开发包。由于其开源免费多平台支持的优势被很多CMS所采用,例如WordPress、Drupal、Discuz!。

上述的CMS被数以万计的网站进行了部署,理论上只要在图片处理方面采用了ImageMagick并且允许上传图像的网站都会受到该漏洞的影响。

 2  关于ImageMagick 不同版本漏洞的几种利用

2.1 CVE-2016-3714

因为过滤不全,问题出现在文件名传入ImageMagick中的配置文件delegates.xml中,会在转换其他文件类型时候触发远程命令执行漏洞。ImageMagick 在处理文件时候会引入其他库,这个功能叫“代理”,也就是delegates.xml的功能。调用外部库会使用system()函数,在delegates.xml中:

1

在图形转换过程中会将后面的ls命令传入到system()当中执行。

最严重的问题是ImageMagick 支持多种格式比如svg,mvg等等。所以对于任何类型的服务在使用ImageMagick 过程中支持用户处理图片并使用默认的配置delegates.xml或者policy.xml,就有可能触发漏洞,比如一些流行的cms:wordpress,drupal等。

2

ImageMagick 通过文件内容去猜测文件类型,所以在利用时候并不取决于文件后缀,这样的话通过重命名来绕过文件类型检测。漏洞范围在ImageMagick 从6到7版本都存在漏洞。在测试poc过程中需要安装Ghostscript and wget (curl也行),因为在配置中是通过curl下载并解析图片,在url后面加双引号闭合,并在转换图片等情况的时候触发漏洞。

2.2 CVE-2016-3718 – SSRF

这可以导致SSRF攻击,导致服务器向其他服务器发送http请求到example

3

2.3 CVE-2016-3715

文件删除,通过ImageMagick的伪协议来删除文件,测试方法如下:

构造exploit 图片文件mvg,然后创建一个tex文件delete.txt,在转换mvg图片到达删除delete.txt的目的。

4

2.4 CVE-2016-3716

文件移动类型转换,可以将本地任何类型文件转换成任意文件类型。比如将图片格式转换成php格式并移动到指定位置。这个是利用ImageMagick的伪协议msl。

利用方法,创建mvg 写入利用代码,,同时写msl.txt文件,image.gif里可以写php的一句话,然后移动重命名到/var/www/shell.php中获取webshell。image.gif和msl.txt可以通过一些上传功能上传到本地。

5

2.5 CVE-2016-3717

本地文件读取,利用ImageMagick的伪协议label,读取本地文件,利用方法:

创建mvg图片恶意文件,读取passwd

6

3 ImageMagick漏洞验证分析

3.1 漏洞验证

首先拿到exp测试脚本后,我进行了一下测试,使用imageMagick工具中的convert命令进行图片格式转换:

4-1

发现嵌入在图片里的命令果然被执行了。

3.2 漏洞执行跟踪

先strace跟踪一下命令执行的大概位置,发现命令在执行了symlink后,又创建了一个新进程,之后就命令执行了。

4-2

然后下载imageMagick调试包和源码,gdb调试跟踪:

apt-get install imagemagick-dbg

apt-get source imagemagick

在symlink和fork处下端点来跟踪:

4-3

Contiune后,断在这里:

4-4

可以看到在AcquireUniqueSymbolicLink的449字节处调用了symlink,配合源码快速定位,跟踪到delegate.c中:

4-5

是在1249处调用的AcquireUniqueSymbolicLink。

4-6

在这下面紧接着就是一处可疑的命令执行:

4-7

先调用InterpretImageProperties来获取command,然后执行delegate。我们在获取command后面下端点,看下command是什么。

4-8

Command是一个利用curl 程序去远程下载图片,然后保存到临时目录,既然command不为空,可以进入子过程,执行delegate。继续跟进ExternalDelegateCommand看,最后发现执行system函数的具体位置:

4-9

对应源码位置:

4-10

在405行处命令被执行,strpbrk判断sanitize_commnad中是否包含“&;<>|”这几个符号,如果包括就直接调用system来执行命令。否则尝试调用子进程execvp去执行命令。

3.3 可能利用

可以发现命令执行的函数就是ExternalDelegateCommand,命令通过command传入。那么看看程序中又哪些地方调用了ExternalDelegateCommand。

4-11

随便点开个svg.c看下:

4-12

跟踪下,可以发现命令最终的执行:

4-13

那么我们在delegates.xml文件中的svg处理结尾处加上一个命令试试:

4-14

然后执行命令:

4-15

果然命令是可以被插入的。额外的文件格式大家可以再测试一下。

4 ImageMagick 漏洞影响和建议

此次的漏洞影响了众多的开源web项目:Wordpress、Discuz、Drupal。Wordpress的POC已经公开,但是此利用过程有一定的限制,就是需要登陆到WP的后台。但是对于一些可以注册的WP网站并且用户可以上传图像时,此漏洞就可能被轻易利用。虽然Discuz和Drupal暂时还还无利用方法,但是也不排除在接下来的日子里利用方法被曝光出来。其他例如MediaWiki、phpBB和vBulletin使用了ImageMagick库生成缩略图,还有一些程序如LyX使用ImageMagick转换图片格式。以上应用可能受到此漏洞影响。

处理开源软件中的此漏洞以外,国内众多厂商也多多少少收到了该问题的影响,当此漏洞5月3日被官网披露时,各厂商还未见影响,但是5月4日官网提供了POC后,这时各路白帽子们就开始忙碌起来了,以下是截止发稿日期时乌云平台关于此次事件的最新提交漏洞。

3-1

从图中可以看出人人网,百度,优酷,腾讯,七牛,赶集,新浪,途牛等众多厂商都受到该漏洞的影响,而且此数量还在逐渐增加。

官网给出如下防护修复建议:

通过配置策略文件暂时禁用ImageMagick,可在“/etc/ImageMagick/policy.xml” 文件中添加如下代码:

7

漏洞影响ImageMagick 6.9.3-10之前的版本,包括ubuntu源中安装的ImageMagick。官方版本的7.0.1-1问题已经得到了修复,如果您是开发者请务必使用新版ImageMagick进行相关CMS的开发。

Written by 漏洞应急响应中心