ネットエージェント新卒採用 CTF Writeup 〜後編〜

ぐだぽよー、おきなわです。

前編の記事を書いてからかなり日数があいてしまいましたが、ぼちぼち後編を書いていこうかなと思います。

以前の writeup は以下。

ネットエージェント新卒採用 CTF Writeup 〜前編〜 | おきなわのぶろぐ

 

では早速書いていきましょう。

mondai6

問題もやっと折り返しを迎えました。さて、6 問目ですが問題文には以下の URL のみ記載されていました。

http://49.212.84.208/cgi-bin/hode7hb376dgeas6df783gr4/mondai6.cgi

どうやら次は Web 問題のようですね。curl コマンドを使って早速アクセスしてみます。

$ curl http://49.212.84.208/cgi-bin/hode7hb376dgeas6df783gr4/mondai6.cgi
<HTML><BODY>use R4000
</BODY></HTML>

use R4000 と言われました。何のことや!ってことで検索してみると、どうやらマイクロプロセッサのことっぽい。

R4000 – Wikipedia

指定のマイクロプロセッサを使えってことか?と思い立ち、R4000 のエミュレータっぽいやつを探し、実行環境を整え、動かしてみました。(迷走して色々調べてたので何処のサイトを参考にしたかすら覚えていない、、、)

動かした際のスクショは以下。

よっしゃ!動いた!!と思ったのも束の間、ネットワークの設定が上手くいかない、、、繋がらない、、、もぅマヂ無理。

しかし、ここでふと、僕はある事に気づきました。

「でもサーバ側から見て判別できそうなのって User-Agent とかくらいじゃね?ってことはそこを偽装すればいいんじゃね???」

ということで早速 R4000 について再度調べ直すことに。すると以下の様な情報にたどり着きました。

 MIPSプロセッサはデジタルTVやDVDレコーダー、ネットワーク機器、プリンタなどの組み込み機器で広く利用されている。身近な例としては、米MIPS Technologiesの「R4000」コアプロセッサを2つ内蔵した、ソニーの携帯ゲーム端末「PSP(プレイステーションポータブル)」が挙げられる。

世界で最も多く出荷されたRISCプロセッサMIPSのサバイバル戦略 - TechTargetジャパン システム開発

なるほど、PSP か!!ってことで PSP の User Agent を調べる。

●PSP (PlayStation Portable)
Mozilla/4.0 (PSP PlayStation Portable); 2.00)

userAgent一覧/ユーザーエージェント一覧

ということらしいので早速 User Agent を偽装してみる。

$ curl -A "Mozilla/4.0 (PSP PlayStation Portable); 2.00)" http://49.212.84.208/cgi-bin/hode7hb376dgeas6df783gr4/mondai6.cgi
<HTML><BODY>de la Bucure?ti
</BODY></HTML>

お、なんかメッセージが変わった!!

どうやらルーマニア語で「ブカレストから?」という意味らしい。

という事はブカレストからアクセスすれば良いのか?と思い、ブカレスト付近のプロキシサーバを探し、プロキシを通してアクセスしてみるも変わらず。使用したプロキシサーバが悪いのか?!と考え、その後もプロキシを使用するという線から色々試してみるも上手くいかず。じゃあ位置情報とかか?!と思い、無理やり位置情報を投げてみたりしましたが、やっぱり上手くいかず、、、

そこでふと「最初は User Agent の偽装だったし、もしかして HTTP ヘッダーで何とかするんじゃね?」と思いつき、調べた結果 Accept Language とかじゃね?と言う事で Accept Language をルーマニア語(ro)にして再度実行。

$ curl -A "Mozilla/4.0 (PSP PlayStation Portable); 2.00)" http://49.212.84.208/cgi-bin/hode7hb376dgeas6df783gr4/mondai6.cgi --header "Accept-Language: ro"
<HTML><BODY>key: Minesweeper1990
</BODY></HTML>

上手くいった!!!

と言う事で答えは Minesweeper1990 でした。

mondai7

解凍後、以下の様な構成のディレクトリが。

mondai7
├── hint7.txt
├── mondai8.zip
└── normal.exe

次はバイナリの問題のようです。

まずは何も考えずに strings コマンドで文字を抜き出して眺めてみます。

$ strings normal.exe

特にこれといってそれっぽいものは見つからなかったため、バイナリを解析する必要があるようですね、面倒くさい。

正直 exe ファイルの解析はあまり得意ではないので、この問題は一緒に問題を解いていたなーが君に丸投げする事にしました。なので僕は直接は解いてません。

なーが君曰く、最初は動的解析を行ったところ、なかなかうまく行かなかったらしいです。その後 exe ファイルがデバッガ判定を行ってデバッガ経由で起動された時とそうでない時で動作を変えているのが上手くいかない原因ではないかと考え、静的解析に切り替えて解析を行ったところ上手くいったとのことでした。具体的(?)には正解である文字列を作成してるっぽい処理をしているところがあったため、そこの処理を追っていったとのこと。ちゃんとどうやって解いたか聞いたのですが、殆ど覚えてないです、、、やる気があればちゃんと解いて追記しようと思います。

