2014年3月9日日曜日

SECCON 2013 CTF 全国大会 write up [Pisa]

3月1~2日に開催されたSECCON 2013 CTF 全国大会に参加してきました。
大阪予選では惨敗でしたが、10人のチームメイトのおかげでオンライン予選を突破し、事務局からは交通費の補助まで頂き、ありがたく参加させて頂きました。
この場を借りて、チームメイトの皆さん、運営事務局の皆さん、スポンサーの皆さんにお礼申し上げます。


結果ですが、私たちのチーム「Ganbare Tigers Jr」は、エントリ順番:14、1日目終了時の順位:14、最終順位:14、と、抜群の?安定感でした。運営twitterによると、瞬間最高順位は12位だった様です。

チームで回答できた問題について、write upを載せていきます。


[Pisa]

問題
http://pisa.tower/sec_bbs/

新規登録やログインのリンクがありました。
まずは新規登録に進み、ID/PassとCaptchaを入れて登録完了。

登録完了の画面(か、その次の画面)のResponseに、
key: KEY{YuNbUllbB}
が含まれていた。

これが1つ目のフラグ。
開始直後の数分?で得点していたチームがあったが、これを見つけていた模様。
http://akiym.hateblo.jp/entry/2014/03/04/172235

さて登録したID/Passでログインすると、画面がリダイレクトされてる様な挙動でした。
Burp Suiteをproxyにして順を追って確認していくと、良くある掲示板の画面が出てきた。
ここで、件名、本文、Captchaを入れると、書き込むことができた。

で、書き込んだ内容が
フラッグワードページ
http://pisa.tower/sec_bbs/api/message.json
に反映されることが分かり、
ここに、チームのフラッグワードを書き込めば、点数が加算されました。

フラッグワードは5分おきに更新されます。
掲示板への書込にはCaptchaがあるので、アナログに手動書込を何度か繰り返します。

5分おきに更新されるフラッグワードを自動取得して、Captchaを解析して、掲示板にも自動で書き込みをしたい…と思ってみたものの、それをすぐにプログラミングする事が出来ず、手が空いたときに手動対応を繰り返していました。

そうこうしているうちにチームメンバがもう一つのKeyを発見しました。
検索していたら出てきた!とのことでしたが、詳細は上記write upによると。
404ページの画像がランダムで切り替わり、404_0.pngから404_5.pngまで存在する
404_4.pngのときのみのalt属性にKEY{hOneyToaStAtPOSTSCRIPT}が出てくる
もちろん、そのときの画像はハニートースト

この問題は全2つのフラグを見つける事が出来ました。
フラッグワードの自動化対応はどうしようか…と思いつつも、他の問題への対応に忙しく1日目は終了。


2日目
開始直後に他の問題のフラグをサブミットして、幸先の良いスタートか、と思ったのもつかの間。他の問題のフラグもなかなか見つからず、気持ちが焦ります。
小さくても加点を!と、Pisaのフラッグワードを書き込もう!と思ったが、掲示板の画面遷移がどうもおかしい。

