スマートフォン解析 top

TOP > タイガーチームセキュリティレポート > DEF CON CTF Qualsにチャレンジ! 2013 OMGACM 2 Writeup

タイガーチームセキュリティレポート

DEF CON CTF Qualsにチャレンジ! 2013 OMGACM 2 Writeup

CTFってご存知ですか?毎年米国で実施されているセキュリティカンファレンス「DEF CON」の中で実施されているイベントの一つで、出題者が出す脆弱性とかのセキュリティ周りの問題を解いて順位を競うイベントです。
分かり易く言うとハッキングコンテストですね。我々も普段からセキュリティエンジニアとしてお仕事させてもらってますので、「ハッキングコンテスト」なんて言葉を聞くと興味津々なメンバーがいる訳ですよ、やっぱり(笑)

で、参加してみたところ、いくつかの問題が解けましたので、その中のいくつかをピックアップして「どうやって解いたの?」ってあたりをご紹介します。

ちなみに、問題を解いたのは筆者ではありません。あはははははハハハ……ハァ~ (-_-;)


DEF CON CTF 2013 Quals OMGACM 2 Writeup

問題文はこちら OMGACM: 2points
diehard
...with a vengence. diehard.shallweplayaga.me:4001

内容はいわゆるテキストアドベンチャーゲームです。問題文に「diehard」、「with a vengence」とあるので、「ダイ・ハード3」(Die Hard: With a Vengeance)と関係が有る問題のようです。


1 : Adventure

指定されたポートにtelnetで繋ぐと、次のようなメッセージが表示されます。 Welcome John McClain...
You are standing at the start of your adventure. You will be tested on your ability to solve a set of riddles in the minimum amount of time possible.

As you glance around the room, you realize the problem you seek is to the north. To the west is a mysterious field.
Exits: n w
>
(意訳)
ようこそJohn McClain...
冒険の始まりです。あなたは次々出題されるなぞなぞをどれだけ短い時間の間に解くことができるか試されます。

あなたは部屋を見回して、北にその問題があり、西にはmysterious fieldがあると悟りました。
出口:n w
>

というので、北に向かいます。「n」を入力してリターンキーを押すと北に移動できます。
ちなみに西に行くと幾つかの部屋が変な感じに繋がるところに出ますが、特に問題との関係はなさそうです。
北へ東へと探索を進めると、目的地に到着します。
You see a large room with sleek black walls on every side. The ceiling overhead is smooth and devoid of features. In the center of the room is a small scale that links to a closed door. A small fountain is gurgling water in the corner. The scale has a small inscription on it.
A red jug is sitting in the room.
A blue jug is sitting in the room.
A fountain is sitting in the room.
A scale is sitting in the room.
>
なめらかな黒い壁に囲まれた広い部屋にたどり着きました。天井は平坦で特徴はありません。部屋の真ん中には、扉に繋がった小さな scale が有ります。部屋の角には水の湧き出る小さな fountain があります。 scale には小さな inscription が付いています。
red jug があります。
blue jug があります。
fountain があります。
scale があります。
>


2 : Water Jug Riddle

いわゆる「水差し問題」です。容量の異なる2種類の水差しを使って、ある特定の量の水を正確に量りscaleに乗せると次の部屋へ進めます。水差しには目盛などなく、目分量で量ることは出来ません。
部屋にはfountain が有るので、汲むべき水が尽きることは有りません。
ダイハード3でも同様の謎解きが有ったようです(ダイ・ハード3では、3ガロンの容器と5ガロンの容器を使い4ガロンを量っていました)。

さて、今回の問題はどのようなものでしょうか。いくつかのコマンドを用いて状況を把握します。 > get red jug
You get a red jug.
> get blue jug
You get a blue jug.
> l red jug
You look at a red jug that you are holding.
This shiny red jug appears to be a container made for holding water.
A red jug holds 0 of 3 gallons.
> l blue jug
You look at a blue jug that you are holding.
This shiny blue jug appears to be a container made for holding water.
A blue jug holds 0 of 5 gallons.
> look inscription
You look at an inscription.
It reads:
To get to the next stage put 4 gallons on the scale.

