คลัง
stego

Outguess

Outguess เป็นเครื่องมือ steganography สำหรับ JPEG ที่ฝังข้อมูลใน LSB ของ DCT coefficient พร้อม 'แก้สถิติ' (statistical correction) หลังฝัง เพื่อรักษาการกระจายความถี่ของ coefficient ให้ดูปกติและหลบ steganalysis บทนี้ลงลึกกลไก, การ embed/extract ทั้งมี/ไม่มี key, การเทียบกับ steghide และ jsteg, workflow การระบุ JPEG stego, การ brute password ด้วย wordlist และตัวอย่างโจทย์ CTF

Intermediate#outguess#stego#jpg#jpeg#dct#statistical#steganalysis#ctf

1. Outguess ทำงานอย่างไร

JPEG บีบอัดภาพด้วย DCT (Discrete Cosine Transform) — แปลงบล็อก 8×8 pixel เป็นสัมประสิทธิ์ความถี่ (coefficient) แล้ว quantize outguess ฝังข้อมูลลับใน LSB ของ DCT coefficient (ข้าม coefficient ที่เป็น 0 และ 1) จุดเด่นสำคัญคือมันทำ statistical correction: หลังฝัง มันปรับ coefficient ที่เหลือเพื่อให้ histogram ของ DCT กลับมาใกล้เคียงต้นฉบับ ทำให้ steganalysis แบบ chi-square (ที่ steghide/jsteg เก่าๆ ตกม้าตาย) ตรวจจับได้ยากขึ้น

Outguess: ฝังใน DCT coefficient + แก้สถิติ
JPEG bล็อก 8x8 DCT coeff quantized แทน LSB ข้าม 0 และ 1 stat correction ปรับ histogram กลับ stego flow การฝังของ outguess
แต่ละ tool ใช้ algorithm/รูปแบบการฝังต่างกัน — ต้อง extract ด้วย tool ตัวเดียวกับที่ฝัง ข้อมูลที่ฝังด้วย outguess จะดึงด้วย steghide/jsteg ไม่ได้ และกลับกัน ดังนั้นเมื่อเจอ JPEG ต้องลองทุก tool

2. ระบุ JPEG stego ก่อน extract

ก่อนจะเดาว่าเป็น outguess ต้องยืนยันก่อนว่าไฟล์เป็น JPEG จริง และตัดเทคนิคที่ 'ตื้นกว่า' ออกไปก่อน (metadata / append data) เพราะ outguess ฝังลึกในโครงสร้าง JPEG

ตรวจไฟล์ชั้นนอกก่อนLinux
file image.jpg                 # ยืนยันว่าเป็น JPEG จริง
exiftool image.jpg             # metadata/comment (บาง flag ซ่อนตรงนี้)
strings -n 8 image.jpg | less  # ข้อความ ASCII ที่มองเห็น
binwalk image.jpg              # ไฟล์ที่ append ท้าย / ซ้อน (zip, png...)
binwalk -e image.jpg           # extract ไฟล์ที่ฝังต่อท้าย

# ถ้ามี data ต่อท้าย EOI marker (ffd9) มักเป็น append ไม่ใช่ outguess
ทำ exiftool/strings/binwalk ก่อนเสมอ — ถูกกว่าและเจอบ่อยกว่า DCT stego
outguess ไม่มี 'magic signature' ให้ตรวจตรงๆ ว่าฝังหรือไม่ — วิธีปฏิบัติคือลอง extract ถ้า outguess คืนข้อมูลที่อ่านออก (text/ไฟล์) แปลว่าใช่ ถ้าคืน binary มั่วหรือ error แปลว่าไม่ใช่ (หรือผิด key)

3. Extract ด้วย outguess

คำสั่ง extract / embedLinux
# ติดตั้ง
sudo apt install outguess

# --- EXTRACT (retrieve) ---
# ไม่มี key
outguess -r image.jpg output.txt

# มี key (passphrase)
outguess -k "secret_key" -r image.jpg output.txt

# ระบุ algorithm รุ่นเก่า (บางโจทย์ฝังด้วย outguess 0.13)
outguess -t -r image.jpg output.txt

# --- EMBED (เผื่อทดสอบ/สร้างโจทย์) ---
outguess -k "key" -d secret.txt cover.jpg stego.jpg

