A digital identity inspired by Oman was transmitte...
تم الإنشاء في: ١٤ يوليو ٢٠٢٦
تمت الإجابة باستخدام GPT-5.6 Thinking بواسطة Chat01
تم الإنشاء في: ١٤ يوليو ٢٠٢٦
تمت الإجابة باستخدام GPT-5.6 Thinking بواسطة Chat01
A digital identity inspired by Oman was transmitted across the network, but the data was divided and hidden among thousands of packets.
Analyze the captured traffic and recover the final identity code.
Flag Format: 1940{...}
solved challenge rồi viết writeup
Đã giải hoàn chỉnh challenge.
Flag: 1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}
:::writing{variant="document" id="47318"}
1940{...}Capture có 3.665 packet với lượng lớn traffic TCP, UDP, ICMP và nhiều TCP stream giả chứa payload bắt đầu bằng XYZ.
Hai thành phần cần khôi phục là:
Sau khi nhóm packet theo TCP 4-tuple và reassemble payload dựa trên TCP sequence number, các stream thật tới:
text10.40.19.200:4919
đều bắt đầu bằng header tùy biến:
textOffset 0–2: "OMN" Offset 3: chunk index Offset 4: total chunks Offset 5–8: payload length, big-endian Offset 9+: chunk data
Có tổng cộng 9 chunk:
textChunk 0–7: 38,784 byte mỗi chunk Chunk 8: 38,780 byte
Ghép theo thứ tự từ chunk 0 đến chunk 8:
pythonjpeg = b"".join(chunks[i] for i in range(9))
thu được file dài:
text349,052 byte
File bắt đầu bằng ff d8 ff, kết thúc bằng ff d9 và được nhận diện là JPEG 1600×1200.
SHA-256:
textc2414ac003839cc226b4300affb34c696a59cd487ee267a118767068920d3587
Các fragment xuất hiện ở cuối capture và được đánh số rõ ràng.
Packet 3657:
text1:776540
Hex decode:
text776540 → we@
Packet 3658:
textKEYFRAG:2:YXJlQA==
Base64 decode:
textYXJlQA== → are@
Packet 3661:
httpCookie: keyfrag=3:bznav@
ROT13:
textbznav@ → omani@
Packet 3665:
textCTRL:4:maet
Đảo ngược chuỗi:
textmaet → team
Ghép theo chỉ số từ 1 đến 4:
textwe@ + are@ + omani@ + team
Mật khẩu hoàn chỉnh:
textwe@are@omani@team
Có thể dùng trực tiếp steghide:
bashsteghide extract \ -sf reconstructed.jpg \ -p 'we@are@omani@team'
File được trích ra:
textfinal_identity.txt
Nội dung:
textCongratulations. You recovered the hidden Omani transmission. Flag: 1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}
Solver Python đi kèm cũng tự trích payload mà không cần binary steghide.
Các hệ số DCT khác 0 được duyệt theo từng JPEG component, từng block 8×8. Passphrase được hash bằng MD5 để tạo seed cho bộ chọn giả ngẫu nhiên. Mỗi bit được tính từ ba hệ số DCT:
textbit = ( abs(coef1) % 2 + abs(coef2) % 2 + abs(coef3) % 2 ) % 2
Cách tạo selector từ MD5 và bộ sinh số tuyến tính tương ứng với implementation của steghide; extractor của nó cũng cộng embedded value của ba sample cho mỗi bit. (GitHub)
Bitstream khôi phục được:
textMagic: 0x73688d Version: 0 Algorithm: 2 — Rijndael-128 Mode: 1 — CBC NPlainBits: 1145
Các trường header, thứ tự bit little-endian, compression flag, CRC, filename và nội dung file đều khớp với cấu trúc EmbData và BitString của steghide. (GitHub)
Với block size 128 bit và CBC có IV 128 bit:
textencrypted size = 128 + ceil(1145 / 128) × 128 = 1280 bit = 160 byte
IV:
text4af19a226e7e1f6a8dd0c4c2cb8b55fa
Steghide gọi KEYGEN_MCRYPT với MD5 và key size 32 byte. Khi không có salt, có thể tái tạo khóa bằng:
pythonh1 = MD5(passphrase) h2 = MD5(passphrase + h1) key = h1 + h2
Khóa:
text5703a35bdcdc3711604764d1d3bc91a4 e449208a73d9fece54c21258944a146e
Cách chọn key size, thêm IV vào đầu ciphertext và gọi key generator được thể hiện trong mã nguồn MCryptPP và MHashKeyGen; vòng tạo key của libmhash tiếp tục hash password cùng các byte khóa đã sinh. (GitHub)
Sau khi giải mã AES-256-CBC:
Kết quả:
textFilename: final_identity.txt Size: 104 byte
text1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}
:::