NetAgent Security Contest 2010

NetAgent主催のNetAgent Security Contest 2010に参加しました。例年はリバースエンジニアリングチャレンジが催されているのですが、今年はリバースエンジニアリングだけでなく、暗号理論、リバースエンジニアリング、パケット解析、デジタル・フォレンジック、Webアプリケーション等々、幅広い分野からの出題され全8問。そして、名前が NetAgent Security Contest と変更になったようです。twitterでのハッシュタグ#NASecContest2010 でした。
結果はLevel1〜5までしか解けませんでした。以下、ネタばれ注意です。

Level1 Activation(リバースエンジニアリング

2010年8月14日にしか起動しないプログラムLEVEL1.exe
このプログラムを2010年8月14日に起動させると
Password: XXXXXXX と表示される
解答パスワード XXXXXXX を答えよ

システムの日付を2010年8月14日に変更すれば答えが出ました。

Password: TVDDFTT
別解について書きました。

Level2 Hidden file (デジタル・フォレンジック

USBメモリをダンプしたイメージForensics.imgがある
このイメージファイルを解析し、削除された暗号化ZIPファイ
ル(xyz.zip)の情報を取得せよ
xyz.zipの論理ファイルサイズを解凍パスワードとする
(入力フォームには10進数で入力すること)

私はAutoPsyでイメージを解析しました。

Password: 115319
環境はVMwareSIFTを使ってます。フォレンジック関係のツールの解説は日本語が少ないと思いますが、ハッカージャパン2010年11月号に入門記事が書かれていました。英語でも苦にならないなら、ネットエージェントの松本さんにFile System Forensic AnalysisPDF版←サイズが大きいので注意)が良い本だと紹介して頂きました。AutoPsyはSleuthKitのGUI版ですが、SleuthKitについて伊原さんが入門向けのスライドを公開してくれていました。
Windows環境でFTKImagerでも勿論解析できました。
NetAgent Security Contest 2010にチャレンジしてみたではPK\x03\x04〜PK\x05\x06を切り出してそのバイト数で答えを出すという綺麗な解き方をしてました。

Level3 Crypto (暗号理論)

Visual C# 2010 と Visual C++ 2010 のExpress版を利用して
ファイル暗号化ツールCrypt_csを作成した
本ツールを用いてpasswordファイルを暗号化した
Completed! n=13511, e=2645
暗号化を施した際、上記の出力結果を得た
Crypt_cs.exe、Crypt_cp.dllを解析して、passwordファイルを
復号し、ファイルの中に記述されているパスワードを得よ

まず、問題を見て思うことは「暗号」「nとe」からRSAが思い浮かびます。
とりあえず.NETなのでReflectorを使って暗号処理部分を探すと、
button2_Clickの中に

fnCrypt_cp(1, ref numArray[i], ref num3, g_n, g_e);
fnCrypt_cp(0, ref numArray[i], ref bInData, g_n, g_d);

という処理を発見しました。
ここから先どうしたら良いか分からなかったので、プログラムを実際に動かして動作を予想しました。まず 0x00〜0x03 を書き込んだファイルを用意し、プログラムを実行してみると、

実行前
00 01 02 03
実行後(n=24503, e=2417)
00 00 00 00 01 00 00 00 40 24 00 00 22 35 00 00 

データサイズが4倍になっていることと、0xXX 0xXX 0x00 0x00 が連続していることより、1バイト→4バイトのブロック暗号ではないかと仮定した上で、入力値、出力値、n、eを使って処理を予想しました。

入力値:0x03 = 3
出力値:0x00003522 = 13602
n:24503
e:2417

n,eを使っている時点でRSAっぽいことを予想していたので、簡単に次の関係式がなりたつことに気付きました。
3^{2417} \quad mod \quad 24503 \quad = \quad 13602
よって、
(input)^e \quad mod \quad n \quad = \quad (output)
となっていることが分かりました。
1バイト毎に暗号化しているだけなので、あとは問題文にあるn=13511, e=2645の時に0x00〜0xffに対応する出力を求め、対応マップを作った後、暗号化されているpasswordファイルの4バイト毎に対応するバイトをans.binに書き込んでいくプログラムを書いて終わりです。すると、

% file ans.bin
ans.bin: PNG image, 571 x 50, 8-bit/color RGB, non-interlaced
% mv ans.bin ans.png

PNGファイルを開くと、

Password: RSA_rSA_RsA_RSa_rsa

Level4 Character codes (文字コード

あるセキュリティエンジニアが、文字コードの処理において、
信じられないほど不出来なメールソフト・メールサーバを用
いてメールを送った
元々書かれていた日本語の文章を復元し、解答パスワー
ドを得よ

Thunderbirdで開くと文字化けして表示されました。エディタで開いてみると

Content-Type: text/plain; charset=utf-7
Content-Transfer-Encoding: 7bit

となっています。+....-の形になっていることからUTF-7と予想します。8ビット目を全部クリアして、base64でデコードすると、次のような文章になりました。

ィよ緋さまでした・・
サんなにゑ瞳くないじ伏悉憶だったとW爾ます・・
囀ヘV″itakamondaiWÅぞ廃緩したものです・・
ア足もよ乾鎮てください・・

もう一息といった感じでした。おそらく一行目は「お疲れさまでした。」で無いかと予想してotsukare.txtを用意して比較すると、

エンディアンが逆になっていることに気付きました。

お疲れさまでした。
そんなに難しくない文字化けだったと思います。
解答は「mitakamondai」を半角にしたものです。
続きも頑張ってください!

Password: mitakamondai
三鷹問題はネットエージェントの特別枠採用の問題の2問目です。

Level5 Crack ZIP files (デジタル・フォレンジック

USBメモリをダンプしたイメージForensics.imgがある
(Level2のものと同じファイルである)
このイメージファイルを解析し、削除された暗号化ZIPファイ
ル(xyz.zip)の中のhoukoku.zipを取り出す
さらにhoukoku.zipの中から解答パスワードを取得せよ
ヒント:Paul C. Kocher

AutoPsyを使ってxyz.zipをイメージからExportして、中のファイルを確認すると、

% unzip -l xyz.zip
Archive:  xyz.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
     2761  11-15-10 20:16   houkoku.zip
      102  11-10-10 11:52   a.txt
    58016  04-02-10 14:39   kaigi1.jpg
    55926  04-02-10 14:39   kaigi2.jpg
 --------                   -------
   116805                   4 files

4つのファイルがありました。4つとも暗号化されています。
ここで、ヒントのPaul C. Kocherとzipなどで調べると、A Known Plaintext Attack on the PKZIP Stream Cipher (Eli Biham & Paul C. Kocher)という論文が出てきます。どうやらKnown Plaintext Attackを使うよう。さらに調べると、先ほどの論文を執筆した2人が書いたPkCrackというツールが出てきます。
Known Plaintext Attackは、既知平文攻撃と訳されるそうです。

asecretkeyで暗号化するとAになる。b,cも同様。この時に、A,B,C,b,cが分かっている状態で、aを求めるというのが既知平文攻撃らしいです。
今回の問題ではAutoPsyを使ってイメージファイルの中から削除されたa.txt, kaigi1.jpg, kaigi2.jpgは復元可能でした。そこでa.txtを用いて既知平文攻撃を行いました。(なぜか、kaigi1.jpg, kaigi2.jpgでは上手くいかなかったです。)

% zip a.zip a.txt
% pkcrack -C xyz.zip -c a.txt -P a.zip -p a.txt -d decrypt.zip

pkcrackの使い方は、
 -C [暗号化されたzipファイル]
 -c [暗号化されたzipファイルの中で平文が分かるファイル]
 -P [平文のファイルが入っている暗号化されていないzip]
 -p [平文のファイル]
 -d [出力先(復号したzipファイルの名前)]
....

時間は掛かりますが、これで復号できました。
houkoku.zipの中には、コピーBook1.xls顧客リスト.xlsがありました。excelファイルなんでどこかのセルに答えが書いてあるのだろうと思い、stringsコマンドで文字列を取り出すと、Password: sangokushi38が出てきました。
Password: sangokushi38
終わってからtwitterで知ったのですが、houkoku.zipは平文でイメージファイルの中に残っていたみたいです。Foremost*1を使えばすぐに終わる問題でした。
以降の問題は解けなかったです。

Level6 UnPack EXE (リバースエンジニアリング

ScriptGame_pro.exeを実行すると、ゲームをプレイできる
赤テーブルor青テーブルのいずれ
かが10000試合勝利すると、ゲーム
が修了し、解答パスワードが表示される
10000試合以上を消化し、解答パス
ワードを得よ

PhantOm Pluginを使ってもOllyDbgで実行できなかったので、一度普通に起動してからOllyDbgでアタッチしてみたのですが、上手くいかなかったです。
解法は汎用プロセスメモリエディタを使ってメモリの値を書き換えるらしいです。
スペシャルねこまんま57号うさみみハリケーン
Password: 45MM3R

Level7 JavaScript (Webアプリケーション)

難読化されたJavaScriptが含まれたnaseclv7.htmlがある
難読化を解除し、解答パスワードを答えよ
どこからも使われていない変数Answerに入る文字列が
解答パスワードとなる

Level7についてはNetAgent Security Contest 2010 参戦記(gtmhvさん)さんがFirebugを使った解法を書いてくれていました。
Password: pDexecwindowNaPwd

Level8 x86_64 (リバースエンジニアリング

210.230.192.40:5555

お手上げでした...
Winnyライクな通信をするプログラムらしいです。
とても楽しく、また新しい発見もあり勉強になりました。コンテストを開催して頂き、有り難うございました。公式の解答も楽しみにしています。

*1:% foremost -t zip Forensics.img