คลัง
stego

JPG Steganography

JPEG ใช้ lossy compression (DCT) ที่ทำลาย LSB ตอน save ดังนั้นเทคนิค stego ใน JPG จึงต่างจาก PNG โดยสิ้นเชิง — ฝังใน DCT coefficient (jsteg, F5), ใช้ tool ที่มี passphrase (steghide, outguess), หรือซ่อนใน metadata/ต่อท้ายไฟล์ บทนี้ลงลึกแต่ละวิธีและลำดับการลอง

IntermediateAdvanced#jpg#jpeg#stego#dct#jsteg#steghide#outguess#ctf

1. ทำไม JPG ต่างจาก PNG

JPEG บีบอัดแบบ lossy: แปลงภาพเป็น block 8x8 → DCT (Discrete Cosine Transform) → quantize (ปัดค่า) ขั้น quantize ทำลายข้อมูลที่ไม่จำเป็นต่อสายตา การฝัง LSB ตรงๆ บน pixel จึงหายตอน save เทคนิค JPG จึงฝังใน DCT coefficient (ก่อน/ระหว่าง compress) แทน หรือใช้วิธีที่ไม่แตะ pixel เลย (metadata, append)

อย่าเสียเวลารัน zsteg กับ JPG — zsteg ใช้ได้แค่ PNG/BMP เท่านั้น สำหรับ JPG ใช้ steghide/stegseek/outguess/jsteg แทน

2. Triage JPG

ตรวจเบื้องต้น (ก่อนเดา passphrase)Linux
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 -50
เริ่มจาก exiftool + binwalk + strings เสมอ — บางทีไม่ใช่ stego จริง แค่ flag ใน comment/ต่อท้าย

3. steghide / stegseek (พบบ่อยสุดใน CTF)

steghide เป็น tool ฝังข้อมูลใน JPG/BMP/WAV/AU ด้วย passphrase — พบบ่อยมากใน CTF ถ้าไม่มี passphrase ให้ stegseek brute-force ด้วย wordlist (เร็วมาก หลักวินาที)

steghide + stegseekLinux
# ถ้ารู้/เดา 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.jpg
passphrase มักมาจาก: รหัสว่าง, คำใน challenge, ชื่อไฟล์, rockyou — ลองตามนี้

4. outguess และ jsteg (DCT-based)

ถ้า steghide ไม่เจอ ลอง outguess และ jsteg ที่ฝังใน DCT coefficient คนละวิธีกัน — ต้องลองทั้งคู่เพราะ extract ต้องตรง tool ที่ใช้ฝัง

outguess / jstegLinux
# 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.jpg
ลองครบ: steghide → stegseek → outguess → jsteg → stegoveritas ก่อนสรุปว่าไม่ใช่ stego

5. ลำดับการลอง (decision flow)

  1. 1exiftool + strings + binwalk — เช็ค metadata/append ก่อน (ง่ายสุด)
  2. 2steghide extract (ลอง passphrase ว่าง + คำใน challenge)
  3. 3stegseek brute ด้วย rockyou (ถ้าไม่รู้ passphrase)
  4. 4outguess -r (DCT วิธีหนึ่ง)
  5. 5jsteg reveal (DCT อีกวิธี)
  6. 6stegoveritas (ลองทุกอย่างรวด) / ดู DCT เองถ้าโจทย์ custom
toolวิธีฝังต้องมี passphrase?
steghideDCT + เข้ารหัสใช่ (brute ด้วย stegseek)
outguessDCT coefficientไม่ / มี key ก็ได้
jstegLSB ของ DCTไม่
metadataEXIF/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. 1พิมพ์ file image.jpg — ยืนยันเป็น JPEG จริง (ไม่ใช่ไฟล์หลอกนามสกุล)
  2. 2พิมพ์ exiftool image.jpg — เช็ค metadata/comment ก่อน อาจมี flag ตรงๆ
  3. 3พิมพ์ strings image.jpg | grep -iE 'flag|ctf' และ binwalk image.jpg — เช็คข้อความ/ไฟล์ที่ต่อท้าย
  4. 4พิมพ์ steghide extract -sf image.jpg กด Enter ลอง passphrase ว่างก่อน
  5. 5ถ้าไม่ออก พิมพ์ stegseek image.jpg /usr/share/wordlists/rockyou.txt — brute passphrase อัตโนมัติ (เร็วมาก ลองก่อนเสมอ)
  6. 6ถ้ายังไม่ออก ลอง outguess -r image.jpg out.txt (ไม่มี key) แล้ว file out.txt ดูผล
  7. 7ถ้ายังไม่ออก ลอง jsteg reveal image.jpg out.txt เป็นอีกวิธี DCT
  8. 8ถ้าลองครบทุก tool เฉพาะทางแล้วไม่เจอ รัน stegoveritas image.jpg กวาดทุกอย่างรวดเดียว
  9. 9อย่ารัน zsteg กับ JPG (ใช้ไม่ได้เพราะ lossy) — ถ้าลืมจุดนี้จะเสียเวลาฟรี
ไล่ตรวจ JPG ทีละชั้น — ติดไปไหนต่อ
เจอ flag ชั้นนอกไหม?
✅ เจอ→ จบ ได้ flag
❌ ไม่เจอ→ ลง DCT stego ต่อ (steghide ก่อน)
steghide ออกไหม?
✅ ออก→ จบ ได้ flag/ไฟล์ลับ
❌ ไม่ออก→ ลอง outguess
outguess ออกไหม?
✅ ออก→ file output แล้วเปิดต่อ จบ
❌ ไม่ออก→ ลอง jsteg
jsteg reveal image.jpg out
LSB ของ DCT ตรงๆ ไม่มี key
ยังไม่เจอเลย?
✅ เจอ→ จบ ได้ flag
❌ ไม่เจอ→ กวาดด้วย stegoveritas / ทบทวน passphrase
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
เช็ค metadata/append ก่อนexiftool, strings, binwalksudo apt install libimage-exiftool-perl binwalkaperisolve.com
extract + brute passphrasesteghide, stegseekapt install steghide; .deb ของ stegseekfutureboy.us/stegano
ลอง DCT อีกวิธี (มี/ไม่มี key)outguesssudo apt install outguess-
ลอง DCT ตรงๆ ไม่มี keyjsteggit clone lukechampine/jsteg; go build-
กวาดทุกวิธีรวดเดียวstegoveritaspipx install stegoveritasaperisolve.com
ถอดข้อความ/ถอดรหัสที่ได้--CyberChef, dcode.fr
สร้าง wordlist เฉพาะทางcewlsudo apt install cewl-
🚑 ถ้าตันสนิท ลองท่าถัดไป: steghide เจาะลึกการ brute passphrase, outguess ถ้ายังไม่ลองแบบมี/ไม่มี key ให้ครบ, binwalk/exiftool ถ้ายังไม่เช็คชั้นนอกให้ทั่ว, zsteg เฉพาะถ้าไฟล์จริงกลายเป็น PNG ไม่ใช่ JPG — อย่าเสียเวลากับ LSB ตรงๆ บน JPG เพราะ lossy compression ทำลาย LSB ไปแล้ว

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้