JPG Steganography
JPEG ใช้ lossy compression (DCT) ที่ทำลาย LSB ตอน save ดังนั้นเทคนิค stego ใน JPG จึงต่างจาก PNG โดยสิ้นเชิง — ฝังใน DCT coefficient (jsteg, F5), ใช้ tool ที่มี passphrase (steghide, outguess), หรือซ่อนใน metadata/ต่อท้ายไฟล์ บทนี้ลงลึกแต่ละวิธีและลำดับการลอง
1. ทำไม JPG ต่างจาก PNG
JPEG บีบอัดแบบ lossy: แปลงภาพเป็น block 8x8 → DCT (Discrete Cosine Transform) → quantize (ปัดค่า) ขั้น quantize ทำลายข้อมูลที่ไม่จำเป็นต่อสายตา การฝัง LSB ตรงๆ บน pixel จึงหายตอน save เทคนิค JPG จึงฝังใน DCT coefficient (ก่อน/ระหว่าง compress) แทน หรือใช้วิธีที่ไม่แตะ pixel เลย (metadata, append)
2. Triage JPG
file image.jpg
exiftool image.jpg # metadata, comment — flag อาจอยู่ตรงนี้
strings image.jpg | grep -iE 'flag|ctf|pass'
binwalk image.jpg # ไฟล์ฝัง/ต่อท้าย
binwalk -e image.jpg
# ดู structure / marker ผิดปกติ
exiftool -v3 image.jpg | head -503. steghide / stegseek (พบบ่อยสุดใน CTF)
steghide เป็น tool ฝังข้อมูลใน JPG/BMP/WAV/AU ด้วย passphrase — พบบ่อยมากใน CTF ถ้าไม่มี passphrase ให้ stegseek brute-force ด้วย wordlist (เร็วมาก หลักวินาที)
# ถ้ารู้/เดา passphrase (ลองรหัสว่างก่อน)
steghide extract -sf image.jpg # ถาม passphrase (Enter = ว่าง)
steghide extract -sf image.jpg -p "password"
# ไม่รู้ passphrase → stegseek brute (เร็วกว่า stegcracker มาก)
stegseek image.jpg /usr/share/wordlists/rockyou.txt
# stegseek เจอแล้วดึงไฟล์ออกให้อัตโนมัติ
# ดูว่ามีข้อมูล steghide ฝังไหม (info)
steghide info image.jpg4. outguess และ jsteg (DCT-based)
ถ้า steghide ไม่เจอ ลอง outguess และ jsteg ที่ฝังใน DCT coefficient คนละวิธีกัน — ต้องลองทั้งคู่เพราะ extract ต้องตรง tool ที่ใช้ฝัง
# outguess (มี/ไม่มี key)
outguess -r image.jpg out.txt
outguess -k "key" -r image.jpg out.txt
# jsteg (ฝัง LSB ใน DCT coefficient)
jsteg reveal image.jpg out.txt
# stegoveritas ลองหลาย method รวด
stegoveritas image.jpg5. ลำดับการลอง (decision flow)
- 1exiftool + strings + binwalk — เช็ค metadata/append ก่อน (ง่ายสุด)
- 2steghide extract (ลอง passphrase ว่าง + คำใน challenge)
- 3stegseek brute ด้วย rockyou (ถ้าไม่รู้ passphrase)
- 4outguess -r (DCT วิธีหนึ่ง)
- 5jsteg reveal (DCT อีกวิธี)
- 6stegoveritas (ลองทุกอย่างรวด) / ดู DCT เองถ้าโจทย์ custom
| tool | วิธีฝัง | ต้องมี passphrase? |
|---|---|---|
| steghide | DCT + เข้ารหัส | ใช่ (brute ด้วย stegseek) |
| outguess | DCT coefficient | ไม่ / มี key ก็ได้ |
| jsteg | LSB ของ DCT | ไม่ |
| metadata | EXIF/comment | ไม่ (exiftool) |
6. Quick Reference
- JPG = lossy → LSB ตรงๆ ใช้ไม่ได้ (อย่ารัน zsteg)
- เริ่ม: exiftool + strings + binwalk
- steghide extract -sf image.jpg (ลอง passphrase ว่าง/คำใน challenge)
- ไม่รู้ pass → stegseek image.jpg rockyou.txt (เร็วมาก)
- ต่อ: outguess -r, jsteg reveal
- all-in-one: stegoveritas
- passphrase มักมาจาก challenge text / ชื่อไฟล์ / rockyou
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติโจทย์แจกไฟล์ .jpg มา มีแค่ Kali เปล่าๆ ไม่รู้จะเริ่มตรงไหนเพราะ JPG มีเทคนิคซ่อนได้หลายแบบ — ทำตามลำดับนี้ทีละขั้น อย่าข้ามขั้นตอนเพราะแต่ละ tool เช็คคนละจุด
- 1พิมพ์
file image.jpg— ยืนยันเป็น JPEG จริง (ไม่ใช่ไฟล์หลอกนามสกุล) - 2พิมพ์
exiftool image.jpg— เช็ค metadata/comment ก่อน อาจมี flag ตรงๆ - 3พิมพ์
strings image.jpg | grep -iE 'flag|ctf'และbinwalk image.jpg— เช็คข้อความ/ไฟล์ที่ต่อท้าย - 4พิมพ์
steghide extract -sf image.jpgกด Enter ลอง passphrase ว่างก่อน - 5ถ้าไม่ออก พิมพ์
stegseek image.jpg /usr/share/wordlists/rockyou.txt— brute passphrase อัตโนมัติ (เร็วมาก ลองก่อนเสมอ) - 6ถ้ายังไม่ออก ลอง
outguess -r image.jpg out.txt(ไม่มี key) แล้วfile out.txtดูผล - 7ถ้ายังไม่ออก ลอง
jsteg reveal image.jpg out.txtเป็นอีกวิธี DCT - 8ถ้าลองครบทุก tool เฉพาะทางแล้วไม่เจอ รัน
stegoveritas image.jpgกวาดทุกอย่างรวดเดียว - 9อย่ารัน zsteg กับ JPG (ใช้ไม่ได้เพราะ lossy) — ถ้าลืมจุดนี้จะเสียเวลาฟรี
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| เช็ค metadata/append ก่อน | exiftool, strings, binwalk | sudo apt install libimage-exiftool-perl binwalk | aperisolve.com |
| extract + brute passphrase | steghide, stegseek | apt install steghide; .deb ของ stegseek | futureboy.us/stegano |
| ลอง DCT อีกวิธี (มี/ไม่มี key) | outguess | sudo apt install outguess | - |
| ลอง DCT ตรงๆ ไม่มี key | jsteg | git clone lukechampine/jsteg; go build | - |
| กวาดทุกวิธีรวดเดียว | stegoveritas | pipx install stegoveritas | aperisolve.com |
| ถอดข้อความ/ถอดรหัสที่ได้ | - | - | CyberChef, dcode.fr |
| สร้าง wordlist เฉพาะทาง | cewl | sudo apt install cewl | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้