A digital identity inspired by Oman was transmitte...

Tạo vào: 14 tháng 7, 2026

Trả lời bằng GPT-5.6 Thinking bởi Chat01

Câu hỏi

Echoes_of_Oman_CTF.zip

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

Suy nghĩ

undefined

Suy nghĩ

undefined

Suy nghĩ

undefined

Suy nghĩ

undefined

Suy nghĩ

undefined

Suy nghĩ

undefined

Suy nghĩ

undefined

Suy nghĩ

Finalizing the writeup with citations

I need to verify the integrity of the zip and checksum, ensuring there are no path issues. For the writeup, we’ll include citations only for technical claims from web sources, like those about steghide. No need to cite local facts, as there’s no citation system for local files. We'll state facts straightforwardly, as required.

Thought for 17m 29s

Trả lời

Đã solve xong.

Flag: 1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}

:::writing{variant="document" id="68421"}

Echoes of Oman — Writeup

1. Tổng quan

Capture chứa hai lớp dữ liệu bị che giấu:

  1. Một ảnh JPEG được chia thành 9 mảnh và truyền qua nhiều TCP stream.
  2. Passphrase mở ảnh được chia thành 4 fragment, lần lượt giấu trong DNS, ICMP, HTTP và TCP.

Quy trình giải:

text
PCAP ├── Reassemble 9 TCP streams có header OMN │ └── oman_artifact.jpg └── Khôi phục 4 key fragments ├── Hex ├── Base64 ├── ROT13 └── Reverse we@are@omani@team Steghide extraction final_identity.txt 1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}

2. Phân tích capture

Mặc dù file có đuôi .pcapng, magic bytes cho thấy đây thực chất là classic PCAP.

Capture có tổng cộng 3665 packet:

ProtocolPacket
TCP2275
UDP744
ICMP426

Trong capture có rất nhiều traffic đánh lạc hướng:

  • TCP payload bắt đầu bằng XYZ.
  • Các HTTP token như not-the-real-pass.
  • Những chuỗi gần giống passphrase như we@are@testing@only.
  • Nhiều kết nối không liên quan đến artifact cuối.

Điểm đáng chú ý là các TCP stream gửi tới port 4919.

Wireshark filter:

text
tcp.dstport == 4919 && tcp.len > 0

3. Khôi phục ảnh từ TCP

Có 9 TCP stream thật từ:

text
10.40.19.77 → 10.40.19.200:4919

Mỗi stream bắt đầu bằng header tùy biến:

text
Offset Size Nội dung 0 3 Magic "OMN" 3 1 Chunk index 4 1 Tổng số chunk 5 4 Chunk length, big-endian 9 N Chunk data

Các chunk:

IndexSource portBody length
0898138784
13311138784
23980938784
31480738784
4875838784
56414738784
65454338784
72135938784
83102638780

Sau khi TCP reassembly, bỏ 9 byte header của từng stream và nối body theo thứ tự chunk:

python
artifact = b"".join(chunks[i] for i in range(9))

Kết quả:

text
File: oman_artifact.jpg Size: 349052 bytes Type: JPEG JFIF, 1600 × 1200 SHA-256: c2414ac003839cc226b4300affb34c696a59cd487ee267a118767068920d3587

Ảnh thu được là phong cảnh Oman và có chữ OMAN. Tuy nhiên, flag không xuất hiện trực tiếp trong ảnh, cho thấy còn một lớp steganography.

4. Khôi phục passphrase

Bốn fragment thật nằm gần cuối capture.

Fragment 1 — DNS TXT

DNS query:

text
vault-key.archive.oman-lab.local

TXT response chứa:

text
1:776540

Giải hex:

text
77 65 40 → we@

Fragment 2 — ICMP

ICMP payload:

text
KEYFRAG:2:YXJlQA==

Base64 decode:

text
YXJlQA== → are@

Fragment 3 — HTTP Cookie

HTTP request:

http
GET /heritage/session-check HTTP/1.1 Host: archive.oman-lab.local Cookie: keyfrag=3:bznav@

Áp dụng ROT13:

text
bznav@ → omani@

Fragment 4 — TCP control message

TCP payload:

text
CTRL:4:maet

Đảo ngược chuỗi:

text
maet → team

Ghép các fragment

text
we@ + are@ + omani@ + team

Passphrase hoàn chỉnh:

text
we@are@omani@team

5. Trích payload khỏi ảnh

Có thể dùng trực tiếp steghide:

bash
steghide extract \ -sf oman_artifact.jpg \ -p 'we@are@omani@team'

File được trích:

text
final_identity.txt

Nội dung:

text
Congratulations. You recovered the hidden Omani transmission. Flag: 1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}

6. Xác minh thủ công lớp steghide

Do môi trường giải không có sẵn steghide, payload cũng được trích bằng cách tái hiện thuật toán trên JPEG:

  1. Dùng libjpeg đọc các hệ số DCT khác 0.
  2. Khởi tạo random selector từ MD5 của passphrase.
  3. Mỗi bit nhúng được tính từ parity của ba hệ số DCT được chọn.
  4. Parse header steghide.
  5. Derive AES key từ passphrase.
  6. AES-CBC decrypt.
  7. Zlib decompress dữ liệu.
  8. Parse filename và payload.

Header thu được:

text
Magic: 0x73688d Version: 0 Algorithm: rijndael-128 Mode: CBC Plaintext size: 1145 bits

Một số thông số khác:

text
Non-zero DCT coefficients: 252845 Compressed payload: Yes Uncompressed size: 1017 bits Embedded filename: final_identity.txt Payload length: 104 bytes

7. Chạy solver tự động

Cài dependency:

bash
python3 -m pip install -r requirements.txt

Máy cần có gcc và thư viện phát triển libjpeg.

Chạy solver:

bash
python3 solve.py Echoes_of_Oman.pcapng -o extracted

Output:

text
[+] Parsed 3665 packets [+] Rebuilt JPEG: extracted/oman_artifact.jpg [+] Passphrase: we@are@omani@team [+] Extracted file: extracted/final_identity.txt [+] FLAG: 1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}

8. Flag

text
1940{0M4N1_N3TW0RK_H1DD3N_M3SS4G3}

9. Kết luận

Điểm chính của challenge là không bị đánh lừa bởi các token giả trong HTTP. Artifact thật được nhận diện nhờ header OMN nhất quán và chỉ số chunk rõ ràng.

Sau khi khôi phục JPEG, passphrase phải được tổng hợp từ nhiều giao thức và nhiều phép biến đổi khác nhau. Đây là sự kết hợp giữa TCP stream reconstruction, protocol analysis, encoding và JPEG steganography. :::

Phần extractor thủ công đã được đối chiếu với mã nguồn Steghide/Stegseek về magic header, selector dựa trên MD5, parity của hệ số DCT và việc sử dụng ba sample cho mỗi vertex bit. (GitHub)

Tệp kết quả: [Gói solution đầy đủ] · Writeup Markdown · Solver Python · [C helper đọc DCT] · Ảnh đã khôi phục · Payload chứa flag

Bản Markdown hiện phù hợp để nộp CTF; có thể rút gọn lại theo format CTFtime hoặc blog kỹ thuật.

Chia sẻ Q&A này