red jugは3ガロン、blue jugは5ガロンで、inscriptionには「4ガロンをはかりに乗せれば次のステージに行ける」と書いてあります。ダイ・ハード3と同じ条件です。なので、同じように解いていきます。 > fill red jug
You fill a red jug with 3 gallons.
A red jug now has 3 gallons.
> pour red jug into blue jug
You pour 3 gallons into a blue jug from a red jug.
A red jug is now empty.
> fill red jug
You fill a red jug with 3 gallons.
A red jug now has 3 gallons.
> pour red jug into blue jug
You pour 2 gallons into a blue jug from a red jug.
A blue jug is now full.
> empty blue jug
You empty a blue jug.
> pour red jug into blue jug
You pour 1 gallons into a blue jug from a red jug.
A red jug is now empty.
> fill red jug
You fill a red jug with 3 gallons.
A red jug now has 3 gallons.
> pour red jug into blue jug
You pour 3 gallons into a blue jug from a red jug.
A red jug is now empty.
> put blue jug onto scale
You put a blue jug onto a scale.
The scale balances perfectly and a door opens to the next room!
完璧です。まだ手元にあるred jugを捨てて次の部屋へ行きます。

水差し問題は、 1. 小さい方の容器を水で満たす。
2. 小さい方の容器の中身を大きい方の容器に移す。
3. 1.と2.を大きい方の容器が満杯になるまで繰り返す。
4. 大きい方の容器を空にする。
5. 小さい方の容器に残った水を大きい方の容器に移す。
という手順を繰り返すと、そのうち正解にたどり着きます。水差し問題の解法は多くの資料がWeb上に有りますので、詳しくはそちらを当たってください。

それでは、次の部屋の様子を見てみます。 You see a large room with sleek black walls on every side. The ceiling overhead is smooth and devoid of features. In the center of the room is a small scale that links to a closed door. A small fountain is gurgling water in the corner. The scale has a small inscription on it.
A red jug is sitting in the room.
A blue jug is sitting in the room.
A fountain is sitting in the room.
A scale is sitting in the room.
>
コピペです。同じ部屋に見えます。jugとinscriptionも見てみます。 > get red jug
You get a red jug.
> l blue jug
You look at a red jug that you are holding.
This shiny red jug appears to be a container made for holding water.
A red jug holds 0 of 71 gallons.
> get blue jug
You get a blue jug.
> l blue jug
You look at a blue jug that you are holding.
This shiny blue jug appears to be a container made for holding water.
A blue jug holds 0 of 5 gallons.
> look inscription
You look at an inscription.
It reads:
To get to the next stage put 36 gallons on the scale.
ワーオ。red jugは「71ガロン」、blue jug は「5ガロン」で「36ガロン」を量れ。と言われました。2部屋目以降は接続するごとに異なる条件の問題が出るうえ、条件によっては手順が凄まじく多くなります(上記の問題では136回の操作が必要です)。
うんうん唸りながらこれを解いていくと、こんなことを言われるようになります。 Streams of dust pour out from gaps in the roof above. The structure looks very close to collapse.
天井の隙間から埃が落ちてきた。もうすぐ建物が崩壊しそうだ。
Disturbing noises from the roof above gives you the feeling that you can't stay in this room long.
嫌な音が天井の方から聞こえる。長くこの部屋に留まってはいられない。
などの嫌な感じのメッセージが定期的に表示され、3分ほど後 The roof collapses in on you. You have failed!
天井があなたの上に崩落した。あなたは失敗した!
と言われてしまいます。このゲームには時間制限があるようです。


3 : Guerilla Programming