# ตรวจผลที่ดึงมา
file output.txt
cat output.txt
strings output.txt | grep -i flag
-r = retrieve, -k = key, -d = data (ฝัง) — ลองทั้งมีและไม่มี key เสมอ
หลัง extract ให้ file output.txt เสมอ — บางครั้งสิ่งที่ฝังไม่ใช่ text แต่เป็นไฟล์ zip/png/รูป ต้องดูชนิดจริงแล้วเปิดต่อ ถ้า cat เป็น binary มั่วอาจแปลว่าผิด key หรือไม่ได้ฝังด้วย outguess

หมายเหตุเรื่องเวอร์ชัน: มี outguess ดั้งเดิม (Niels Provos) และ fork outguess-0.2/outguess ใน repo ปัจจุบัน บางโจทย์เก่าฝังด้วยรุ่นที่มี default seed ต่างกัน ถ้า extract ไม่ออกทั้งที่มั่นใจว่าเป็น outguess ลองสลับเวอร์ชัน/ใช้ flag -t หรือ build จาก source เดิม

4. เทียบกับ steghide / jsteg

JPEG stego มีสาม tool หลักที่ต้องรู้จัก แต่ละตัวฝังคนละแบบและต้อง extract ด้วยตัวเอง — จำความต่างเพื่อเดาว่าโจทย์ใช้ตัวไหนและลองให้ครบ:

toolalgorithmรองรับ key/passphraseคำสั่ง extract
steghideDCT + graph-theoretic + เข้ารหัส (Rijndael)มี (บังคับ, brute ได้ด้วย stegseek)steghide extract -sf image.jpg
outguessLSB ของ DCT + statistical correctionมี (optional -k)outguess -r image.jpg out
jstegLSB ของ DCT ตรงๆ (ไม่แก้สถิติ)ไม่มีjsteg reveal image.jpg out
  • steghide — พบบ่อยที่สุดใน CTF, มักมี passphrase, brute ด้วย stegseek + rockyou ได้เร็วมาก (ดูหัวข้อ steghide)
  • outguess — ลองเมื่อ steghide ไม่ออก, จุดเด่นคือ stat correction หลบ chi-square steganalysis
  • jsteg — เก่าและง่ายสุด ฝัง LSB ของ DCT ตรงๆ ไม่มี key ตรวจจับ/ดึงง่าย
  • ทั้งสามใช้ DCT ของ JPEG แต่ layout/encryption ต่างกัน → extract cross-tool ไม่ได้
jsteg ฝังตรงๆ ไม่แก้สถิติ จึงถูกจับได้ง่ายด้วย steganalysis (เช่น stegdetect) ส่วน outguess ออกแบบมาโดยเฉพาะเพื่อเอาชนะ stegdetect ของยุคนั้น — นี่คือเหตุผลที่ outguess มี statistical correction

5. Brute-force key ด้วย wordlist

outguess ไม่มี tool brute-force สำเร็จรูปยอดนิยมแบบ stegseek (ซึ่งใช้กับ steghide) แต่เขียน loop เองได้ง่ายเพราะ outguess คืน exit code / output ที่อ่านออกเมื่อ key ถูก วิธีคือวน key จาก wordlist (เช่น rockyou.txt) แล้วเช็คผลลัพธ์

Brute password ด้วย wordlist (bash)Linux
#!/bin/bash
# brute outguess key ด้วย rockyou
IMG="image.jpg"
WORDLIST="/usr/share/wordlists/rockyou.txt"

while IFS= read -r key; do
  outguess -k "$key" -r "$IMG" /tmp/out.bin 2>/dev/null
  # ถ้าผลลัพธ์มีคำว่า flag หรือเป็น printable text = เจอ
  if grep -qai "flag{" /tmp/out.bin 2>/dev/null; then
    echo "[+] KEY FOUND: $key"
    cat /tmp/out.bin
    break
  fi
done < "$WORDLIST"
ปรับเงื่อนไขตรวจผล เช่น เช็คว่า output เป็น printable ทั้งหมด หรือมี magic bytes ของ zip/png
เวอร์ชัน Python (เช็คผลแบบยืดหยุ่นกว่า)
import subprocess

IMG = "image.jpg"
with open("/usr/share/wordlists/rockyou.txt", "r",
          encoding="latin-1") as f:
    for key in f:
        key = key.strip()
        subprocess.run(["outguess", "-k", key, "-r", IMG, "/tmp/out.bin"],
                       stderr=subprocess.DEVNULL,
                       stdout=subprocess.DEVNULL)
        try:
            data = open("/tmp/out.bin", "rb").read()
        except FileNotFoundError:
            continue
        # เจอเมื่อผลลัพธ์มี flag หรือเป็น text อ่านออกล้วน
        if b"flag{" in data.lower() or (data and all(
                32 <= b < 127 or b in (9, 10, 13) for b in data)):
            print(f"[+] KEY = {key}")
            print(data[:200])
            break
