[SECCON 2013_WEB Network_WEB 300 Hidden Message?]

 

どうも、ゆったんです。

NETWORK_WEB 300の、Hidden Messageについて説明します。


 

q

問題として、上のような画像ファイルが渡される。
カテゴリを考えると、おそらく何かしらのデータがこのjpgファイル内に隠されているのだろうとめどをつけて
バイナリエディタに投げ込んで目grepしてみると、tcpdumpファイルのヘッダが見つかるので抜き出す。

Hex_SECCON_Net300

切り取ったtcpdumpファイルをWiresharkに投げ込んでみると、逆引きしていることがわかる。

wireshark_SECCON2013WEB_Net300

チームメイトが逆引きしてFlagをSubmitしたのですがAcceptされず、私も逆引きしてみると、
Acceptされなかったのは”.”が抜けてたのが原因だとわかった。

$ nslookup 10.95.133.134 133.242.55.252

とnslooupを叩いて逆引きをした結果、下のような文字列が返される。

You.G0t.a.Hidd3n.m3ss4g3.1n.Th15.DNS.

というわけで
答え: You.G0t.a.Hidd3n.m3ss4g3.1n.Th15.DNS.

[SECCON 2013_WEB, Forensics 300] ログインパスワードを解明せよ

みむらです。

続けてフォレンジック 300 の “ログインパスワードを解明せよ “ について
解説いたします。


問題としては 1GB のメモリダンプイメージが渡されます。

メモリダンプと言いますのは、
純粋にそのときにメモリにあったデータを出力したもので、
今回のようにシステム全体のメモリを取る場合には、
DumpIt というようなツールや、
システムをクラッシュさせて取得する方法があります。

メモリダンプはアプリケーションやシステムの解析目的に用いられ、
たとえばマルウェアが動作している時にメモリダンプを取って調査する
というようなことも行われます。

 

今回の場合は、このメモリダンプのイメージから
ログインパスワードに関する情報を抽出し、解析して求めることが解法となります。

 

まず volatility というツールを用いて、データを抽出します。

ダウンロードは次のリンクより。
volatility – An advanced memory forensics framework – Google Project Hosting

 

ログインパスワードに関する情報はレジストリ上にありますので、
メモリ上のレジストリハイブの場所を求めます。

この際、問題においてシステムは Windows 7 ServicePack 1 x86 であることが
明記されていますので、解析時のプロファイルには “Win7SP1x86” を用います。

#volatility hivelist -f memorydump2.bin --profile=Win7SP1x86

Volatility Foundation Volatility Framework 2.3.1
Virtual    Physical   Name
---------- ---------- ----
0x9ff5a3c0 0x37fbb3c0 \SystemRoot\System32\Config\SECURITY
0x9ffc03a0 0x30e243a0 \SystemRoot\System32\Config\SAM
0x8f60c568 0x04bbc568 [no name]
0x8f61c008 0x005d2008 \REGISTRY\MACHINE\SYSTEM
0x8f6448d8 0x04b3c8d8 \REGISTRY\MACHINE\HARDWARE
0x90659650 0x199c0650 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0x906d8008 0x13200008 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0x93cf5008 0x38814008 \Device\HarddiskVolume1\Boot\BCD
0x93d479d0 0x388c19d0 \SystemRoot\System32\Config\SOFTWARE
0x989bc008 0x37920008 \SystemRoot\System32\Config\DEFAULT
0x9e6e69d0 0x005469d0 \??\C:\Users\forensics\ntuser.dat
0x9efe5650 0x028aa650 \??\C:\Users\forensics\AppData\Local\Microsoft\Windows\UsrClass.dat 

実行しますとこのようになります。

このうち SAM と SYSTEM の情報が必要ですので、
これらの仮想アドレス (Virtual) の値をメモし、実際に出力を行います。

なお今回のシステムの場合
SAM は 0x9ffc03a0
SYSTEM は 0x8f61c008

になります。

# volatility hivedump -f Memorydump2.bin --profile=Win7SP1x86 -y 0x8f61c008 -s 0x9ffc03a0

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
forensics:1000:aad3b435b51404eeaad3b435b51404ee:98ffdb1b29e7c88954326cd4011141d8:::

実行しますとこのような結果が表示されます。

image

あとは、ophcrack などの解析ソフトに与えることで、

image

ものの数秒で答えが見つかります。

ここまで早く見つかるのは、NTLM ハッシュというのが、
パスワード文字列を UTF-16 LE で表現したものに MD4 ハッシュを掛けただけのものであることに由来します。

ophcrack ではハッシュ値と平文の逆引き表を持っており、今回はそれを用いてパスワードを求めました。もちろん、この逆引き表に含まれていなかった場合は求めることは出来ません。
ですが、今回の場合は “Kani3” という短いパスワードであったためにテーブル内に含まれており、ハッシュ値から求めることができました。

一般にこういう解析に対しては、ハッシュを生成する際にパスワードにソルトと呼ばれるランダムな文字列を生成し、パスワード文字列につけてハッシュを生成することが一般的な対策であり、
これをすることにより、パスワードの文字列長を伸ばしたときと同じ効果が得られ、テーブルによる攻撃を難しくさせます。

 

閑話休題。