フラッグワードページを確認すると、こんな事になっていた。
{"code":0,"message":"ok","messages":[{"id":"6497","username":"mage2","img_path":null,"title":"8dc7281c74ae75585742599834a49214","message":"a","created_at":"1393718648"},{"id":"6496","username":"1qaz2wsx3edc","img_path":null,"title":"1fa8bc1384d069682e5afb772faaef28","message":"\u003Cscript\u003EsetTimeout(function(){$(\u0027#logout_form\u0027).submit();},0);\u003C\/script\u003E","created_at":"1393718644"},{"id":"6495","username":"1qaz2wsx3edc","img_path":null,"title":"1fa8bc1384d069682e5afb772faaef28","message":"\u003Cscript\u003EsetTimeout(function(){$(\u0027#logout_form\u0027).submit();},0);\u003C\/script\u003E","created_at":"1393718644"},
(以下省略)
なるほど、JavaScriptで強制的にログアウトさせられるのね。これが自動的に大量に書き込まれるために、2日目は他チームも加算できていなかった模様でした。


終わってから、ブラウザでJavaScript切ってたら良かったんじゃねえの?とチームメンバに言われて…。
とはいえ、Captcha解析やファイル取得→更新の自動化手順は、先に用意しておくべきでした。

SECCON 2013 CTF 全国大会 write up [Hanoi]

[Hanoi]

1日目の終了30分前に公開された問題です。

まず
http://han01.tower/
にアクセスする。

ID/Passを入れると先に進めそうだが、当然分からない。

下にあるUSERのリンクは
readfile.php?filename=id.txt&accesscode=17d976822ca25f949ff8f552fd00ff3d
となっていて、クリックすると、そのファイルと思われる内容が表示された。PASSの方は後述。

accesscodeは"id.txt"のMD5なので、
これを、
readfile.php?filename=index.php&accesscode=828e0013b8f3bc1bb22b4f57172b019d
として開くと、index.php が表示された。
-----
Access granted to index.php!
if ($_SERVER[REQUEST_METHOD] == 'POST')
{
 echo "ACCESS DENIED!
";
}
//
// stage1:
// KEY{!2345&QwertY}
// Hint to Next Step:
// Did you inspect whole web contents on this server?
//
?>
-----
1つめのフラグをゲット。


画面下部のPASSのリンクをクリックしても、USERと同じ様には表示されない。
accesscodeがid.txtの時と同じなので、これをpass.txtのMD5に置き換えると内容が表示された。
daemon:fb0d7f74e509b6a4a9dd10eb8179122b36209fcb
backup:a48f53309f72df9fe7124c65605c328c0c4dd415
これをパスワードーに突っ込めば…と思い、いくつかのオンラインサイトで試してみるも解読できず。(あとで聞いたのですが、これは改行込みの文字列のハッシュ値で、撹乱ネタだった様です。)

また、チームメイトが readfile.php で readfile.php 自身を表示させてみると、このプログラムで表示できるファイル名が index.php, id.txt, pass.txt, readfile.php に制限されていることが分かった。


初日終了後、ホテルで作戦会議。
pass.txt のハッシュは、フォーマット的にはSHA1ハッシュ値と思われるが、チームメイトが john the ripper に入れてもやっぱり答えが出てこない。何か違う方式かな?と思いつつも分からぬまま…。



2日目
1つめのフラグを取得した際のメッセージに従ってチームメイトがniktoでスキャンすると、こんなのが。
+ OSVDB-3093: /squirrelmail/src/read_body.php: This might be interesting... has been seen in web logs from an unknown scanner.

http://han01.tower/squirrelmail/src/read_body.php
とすると、確かに動いてる。

ログイン画面にいく。
http://han01.tower/squirrelmail/src/login.php

ここに、昨日見つけたファイルに入っていた daemon, backup で認証できるかも!と思ったものの、パスワードが解析出来ずログインはできず。
じゃ、このリスメールに何か脆弱性があるのかな?と探してみるが、インストールされていたのは最新バージョンで分からず。


しばし時間が経って…。
チームメイトが最初のページの塔を動かすgifアニメのファイル top.gif の最後に、pcapらしきテキストが入っていることを発見する。
これはオンライン予選の時にあったのと同じではないですか!
早速別のチームメイトがファイルを切り出して確認したところ、10.100.6.3 に、10.100.6.1 の逆引きクエリを投げていた。
実際に引いてみると以下の様に。

$ dig -x 10.100.6.1 @10.100.6.3
; <<>> DiG 9.8.3-P1 <<>> -x 10.100.6.1 @10.100.6.3
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27125
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;1.6.100.10.in-addr.arpa. IN PTR
;; ANSWER SECTION:
1.6.100.10.in-addr.arpa. 3600 IN PTR hanoi.
;; AUTHORITY SECTION:
10.in-addr.arpa. 3600 IN NS haruna.great.

hanoi ねぇ…。FLAGに入れてみても反応は無し。
手詰まりのまま終了。


han01 と hanoi の違いをもっと強く疑問に思ったり、
10.100.6.1
10.100.6.3
があるんだから、
10.100.6.2
もあるんじゃないの?な思考に至らなかったのが残念。