ช้ากว่า stegseek มากเพราะเรียก process ต่อ key — จำกัด wordlist ให้เล็กหรือใช้เฉพาะเมื่อจำเป็น
การ brute แบบเรียก outguess ต่อ 1 key ช้ามาก (subprocess overhead) — ลอง key ที่เดาได้จากบริบทโจทย์ก่อน (ชื่อไฟล์, ข้อความในโจทย์, author) แล้วค่อย fallback ไป rockyou เฉพาะเมื่อจำเป็น

6. Workflow เต็ม: เจอ JPEG → หา flag

  1. 1file + exiftool — ยืนยัน JPEG จริง + ดู metadata/comment
  2. 2strings + binwalk — หา text/ไฟล์ที่ append ท้าย (ตื้นสุด เจอบ่อย)
  3. 3steghide extract -sf (ลอง passphrase ว่าง) + stegseek brute rockyou (พบบ่อยสุด)
  4. 4outguess -r (ลองทั้งมี/ไม่มี key) — ขั้นนี้
  5. 5jsteg reveal (DCT LSB ตรงๆ อีกวิธี)
  6. 6stegoveritas image.jpg — รันทุกอย่างรวดเดียว ครอบคลุมที่พลาด
เจอ JPEG stego — ไล่ตามนี้
เจอ flag ชั้นนอกไหม?
เจอจบ
ไม่เจอลง DCT stego ต่อ
steghide ออกไหม?
ออกจบ
ไม่ออกลอง outguess
outguess -r (มี/ไม่มี key)
ผิด key → brute wordlist
outguess ออกไหม?
ออกfile output แล้วเปิดต่อ
ไม่ออกjsteg reveal / stegoveritas
jsteg reveal → stegoveritas (กวาดที่เหลือ)
เจอ flag / ไฟล์ซ่อน
ดู workflow JPG แบบเต็มที่หัวข้อ stego-jpg และเครื่องมือที่เกี่ยวข้อง: steghide (passphrase + stegseek), binwalk (append/embedded), exiftool (metadata)

7. ตัวอย่างโจทย์ CTF

โจทย์ A (ไม่มี key): ได้ภาพ .jpg — steghide/binwalk ไม่เจออะไร ลอง outguess -r image.jpg out.txt โดยไม่ใส่ key ได้ text ที่มี flag{...} ทันที

โจทย์ B (มี key จากบริบท): โจทย์บอกใบ้ passphrase เป็นชื่อผู้เขียนหรือคำในโจทย์ ลอง outguess -k "password" -r image.jpg out — key มาจาก description ของ challenge บ่อยครั้ง

โจทย์ C (ฝังไฟล์ ไม่ใช่ text): extract ได้ output ที่ cat เป็น binary มั่ว — file out พบว่าเป็น Zip archiveunzip out ได้ไฟล์ที่มี flag ข้างใน