ということで、この問題については答えは次の通りとなります。

答え:Kani3

[SECCON 2013_WEB, Forensics 200] 削除されているファイルの名前は何ですか?

どうも、みむらです。

続けて フォレンジック200の問題である
「削除されているファイルの名前は何ですか?」について解説いたします。


問題ファイルとして NTFS の MFT (Master File Table) の情報が渡されます

 

MFT には記録媒体上のファイルの情報が入っており、
(ファイル名やファイルの記録媒体上の場所、作成・編集時間などが記録されます)
このファイルを解析することにより、
削除したファイルを求めるというものになります。

 

一般にコンピュータ上のファイルの削除というものは、
記録媒体上から実際に消しているわけではなく、
MFT 上から情報を消すか、”削除した” というフラグを立てる
という動作になります。

ですので、後者であれば MFT を探れば削除したファイルを戻すことができますし、
前車であってもディスク内を探せば見つけることが出来ます。

ただし、消したファイルが使用していた領域が、
別のファイルに使用された場合は当然元の中身は消えてしまいますので
復元できなくなります。

 

閑話休題

 

この問題の場合は MFT の情報が渡されますので、
”削除した” というフラグが立っているファイルのファイル名を見つけることが
解法となります。

 

今回使用したのは “MFTDump” というツールです。
http://malware-hunters.net/2012/09/13/mftdump-v-1-3-0-released/

簡単に言えば MFT の情報を解析して、表にして出してくれるツールとなります。

 

問題のファイルを先ほどのツールに与えますと、次のような表が出力されます。

image

あとは、 “Deleted” が 1 になっているファイルを探すだけです。

 

image

というわけで、答えが求まります。

 

答え: SkyhookParser.exe

[SECCON 2013_WEB, Binary100] Enjoy the Game

初めまして。みむらです。

チームわさむすめ でリーダーとして全力で旗をふったり、雑務をやったり、
気持ちの上では全員にお茶をくんで運んだりと、
そんな仕事をやっている(つもりです)

まぁ冗談はこの辺にして。

まずは先日行われました SECCON CTF 2013 の WEB 予選で出題されました
Binary 100 の問題である “Enjoy the Game” について解説いたします。


起動しますと、次のような画面が表示されます。

image_thumb1

このゲームはキーボードの十字キーで動くことができ、
ゴールに向かい、フラグを入手することが問題の内容となります。

実際に大会で触った方は分かるかと思いますが、
実はゴールには行けないようにマップが構成されており、
そのままでは行くことが出来ません。

 

そこで、いくつかデータを変更して様子を観察してみます。

data フォルダ内にメタセコイアのテキスト形式での 3D データが入っています。
これは同じフォルダにあるテクスチャの画像から容易に想像できるように、
ゲーム内の壁を表現した 3D データとなっています。

テキスト形式ですのでメモ帳かなにかで見てみますと、
中に Object と書かれた部分が見つかります。

image

そのうちの vertex (頂点座標)の部分に注目します。
値が3つずつ並んでいて、それぞれ X, Y, Z というように記録されています。

メタセコイアの mqo ファイルは 右手系 Y-up 座標系で表現しますので、
描画した際の高さを表現する部分は真ん中の Y 座標となります。

image

ここで、 Y 座標をすべて 0 に置換してプログラムを起動してみることにします。

image

明るさをかなり上げてありますが、このようにマップが大変見やすくなります。

またここで、くるりと回ってみますと、

image

このようにゴールの場所が見えます。

ですが、もちろんここへは本来であれば壁がある場所ですので
行くことは出来ません。

 

そこで、プログラムを書き換えて壁の当り判定を無視するようにします。
というわけで、 IDA Pro でプログラムを眺めます。

そうしますと、 0x1400016C7 あたりにそれらしいコードが見つかります。
(このあたりは動的解析をすると簡単に見つかります)

image_thumb5

ここでは、

movzx eax, byte ptr [rcx+r9]	; 通路情報が入った配列から該当箇所の情報を取得
cmp al,1			; 通路どうかを判定
jz short loc_1400016CF		; 通路であれば 0x1400016CF へ飛ぶ

という処理が書かれています。
ですので、”通路であれば” ではなく、
常にジャンプするように書き換えを行います。

image

スペースキーを押してこの表示に切り替えた

image

d キーを押して該当箇所を含めた前後の箇所をバイト表示にして、この情報を元に
バイナリエディタで検索して該当箇所を求めます。

今回の場合は 0xAC9 が該当箇所となります。

元のデータは “74 04” となっており、これは “jz 0x1001006” を表しています。
これを “EB 04” に書き換え、 “jmp 0x1001006” に書き換えます。

書き換えますと次のように書き換わり、
常にジャンプすることが分かるかと思います。

image_thumb[2][1]

あとはこの状態で、答えの箇所まで・・と行きたいところではあるのですが、
このゲームはまっすぐゴールに向かってもフラグが出ないように作成されています。

そのため、あたかも壁がある場合の動きで、最寄りの場所まで移動し、
ゴールの場所に移動することでフラグが出ます。

 

私が解いた際には、何度やってもフラグが出ず、
最終的にいくつか出てきた文字列からチームメイトが想像してフラグを求めました。

答え:“3D_dUnGEoN”