SECCON 2018 国内決勝 反省会会場

2018年12月23日に開催されたSECCON CTF 2018 国内決勝にTeam Enuのメンバーとして出場してきました。

結果は去年と同じ6位でしたが、獲得点数は今年の方がだいぶ高かったのでよかったです(?)。バイナリ系の問題は全く手を出さなかった(できないので)のですが、ここでは私が解いた問題について書いていきます。

松島

この問題はマリーナベイサンズにただならぬ思い入れがある方が作った、オンラインポーカーでした。フルハウス以上を出すと1つめのAttack keywordが手に入り、フォーカード以上を出すと2つめのAttack keywordとDefence keywordを入力するページのURLが手に入ります。

この問題の想定解法は、配布されているgenerate_random_handsというELFファイルを解析してフルハウスやフォーカードを出す方法(タイミングと交換する手札)を調べるという方法なんだろうと思われます。手元でELFファイルを動かしてみたところ、1秒ごとに配られる手札が変わっていたので手札は時間をシードとする乱数で決まるんだろうと思いましたし、実際にバイナリの中身を見ていたチームメイトもそう言っていました。

そんな中、どこかのチームが開始から割と早い段階でAttack keywordをsubmitしていました。バイナリを読んでどうにかする暇もないレベルの速さだったので、ここでこの問題は気合いでやれば解ける問題だと確信しました。

あとはチームメイトの @takahoyo 氏が手動でぶん回してフルハウスを出し、私はChrome Extension*1を書いて自動でぶん回してフォーカードを出しました。

f:id:iso0:20181223223116p:plainf:id:iso0:20181223223244p:plain
左のはフォーカードが出ているように見えるがフルハウス判定。実は単にフォーカードを出せばいいわけではなく、その回で出うる最も強いカードではないといけないらしい(多分)。

天橋立

XSSできるhtmlとそのペイロードを問題サーバーに登録し、他のチームにその問題が解かれるまで(alert("XSS")が出せるまで)Defence pointが入るという問題でした。

いい感じにエンコードしたペイロードしか受け付けないようにしておけばまあ解かれないだろうということで、ググって出てきたスクリプトを、javascript obfuscatorでググって出てきたサイトに突っ込んで手直しして問題としてアップロードしておきました。

この方法でも割と健闘していて、後半になってこのまま解かれないだろうと安心しきっていたら、なんと解かれてしまいました*2。どうやらyharimaチームの方っぽいです。

SECCON CTF 2018 国内決勝 writeup - yuta1024's diary

この頃には他のほとんどのチームは、ペイロードのsha256が特定の値だったらalertを実行するという問題にしていたので速攻で他のチームの問題をパクらせていただきました。

ところで、松島も天橋立もDefence keywordの更新を自動でやるスクリプトを走らせていたのですが、天橋立スクリプトがぶっ壊れていて無限に存在しないパスにリクエストを出し続けるということをしてしまっていたのは秘密です。

終わりに

今回のCTFは一部で色々言われていますが、個人的には久しぶりにチームで集まってCTFができたので楽しかったです。

運営の皆様、ありがとうございました😊

*1:https://gist.github.com/0xiso/b4345e3a3d6d535b389cde103ec332bf - フォーカードを出すために手札の一番多い数字以外を全部Changeするという戦略でやっている。ポーカーのルールが全くわからないのでこれでいいのかは不明。

*2:私が作ったDefence keyword自動アップデートスクリプトがちゃんと仕事をしているか監視するスクリプトを @takahoyo 氏が回してくれていて気づけた