คลัง
stego

Binwalk

Binwalk สแกนไฟล์หา signature ของไฟล์อื่นที่ฝัง/ต่อท้ายอยู่ข้างใน — เทคนิคยอดนิยมคือซ่อน zip/รูป/ไฟล์ไว้ท้ายภาพ (เพราะ viewer อ่านแค่ส่วนหัว) binwalk หาและแยกออกมาได้ บทนี้ลงลึกการ scan, extract, การแก้เมื่อ auto-extract ไม่ได้ผล, และ polyglot file

BeginnerIntermediate#binwalk#stego#file-carving#embedded-files#polyglot#firmware#ctf

1. หลักการ — ไฟล์ซ้อนไฟล์

หลายไฟล์ format อ่านแค่ส่วนหัวจนถึง marker จบ แล้วเพิกเฉยส่วนที่เหลือ — เช่น image viewer เปิด JPG เห็นภาพปกติ แม้มี zip ต่อท้าย binwalk สแกนหา magic bytes (signature) ของไฟล์ทุกชนิดในทั้งไฟล์ ทำให้เจอไฟล์ที่ฝัง/ต่อท้าย แล้วแยกออกมาได้ เป็นเทคนิค stego ที่พบบ่อยที่สุดอย่างหนึ่ง

ไฟล์ภาพที่มี zip ต่อท้าย (binwalk หาเจอ)
JPEG (FFD8 ... FFD9) viewer อ่านแค่ตรงนี้ เห็นภาพปกติ ZIP (504B0304 ...) flag ซ่อนตรงนี้ — binwalk เจอ binwalk สแกน magic bytes ตลอดทั้งไฟล์ → เจอ ZIP ที่ offset หลัง FFD9

2. Scan

binwalk scanLinux
# สแกนหา signature
binwalk file.jpg
# output: offset | description
# 0     JPEG image data
# 12345 Zip archive data

# entropy analysis (หาส่วนที่ถูกบีบอัด/เข้ารหัส)
binwalk -E file.jpg
ดู offset ของไฟล์ที่ฝัง — ใช้ตอน extract เองด้วย dd ถ้า auto ไม่ได้

3. Extract

auto-extract และ manualLinux
# auto extract (recursive)
binwalk -e file.jpg               # แยกไฟล์ออกมาในโฟลเดอร์ _file.jpg.extracted
binwalk -Me file.jpg              # recursive (แยกซ้อนไฟล์ในไฟล์)

# ถ้า -e ไม่ได้ผล (permission/format) → ดึงเองด้วย dd ตาม offset
binwalk file.jpg                  # ดู offset ก่อน (เช่น 12345)
dd if=file.jpg of=hidden.zip bs=1 skip=12345
unzip hidden.zip

# foremost เป็นทางเลือก carving
foremost -i file.jpg -o out/
dd skip=OFFSET คือ fallback ที่ชัวร์สุดเมื่อ binwalk -e ล้มเหลว

4. เมื่อ extract ไม่ได้ผล / polyglot

  • binwalk -e ไม่แยก: ดู offset แล้ว dd if=file of=out bs=1 skip=OFFSET เอง
  • zip ต่อท้าย: unzip file.jpg ตรงๆ ได้เลย (unzip หา central directory ท้ายไฟล์)
  • zip มี password: ดึง zip ออกมาแล้ว fcrackzip -D -u -p rockyou.txt out.zip หรือ zip2john
  • polyglot file: ไฟล์ที่ valid หลาย format พร้อมกัน (เช่นเป็นทั้ง JPG และ ZIP) — เปลี่ยนนามสกุลแล้วเปิด
  • append หลายชั้น: binwalk -Me แยก recursive; หรือ dd ทีละชั้น
  • ดู hex เอง: xxd file | grep -i '504b' หา zip signature (PK)
ลอง unzip file.jpg และ binwalk -e file.jpg ควบคู่กันเสมอ — zip ต่อท้ายเป็นเทคนิคที่พบบ่อยมาก และ unzip มักดึงได้ตรงๆ แม้ binwalk งอแง

5. Quick Reference

  • binwalk หา/แยกไฟล์ที่ฝัง-ต่อท้าย (magic bytes)
  • scan: binwalk file → ดู offset
  • extract: binwalk -e (auto) / -Me (recursive)
  • ไม่ได้ผล → dd if=file of=out bs=1 skip=OFFSET
  • zip ต่อท้าย → unzip file.jpg ตรงๆ; มี pass → fcrackzip/zip2john
  • polyglot → เปลี่ยนนามสกุลเปิด; xxd | grep 504b หา PK

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

