PoliCTF writeup
初めてのチーム戦で、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}