ところで、「OMGACM」は「Guerrilla Programming」というジャンルの問題だそうです。これだけ短い時間の間に手作業で問題を解くのは無理が有るので、早速自動で問題を解くクライアントプログラムをビルドします。 1. 対象のサーバに接続
2. 目的の部屋へ到達
3. jugの容量と目標の容量を確認
4. 問題を解いて次の部屋へ
5. 2~4をThe keyにたどり着くまで繰り返す
という感じの動きをするプログラムを作り、実行してみましたが、4部屋目あたりで天井が落ちてきてしまいます。手作業でやるよりはるかに速い速度で応答している筈ですがまだ遅いようです。そこで、処理の高速化を検討しました。
幾つかのパターンでデータを送信してみると、「複数のコマンドを改行で繋いで同時に送信しても期待通りに処理され、且つ、早い」という事が分かりました(今回はJavaを使ったのですが、そのせいもあるかもしれません)。 そこで、出来るだけ少ない送信回数で問題を解くことにします。

サーバからの応答を調べなければならない手順は、上記の「3. jugの容量と目標の容量を確認」のみですので、この手順に至るまでの全てのコマンドをまとめて送信するようにします。
この結果、以下のような構造のプログラムが出来ました。 1. 対象のサーバに接続
2. 部屋へ到達するためのコマンドをバッファに格納
3. 以下3-1~3-6を繰り返す
3-1. jugの容量と目標の容量を確認するコマンドをバッファに格納
3-2. バッファに溜まったコマンドを送信し、バッファを空に
3-3. 応答をすべて受信
3-4. jugの容量と目標の容量を応答メッセージから抽出(目的地に到達した場合はループを脱出)
3-5. 問題を解く手順を解析し、必要なコマンドをバッファに格納
3-6. 次の部屋へ進む為のコマンドをバッファに格納
4. The keyを見るコマンドを送信してThe Keyを得る

例えば、最初に送信するコマンドは以下の通りです。 n
n
n
n
n
n
e
n
w
n
get red jug
get blue jug
l red jug
l blue jug
look inscription

2回目以降のコマンドは以下のようになります。 fill red jug
~~中略(水差し問題を解く手順です)~~
pour red jug into blue jug
put blue jug onto scale
drop red jug
n
get red jug
get blue jug
l red jug
l blue jug
look inscription

この繰り返しで、20部屋目を攻略すると、 You find yourself in a solid granite chamber filled with hexadecimal writings on the walls. In the middle of the room sits a small key. A key is sitting in the room.
>
壁に16進数がみっちり書いてある花崗岩でできた部屋にたどり着きました。小さな key が部屋の真ん中にあります。
key があります。
>
目的地に到達します。 >look key で The key を得られます。


4 : おまけ

このようにすんなり解ければよかったのですが、実際のところは「inscription」の存在に気付かず苦戦しました。この場合、目標値は分かりませんが、scaleにjugを置くと「目標より重い」とか「軽い」とか言われるので、これを元に都度jugをscaleに置いて重さを確認したり、scaleに置く回数を最小にするような工夫をこらしたり。制限時間をクリアするために水差し問題の解法ロジックを変えたりと、いろいろな試行錯誤をしました。「inscription」に気づいた後も、どうすればそれを見られるのかわからず、「watch inscription」「see inscription」「take inscription」「get inscription」「tell me the amount of water」などなど試して、「look inscription」で良い事に気づくまで1時間もかかるなど、びっくりするほど無駄骨。 そのようなわけで、出来上がったソースコードは見るに堪えないスパゲティであるところのもので、しかるに公開は差し控えたいと思います。悪しからず。

それと、The keyを得られはしたものの部屋から出ることは叶わず、結局 John McClain は落ちてきた天井につぶされてしまいました。Johnを助けたかったのですけどね。

以上


取り急ぎ、1問だけアップしましたが、残りの問題も随時アップしていきます!


タイガーチームメンバー(広報w) 白谷 宗大