3/1(土)~3/2(日)の2日間、SECCON CTF 2013全国大会(Final)に、名古屋大会優勝チームである********の一員として参加してきた。
ルール
詳細なルールは以下のページを参照。
SECCON 2013 全国大会 競技ルール - SECCON 2013
簡単に言うと、いくつかの問題サーバが与えられて、そこに隠されているキーワードを探し出し、スコアサーバに送信するサブミットポイントと問題サーバのフラッグページにチーム毎の5分ごとに変わるキーワードが書かれていればもらえるフラッグポイントがあり、この2つの点を合わせて、点数が多い順に順位が付く。
去年の全国大会もこの形式で、King of the Hillという形式らしい。(よくある問題を解く形式のCTFはjeopardy、攻防戦形式はatack/defenceというらしい。*1)
前回大会では、攻略するサーバの名前に惑星の名前がついていたが、今回大会では塔の名前がついていた。
NIRVANA 改 SECCON Edition
今大会では、NIRVANA改 SECCON Editionということで、競技中リアルタイムで、どのサーバにどのチームがパケットを飛ばしているかが可視化されていた。どのサーバが人気なのかとか、どのチームがどういうパケットを飛ばしているのかとか、どのサーバがdownしているとか、個人的には見てた。
旗が立っててどのチームがフラッグワードを維持しているのかとか、どのチームがどの問題解いたとかの情報も見れたのは、観客の視点的には良かったと思う。
競技中が動いている様子を録画した動画(かっこいい!!
次回も展示して欲しいですね…
NIRVANA改 SECCON Editionは本当に良かったので、来年も是非やって欲しい #seccon
— ほよたか (@hawk_light20) March 2, 2014
結果
結果は以下の通り
全20チーム中7位でした。(12位以下が諸事情あって切れてしまいました。ごめんなさ><)
チームとしては、去年の全国大会出場チームとか社会人チームが多い中、初出場でこの順位はなかなか健闘したと思う。ただ、僕はほとんど何もしてないですがw
Writeup
今回はほとんど問題解けなかったので、WriteupというWriteupが書けるか微妙ですがとりあえず書きます。(チーム全員の通信ログ取っておけば良かった…)
うちのチームが解いた問題は以下の通り(これも諸事情あって何チームが切れてしまってます…)
サーバは6つあって、それぞれKarin (カリン塔)、2.kaku (通天閣)、Pisa(ピサの斜塔)、Druaga (ドルアーガの塔)、Babel (バベルの塔)、Hanoi(ハノイの塔)の6つ。
※実はサーバの名前はNIRVANA関連のこのツイートから競技開始前にわかってしまったwあと、各サーバにあるサブミット用のKeyの数もNIRVANA良く見ると書いてあったw
砲台感出た…というより1週間でほぼ別物になった :-) NIRVANA改 SECCONカスタム→ http://t.co/QTUXfu4x9A
— Daisuke INOUE (@d_a_i_i_n_o) February 28, 2014
問題サーバのうち、Karin、2.kaku、Pisaが最初からオープンしていて、Druaga、Babel、Hanoiが1日目終盤にオープンした。
Karin
見た瞬間、「あ、これWebマンのための問題だー」と察したのでやぎはしゅとひろたんに任せるという名の丸投げ()きっと、彼らがWriteupを書いてくれているに違いない(チラッ
SECCON CTF 2013 FINAL | やぎはしゅブログ
2.kaku
見た瞬間、「あ、これexploitマンのための問題だー」と察したのでalcさんに任せるという名の(ry
※懇親会で他のチームの方にいろいろ聞いたら、Metasploit使えば解けたよと言われたので、試せば1つくらいはサブミットできたかなと後悔してますorz
Pisa
アクセスすると、表示がずれてたりするいかにも脆弱そうな掲示板があり、XSSとかありそうだなーと思いつつWebマンの問題ぽいのでWebマンにとりあえず任せる。
しかし、フラッグページへの書き込みが掲示板に書き込めばできるということに気付いたので、やることもなかったので、とりあえず後半のサーバが公開されるまでの前半は、妨害されなければ手動で自チームのフラッグワードを書き込むことをしてた。(我ながら効率悪いと思うけど…)
ちなみに、このサーバでは脆弱性を利用したいろいろな妨害をされたw最初はアラートが出てくるとかだけで大したことなかったけど、途中から掲示板に書き込むページにアクセスすると他のページにリダイレクトされたり、強制的にログアウトさせられたりとどんどん悪質なものに変わって行った。なので、2日目は途中からフラッグワード書き込むのやめましたw
でも実は、この地道な作業で150ptくらい稼いでいて、意外と点数になっていた。これ無かったら順位結構下がってたしwまあ誰にでも出来るんですが…
ちなみにKeyは、
- HTTPレスポンスヘッダ(どこかは忘れた…)
- 存在しないディレクトリにアクセスしたときに出てくる5種類ある404 Not Foundページの中の1つのソース中に、画像のalt
に埋め込まれていたとのこと。Keyは自チームのWebマン達が色々と勘違いしてて、なかなかサブミットできなかったけど、最終的にできて良かった。
Druaga
最初はアクセスが集中していたので、アクセスするのをやめた。2日目にやることなくなってアクセスしてみると、ファイルが置いてあって、True Crypt(pass is seccon)みたいな感じで書かれいた。なので、このpass使ってTrue Cryptでマウントすれば行けるかなと思い、True Cryptでマウント。すると、やけに大きいZIPファイルとテキストファイルが置いてあって、テキストファイルのファイル名が一つ目のフラグだった。(自分がサブミットした唯一のフラグでもある…)
KEY{OoiOtya}
テキストファイルの中には次のような文章が書かれていた。
Linux/x86環境にて 0609 と表示するアセンブラ短歌を探し出し
KEY{MD5(taka.jpg)}
※)アルファベットは小文字
Enjoy Hacking! :)
はい、アセンブラ短歌出ましたwまあ、とりあえず問題見てみるかーと思って、ZIPファイル開くと、同じファイル名の大量のアセンブラ短歌が書かれた画像がww(ほ○たてのパターンですね。)
画像をテキストに落として一つずつ動作させれば行けるのだろうけど、画像をテキストに落とす処理も難しそうだったし、それ出来てもアセンブラ短歌が詠めないので、サブミットポイントも取れない。それに、フラッグワードの書き込みもどうすればよいかわからなかったので、このサーバの攻略はここで攻略終了した。
Babel
他のメンバーに投げてしまっていたので、あまり見てなかったw
Hanoi
これが個人的には一番面白かったと思ったサーバ。(というか得意分野が多かった)問題のイメージを貰って、ぜひもう一度解きたい。
問題サーバにアクセスすると以下のような画像(ハノイの塔のWikipediaにも同じGIFあったw)とログインページがあった。
とりあえず、一見するとWebマンの問題だなーと思ったので、とりあえず他のメンバーに任せてた。すると、ひろたんが「画像にパケット入ってますよ」とクールに教えてくれたので、さっそく抽出して取り出す。ここに入っているパケットはオンライン予選のHidden Messageと同様に、ファイルの一番最後にパケットが入っていた。(この時点で、この問題の作者をなんとなく察したw)
ただ、今回は前回とは違い 0A 0D 0D 0A… で始まっていたのでpcap-ng形式であった。さっそくパケットを開くと、オンライン予選と同様に10.100.6.3というサーバにDNSクエリを投げていた。
なので、オンライン予選の時と同様に10.100.6.3に対してクエリを飛ばしてみたところ、「1.6.100.10.in-addr.arpa name = hanoi」とレスポンスが帰ってきた。DNSレスポンスのパケットを見ると、権威DNSサーバの名前がharuna.greatとかで何かありそうだったけど、自分はここから先へは進めなかった。
ここで、不思議なのが、問題サーバが10.100.6.1で、DNSサーバが10.100.6.3だったこと。なので、10.100.6.2に何かあると思った訳ですw
という訳で、nmapを走らせて10.100.6.0/24のネットワークを調査したところ、案の定10.100.6.2ってサーバが存在していることがわかった。1日目はこのサーバにポートスキャンを飛ばしているところで終了した。
2日目は、10.100.6.3の謎を考えつつ、10.100.6.0/24をnmapでポートスキャン。やることなかったので、-Aオプションつけてスキャンした。
# nmap -A 10.100.6.0/24 (省略) Nmap scan report for 10.100.6.1 Host is up (0.17s latency). Not shown: 999 filtered ports PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.2.22 (Ubuntu) |_http-methods: No Allow or Public header in OPTIONS response (status code 200) |_http-title: Login Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port (省略) Network Distance: 3 hops TRACEROUTE (using port 80/tcp) HOP RTT ADDRESS - Hops 1-2 are the same as for 10.100.6.2 3 168.07 ms 10.100.6.1 Nmap scan report for 10.100.6.2 Host is up (0.19s latency). Not shown: 995 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.1 (Ubuntu Linux; protocol 2.0) (省略) 53/tcp open domain ISC BIND 9.8.1-P1 (省略) 80/tcp open http Apache httpd 2.2.22 ((Ubuntu)) (省略) 143/tcp open imap Dovecot imapd (省略) 993/tcp open ssl/imap Dovecot imapd (省略) TCP/IP fingerprint: (省略) Network Distance: 3 hops Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE (using port 256/tcp) HOP RTT ADDRESS 1 0.55 ms 192.168.9.* 2 87.99 ms 172.16.0.1 3 269.10 ms 10.100.6.2 Nmap scan report for 10.100.6.3 Host is up (0.19s latency). Not shown: 998 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.1 (Ubuntu Linux; protocol 2.0) (省略) 53/tcp open domain ISC BIND 9.8.1-P1 (省略) TCP/IP fingerprint: (省略) Network Distance: 3 hops Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE (using port 256/tcp) HOP RTT ADDRESS - Hops 1-2 are the same as for 10.100.6.2 3 270.40 ms 10.100.6.3 OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 256 IP addresses (3 hosts up) scanned in 160.21 seconds
長ったらしくなったんで、いろいろ省略しました。
やはり、10.100.6.2でいくつかポートが空いてた。10.100.6.3はDNSとSSHだけ。
ここで、10.100.6.2でhttpdが動いていたのでブラウザでアクセスすると、見た目は完全に10.100.6.1と同様のページが表示された。しかし、ソースを見てみると、画像のリンクがkey.zipというファイルへのリンクになっていたり、画像も10.100.6.1にあるものとはファイルサイズが明らかに違うため何かありそうだなと思った。
ここで自分は、目grep力が足りなかったためgifファイルの中の別のファイルの存在に気付けなかったが、ひろたんがJPEGとパケットが入ってることに気づく。今思えば、Stirlingでビットイメージ使って目grepすればよかったと後悔しているw(赤枠で囲った部分付近が明らかに他と違う)
パケットに関してはDNSクエリを投げてるなぜか10.100.6.2から10.100.6.1に対してDNSを投げている。こっちから見る限りは10.100.6.1はDNSのポートが空いてなかったので、このクエリを投げてもこっちから投げても意味がなかった。(もしかしたら10.100.6.2のSSHで入ってnslookupすれば何かあったかもだけど)
一方、JPEGの方にはたぶん10.100.6.2のSSHのユーザ名とパスワードが書かれていた。ここから先はこれを使って攻略していったみたいだけど、完全にひろたん&やぎはしゅに任せていたので、彼らのWriteup期待しましょうw
感想
とりあえず、自分でも役に立つのかと思って行ったSECCONの全国大会ですが、ある程度は役に立ったかなーと思う。簡単な問題のKeyをサブミットしたり、簡単なフラッグポイントを入れるとか、nmapとかでネットワーク調査したりして他のメンバーのサポートとかをするくらいだったけど。ただ、他のメンバーにほとんど問題を投げてしまったことが申し訳なかったし、悔しかった。
それでも、全体を通してでは今回の大会はとても面白かった。普段はJeopardy形式のCTFだけど、King of the Hill形式のようなサーバに実際に攻め込むタイプはなかなかなかったので良い経験になった。また、併設のカンファレンスも興味ある内容が多かったので、良い感じに妨害コンテンツになっていた。(上野さんのTorの話とか、辻さんのセキュリティエンジニアのこれからの話とか聞きたかったな…)
あとは、ここまで強いチーム達とオフラインでやれる機会がなかったので、良い刺激をもらえた。この刺激を糧にして、力をつけて、また来年度も(開催するかは未定ではあるが)全国大会に参加できるように頑張っていきたい。あとは、大会後の懇親会でもっと他のチームの方と親睦を深めたかったけど、懇親会の時間が少なかったのは残念でした。(大人の事情があったのだろうけど…)
最後に、SECCONに参加された皆様、本当にお疲れ様でした。また、1年間SECCONを運営して下さった委員会の皆様、大変だったと思いますが、本当に素晴らしい大会を開催して頂きありがとうございました。