โจทย์ D (ต้อง brute): รู้ว่าเป็น outguess (จาก hint) แต่มี key — เดา key จากบริบทไม่ได้ จึงเขียน loop วน rockyou (จำกัดคำที่เกี่ยวข้อง) เช็ค output ว่ามี flag{ จนเจอ key

8. Quick Reference

  • outguess = JPEG stego, ฝังใน LSB ของ DCT coefficient + แก้สถิติหลบ steganalysis
  • extract: outguess -r image.jpg output.txt
  • มี key: outguess -k 'key' -r image.jpg output.txt
  • หลัง extract → file output.txt เสมอ (อาจเป็น zip/png ไม่ใช่ text)
  • ลองหลัง steghide/stegseek, คู่กับ jsteg — extract ต้องตรง tool ที่ฝัง
  • ต่างจาก steghide (มี encryption) และ jsteg (LSB ตรงๆ ไม่แก้สถิติ)
  • brute key: loop wordlist เรียก outguess ต่อ key (ช้า → เดาจากบริบทก่อน)
  • ทำ exiftool/strings/binwalk ก่อนเสมอ — ดู workflow เต็มที่หัวข้อ stego-jpg

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติได้ไฟล์ JPEG มา ลอง steghide/stegseek แล้วไม่ออก มีแค่ Kali เปล่าๆ สงสัยว่าเป็น outguess — ทำตามนี้ทีละขั้น ก่อนจะไปถึง outguess ต้องมั่นใจว่าเช็คชั้นตื้นๆ ครบก่อน

  1. 1พิมพ์ file image.jpg + exiftool image.jpg — ยืนยันเป็น JPEG จริง + เช็ค metadata/comment
  2. 2พิมพ์ binwalk image.jpg — เช็คไฟล์ฝัง/ต่อท้ายก่อน (ตื้นกว่าและเจอบ่อยกว่า)
  3. 3พิมพ์ steghide extract -sf image.jpg (Enter = passphrase ว่าง) แล้ว stegseek image.jpg /usr/share/wordlists/rockyou.txt
  4. 4ถ้า steghide/stegseek ไม่ออก ให้ลอง outguess -r image.jpg output.txt โดยไม่ใส่ key ก่อน
  5. 5พิมพ์ file output.txt ดูว่าได้อะไรออกมา — ถ้าเป็น text อ่านออกหรือมี flag{ ก็จบ ถ้าเป็น binary มั่วอาจแปลว่าผิด key หรือไม่ใช่ outguess
  6. 6ถ้ามีคำใบ้เรื่อง passphrase (ชื่อไฟล์, description ของโจทย์) ลอง outguess -k "คำที่เดา" -r image.jpg output.txt
  7. 7ถ้ายังไม่ออกและมั่นใจว่าเป็น outguess ให้เขียน loop brute wordlist (ดู script bash/python ด้านบนในหัวข้อนี้) จำกัด wordlist ให้เล็กก่อน เพราะช้ากว่า stegseek มาก
  8. 8ถ้ายังไม่ออก ลอง jsteg reveal image.jpg out.txt เป็นอีก DCT-based tool หนึ่ง
  9. 9ถ้าลองครบ steghide/outguess/jsteg แล้วไม่ออกเลย รัน stegoveritas image.jpg กวาดทุกวิธีที่เหลือรวดเดียว
ลอง outguess แล้วไปทางไหนต่อ
steghide ออกไหม?
✅ ออก→ จบ ได้ flag
❌ ไม่ออก→ ลอง outguess ต่อ
outguess -r image.jpg out.txt
ลองไม่มี key ก่อน
file out.txt ได้อะไร?
✅ text/flag อ่านออก→ จบ ได้ flag
❌ binary มั่ว/error→ ลองมี key จากบริบทโจทย์
outguess -k "คำที่เดา" -r
เดา key จากชื่อไฟล์/description
ยังไม่ออก?
✅ ออกแล้ว→ จบ ได้ flag
❌ ยังไม่ออก→ brute wordlist หรือลอง jsteg
brute key ด้วย rockyou (script) หรือ jsteg reveal
ช้า → เดาจากบริบทให้มากที่สุดก่อน
ยังไม่เจอเลย?
✅ เจอ→ จบ ได้ flag
❌ ยังไม่เจอ→ กวาดด้วย stegoveritas / กลับไปเช็ค metadata ที่อาจพลาด
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
เช็ค metadata/ไฟล์ฝังก่อนexiftool, binwalksudo apt install libimage-exiftool-perl binwalkaperisolve.com
ลอง steghide ก่อน outguess เสมอsteghide, stegseekapt install steghide; .deb ของ stegseekfutureboy.us/stegano
extract แบบไม่มี/มี keyoutguesssudo apt install outguess-
อีกทางเลือก DCT-basedjsteggit clone lukechampine/jsteg; go build-
brute key ด้วย wordlistbash/python loop + rockyou.txt-crackstation.net (ถ้าเป็น hash ไม่ใช่ key นี้)
กวาดทุกวิธีรวดเดียวstegoveritaspipx install stegoveritasaperisolve.com
เข้ารหัส/ถอดข้อความที่ได้--CyberChef, dcode.fr
🚑 ถ้าตันสนิท ลองท่าถัดไป: steghide ถ้ายังไม่ลอง stegseek+rockyou ให้ครบ, stego-jpg สำหรับ workflow JPG แบบเต็มที่ครอบคลุมทุกเทคนิค, binwalk ถ้ายังไม่เช็คไฟล์ต่อท้าย, exiftool ถ้ายังไม่เช็ค metadata — outguess ไม่มี signature ให้ตรวจตรงๆ ต้องลอง extract จริงถึงจะรู้ว่าใช่หรือไม่

โน้ตของฉัน

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