我平时基本不单独发一些漏洞复现的文章,除非觉得很有学习意义。ImageMagick这个属于特例,因为还是蛮有影响的,包括我司的许多产品实际上都是使用ImageMagick作为底层能力,之前有出现过因为Ghostscript的RCE 0day导致使用了ImageMagick的业务可以被RCE,每次出现新漏洞都要紧急排查和修复一波。
介绍▸
ImageMagick是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。
ImageMagick在解析包含特定格式的路径的PNG图片时,会发生文件读取的行为(也可DoS,编号CVE-2022-44267)。
PoC▸
https://github.com/duc-nt/CVE-2022-44268-ImageMagick-Arbitrary-File-Read-PoC
复现▸
我根据PoC做了一个复现的Docker,拉下来就能直接用,省去了自己复现。详见:https://github.com/y1nglamore/CVE-2022-44268-ImageMagick-Vulnerable-Docker-Environment
启动容器:
然后执行./run.sh FILEPATH
进行任意文件读取
如果不给参数,默认./run.sh
会读/etc/passwd
当然也可以手工执行:
漏洞作者的分析:https://www.metabaseq.com/imagemagick-zero-days/
metabaseq的文章可以说非常透彻了,只不过是英文的,于是这里我就主要翻(chao)译(xi)一些核心的流程
攻击者可以向PNG图片添加一个文本块类型,比如tEXt
,这些类型由一个「关键字」和一个「文本字符串」构成。如果「关键字」是profile
,那么ImageMagick就把「文本字符串」当做一个路径,并读取对应文件内容作为profile,文件内容以HEX形式嵌入新生成的PNG图片,攻击者下载新的图片就可以拿到读取的文件内容了。
首先是读取PNG文件 ReadOnePNGImage()
(coders/png.c:2164)
之后遇到tEXt
类型,就会读取对应的tEXt chunk
,读取过程中会走到SetImageProfile()
(MagickCore/property.c:4360)
在SetImageProfile()
中,如果匹配到关键字profile
,就会做文件读取,结果返回赋值到profile
变量
读取成功后,profile
变量(也就是携带了文件内容的一个结构体)被写入新的生成的PNG文件中
然后攻击者下载新的PNG,就可以拿到对应文件的文件内容了。
图解版:
想起来一道ImageMagick的one line php题目,和这个洞倒是没关系,觉得还蛮不错的
本质是任意类实例化,可以SplFileObject
读文件之类的,本题目使用ImageMagick扩展实现RCE
准备1.xml
1.html
然后用1.html上传1.xml,即可得到一个webshell http://y1ng.vip/swarm.php?a=system('cat /flag');
当然前提是网站根目录可写