ちなみに今回の答えは TochuKasou だったらしいです。

mondai8

解凍後、以下の様な構成のディレクトリが。

mondai8
├── mondai8.tc
├── mondai8.txt
└── mondai9.zip

そして問題は以下の文章のみ。

TrueCrypt pass:mondai8

漢字8文字

どうやら mondai8.tc が TrueCrypt で暗号化されたイメージファイルのようなので、まずはそれを素直にマウント。マウントすると何枚かの画像ファイルなどがありました。

mondai8/
├── $RECYCLE.BIN
│   └── desktop.ini
├── Beale_1.svg
├── Crete_-_Phaistos_disk_-_side_A.JPG
├── Dorabella-cipher-image.png
├── Linear_A_tablets_filt.jpg
├── dagapeyeff_cipher.jpg
└── gold_bar.jpg

基本的にイメージファイル等を扱う問題では消されたデータを復元して解いていく流れのものが多いため、見えている画像ファイル達はどうせダミーだろうなぁと思いながらも一応 google 画像検索で検索をかけてみると以下の記事がヒット。

いまだ解読されていない歴史的な10種の暗号 – GIGAZINE

画像ファイルは全てこのサイトから辿れるものと全く同じだったため、ダミーだと確認出来ました。次に消されたファイルの復元を行います。私は Autopsy を使って復元を行いました。まずおもむろに Autopsy を起動します。

$ autopsy
============================================================================
Autopsy Forensic Browser
http://www.sleuthkit.org/autopsy/
ver 2.24
============================================================================
Evidence Locker: /usr/local/var/lib/autopsy
Start Time: Fri May 22 20:59:31 2015
Remote Host: localhost
Local Port: 9999

Open an HTML browser on the remote host and paste this URL in it:

http://localhost:9999/autopsy

Keep this process running and use <ctrl-c> to exit

その後ブラウザで http://localhost:9999/autopsy にアクセスすると以下の画面に。

スクリーンショット 2015-05-22 21.03.45

まずは解析を行うための準備を行う。NEW CASE を選択。

上の画像のように Case Name、Description、Investigator Names を適当に入力し、NEW CASE をクリック。

リストから先ほど作った CASE を選択し、ホストを追加するために ADD HOST を選択。

デフォルトで値が入っているので、そのまま ADD HOST を選択。

確認画面が表示されるので、解析するイメージを選択するために ADD IMAGE をクリック。

ADD IMAGE FILE をクリック。

解析したいイメージファイル(今回は TrueCrypt で複合化したイメージファイル)のパスを上の画像のように絶対パスで記入し、Type と Import Method を選択し、NEXT を選択。今回は Type は Disk、Import Method は Symlink を選択。

ディスクイメージの種類を選択するよう言われるため、Volume Image を選択し、OK をクリック。

MD5 ハッシュを計算するか聞かれるので Ignore を選択し、マウントポイントを適当に /Volumes/c/ とかにして ADD を選択。

確認メッセージが出るので OK を選択。

これで解析を行う準備が整いました。早速やっていきましょう。ANALYZE を選択。

上のタブの FILE ANALYSIS を選択。

すると普通のファイルが青色で、消されたファイルが赤色で表示されます。

ここでファイル名を眺めていると、今日の本.xlsx という如何にも怪しいファイルを発見。ファイル名をクリックするとファイルをダウンロード出来るため、今日の本.xlsx  をクリックします。すると autopsy というファイル名でダウンロードできます。ダウンロード後、適当に book.xlsx などと名前を変更し、開いたところ、エラーを吐いて開けず。そこでバイナリエディタでファイルを開いてみましょう。私はバイナリエディタとして 0xED を使用しました。

ファイルの先頭に余計な部分(PK の前までの部分)があったため、その部分を削除・保存して再度開くと無事開くことが出来ました。

開いた Excel ファイルには 3 つのシートがあり、1 つ目のシートには a から z に対応する数字が、2 つ目のシートには奇談クラブという小説(?)の一部が、3 つ目のシートには password という key が書かれていました。どうやら暗号のようなのですが、最初はどうやって解いていけば良いのか全く思いつきませんでしが。ところが一緒に解いていたなーが君が「これって 1 つ目のシートに書かれた a から z に対応した数字がそれぞれ行番号と何番目の文字かを表してるんじゃない?」的なことを言い出しました。つまり “a” は 2 シート目の 62 行目の 11 文字目である “気” に対応して居るのではないか、ということです。そのように解釈すると a から z の対応表は以下のようになります。

この表を見ながら key である password を各文字置き換えると 意気揚揚明鏡止水 となりました。それが答えでした。

mondai9

解答後のディレクトリ構成は以下の通り。

mondai9
├── mondai10.tc
└── mondai9.pkt

file コマンドを使ってファイルを調べてみます。

$ file mondai9.pkt
mondai9.pkt: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 65535)

今度はキャプチャされたパケットを眺める問題のようです。というわけでおもむろに wireshark を立ち上げて読み込んで眺めてみましょう。

とりあえず http 通信でサーバに向けた通信のみを見てみます。

