トップ 最新

糸の切れた凧( a threadless kite )

ここは、管理人yamagataが方針未定のまま、何となーく思いついたことを思いついたままにだらだらと書き付ける日記帳です。ふんわりほんわかな感じでお願いします。

2013/02/06(水)水曜日ー。(大雪・・・ではないよね。)

[雑談] いろいろ。
  • 「CTFの楽しさを広く一般にも」 大人のCTF大会、「CTFチャレンジジャパン」開催 (@IT)

  • CTF Challenge Japan(Final) Write Ups - Binary 100 (とある脆弱性のシェルコード)

  • はせがわようすけ、宮本久仁男がSECCON CTFにかける思い (サイボウズLiveマガジン)

  • CROSS 2013レポート: エンジニアも避けては通れない「安全な利用規約」の作り方 (@IT)

  • 【なりすましウイルス】 “最後のメール”から1カ月 嘘、ミス、防犯カメラ…狭まる包囲網

  • アノニマスが銀行幹部4000人の個人情報を流出させる。政府のWebサイトから (GIZMODO)

  • 米FRBがハッカー被害=銀行幹部の情報流出か-メディア報道 (時事ドットコム)

  • QolyがFacebook経由のサイバー攻撃を受けた件について (qoly.jp)

  • Facebookで友達を切られると、4割の人間がソイツとの接触を全力回避すると判明 (IRORIO)

  • 首都圏で雪 ラッシュ時に間引き運転、大混雑の駅も (朝日新聞デジタル)

  • GoogleAdwordsで彼女を募集したら可愛いお姉さんと知り合えたんですが、このたび...

[CTF] CTFチャレンジジャパン2012 Write-Up: サービスアタック200 「Emailのログを盗み出せ!」ol li{margin-left:15px;padding-bottom:5px}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-o-pre-wrap;white-space:-pre-wrap;word-wrap:break-word;}問題文
textileサーバ管理者のA君は、どこからでもSMTPのログを確認したかったため、一見なんの変哲もないプログラムtest.cgiにEmailのログを出力する仕組みを実装した。たまたまtest.cgiを手に入れたB君はあなたにそのプログラムの解析を依頼してきた。test.cgiを解析し、サーバにあるEmailのログを得よ。
試したこと問題のZIPファイルを開くと、test.cgiが入っていた。・・・バイナリやんけ!(-_-;)![](/image/CTFjpn/testcgi.png)まず、password.txtにアクセスできるかどうかを確認。/cgi-bin/password.txtは存在するようだが、/cgi-bin/以下なので普通には表示できない。ここから数十分、どうにかしてpassword.txtを表示する方法がないか試行錯誤。次に、REMOTE_ADDR 127.0.0.1という文字列に注目。試しに手元のバイナリで確認すると、確かにローカルからのアクセスだとパスワード無しでメールログが表示される。ローカルからtest.cgiへアクセスする方法がないかここから数時間、試行錯誤。サービスアタック100のCGIからアクセス出来るんじゃないか?(SQLインジェクション経由でhttp://127.0.0.1/cgi-bin/test.cgiを読み込める?)とか、トップページ以下のコンテンツのどこかに隠れてるんじゃないか?とか、何か既知の脆弱性があるWebアプリ経由か?と思ってniktoかけてみたりとか、CONNECTメソッド経由やWebプロキシ経由でアクセスするんじゃないか?とか、ダメ元でフルポートでポートスキャンかけてみたりとかも。アイディアが尽き果てて、仕方がなく、慣れないIDA Pro Freeでバイナリを覗いてみた。メールログを表示する関数に飛ぶのは、やはりREMOTE_ADDRが127.0.0.1の時と、QUERY_STRINGとpassword.txtとを比較しているところからだけっぽい。しかもQUERY_STRINGについては、文字数が16文字以下の時しか処理を進めないようになっているっぽく、これではバッファオーバーフローも起こりそうにない。(?!)ただ、色々と試していくうちに、QUERY_STRINGが16文字の時に気になる挙動が:http://target:8080/cgi-bin/test.cgi?0000000000000000 → エラーhttp://target:8080/cgi-bin/test.cgi?0000000000000001 → エラーhttp://target:8080/cgi-bin/test.cgi?0000000000000002 → 正常http://target:8080/cgi-bin/test.cgi?0000000000000003 → エラーhttp://target:8080/cgi-bin/test.cgi?0000000000000004 → エラーhttp://target:8080/cgi-bin/test.cgi?0000000000000005 → エラーhttp://target:8080/cgi-bin/test.cgi?0000000000000006 → エラーhttp://target:8080/cgi-bin/test.cgi?0000000000000007 → 正常http://target:8080/cgi-bin/test.cgi?0000000000000008 → エラーhttp://target:8080/cgi-bin/test.cgi?0000000000000009 → 正常何だか良く分からないが16文字でブルートフォースしたら答えが出るんじゃないか?と思いつき、Perlでプログラムを書き始めたが・・・指定する数字によっては無限ループに入ってしまい、ブルートフォースがかけにくい。alarmを使ってプログラムが終わらない時は強制的に次に進むように試行錯誤。そうこうしているうちに、運営側からヒント。え、gdb使うの?!(Web問題なのに、、)隣に座っていたこういうのが得意なチームメイトに助けを求めたら、5分もしないうちに解いてくれました。オレの十数時間を返せ!! 解き方は見せてくれなかったので、CTF終了後に自分で勉強して解いてみた。QUERY_STRINGにAAAABBBBCCCCDDDDを設定して、gdb内でtest.cgiを実行すると、0x08048644でSegmentation faultで異常終了。![](/image/CTFjpn/testcgi2.png)ESPの付近を見ると、AAAABBBBCCCCDDDDが0x41~0x44で入っている部分に重なって、0x44 0x86 0x04 0x08という文字列があり、これがEIP(0x08048644)らしい。QUERY_STRINGの最後の1バイトがアドレスを上書きしているということかしら。IDA Pro Freeで覗くと、答えを表示するサブルーチンのアドレスは、0x08048651。![](/image/CTFjpn/testcgi3.png)QUERY_STRINGの最後の1文字を「D」(0x44)から0x51を意味する「Q」に変えると、答えのメールログが表示された。(以下の画像はローカルで実行。実環境で実行するとフラグが表示された。)![](/image/CTFjpn/testcgi4.png)