問題
問題ファイル: ch5/seccon__q1_pcap.pcap
解法
どんなファイルか調べる。
bash
$ file seccon_q1_pcap.pcap
seccon_q1_pcap.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4 (Ethernet, capture length 65535)
パケットキャプチャしたデータのため、WireSharkで確認してみる。
pingの通信だった。
色々見ていると、sequence番号が特徴的な通信があったので確認してみる。
GET /kagi.png HTTP/1.1という文字列が見つかるので、これがflagと関係してそうだと判断。
strings seccon_q1_pcap.pcapの実行結果の中で、下記の文字列を発見。
8GET /kagi.png HTTP/1.1
User-Agent: Wget/1.13.4 (linux-gnu)
Accept: */*
Host: localhost:8080
Connection: Keep-Alive
8GET /kagi.png HTTP/1.1
User-Agent: Wget/1.13.4 (linux-gnu)
Accept: */*
Host: localhost:8080
Connection: Keep-Alive
8HTTP/1.1 200 OK
Date: Tue, 26 Nov 2013 17:12:08 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Tue, 26 Nov 2013 02:52:01 GMT
ETag: "500122-aeb-4ec0b909cdaca"
Accept-Ranges: bytes
Content-Length: 2795
Connection: close
Content-Type: image/png
レスポンスのボディ部分を抜き出し、kagi.pngを復元できればflagを取得できそう。
パケットを扱うためのPythonスクリプトを記述する。
参考: 中島 明日香『入門セキュリティコンテスト ― CTFを解きながら学ぶ実戦技術』翔泳社, 2023年
python
# coding: utf-8
from scapy.all import rdpcap, Raw
packets = rdpcap('seccon_q1_pcap.pcap')
parts = []
for i in range(43, 48):
data = packets[i].getlayer(Raw).load
parts.append(data[28:])
icmpdata = b"".join(parts)
sig = b'\x89PNG\r\n\x1a\n'
index = icmpdata.find(sig)
key = icmpdata[index:]
with open('kagi.png', 'wb') as f:
f.write(key)
まとめ
ICMPペイロードの中にHTTP通信のためのデータが入るというICMP Tunnelに関する問題だった。


