SECCON2013 全国大会に参加しました

closeこれは 3 年 23 日 前に投稿されたものです。最新のものではありませんので、間違っているかも知れません。

チームdodododoの席温め担当、及びセキュリティコンテスト優勝者としてSECCONに行ってきました。

セキュリティコンテスト

  • 攻撃検知コンテスト
  • スコアサーバハッカソン
  • パケットコンテスト
  • Shellcoder's Challenge

などがありますが、私は「パケットコンテスト」での参加です。

SECCON2013 北海道大会に参加しました
でも、書いていますが、応募者1名で自動決定。うーんこの。

発表スライドを載せておきます。

以前のスライドを比べ、提督Lvが上がっていることが分かります。
来年度もあるかどうか分かりませんが、「俺のほうがもっと良いパケットを持っている!!!!」という方は応募すると良いんじゃないでしょうか。

(おまけ)
sec
ちょっとtwitterに絡めた発表するだけで、公式アカウントからフォローされるからちょろい。

Writeup

6つ問題があるうちの1つしか貢献できなくて悲しい。後半の問題がOpenするまでは本当に席温め担当だった。
今思えば、後のことを考えて、フラグ書き込みの自動化スクリプトや妨害スクリプトを作っておくべきだった。

Korin

問題の名前は塔縛りだけど、「korin.tower」でかりんとうってどうなんでしょうか。

[追記]
「カリン塔」だそうです。


猫の画像出てきましたか?

2.kaku

通天閣ってどうなんでしょうか。

Druaga

あぁ^~クーパかわいいんじゃ^~

貢献していない問題だけど一応。
Stage 2の大量のアセンブラ短歌を実行するため、x86のELFを吐き出すようなスクリプトを書いた。

import sys

shell_code = open(sys.argv[1], 'rb')

sys.stdout.write(
	"\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00"
	+ "\x02\x00\x03\x00\x01\x00\x00\x00\x54\x80\x04\x08\x34\x00\x00\x00"
	+ "\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x20\x00\x01\x00\x00\x00"
	+ "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x80\x04\x08"
	+ "\x00\x80\x04\x08\x73\x00\x00\x00\x00\x10\x00\x00\x07\x00\x00\x00"
	+ "\x00\x10\x00\x00"
)
sys.stdout.write(shell_code.read())

(問題以外のx86の)アセンブラ短歌を実行してみると面白い。114514とか出力されて草。
あとで知ったが、アセンブラ短歌 On webとのことで、ブラウザからも実行できるそう。

それで、先ほどのスクリプトとOCRを用いて、順に実行していったんだけど結局見つからなかった。

SECCON CTF 2013 全国大会 Druaga write-up - math314のブログ
によると、「3/93/73/taka.jpg」という短歌が正解らしいが、見事に認識エラーしてた。

単純なパターンマッチなので、ちゃんと学習データを用意すれば上手く行ったと思う。
これを解いているのは、1日目夜のホテルだったので、頑張ればなぁ…という感じでした。

Hanoi

Stage 1
与えられた「http://han01.tower/」(10.100.6.1)というURLにアクセスすると、こんな画面が見える。
hanoi-1
ハノイの塔のGIFアニメがずっと流れている。

ここで、「readfile.php?filename=id.txt&accesscode=17d976822ca25f949ff8f552fd00ff3d」というURLにアクセスすると、そのfilenameの内容が見える。「accesscode」は、filenameのMD5ハッシュ。
実は、サーバ側で処理されないもの(.phpなど以外)は普通にアクセスできるが、あまり関係ない。

readfile.phpでindex.phpを表示させたときにKeyが見えた。
hanoi-2

なお、この仕組みは完全に
DEFCON CTF Quals の write up 書いてみた - wakatonoの戯れメモ
だった。

それに倣って、readfile.php自体をreadfile.phpしてみたが、

<?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";
}
?>

乱数を使わないのにsrandしたり(そもそも$valueは…)していて、DEFCONのものをパクっている。
しかし、「暗号鍵を推測して…」をしようにも、何も処理していないのでできない。困った。

