サイバーコロッセオ 2017 Writeup
サイバーコロッセオに参加してきました。
詳細はこれ。
写真はほとんど撮ってないので何も視覚的な情報がないんですが、今のところSECCON公式Twitterからランキングを見られるのでそちらからどうぞ。
これはチームのアレ。ドクターマリオっぽい背景ですね。
結果
SECCON本戦と同じメンバーで出場して、なんとか優勝することができました。途中でurandomに迫られたりするなどありましたが、一旦1位に出てからは順位を下げず切り抜けられました。ATK/DEF=1400/485で、Attack pointも全体で1位でした。
SECCONのサイトに書いてあるとおり、副賞の賞品がめっちゃ豪華。どれくらい豪華かって言うと電源を入れると触って遊べるWindows10が起動する。
ちなみに新宿のビックカメラで買ったらしい。
2位賞品は11インチモバイルモニターだったみたいですがそっちもよさそうでした。
問題セット的には4人1チーム・4時間半で取り組むには時間がかかりすぎる問題とかハマリポイントとか少なくてサクサク解けたのでバランスがよかったです。SECCON本戦みたいな長時間の競技より短時間で簡単めに設定されているCTFのほうがKing of the Hillは合いそうな気がします。
以下、雑です。
サーバ1
素数p, qを送信し、pqが最も小さいチームにDefenseポイントが入るだけの単純な問題。他チームに対してはpqを素因数分解してp,qを投げつけると倒すことができる。ちなみに素数p, qの送信は30分に1回しか行うことができない。
Defenseのみの単純な問題で、しかも1度に1チームしかDefenseできないので結構しんどい問題。適当なビット数のp, qを投げるようにしておいてあとは放置。ちなみに書いてる途中で思いついたことがあって、他チームのIPを使って無駄にでかい素数をsubmitするようにしたら問題が破滅したのでは……?
サーバ2
Exploit問サーバ。keyword1~3.txtが置いてあってそれぞれAttack point 100pt分になっている。初心者向けを意識してる感はあったが、keyword3.txtはちょっと慣れがないとハマり続ける感じだったので3つ目のフラグを取っていたチームは少なかった。
keyword1.txt
メンバーのhiromuが解いた。fork不可の環境下でkeyword1.txtを読むだけ。(例: exec や read LINEなど)
keyword2.txt
これもhiromuが解いた。投げた文字列をシェルコードとして実行してくれるらしいのでopen-read-writeをする。
keyword3.txt
No ASLR/NX disableかつBOFを起こす状況下でkeyword3.txtを読む。
スタックのアドレスを教えてくれるので適当にリターンアドレスを書き換えて飛ばせばよい……が、 scanf("%s", ...)
で読み込むという罠があって空白文字があるとシェルコードが千切れてしまう。解決策は単純で、スタックのアドレス決め打ちで適当にstagerを噛ませてreadすればよい。
ちなみにAlpine Linux上で動いているらしく、手元で動かすにはmusl libcのインストールが必要だった。
Defense flag
サーバ内でWebに公開されそうなパスを調べると、nginxっぽいDocRootにflag.txt(/usr/share/nginx/html/flag.txt
)があるのでここにチームのDefenseフラグを書き込む。SECCON本戦の時にハマった覚えがあるけど、追記限定ファイルに書き込むにはopen時の第2引数をちょっと工夫しないといけない気がする。 (O_WRONLY|O_APPEND=0x401
)
サーバ3
Webカメラが動いている風のサービス。
フラグ1
知らない間にakiymさんが解いていた。リクエストを書き換えて範囲外の画像を取得するとフラグがあるらしい。
フラグ2
フラグ1でデバッグポートを探せ的な内容なのでポートスキャンをすると57017ポートが空いていて、繋ぐと謎のコンソールが現れる。
help
でヘルプを見られるのはすぐ見つかるが意外と[command] help
という書式はないので時間がかかった。適当にadmin
config
show config
したらフラグが手に入った。
フラグ3
set keyword help
を知らず、Defenseを取ったあとくらいにnolzeさんが発見していた。
Defense
akiymさんがいい感じに自動化してくれた。configを保存するコマンドでflag.txtに書き込むとよいらしい?
サーバ4
CaitSith Linuxで制限された環境内でクエストをクリアする感じのゲーム。早い段階からurandomがDefense pointを稼いでいたので差を埋めるためになんとか解ききりたかったが、だめでした。
stage1
cat /stage1.txt
で内容を見て/usr/bin/stage1 [uid] [gid]
するだけ。
stage2
素数チャレンジをしている間にメンバーが解いていた。
cat
が制限されているのでbash組み込みのread
を使ってファイルを読む。while read LINE; do echo $LINE; end < /stage2.txt
/usr/bin/stage2
を実行するとよいらしいが、中身がさっぱりわからない。strace
が許可されているので中身を追うと、/var/tmp/seccon/flag.txt
を作ろうとしてエラーになっていることがわかる。ここがちょっとエスパーっぽいが、flag.txt
を消すといいらしい。実際にはすごい勢いでflag.txt
が生成されているらしく(妨害?)無限ループを使って消さないとだめだった。
stage3
MD5がfee1dead
から始まるようなファイルを用意し、/usr/bin/stage3
の引数に渡すとクリア。
32bitの一致なので探索する問題かと思い、とりあえず探索するがあんまりすぐには見つからないので他の方法を考える。チーム内では「PATHを弄ってmd5sumを騙す」という競技終了後の答え合わせでも出た方法ではないかと試していたが、どうもうまく行かなかったらしい。
自分もそれに乗っかって適当に弄っていたらmd5sumが存在しない場合でも条件を通過する(多分シェル芸か何かで判定してる?)っぽくてPATH=
で通過できた。
ここでやっと1つ目のフラグを入手。サーバ4はここまで。
終了後に聞いた話では、このあとCAITSITH=yesつきでsshを叩いたりCaitSithのポリシーを読んでDefenseフラグを書いたりするらしいです。
サーバ5
一切意図していたわけではないが競技中に1度も問題を見なかった。おわり。実際はnolzeさんがほぼ攻略していたので実際のところあまりやることがなかったっぽい。
サーバ6
でっかいpcapファイルが降ってくる。24*4人が接続するネット環境でよくあのサイズのファイルを配ったなと言う感じですね。USBメモリだったのを思い出した。サーバ1とは逆にAttack flagのみの問題。そういう理由もあってか、この問題に関してはフラグの点数が200, 100, 200, 400という感じにぶっ飛んでました。
pcapファイルを目grepするのはhiromuがめっちゃ頑張ってくれて怪しいIP * 2を特定してくれたので自分はDNSリクエストからフラグを発掘する部分をやった。怪しいIP発掘は多分各200点だった気がします。
[A-Z0-9]\.api\.google\.comのドメインを解決しようとするパケットがめっちゃ飛んでるので繋げてbase32をすればおわり。
最後の1問はpingでモールスしたのを解析すると言う問題だったらしいけど実際にプロットするところまではやらなかったので全く気づけなかった。「通信の間隔」というヒントで1つ1つのパケット同士の間隔を見てしまったが、マクロ的に見ないとだめだったらしい。ちなみに400点問題だった思うのでこの1問で相当ゲームバランスが崩れてそう。