読者です 読者をやめる 読者になる 読者になる

PoliCTF writeup

CTF
PoliCTFにvulscryptosとして参加して、全体で25位、日本では3位でした。

初めてのチーム戦で、3日間「コワーキングスペース茅場町 Co-Edo」にてオンサイトでチーム内の関東組などで4〜5人集まって泊まりで行いました。

僕は雑魚なのでクソエスパー問のJohn the Dropperだけしか解いてないのですがwriteupを書きます。

John the Dropper

I am afraid John is in trouble. I feel he needs help but I can't find any message from him. John does not need a port to communicate.

dropper.polictf.it



まず、ポートスキャンをしたら
TCP/21 ftp
TCP/554 rtsp
TCP/7070 realserver

があいてて、全部繋ごうとしたけどtimeout食らいました。
ちなみに554と7070はrealplayerとかのやつです。
他のすべての問題サーバーでこのポートは空いていた&途中で追加された[John does not need a port to communicate.]という文章で関係ないなと判断しました。

ということで、途中から追加された文章から推測すると、第3レイヤの通信で何かわかるはずと判断し、scapyを使って様々なICMPパケットを送りました。(nmap -sOによりICMPは使えると分かったため)

パケットは所々届かなくて、電波が悪いなと思っていました。

アプローチとして、SSLのHeartbleedのようにIPlengthをいじればflagが送られてくるのか?とか思いscapyのソースコードを持ってきて、pythonで攻撃とかをたこやきさんとやっていたのですが、厳しい……(5時間くらい経過?)

そして、ふと100点問題だからそんな複雑なわけがないと思い、単純にpingをずっと飛ばしてん〜〜っとしていたところ、電波悪すぎじゃね?と思い他のサイトに送ってみると…普通に飛ぶ。

ここで、わざとpingを落としていてそれがメッセージになっているのか!?と思いよく見てみたところ、落とされるpingのシーケンス番号が全く一緒だと気付きました。
そして、落としていないシーケンス番号を書き出し、差分をモールス信号として変換するとフラグが出てきました。
僕がpythonを書くとあれなのでプロに変換は託しました。

flag{it-is-never-too-late-for-a-drop}