そこで、先ほどのハノイの塔のGIFアニメを調べたところ、先日のSECCONオンライン予選「Hidden Message?」と同じような処理が施されていることが分かった。
SECCON CTF 2013 オンライン予選に参加した&Writeup - Tahoo!!

10.100.6.3に対し、10.100.6.1を逆引きしている。
しかし、問い合わせをしても「hanoi」と帰ってくるだけで何も起きなかった。

ここで1日目終了。

問題そのものには関係ないけど、

  • wakatonoさんが似たような問題のWriteupを書いている
  • wakatonoさん作成と思われる(画像がやる夫)問題がオンライン予選で出され、似たような問題が出た
  • オンライン予選のときと、今回とでネームサーバが「haruna.great」と共通
  • 「haruna.great」は「(艦これ×アルペジオイベのときの)ハルナすげぇつええ」「超重力砲すげぇ」という意味だと思う
  • こんなことするのは、忠鉢さんとwakatonoさんしか知らない
  • パケットだし…?

ということで、問題作成者はwakatonoさんだと思う。

Stage 2
ホテルに戻っていろいろ考え、競技開始と同時にそれを実行に移すも何も起きず。

「Did you inspect whole web contents on this server?」と、ハノイの塔のGIFアニメが「http://han01.tower/top.gif」なことを利用して、「http://han01.tower/top.jpg」にアクセスすると、
snd
という画像が。

@akiymさん曰く、「前に見たことがある」そうで、


でした。
しかし、画像はハッシュ値レベルで一致し、何もありませんでした。しばらく園田さんをひっくり返したりして見ていたような気がする。

ここで、もう終了時間が近づいてきて、やけになってくる。
「10.100.6.3と、10.100.6.1というサーバがあるんだから、10.100.6.2もあるのでは?」という発想に至る。

結果的には、大正解で、
hanoi-3
という画面が。なんだよ「2!」って。

Stage1のときと同様にいろいろ見てみる。
hanoi-4
hanoi-5
hanoi-6
要は、key.zipを普通にダウンロード、menuをどうにかして入手、menuのMD5ハッシュ値を計算してkey.zipを回答すれば、keyが貰える。
そして、Stage3へは、10.100.6.2にSSHでログインすれば良い(ユーザ名とPWは手に入れなければならない)。

key.zipの解凍は、先ほどのDEFCONのものと同様なのだが、mcrypt系の環境が揃っておらず、@akiymさんにやってもらった。

Stage3
Stage2のハノイの塔のGIFアニメは、Stage1とファイルサイズが異なっており、別のパケットが埋め込まれていた。
さらに、JPEG画像や、GIF画像(表示されているものと同じもの。ファイルの後ろを見られてもGIF画像のままだと誤解させるため?)が含まれているような感じだったが、良く分からなかったので、これも@akiymさんに取り出してもらった。申し訳ない。
binwalkで出来るらしいです。JPEG画像にログイン情報が書かれていた。

SSHでログインすると、Stage2で入手したmenuが動いている。
1~3までの数値を入力すると、lsやらwやら(あと一つ忘れた)を実行できる。

wでの結果、「wakatono」というユーザ名が見えたし、このときのハノイの塔のGIFアニメにもDNSの逆引きパケットが含まれており、その結果が「iona」だし、やっぱりなという感じだった。

ん…?

"h" << "iona".reverse
iona => 401 => 01 <= han01 

しかし、lsやらwなどのコマンドを実行した後はすぐに接続を切られてしまう。
だが、@lmt_swallowさんによると、「(適当な2桁の数字)/bin/sh」などでシェルを起動できるらしい。

その上で、Maildirを覗くと、「login.pcap」の添付されたメールが見つかる。
そのパケットを見ると、10.100.6.1で動作中のSquirrelMailへログインしている様子が伺える。
hanoi-7

10.100.6.1は、Stage 1のサーバなのだが、Virtual Hostで「Host:iona」のときのみSquirrelMailのページヘ飛ばしているんだと思う。(追記 3/11: そんなことはなかった模様)
平文でログインID、PWを飛ばしているし、あとはログインするだけなのだが、ここで時間切れ。もっと早く気づいていれば…惜しいことをした。

