PNG Steganography
PNG เป็น format ยอดนิยมในโจทย์ stego เพราะเป็น lossless และมีโครงสร้าง chunk ที่ซ่อนข้อมูลได้หลายจุด — LSB, chunk ที่ผิดปกติ, ข้อมูลต่อท้าย IEND, ขนาดภาพที่ถูกตัด บทนี้ลงลึกถึงโครงสร้าง PNG ทุก chunk และทุกจุดที่ซ่อนข้อมูลได้ พร้อมวิธีตรวจ
1. โครงสร้าง PNG
PNG เริ่มด้วย magic bytes 89 50 4E 47 0D 0A 1A 0A ตามด้วย chunk เรียงต่อกัน แต่ละ chunk = [length(4)] [type(4)] [data] [CRC(4)] chunk สำคัญ: IHDR (header: ขนาด/สี), IDAT (ข้อมูลภาพบีบอัด), IEND (จบไฟล์) — ข้อมูลซ่อนได้ทั้งใน chunk, ระหว่าง chunk, และหลัง IEND
2. Triage — ตรวจทุกจุดตามลำดับ
# 1. ยืนยันชนิด + ขนาดจริง
file image.png
identify -verbose image.png # ImageMagick: ดู metadata เต็ม
# 2. ตรวจ chunk เสีย/ผิดปกติ (สำคัญมาก)
pngcheck -vtp7 image.png
# มองหา: CRC error, chunk แปลก, ข้อมูลหลัง IEND
# 3. metadata + text chunk
exiftool image.png
# tEXt/zTXt/iTXt อาจมี flag ตรงๆ
# 4. ข้อมูลฝัง/ต่อท้าย
binwalk image.png # หาไฟล์ฝัง
binwalk -e image.png # แยกออกมา
strings image.png | grep -iE 'flag|ctf'
# 5. LSB (ดูหัวข้อ LSB)
zsteg -a image.png3. เทคนิค: แก้ความสูงภาพ (ซ่อนใน IHDR)
เทคนิคคลาสสิก: ผู้ซ่อนเขียน flag ที่ส่วนล่างของภาพ แล้วแก้ค่า height ใน IHDR ให้น้อยลง ทำให้ viewer แสดงแค่ส่วนบน flag ถูกซ่อนใต้ขอบ การแก้คือเพิ่ม height กลับ หรือซ่อม IHDR
# pngcheck จะเตือนถ้า CRC ของ IHDR ผิด (สัญญาณว่าถูกแก้ height)
pngcheck -v image.png
# แก้ด้วย Python — เพิ่ม height แล้วคำนวณ CRC ใหม่
python3 << 'PY'
import struct, zlib
d = open("image.png","rb").read()
i = d.index(b'IHDR')
w = struct.unpack(">I", d[i+4:i+8])[0]
# ตั้ง height ใหม่ให้ใหญ่ขึ้น (เช่นเท่า width หรือค่าที่เดา)
new_h = 1000
chunk = d[i:i+4] + d[i+4:i+8] + struct.pack(">I", new_h) + d[i+12:i+17]
crc = zlib.crc32(d[i:i+8] + struct.pack(">I", new_h) + d[i+12:i+17]) & 0xffffffff
out = d[:i+8] + struct.pack(">I", new_h) + d[i+12:i+17] + struct.pack(">I", crc) + d[i+21:]
open("fixed.png","wb").write(out)
PY4. สรุปจุดซ่อนทั้งหมดใน PNG
| จุดซ่อน | ตรวจด้วย | หมายเหตุ |
|---|---|---|
| LSB ใน IDAT | zsteg, StegSolve | พบบ่อยสุด (ดูหัวข้อ LSB) |
| tEXt/zTXt/iTXt chunk | exiftool, pngcheck | ข้อความ/flag ตรงๆ |
| height ที่ถูกตัด (IHDR) | pngcheck (CRC error) | flag ใต้ขอบภาพ |
| ข้อมูลหลัง IEND | binwalk, hex editor | ไฟล์/text ต่อท้าย |
| chunk ปลอม/ไม่มาตรฐาน | pngcheck -v | data ใน chunk ที่ตั้งชื่อเอง |
| palette (PLTE) ผิดปกติ | StegSolve | สีใน palette ซ่อนข้อมูล |
5. Quick Reference
- triage: file → pngcheck -vtp7 → exiftool → binwalk → zsteg
- pngcheck CRC error = chunk ถูกแก้ (มัก height)
- text chunk (tEXt/zTXt/iTXt) → exiftool ดู flag
- height ถูกตัด → เพิ่ม height + คำนวณ CRC ใหม่
- ข้อมูลหลัง IEND → binwalk -e
- LSB → zsteg/StegSolve (ดูหัวข้อ LSB)
- PLTE palette → StegSolve
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติโจทย์แจกไฟล์ .png มา มีแค่ Kali เปล่าๆ — PNG ซ่อนได้หลายจุด (chunk, height, LSB, append) ทำตามลำดับนี้ทีละขั้น เช็คโครงสร้างก่อนค่อยไป LSB
- 1พิมพ์
file image.pngและidentify -verbose image.png— ดูขนาด/สี metadata เบื้องต้น - 2พิมพ์
pngcheck -vtp7 image.png— หัวใจของการตรวจ PNG มองหา CRC error, chunk แปลก, ข้อมูลเกินหลัง IEND - 3ถ้า pngcheck เตือน CRC error ที่ IHDR ให้สงสัยว่า height ถูกแก้ให้ต่ำกว่าจริง (flag ซ่อนใต้ขอบภาพ) — ใช้ script Python ในหัวข้อนี้แก้ height แล้วเปิดใหม่
- 4พิมพ์
exiftool image.png— เช็ค tEXt/zTXt/iTXt chunk อาจมี flag ตรงๆ - 5พิมพ์
binwalk image.pngแล้วbinwalk -e image.png— เช็คข้อมูลที่ต่อท้ายหลัง IEND - 6พิมพ์
zsteg image.png— ลอง LSB combination อัตโนมัติ - 7ถ้าไม่เจอ ลอง
zsteg -a image.pngละเอียดขึ้น - 8ถ้ายังไม่เจอ เปิดใน StegSolve ไล่ดู bit-plane ด้วยตา และดู palette (PLTE) ถ้าเป็นภาพ indexed color
- 9ถ้าครบทุกจุดแล้วยังไม่เจอ รัน
stegoveritas image.pngกวาดทุกอย่างรวดเดียวเป็นด่านสุดท้าย
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| ตรวจโครงสร้าง chunk/CRC | pngcheck | sudo apt install pngcheck | aperisolve.com |
| เช็ค metadata/text chunk | exiftool | sudo apt install libimage-exiftool-perl | exifdata.com |
| เช็คข้อมูลต่อท้าย/ฝัง | binwalk | sudo apt install binwalk | aperisolve.com |
| ลอง LSB อัตโนมัติ | zsteg | gem install zsteg | stylesuxx.github.io/steganography |
| ดู bit-plane/palette ด้วยตา | StegSolve (java -jar) | wget stegsolve.jar | - |
| แก้ height/CRC เอง | python3 (struct, zlib) | - | - |
| กวาดทุกวิธีรวดเดียว | stegoveritas | pipx install stegoveritas | aperisolve.com |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้