DEFCON CTF Quals grab400 うろ覚えwriteup

2012年6月2日, 3日(UTC)に行われたDEFCON CTF Qualsに参加しました。その内の一問 grab bag 400 のwriteupです。

ペネトレテスターの辻さんもblogで同じ問題のwriteupを書かれていますが、僕は少し違う解法で解きました。スクリーンショットとか色々取るのを失念していたので、その辺は辻さんのblogを参照してください。

問題

What is Jeff Moss' checking account balance?
Bank site => http://140.197.217.85:8080/boa_bank
User:blacksheep, Password:luvMeSomeSheep

ざっとサイトを調べた所、任意のパラメータを与えられそうなのはログイン画面のID, Passと支店検索フォームのZIP codeの3つでした。支店検索フォームにシングルクオートを入力したらSQLのエラーメッセージが表示されたので、ここから攻める事にします。

まず、テーブル名を列挙しました。辻さんはinformation_schemaを使っていますが、僕は確かpg_databaseテーブルからdatnameを引っ張って来ました。クエリはこんな感じ。

0 UNION SELECT datname,'','','','','' FROM pg_database

列挙されたテーブル一覧を眺めるとaccountというテーブルがありました。怪しいですね。調べます。それっぽいカラム名を入力してみたりHAVINGとGROUP BYでカラム名をエラーメッセージとして表示させてみた所、使えそうなカラムが以下のような感じである事が判明しました。

account.type => 'checking', 'saving'
account.balance => Integer
account.owner => Integer
account.name => (以上3カラムの内容その他をカンマで区切って連結したもの)

そこで、以下のようなクエリを投げて(うろ覚え)、全checking口座のbalanceとownerを列挙した所、balanceが全て0.00であることが判明。(!?)

0 UNION SELECT account.name,'','','','','' FROM account WHERE account.type = 'checking'

この時点で0.00と解答しても良かったのですが、どうも判然としないのでJeff Mossの口座を突き止める事にします。accountテーブルでは口座所有者の情報はownerの数値しか見つからなかったので、別のテーブルの情報と結びつける事を考えました。今一度テーブル一覧を眺めると、customerなるテーブルがあるようです。調べます。

accountテーブルと同様にcustomerテーブルも調べた所、customer.id, customer.firstname, customer.lastnameがあるようなので列挙させました。"Jeff", "Moss"でページを検索しましたが、彼らしき人物はヒットしなかったので"Jeff Moss"で検索した所、Wikipediaに以下のような記述を発見。

Jeff Moss, also known as The Dark Tangent, is the founder of the Black Hat and DEF CON computer hacker conferences.

"Tangent"でページ検索をかけたら、居ました。Dark Tangentさん。(どんな名前だ…)彼のcustomer.idが分かったので、account.ownerと結びつけた上でaccount.balanceを今一度確認しましたが、やっぱり0.00です。仕方がないので、"0.00"と解答した所、"CORRECT!"となり400ptをゲットしました。

反省

非効率極まりないですねorz
account.ownerとcustomer.idが同一の値であるという前提も勘に寄ったものですし、これは好ましくない解法です。全ユーザーのbalanceが0.00だったのは、何かの間違いだったのか、それとも意図されたものだったのか…。SQL Injectionはあまり知らなかったので、いい勉強になりました。
forensic 300も解きましたが、概ね辻さんと同じアプローチでした。