ただし、競技終了後の閉会式でifconfigの人が「hanoiのサーバは4つある…」と言っていたので、もしかすると「10.100.6.4」とかも動いていたのかな?確認すれば良かった。
確認する時間があったかは微妙だけど、裏でnmap動かすくらいだったら出来ただろう…。

ネットワーク構成

SECCONと、チーム内のネットワーク構成について。

各チームのテーブル上には、BBR-4xG系のルータが置いてある。
「チームへの攻撃は禁止とし…」「競技開始時間にはDHCPでアドレスが割り当てられるので…(運営の好きなタイミングでアドレス配布ができる)」と言っていたので、普通にスイッチとして動作させていると思っていた。
しかし、チームごとに割り当てられるIPアドレスのセグメントが異なっており、驚いた。

恐らく、DD-WRTか何かを入れて、「(NAPTしない)ルータ」として動作させた上で、DHCPリレーエージェントを使っているんだと思う。
さすがだ。だったら、Buffaloを使っているのも分かる。公式FWでも出来るのかも知れないが、知らないので触れない。

そして、dodododoでは、チーム内とそれ以外のネットワークとの通信をすべてキャプチャしていた。
sec-nw

軽く結果を載せると、1日目は、

$ capinfos seccon_1_1.pcap
File name:           seccon_1_1.pcap
File type:           Wireshark/tcpdump/... - pcap
File encapsulation:  Ethernet
Packet size limit:   file hdr: 65535 bytes
Number of packets:   1018 k
File size:           502 MB
Data size:           486 MB
Capture duration:    24142 seconds
Start time:          Sat Mar 01 03:49:43 2014
End time:            Sat Mar 01 10:32:05 2014
Data byte rate:      20 kBps
Data bit rate:       161 kbps
Average packet size: 477.67 bytes
Average packet rate: 42 packets/sec
SHA1:                1534ed88717b8ac72ff3e3fc0a5c2a28791e66cf
RIPEMD160:           c8e0b7aa9510e493f9e1f1138e73af89408820b3
MD5:                 24f68df9c7376c1dc42b413c9bb6a029
Strict time order:   False

UTCです。1,013,964パケットぐらい? 2日目は、

$ capinfos seccon_2_1.pcap
File name:           seccon_2_1.pcap
File type:           Wireshark/tcpdump/... - pcap
File encapsulation:  Ethernet
Packet size limit:   file hdr: 65535 bytes
Number of packets:   955 k
File size:           301 MB
Data size:           285 MB
Capture duration:    18967 seconds
Start time:          Sat Mar 01 23:46:09 2014
End time:            Sun Mar 02 05:02:16 2014
Data byte rate:      15 kBps
Data bit rate:       120 kbps
Average packet size: 299.33 bytes
Average packet rate: 50 packets/sec
SHA1:                2ca7d51552ac0608826f69f72072f7f433a35da2
RIPEMD160:           e6d71d66d1fe54b7d7926fd6e96dac543196ed78
MD5:                 8bc107a2a67c9379f34bcaa888c1574f
Strict time order:   True

948,350パケットぐらい。何で「Strict time order」が違うんだ、何があった。
性能のせいか、何パケットかDropしているところもあったり。

1日目と2日目でも、1日目に80MBのファイルを4人がダウンロードしたことを考えると、だいたい同じぐらいですかね。
中身的には、こんなデータがあった。
sec-1-1
sec-1-2

他チームからも少し飛んでくる。
sec-2-1

競技開始時間になると、「possible ARP spoofing!」と言われまくるんだけど、これもたぶん性能のせいで取りこぼしがあったんだろうなぁと思う。
LAN内でキャプチャしているわけだからねぇという感じで。

あとは、Snortとかで攻撃検知も面白いかもしれない。

関連情報

気付いたら追加します。
これで、Writeup書いたので、VMイメージください!オナシャス!何でもしますから!

[追記]
SECCON CTF 2013本戦に参加した - ももいろテクノロジーで見たけど、inaz2/SimpleHTTPProxy · GitHub、SSLもイケるっぽくて良さ気。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>