สมมติเพิ่งเจอโจทย์ stego แจกไฟล์รูปมาไฟล์เดียว มีแค่ Kali เปล่าๆ ไม่รู้จะเริ่มตรงไหน — binwalk คือ tool แรกที่ควรรันเพราะเช็คไวและเจอบ่อย ทำตามนี้ทีละขั้น

  1. 1พิมพ์ file image.jpg — เช็คชนิดไฟล์จริง (บางทีนามสกุลหลอก)
  2. 2พิมพ์ binwalk image.jpg — ดูรายการ signature ที่เจอ ถ้ามีมากกว่า 1 บรรทัด (เช่นเจอ 'Zip archive' ต่อจาก 'JPEG image') แปลว่ามีไฟล์ฝัง
  3. 3พิมพ์ binwalk -e image.jpg — ให้ binwalk แยกไฟล์ที่เจอออกมาอัตโนมัติ
  4. 4พิมพ์ ls _image.jpg.extracted/ — ดูไฟล์ที่ถูกแยกออกมา แล้ว file ทีละไฟล์
  5. 5ถ้าได้ zip ลอง unzip hidden.zip ตรงๆ ก่อน (unzip หา central directory ท้ายไฟล์ได้เองแม้ binwalk งอแง)
  6. 6ถ้า -e ไม่แยกอะไรออกมาเลย ดู offset จาก step 2 แล้วดึงเอง: dd if=image.jpg of=hidden.bin bs=1 skip=OFFSET
  7. 7พิมพ์ file hidden.bin ยืนยันชนิดไฟล์ก่อนเปิดต่อ
  8. 8ถ้ายังไม่เจอไฟล์แปลกเลย ลอง binwalk -E image.jpg ดู entropy — ส่วนที่ entropy พุ่งสูงผิดปกติอาจเป็นข้อมูลเข้ารหัส/บีบอัดที่ signature ไม่ตรงมาตรฐาน
  9. 9ถ้า entropy เรียบปกติทั้งไฟล์ แปลว่าโจทย์นี้ไม่ใช่ 'ไฟล์ซ้อนไฟล์' — ไป exiftool ดู metadata ต่อ แล้วค่อยไปเทคนิค LSB/bit-plane ตามชนิดไฟล์
ใช้ binwalk แล้วไปทางไหนต่อ
binwalk image.jpg
สแกนหา signature ไฟล์ที่ฝัง/ต่อท้าย
เจอ offset ไฟล์อื่นไหม?
✅ เจอ (เช่น Zip/PNG ต่อท้าย)→ ทำ binwalk -e แยกไฟล์ออกมาต่อ
❌ ไม่เจออะไรเลย→ ข้ามไปเช็ค metadata ก่อน (ตัน)
binwalk -e image.jpg
auto extract ไฟล์ที่ฝัง
extract ได้ไฟล์ที่เปิดใช้ได้ไหม?
✅ ได้ไฟล์ปกติ/เปิดได้→ เปิด/unzip หา flag ต่อ
❌ ได้ zip ที่มี password→ fcrackzip -D -u -p rockyou.txt หรือ zip2john+john
❌ -e ไม่แยกอะไรเลย→ dd if=file of=out bs=1 skip=OFFSET เอง
เจอ flag ใน metadata ไหม?
✅ เจอ→ จบ ได้ flag
❌ ไม่เจอ→ เปลี่ยน channel ตามชนิดไฟล์ (LSB/bit-plane/spectrogram)
PNG/BMP → zsteg, JPG → steghide, WAV → spectrogram
เลือกหัวข้อเฉพาะตามชนิดไฟล์จริง
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
ดูชนิดไฟล์จริงfile-aperisolve.com (upload แล้วรันชุด triage ให้)
สแกนหา signature ที่ฝังbinwalksudo apt install binwalkaperisolve.com
แยกไฟล์ที่ฝังออกมาbinwalk -e / dd--
ถอด zip ที่มีรหัสfcrackzip, zip2john+johnsudo apt install fcrackzipcrackstation.net (ถ้าเป็น hash)
เช็ค metadata หลัง extract ไม่เจอexiftoolsudo apt install libimage-exiftool-perlexifdata.com, metadata2go.com
ดู entropy หาโซนแปลกbinwalk -E--
เปลี่ยนไปดู LSB (PNG/BMP)zsteggem install zstegstylesuxx.github.io/steganography
เปลี่ยนไปดู JPG มี passphrasesteghide, stegseekapt install steghide; .deb ของ stegseek จาก GitHubfutureboy.us/stegano/decinput.html
🚑 ถ้าตันสนิท ลองท่าถัดไป: zsteg ถ้าเป็น PNG/BMP (LSB), steghide ถ้าเป็น JPG/WAV และสงสัยว่ามี passphrase, exiftool/metadata ถ้ายังไม่เช็ค comment/EXIF, stego-png/stego-jpg สำหรับ workflow เฉพาะชนิดไฟล์ที่ครบกว่า — อย่าเสียเวลาวน binwalk ซ้ำถ้า entropy เรียบแล้ว

โน้ตของฉัน

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