167 words
1 minute
TCTT25 Network: Custom Protocol V2

Custom Protocol V2 [300pts] - Network Security Write-up#

โจทย์#

--- ไม่ได้บันทึกไว้ ---


ดาวน์โหลดไฟล์#

ไฟล์ดาวน์โหลด
PCAP + Script📦 GitHub Folder

ข้อสังเกต#

  • Packet STH v2 จะเริ่มด้วย "STH" และ version=0x02
  • Packet type ที่สำคัญ ได้แก่
    • HELLO (0x01) เก็บ client_nonce 8 ไบต์
    • WELCOME (0x02) เก็บค่าพารามิเตอร์การถอดรหัส เช่น server_nonce, salt, จำนวนชิ้นส่วน, ค่า LCG (a,c,seed), และ flags2
    • DATA (0x10) เก็บชิ้นส่วน ciphertext
  • ตรวจ CRC32 เพื่อคัด Packet ที่ถูกต้อง
  • ชิ้นส่วน DATA ถูกสลับลำดับด้วย LCG
  • flags2 ระบุว่ามีการ base64 encode หรือ reverse

แนวคิดการแก้โจทย์#

  1. ใช้ไฟล์ pcap ดึงเฉพาะ UDP/31337
  2. ตรวจหา packet ที่เป็น STH v2 ("STH", version=0x02)
  3. เก็บ client_nonce จาก HELLO, เก็บพารามิเตอร์จาก WELCOME, เก็บชิ้นส่วนจาก DATA
  4. ใช้สูตร LCG (a*x+c) mod n เพื่อนำมาเรียงเป็น ciphertext
  5. ถอด base64 และ reverse strings
  6. สร้าง keystream จาก (session_id || client_nonce || server_nonce || salt || k) แล้ว XOR กับ ciphertext
  7. คลาย zlib จะได้ plaintext

อธิบาย Script#

  • ใช้ struct.unpack แกะ global header ในการอ่าน pcap แล้ววนแพ็กเก็ตทีละตัว
  • Filter UDP โดยการเช็คว่าเป็น IPv4+UDP และ Port 31337
  • Filter STH v2 โดยการเช็ค header "STH" และเวอร์ชัน 0x02
  • ตรวจ CRC32 ถ้าไม่ตรงจะทิ้ง packet นั้น ๆ
  • เก็บ client_nonce
  • เก็บ server_nonce, salt, n, a, c, seed, flags2
  • เก็บ payload กับ seq
  • ใช้ LCG order ในการวาง DATA ให้ถูกต้อง
  • ถ้า flags2 มี base64 จะถอดรหัส และถ้ามี reverse ก็จะ reverse strings
  • สร้าง keystream ด้วย SHA256, XOR, แล้ว zlib.decompress
  • ใช้ regex flag{.*?} ถ้าเจอให้พิมพ์ออกมา

ผลลัพธ์#

เมื่อรัน Python Script จะได้ Flag:

flag{48e64c539d58ac64f574b3c9abd9b6b1}

Credits#

Writeup by netw0rk7 | Original Repo

TCTT25 Network: Custom Protocol V2
https://blog.lukkid.dev/posts/tctt25-network-custom-protocol-v2/
Author
LUKKID
Published at
2025-12-13
License
CC BY-NC-SA 4.0