すでに1週間以上前になってしまいましたが...
参加したからには、レポートを書いておかなければ!
先週はいろいろ忙しかったのです。
まずは感想とか...
2012年5月 19 - 20日 と、SECCON CTF というイベントに参加しました。SECCON については、以下のページとかを見ると良いと思います。
所謂、Capture The Flag という競技をするセキュリティ系のイベントです。
セキュリティ系男子じゃない僕がなぜセキュリティ系のイベントに参加してるかはお察しください。
というより、まあ、セキュリティ&プログラミングキャンプの講師の方々が結構関わっているというのもあって、せっかつくばでやるなら参加してやろうじゃないかというわけです。
僕が参加している産学間連携推進室(AC部屋)もちょっとお手伝いするみたいだったですし。
ifconfig というチーム名で参加しました。
僕が決めたわけじゃありません。
Twitter で相手がいない!みたいなこと呟いたら、くりす (@x86_64) とねこにゃん (@nekonyaaaaaaaan)が拾ってくれたのでこのチームに参加することになりました。
さらに、きむ (@KIM_TPDN) も追加されて、ifconfig は coins09 + 10 混成チームとなったわけです。
他にも、つくばからは coins11 の urandom チームがいましたし、つくば以外のメンバーと混成チームがあと2チームありました。
結果からいきましょう。
というわけで、勝ちました。といっても、接戦でした。特に後輩達と。
4人とも大人気なく本気で徹夜のガチバトルしてました。
2日間とても楽しかったです。
CTF 初めてでしたが、また機会があったら参加したいとも思いました。
こういう機会を与えてくれた運営の方々、スポンサーの方々に感謝です。
ただ、1日目の交流会は余り他の人たちと交流できませんでした。
というのも、1日目は不完全燃焼状態で終了してしまったので、色々考えこんでましたし、つくば同士で固まってしまうの良くないですね。
問題の傾向と対策 Day 1
ここからは、ちょっと長くなりますが CTF に出題された問題について話したいと思います。OOM Killer
まず最初に僕が手を出した問題は、OOM Killer の問題です。規定の VM のイメージのようなものを落として、そこで OOM Killer を発動させると回答が出てくるというものなので、楽勝!と思ってたのですが、楽勝じゃありませんでした。
正確に言うと、問題自体は楽勝でした 。
ただ、僕の PC には VMware が入ってませんでした。Debian sid on MacBook Air なマシンを持ち込んだのですが、インストールがうまく行きませんでした。
急遽、古い netbook を参戦させて解いた時には、1時間半ぐらいたってました。
問題も、瞬殺できてたみたいなのですが、1分間維持させる、みたいなことが問題文に書いてあったので、OOM Killer のメッセージなんてまともに見てなかったのですが...
観客として、知合いの人が来ていまこんな問題やってるんですよ!答えでてこないんです!って言ってたら、これ答えじゃない?って言われて...
びっくりですよね。画面上に出てたのに、答えが出てないって思ってるなんて。
ちなみに、この問題は、malloc とか fork 使えば潰せます。ただ、単純に malloc しただけでは、意味無いです。
最近の Linux は malloc した領域も使わないと割り当てなかったりします。
つまり、単純に malloc() だけ繰り返してると、32bit マシンの場合 3GB まで確保されて、止まる、みたいなことが起きます。物理的に 3GB メモリ乗ってなくても。
実際、そんな事知らなくても、fork() しまくれば潰せるみたいです。
僕は、自分でコード書くのも面倒なので、ぐーぐる先生に伺って適当にサンプルコード引っ張ってきて潰しました。
まあ、最初は慣れですよね。CTF 初参戦なんで、最初からうまく行くなんて思ってません。
僕のチームはこれが、実質初得点になります。
うるう秒
その後、他の問題も眺めつつ、わっかんねーとか言いながら時間潰してました。次に挑戦したのが、確かうるう秒の問題です。
なんか、うるう秒でどっかのロック変数がデッドロックになるんだけど、その変数を答えよみたいな問題で、vmlinux を渡されて...
調べるのも面倒なので、時間勝負で CTF はブルートフォースありらしいので...
$ objdump -D vmlinux | grep _lock
で上から順番に入力して撃墜しました。 おわり。
kill me
前述の OOM Killer と同じ VM イメージの中に、killme というプロセスがいて、これを殺すと回答が出てくるという問題です。root はないです。普通には殺せません。
kernel のバージョンは 3.2.5 とかで、mempodipper (CVE-2012-0056) がいけるかなーとおもったのですが、だめでした。
僕は解いてません。くりすが解きました。vmdk...
1日目は、そんなかんじで終わりだったと思います。
もう一問ぐらいなんかといたような気がしたけど、大した問題じゃなかったような。
1日目の順位はそんな上のほうじゃなかったです。
他のチームとといてる問題のカテゴリーが違っていて、OS 系の問題全部撃沈したので、それだけで僕は嬉しかったです。
問題の傾向と対策 夜の部 - Day 2
そんなこんなで、大した問題も解けずに、夜になります。16時で終わりだったのですが、もちろんお持ち帰りできる問題はお持ち帰りします。
大学に居残りで、そのまま徹夜します。
newcomer architecture
まずは、こいつから手を付けます。昼間の時点で少し手を付けていたのですが、全然わかりませんでした。
"RITE0009000000090000MATZ"
から始まる、意味不明なバイナリのようで全部 ASCII なファイルを渡されて、キーワードを探してくださいと...
ぼくは、馬鹿正直にこのよくわからないファイルを整形して、何かの VM かマシンのコードだと思っていて、オリジナルなのかなーと思っていたのですが、違いました。
ねこにゃんが、mruby の mrb ファイルだという事を教えてくれます。
わからなかったら、まず Google!が鉄則ですね... (Matz って時点で気づけ
ここまで来たら、作業が捗ります。
mruby をコンパイルして実行しますが Linux ではうまくいかず、Mac で動かしたら gets が No Method Error...
mruby のコードを読み始めます。
どうも、gets が implement されていないようです。
しかし、よくわからないので gdb に流して処理をトレースし始めます。
..., ..., ......, わかりません!
しかしあることに気づきます。
なんか、VM のコードの中に、VM の命令とオペランドを出力するデバッグプリントのようなものが実装されています。
もしや... と思い $ mruby --help してみると、--verbose というオプションがあったー
--verbose つけて mruby 実行したら、VM の処理が全部出てきたー(涙目
あとは、mruby (Rite VM) のやってる処理を解析して、逆の処理をするだけです。
解析は、別に言語処理系の VM じゃなくて、僕はいま実際の CPU を未踏で開発してるようなことをやっているので、全然苦痛じゃないです... (こういうのがお好きなの!)
結局、gets で入力してもらった文字列を、キーで暗号化して、コードの中に含まれている暗号文と照合して、同一かどうかチェックしてるだけのコードでした。
XOR なので、可逆な暗号です。
つまり、中に含まれてる暗号分に逆の処理をかけるだけです。
mruby の処理系のいい勉強になりました。(かなりコード読んだ)
おわり。 => http://bit.ly/KKfYbs
IP パケットを探せ的な...
次に手を付けた問題は、IP パケットの問題です。ある通信相手のファームウェアの readelf の結果とメモリーのダンプを渡されます。
その中から、通信相手の IP アドレスを探り出せ!という問題です。
なんか今まで僕が手をつけてきた問題は、僕がそっち系得意じゃないという事もあり、全然 CTF らしくない問題ばかりですが、これは若干それっぽい。
ただし、readelf の結果、よくみると...
Machine: Renesas H8/300
なんと、H8!! おお!
組み込み分野も、セキュリティ重要ですよね!!
メモリーダンプが、hex で書かれて読みづらいのでバイナリにします。
これは、間違いなく KOZOS です。ここで勝ちを確信しました... が?
CTF 慣れしてない僕は、過ちを犯します。
IP パケットっぽい部分は .bss セクションに、何度も繰り返しっぽい文字列が現れているので、すぐにわかったのですが、IP がどれかわかりません。
と、違う問題も見てたり、休んだり、全然違うことしたりして、この辺で夜が明けます。
RedBull を補給し、そのまま CTF 会場へ向かい再開。
夜の部の成果で、得点ボード上トップに立ちます。
血迷った僕は、とりあえず、KOZOS のコード読み始めましたw
HTTP, TCP, IP の部分のコード読んで、構造体の並びとか見て、割と当てずっぽうでやってみたのですが、うまく行きませんでした。
が、そもそも HEX -> IP アドレス変換の簡単な関数を Python で書いていたのですが、そいつが間違ってるのに気づいたのが 30 分ぐらいあと。
通りました。なんで Python のプログラムが間違ってるかと思ったかというと、IP パケットの特徴を調べるため、このページを見てると、どうも 45 00 から始まっているので、45 00 で grep かけるとあるし、ちょうど狙ってたところ同じだし...
IP アドレスは、先頭から 9 バイト目から。
プログラムじゃなくて、手で変換したら、一発で通ったという...
KOZOS のコードも、H8 も全く関係ない問題でした。
ちなみに、CTF ガチ勢はこれぐらい 目grep できるのでしょう。
その他...
CODE39 は一発でわかりました。初日から怪しいと思ってました。問題は、CODE39 で、全くヒントなしです。
このブログを見てるあなたもキーワードは解けるはずです。
くりすにヒントを教えて手で解いてくれました。
お城の画像、これはどっかで見たことがあって同じ問題じゃないかと思って、gimp で開いたら案の定レイヤーが重なってました。
拡張子は jpg ですが、gimp で開くと実は後ろのレイヤーに答えが書いてあるという。
John のやつ、sed -e 's/Z//g' で SHA1 まではわかりましたが、僕はその後諦めて、ねこにゃんが解いてくれました。
僕が関わったのこれぐらいですかね?
ほかは手を付けたけど解けなかったとか、他のメンバーが頑張ってくれました。
バランスのよいチームだったし、Web 系も最後に潰せたし、それを眺めていただけで面白かったです。
最後の方は、urandom (coins11 勢) と接戦で、抜きつ抜かれつ、残り1時間で得点ボードが消えるまで100点差でした。
というより、筑波勢2チームの潰し合いで、他のチームを若干置いてきぼりにする筑波パワーw
僕達のチームは得点ボードが消えた後、 こっそり1問得点したりしてます。保険!
最後に...
つまり、僕はガチセキュリティの問題はほとんどといてないんですよ。こんなヤツが勝ってしまってごめんなさい!
少なくとも、出るからには頑張りたかったですが、本気で勝てるなんて思ってませんでした。
CTF 出まくってたり、スポンサーついて支援を受けたりしてるチームもあるみたいだったし、僕より若い人多いし、ね。
CTF 楽しいです。つい本気になってしまいます。
あと、普通のプログラミングコンテストより、もっといろいろな知識が必要なので、かなり実践的な競技だと思いました。
SECCON は今年もあと何度か開催するみたいなので、興味のある方は参加してみましょう!
学生のみですが、参加に関しては色々支援もあるので。
また機会があったら参加してもよいと思っているので、その時はよろしくお願いします!
0 件のコメント:
コメントを投稿