Outguess
Outguess เป็นเครื่องมือ steganography สำหรับ JPEG ที่ฝังข้อมูลใน LSB ของ DCT coefficient พร้อม 'แก้สถิติ' (statistical correction) หลังฝัง เพื่อรักษาการกระจายความถี่ของ coefficient ให้ดูปกติและหลบ steganalysis บทนี้ลงลึกกลไก, การ embed/extract ทั้งมี/ไม่มี key, การเทียบกับ steghide และ jsteg, workflow การระบุ JPEG stego, การ brute password ด้วย wordlist และตัวอย่างโจทย์ 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 เก่าๆ ตกม้าตาย) ตรวจจับได้ยากขึ้น
2. ระบุ JPEG stego ก่อน extract
ก่อนจะเดาว่าเป็น outguess ต้องยืนยันก่อนว่าไฟล์เป็น JPEG จริง และตัดเทคนิคที่ 'ตื้นกว่า' ออกไปก่อน (metadata / append data) เพราะ outguess ฝังลึกในโครงสร้าง JPEG
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 ไม่ใช่ outguess3. Extract ด้วย outguess
# ติดตั้ง
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 flagfile 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 ด้วยตัวเอง — จำความต่างเพื่อเดาว่าโจทย์ใช้ตัวไหนและลองให้ครบ:
| tool | algorithm | รองรับ key/passphrase | คำสั่ง extract |
|---|---|---|---|
| steghide | DCT + graph-theoretic + เข้ารหัส (Rijndael) | มี (บังคับ, brute ได้ด้วย stegseek) | steghide extract -sf image.jpg |
| outguess | LSB ของ DCT + statistical correction | มี (optional -k) | outguess -r image.jpg out |
| jsteg | LSB ของ 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 ไม่ได้
stegdetect) ส่วน outguess ออกแบบมาโดยเฉพาะเพื่อเอาชนะ stegdetect ของยุคนั้น — นี่คือเหตุผลที่ outguess มี statistical correction5. Brute-force key ด้วย wordlist
outguess ไม่มี tool brute-force สำเร็จรูปยอดนิยมแบบ stegseek (ซึ่งใช้กับ steghide) แต่เขียน loop เองได้ง่ายเพราะ outguess คืน exit code / output ที่อ่านออกเมื่อ key ถูก วิธีคือวน key จาก wordlist (เช่น rockyou.txt) แล้วเช็คผลลัพธ์
#!/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"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])
breakoutguess ต่อ 1 key ช้ามาก (subprocess overhead) — ลอง key ที่เดาได้จากบริบทโจทย์ก่อน (ชื่อไฟล์, ข้อความในโจทย์, author) แล้วค่อย fallback ไป rockyou เฉพาะเมื่อจำเป็น6. Workflow เต็ม: เจอ JPEG → หา flag
- 1
file+exiftool— ยืนยัน JPEG จริง + ดู metadata/comment - 2
strings+binwalk— หา text/ไฟล์ที่ append ท้าย (ตื้นสุด เจอบ่อย) - 3
steghide extract -sf(ลอง passphrase ว่าง) +stegseekbrute rockyou (พบบ่อยสุด) - 4outguess -r (ลองทั้งมี/ไม่มี key) — ขั้นนี้
- 5
jsteg reveal(DCT LSB ตรงๆ อีกวิธี) - 6
stegoveritas image.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 archive → unzip 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พิมพ์
file image.jpg+exiftool image.jpg— ยืนยันเป็น JPEG จริง + เช็ค metadata/comment - 2พิมพ์
binwalk image.jpg— เช็คไฟล์ฝัง/ต่อท้ายก่อน (ตื้นกว่าและเจอบ่อยกว่า) - 3พิมพ์
steghide extract -sf image.jpg(Enter = passphrase ว่าง) แล้วstegseek image.jpg /usr/share/wordlists/rockyou.txt - 4ถ้า steghide/stegseek ไม่ออก ให้ลอง
outguess -r image.jpg output.txtโดยไม่ใส่ key ก่อน - 5พิมพ์
file output.txtดูว่าได้อะไรออกมา — ถ้าเป็น text อ่านออกหรือมี flag{ ก็จบ ถ้าเป็น binary มั่วอาจแปลว่าผิด key หรือไม่ใช่ outguess - 6ถ้ามีคำใบ้เรื่อง passphrase (ชื่อไฟล์, description ของโจทย์) ลอง
outguess -k "คำที่เดา" -r image.jpg output.txt - 7ถ้ายังไม่ออกและมั่นใจว่าเป็น outguess ให้เขียน loop brute wordlist (ดู script bash/python ด้านบนในหัวข้อนี้) จำกัด wordlist ให้เล็กก่อน เพราะช้ากว่า stegseek มาก
- 8ถ้ายังไม่ออก ลอง
jsteg reveal image.jpg out.txtเป็นอีก DCT-based tool หนึ่ง - 9ถ้าลองครบ steghide/outguess/jsteg แล้วไม่ออกเลย รัน
stegoveritas image.jpgกวาดทุกวิธีที่เหลือรวดเดียว
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| เช็ค metadata/ไฟล์ฝังก่อน | exiftool, binwalk | sudo apt install libimage-exiftool-perl binwalk | aperisolve.com |
| ลอง steghide ก่อน outguess เสมอ | steghide, stegseek | apt install steghide; .deb ของ stegseek | futureboy.us/stegano |
| extract แบบไม่มี/มี key | outguess | sudo apt install outguess | - |
| อีกทางเลือก DCT-based | jsteg | git clone lukechampine/jsteg; go build | - |
| brute key ด้วย wordlist | bash/python loop + rockyou.txt | - | crackstation.net (ถ้าเป็น hash ไม่ใช่ key นี้) |
| กวาดทุกวิธีรวดเดียว | stegoveritas | pipx install stegoveritas | aperisolve.com |
| เข้ารหัส/ถอดข้อความที่ได้ | - | - | CyberChef, dcode.fr |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้