トップ «前の日記(2014-04-30) 最新 次の日記(2015-12-31)» 月表示 編集

日々の流転


2015-07-04 [長年日記]

λ. CTF for ビギナーズ 2015 東京 に参加してきた。

CTF for ビギナーズ 2015 東京 に参加してきた。事前配布された資料を読んで比較的簡単そうという印象だったけれど、実際に講義で手を動かしてみたら良く身につきそうで、想像以上に良かった。

最後のCTF実践には「↻」という名前で参加。 16問中13問を解いて、4600点中3200点で、103人中6位だった。実際にCTFに参加するのもとても面白く、はまってしまう人が多いのも理解できた。講義で扱った範囲だけで楽しめる問題をこれだけ作るのは大変だったのではないかと思うし、運営の人たちには本当に感謝したい。

CTF問題メモ

以下、問題のメモを、解き方を忘れないうちに書いておく。 落ち着いて考えれば全問解けたのではないかと思うと、ちょっと悔しいが、初心者なのでまあ仕方ない。

問題1. 練習問題(まずはここから)(最初にこれを開く)(これを解いてから他の問題をやる) (その他 100)

フラグをsubmitする手順の練習問題。

問題2. Can you login as admin? (Web 100)

ユーザ名とファイル名を指定してログインするシステムで、SQLインジェクションを使ってadminでログインする。 講義でやったとおり「' OR 1=1; --」みたいなのを入れたら通った。

問題3. Find the flag (Web 200)

「Flag is hidden in HTTP traffic.」とあって、HTTPヘッダにフラグが書いてあったのだと思うけれど、詳細は忘れた。

問題4. 1M4G3 V13W3R (Web 300)

画像のアップローダが与えられていて、アップロードされた画像は「view.php?file=076b74f36eee552c.jpg」などのようなURLで参照されていた。 「view.php?file=ファイル名」中のファイル名を適当に書き換えると、どうも「images/ファイル名」からファイルを読んでいるようだったので、「view.php?file=../view.php」と「view.php?file=../index.php」でスクリプトをゲット、スクリプト中のコメントにフラグが書いてあった。

問題5. SQL Injection Level2 (Web 400)

SQLインジェクションの2問目。今度はユーザ名は適切にエスケープされていて、パスワード中にORは使えないそうな。 SQLには不慣れなので、SQLを想像して攻撃するのだと自分には難しいだろうなぁ、と思っていたけれど,適当な文字列をいれてログインを試したところ、実行されたSQLがヒントとして表示され、これなら何とかなるかなと思って考えてみる。

どうも「SELECT username FROM users WHERE username = 'ユーザ名' AND password = 'パスワード';」というようなSQLが実行されているようだったので、これは講義中にやったUNIONのやつだと思って試行錯誤。 不慣れなので何回か試したけれど、最終的にはパスワードに「' UNION SELECT 'admin'; --」的なやつを入れていけた。

後で解説を聞くと、ORは一回だけしか消去していなかったそうで、「OORR」とかしても良かったらしい。 しかし、よくよく考えてみると、パスワードにORという文字列が含まれてはいけないサイトって、サイトとしての根本的な機能に問題がある気が……

問題6. Universal Web Page(笑) (Web 500)

「?lang=en」で英語版、「?lang=ja」で日本語版が表示されるようなサイトが与えられていて、フラグはindex.phpに書かれているそうな。「en」や「ja」の部分を書き換えてみると、その名前のファイルをincludeしているらしいので、「?lang=index.php」としてみたが、どうもphpプログラムの実行エラーになってしまってファイルの中身自体は表示されず。 きっとPHPの変態的な機能を使うと、いけると思ったのだけれど、調べてもよく分からず、行き詰まった。

あとで解説を聞くと、「php://filter/convert.base64-encode/resource=」というのを使えばよかったらしく、事前講習資料ではこの機能についても説明されていたようだ。うぐぐ。 しかし、PHPは一体何を考えてincludeにこんな機能を用意しているのやら。 あと、CTFのために、そうでなければ(自分は)学ばないであろうPHPをあえて、しかもこんなマイナー機能を学ぶのもなぁ、という辺りでちょっとモヤモヤする。

