bash -lc cat > /mnt/data/Echoes_of_Oman_CTF/WRITEUP.md <<'MD'
Echoes of Oman — Writeup
- Category: Network Forensics / Wireshark / Steganography
- Difficulty: Hard
- Flag:
1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}
1. Tổng quan
Capture chứa hàng nghìn packet mồi. Luồng có ý nghĩa xuất hiện gần cuối file, chủ yếu giữa:
- Sender:
10.40.19.77
- Receiver:
10.40.19.200
Chuỗi giải gồm bốn lớp:
- DNS transaction ID tạo session token.
- ICMP mang manifest đã chia mảnh và Base64.
- HTTP chỉ ra cách phục hồi artifact; TCP/4919 truyền JPEG theo nhiều stream.
- Bốn key fragment nằm trên DNS, ICMP, HTTP và TCP; ghép thành passphrase để giải steghide.
2. DNS transaction ID → MUSCAT-1940
Filter Wireshark:
text
dns.qry.name contains "stage-" && ip.src == 10.40.19.77 && ip.dst == 10.40.19.200
Các query stage-* có DNS transaction ID là mã ASCII:
| Frame | Query | DNS ID | ASCII |
|---|
| 3221 | stage-a7.archive.oman-lab.local | 77 | M |
| 3225 | stage-c2.archive.oman-lab.local | 85 | U |
| 3228 | stage-f9.archive.oman-lab.local | 83 | S |
| 3232 | stage-b3.archive.oman-lab.local | 67 | C |
| 3236 | stage-d1.archive.oman-lab.local | 65 | A |
| 3240 | stage-e5.archive.oman-lab.local | 84 | T |
| 3243 | stage-g8.archive.oman-lab.local | 45 | - |
| 3247 | stage-h2.archive.oman-lab.local | 49 | 1 |
| 3251 | stage-k6.archive.oman-lab.local | 57 | 9 |
| 3256 | stage-m4.archive.oman-lab.local | 52 | 4 |
| 3260 | stage-p0.archive.oman-lab.local | 48 | 0 |
Đọc theo thứ tự packet:
Đây là session token, chưa phải mật khẩu stego cuối.
3. ICMP fragments → đường dẫn manifest
Ngay sau DNS là các ICMP Echo Request có identifier 0x1940. Packet thật có marker:
text
M:77474dac|D:<base64-fragment>|<2-byte-index>
Filter gợi ý:
text
icmp.ident == 0x1940 && ip.src == 10.40.19.77 && ip.dst == 10.40.19.200
Các frame thật là 3263, 3266, 3272, 3275, 3278, 3283. Lấy phần sau D:, sắp theo chỉ số 2 byte cuối, nối lại rồi Base64 decode:
text
protocol=http
stream_hint=x-oman-session
stream_value=MUSCAT-1940
object=/heritage/manifest.dat
Vậy cần gửi HTTP request tới /heritage/manifest.dat với session MUSCAT-1940.
4. HTTP manifest → TCP port 4919
Frame 3290:
http
GET /heritage/manifest.dat HTTP/1.1
Body response frame 3291 là chuỗi hex. Hex decode được:
text
OBJECT=oman_archive.jpg
TRANSFER=TCP
CHANNEL=4919
CHECK=SHA256
Request /heritage/verify.info tiếp theo trả header:
text
X-Artifact-SHA256: c2414ac003839cc226b4300affb34c696a59cd487ee267a118767068920d3587
5. Phục hồi oman_archive.jpg
Filter:
text
tcp.dstport == 4919 && ip.src == 10.40.19.77 && ip.dst == 10.40.19.200
Có nhiều stream mồi bắt đầu bằng XYZ, nhưng stream thật bắt đầu bằng header 9 byte:
text
Offset Size Ý nghĩa
0 3 "OMN"
3 1 chunk index
4 1 total chunks
5 4 payload length, big-endian
9 ... payload
Có 9 chunk, index 0..8. Reassemble từng TCP stream, bỏ header OMN, sắp theo index rồi nối payload:
text
oman_archive.jpg — 349052 bytes
Kiểm tra:
bash
sha256sum oman_archive.jpg
Kết quả:
text
c2414ac003839cc226b4300affb34c696a59cd487ee267a118767068920d3587 oman_archive.jpg
Hash trùng hoàn toàn với header HTTP, xác nhận artifact được dựng đúng.
6. Ghép mật khẩu steghide từ bốn protocol
Sau khi truyền JPEG, capture phát bốn KEYFRAG:
| # | Protocol / Frame | Giá trị lấy được | Biến đổi | Kết quả |
|---|
| 1 | DNS TXT / 3657 | 1:776540 | hex decode | we@ |
| 2 | ICMP / 3658 | KEYFRAG:2:YXJlQA== | Base64 decode | are@ |
| 3 | HTTP Cookie / 3661 | keyfrag=3:bznav@ | ROT13 | omani@ |
| 4 | TCP/4919 / 3665 | CTRL:4:maet | reverse | team |
Ghép theo index:
text
we@ + are@ + omani@ + team
Passphrase cuối:
7. Extract payload steghide
Dùng steghide:
bash
steghide extract \
-sf oman_archive.jpg \
-p 'we@are@omani@team'
File được trích xuất:
Nội dung:
text
Congratulations. You recovered the hidden Omani transmission.
Flag: 1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}
Flag
text
1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}
8. Chạy solver tự động
solve.py đi toàn bộ pipeline: parse PCAP, giải DNS/ICMP/HTTP, reassemble TCP, xác minh SHA-256, dựng JPEG, ghép passphrase và extract payload steghide.
bash
python3 solve.py Echoes_of_Oman.pcapng -o recovered
Output cuối:
text
DNS token : MUSCAT-1940
Artifact SHA-256: c2414ac003839cc226b4300affb34c696a59cd487ee267a118767068920d3587
Key fragments : ('we@', 'are@', 'omani@', 'team')
Stego passphrase: we@are@omani@team
Embedded file : final_identity.txt
FLAG : 1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}
MD
cp /mnt/data/Echoes_of_Oman_CTF/recovered_by_solver/final_identity.txt /mnt/data/Echoes_of_Oman_CTF/final_identity.txt
cd /mnt/data/Echoes_of_Oman_CTF && sha256sum oman_archive.jpg recovered_by_solver/oman_archive.jpg final_identity.txt solve.py WRITEUP.md
rm -f /mnt/data/Echoes_of_Oman_solution.zip
cd /mnt/data/Echoes_of_Oman_CTF && zip -q /mnt/data/Echoes_of_Oman_solution.zip WRITEUP.md solve.py oman_archive.jpg final_identity.txt
ls -lah /mnt/data/Echoes_of_Oman_solution.zip /mnt/data/Echoes_of_Oman_CTF/WRITEUP.md /mnt/data/Echoes_of_Oman_CTF/solve.py /mnt/data/Echoes_of_Oman_CTF/final_identity.txt
Thought for 19m 45s