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_nonce8 ไบต์ - WELCOME (0x02) เก็บค่าพารามิเตอร์การถอดรหัส เช่น
server_nonce,salt, จำนวนชิ้นส่วน, ค่า LCG (a,c,seed), และflags2 - DATA (0x10) เก็บชิ้นส่วน ciphertext
- HELLO (0x01) เก็บ
- ตรวจ CRC32 เพื่อคัด Packet ที่ถูกต้อง
- ชิ้นส่วน DATA ถูกสลับลำดับด้วย LCG
flags2ระบุว่ามีการ base64 encode หรือ reverse
แนวคิดการแก้โจทย์
- ใช้ไฟล์ pcap ดึงเฉพาะ UDP/31337
- ตรวจหา packet ที่เป็น STH v2 (
"STH",version=0x02) - เก็บ
client_nonceจาก HELLO, เก็บพารามิเตอร์จาก WELCOME, เก็บชิ้นส่วนจาก DATA - ใช้สูตร LCG
(a*x+c) mod nเพื่อนำมาเรียงเป็น ciphertext - ถอด base64 และ reverse strings
- สร้าง keystream จาก
(session_id || client_nonce || server_nonce || salt || k)แล้ว XOR กับ ciphertext - คลาย 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/