何かファイルをアップロードしているようなので、パケットからアップロードしているファイルを取り出します。すると zip ファイルが 1 つ、docx ファイルが 1 つ、xls ファイルが 2 つの合計 4 つのファイルを抽出することが出来ました。

meast_ecn_notes_fill.zip
空港代码.xls
صحيفة.docx
第一批基地名单.xls

まずは zip ファイルを解凍しようとしたのですが、パスワードが設定されていたため、再度パケットを眺めながらそれらしい文字列を探して試してみましたが解凍できず、、、次にその他のファイルも開いてみましたが、どのファイルも何も書かれていませんでした。他に思いつく事も無かったため、おもむろに docx を解凍し、pass という単語で文字列検索をしてみました。

$ unzip -q صحيفة.docx
$ grep -R "pass" .
./docProps/core.xml:<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title><dc:subject></dc:subject><dc:creator>user</dc:creator><cp:keywords></cp:keywords><dc:description><strong><strong>password: lastonemile</strong></strong></dc:description><cp:lastModifiedBy>杉浦 隆幸</cp:lastModifiedBy><cp:revision>4</cp:revision><dcterms:created xsi:type="dcterms:W3CDTF">2013-12-13T12:04:00Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2015-03-20T02:31:00Z</dcterms:modified></cp:coreProperties>

お、パスワード書いてある!ってことで答えは lastonemile でした。

結局パスワードの掛かった zip ファイルはダミーだったみたいだけど、中には何が入ってたんだろ、、、

mondai10

ついに最終問題です。最後の問題は実際に指定された場所まで行って問題の入った SD カードを回収しないといけないとのこと。場所は 4 箇所あり、関東に 2 つ、関西に 2 つありました。しかし私が最後まで解いた時には既に関東に置かれたものは回収され、関西に置かれたものしか残っていませんでした。関西と言えど、さすがに福岡から行くのは大変なため、関西に居る知り合いに頼むことにしました。誰に頼もうかと思っていたところ、僕となーが君の共通の知り合いであるおわたん君なら行ってくれるのではないかということで頼んでみたところ、行ってくれる事になりました。下記は彼が取りに行った時のことを書いた記事です。

あの日 kansai1 で起こったできごとをボクたちはまだ知らない – にゃるにゃる

どうやらすでに回収されていたようでした、、、ごめんねおわたん、、、ということで最後に残った kansai2 を回収することに。しかし再度おわたん君に頼むのはちょっと可愛そうだし、結構遠いようだったので、別の方に頼むことにしました。大学の講義で知り合った人達がいる Slack のグループに誰か取りに行ってくれないか投げてみたところ、りらっくま君という子が行ってくれる事に。下記は彼が取りに行った時のことを書いてもらった記事です。

ネットエージェント – SDCardFindingBattle【kansai2】 | larufa’s blog @ テキトー

kansai2 の SD カードは無事回収してもらうことが出来ました!!!やったぜ!!!!!!!

さて、SD カードを送ってもらい、無事問題に取り組むことができるようになりました。まずはカードを Read only でマウントすると、入っていたのは Truecrypt で暗号化されたイメージファイルのみ。ということで、イメージファイルを渡された時の常套手段である削除されたファイルの復元を試みますが、それらしいファイルは出てこず、、、しかしこの時、復元したファイルの中に Mac でマウントすると自動で作成されるディレクトリがあり、ある可能性に気づきました。

「もしかして、書き込んでしまって復元できなくなった、、、??????」

実は SD カードを郵送して貰う前に、取りに行ってくれた人に中身のデータだけ先に送って貰っていたのです。もしかしたらその時に、、、

「いやでも、一度しくじったら解けなくなるような問題出すかなぁ、、、」と思い、その後はファイルの復元ではなく、他の解き方を模索しましたが結局進まず、色々試しましたが解けず。やっぱりファイルの復元だったのかな、、、

これはもう分かんないわ、、、ってことでソーシャルエンジニアリング(?)の出番です。既に最終問題まで解いてその write up を書いている方が居たので、その記事を参考に解くことにしました。

ネットエージェント最終面接問題 Write-up エクストリームCTF編 – 犬アイコンのみっきー

この記事によると、どうやら最後の問題はやはり削除されたファイルを復元して解くようです。この方が解いた問題の場合、答えは山名+最高点の標高を英数字で9文字だったようなので、それを参考にしました。今回 SD カードが置いてあった高雄山という名前とその標高である428 をくっつけた takao428 でイメージファイルが複合出来ました。

これで全問突破です!やったぜ!!!!!!!

さいごに

問題を解いた感想ですが、解くのにかなり時間が掛かったので、CTF ってやっぱり普段からリハビリしてないとダメなんだなと実感しました。ですが、仲間とワイワイ言いながら問題に取り組むのはやっぱり楽しかったので、時間は掛かったけど挑戦して良かったなと思いました。ただ一つ残念だったことは僕自身が実際に山に登って SD カードの回収に行かなかったことです。他の友人も誘ってみんなでキャッキャ言いながら回収しに行きたかったな、、、

モバイルバージョンを終了