問題7. Insecure Protocol (Network 100)

pcapファイルが与えられているので、Wiresharkで開くとTELNETだったのでFollow TCP Streamすると、パスワードがフラグになっていた。

問題8. Insecure Protocol 2 (Network 200)

pcapファイルが与えられており、Wiresharkで開くとTELNETで、こっちはログイン後にフラグが表示されている感じだけれど、肝心のフラグ部分がマスクされている。 対象のホストにtelnetで繋いでpcapファイル中のユーザ名とパスワードでログインするとフラグが表示された。 なんか、telnetコマンドの使い方でちょっとハマった。

問題9. File Transfer Protocol (Network 300)

pcapファイルが与えられており、Wiresharkで開くとftpの通信らしい。ファイルの一覧を表示後、1.txt, 2.zip, 3.txt というファイルをダウンロードしているようだったので、ftp-data でフィルタリングした後に、Export Select Packet Bytes で適当にファイルとして保存し、書かれていてた内容を連結してフラグをゲット。

問題10. This quiz is a NETWORK challenge (Network 400)

今度はpcapファイルではなくexeファイルが与えられている。 実行してみると謎のメッセージが表示される。 ネットワーク問題なので、どうせWiresharkで通信をキャプチャするんだろう、と思ってキャプチャしてみると、Basic認証付きで表示メッセージのデータを取得した後に、Basic認証無しでflag.txtにアクセスしようとして失敗していた。 なので、最初のBasic認証のデータを(base64デコードした上で)使って、ブラウザからflag.txtにアクセスしたらフラグが読めた。

問題11. Communication (Network 500)

pcapファイルが与えられていて、Wiresharkで開くとHTTPっぽかったので、 File → Export Objects → HTTP したところ、lime240.exe (LimeChat?)、rfc1459.txt (IRCのRFC)、trafficというファイルをダウンロードしていていた。trafficを保存するとこれはzipファイルになっていて、中からtraffic.pcapが出てきた。これをWiresharkで見てみるとIRCの通信っぽい。中に「ctf4b{ }」という文字列があるのは発見したが、この個数分の空白をとりあえずsubmitしても不正解、というところで時間切れ。

lime240.exeを保存した上で、それを使って traffic.pcap の中身に従って、IRCサーバに接続して同じことをしてみれば、マスクされていないフラグが表示されたのかな……多分。

問題12. NOT onion (Binary 100)

exeファイルが与えられていて、fileでgifファイルとわかったので、gifとして開いたらフラグが表示された。 画像ファイルからフラグを書き写すのが一番面倒くさい部分だった。

問題13. 読めますか?(Binary 200)

なんか表示できない変なpngファイルが与えられたので、とりあえずstringsしてctf4bでgrepしたらフラグをゲット。 pngとして表示できなかったのは、無理やりファイルを書きかえてpngとして不正なファイルになっていたためか?

問題15. READ and BURST (Binary 300)

アセンブリの実行結果を問う問題。 計算すれば良い。

問題16. DETECTIVE IDA (Binary 400)

謎のファイルが与えられていて、fileコマンドで判別するとexeファイルで、実行すると Passphrase を問われる。 IDA Pro 上で実行して Set IP で Passpharase の判定結果の分岐を正しい方に変更してみるも、文字化けした結果しか出力されず。 多分、パスフレーズのデータも使って復号化する形になっているのだろうと思い、IDA Pro の画面上のディスアセンブル結果でもパスフレーズっぽい文字列が表示されているのも見つけたが、IDA Pro の使い方がよくわからず、色々やっているうちに時間切れ。 後で解説を聞くと、文字列を照合する際の長さとかに注意して、ちゃんと追えばよかったらしい。

問題17. 5394 (Binary 500)

アセンブリの実行結果を問う問題その2。 ループを含む処理になっていて、手で考えるのが面倒臭かったので、とりあえずRubyに書き換えて実行し、フラグをゲット。

問題14?

あと、問題リストをよく見たら、14番めの問題が欠番になっていたことに気づいた。 ひょっとしてURLを書き換えてアクセスすると、隠し問題があったりしたんだろうか?

関連リンク

Tags: security