ネットエージェント新卒採用 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 カードの回収に行かなかったことです。他の友人も誘ってみんなでキャッキャ言いながら回収しに行きたかったな、、、

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

にゃんぱすー、おきなわです。

何番煎じか分かんないですけど、せっかくなので以前解いた CTF の Writeup でも書いてみようかなと思います。

題名から察しがつくかもしれませんが、今回書くのはネットエージェント株式会社の 2016 年度新卒採用で出題された問題の Writeup です。これは全ての問題を解くと最終面接から選考を始めることが出来ると言うとてもおもしろい取り組みです。

詳しくは下記のサイトを見て下さい。

さて、では早速解いていきましょう。
※ちなみに僕は Mac ユーザなのでこの記事におけるコマンドの例は全て Mac での実行例です。

mondai1

まず最初の問題です。

問題:LzYxMDIvcGouaGJwLy86cHR0aA==

もうこれは見ただけでわかりますね。そう、base64 です。末尾に == が付いてるのが特徴的ですね。というわけで Let’s デコード♪

$ echo "LzYxMDIvcGouaGJwLy86cHR0aA==" | base64 -D
/6102/pj.hbp//:ptth

どうやら逆になってるURL のようなので再度以下のようにコマンドを実行

$ echo "LzYxMDIvcGouaGJwLy86cHR0aA==" | base64 -D | rev
http://pbh.jp/2016/

上記の URL にアクセスすると zip で固められた問題がダウンロード出来ました。どうやら今度はそれを解いていくようです。

mondai2

ダウンロードしてきた zip ファイルを解凍すると次のような構成のディレクトリが出来ました。

mondai
├── hint2.txt
├── mondai2.txt
└── mondai3.zip

どうやらどんどん zip ファイルを解答していけば良いようです。では 2 問目を解いていきましょう。

2016の平方根の小数点以下2016桁目から20桁をパスワードにしました。

ガリガリ計算させれば良いじゃん!ということで僕は普段大学で matlab を使っているため、matlab で以下の m ファイルを実行させて解きました。

簡単ですね。ちなみに他の解き方としては bc コマンドを使う方法もあります。bc コマンドを用いる事で複雑な数値計算も行えます。

$ echo "scale=2035;sqrt(2016)" | bc | tr -d "\n" | tr -d "\\" | cut -c 2019-
74571026133060730881

というわけで答えは 74571026133060730881 です。

mondai3

さて、3 問目です。

ハッシュパスワード問題

答え:3つの答えをつなげて

0f1aae8b8398c20f81e1c36e349a7880c9234c63

01821f5469967540a5a774197463e8c4d658f588

264f39cab871e4cfd65b3a002f7255888bb5ed97

ハッシュから元の文字列を求めないといけないようですね。本来ハッシュは不可逆なので元の文字列を求めることは出来ないのですが、インターネット上に単語とそのハッシュ値を紐付けたデータがごまんとあるので大概検索をかければヒットします。と言う訳で Google 先生の出番です。それぞれのハッシュを検索するだけ。

0f1aae8b8398c20f81e1c36e349a7880c9234c63 → tokyo
01821f5469967540a5a774197463e8c4d658f588 → ueno
264f39cab871e4cfd65b3a002f7255888bb5ed97 → line

ということで答えは tokyouenoline です。

mondai4

さて、4 問目ですが、ディレクトリ構成は次のようになっていました。

mondai4
├── hint4.txt
├── mondai4.png
└── mondai5.zip

どうやら次は画像の問題のようですね。入っていた png ファイルは以下のようなものでした。

とりあえず画像ファイルに含まれる文字列を下記のようにコマンドを実行して見てみます。

$ strings mondai4.png

実行結果を眺めてみましたが、特にめぼしいものはなかったため、画像に書かれているヒエログリフを読む必要があるみたいですね。さっそく読んでみましょう。ただし僕はもちろん古代エジプト人では無いので日本語との対応表が無いと全く読めません。ということで以下のサイトを参考にしました。

ヒエログリフで五十音図

上記のサイトを参考に画像に書かれているヒエログリフを日本語にすると

のらかちいくち てちのちんちもちみら もにみちもにみら もにとちのにみちもちい のらもらまみ

となりました。ちょっと何言ってるのか良く分かんないですね。とりあえず2つ目の文字列である「てちのちんちもち」で Google 検索をかけた所、以下のサイトが最上位に来ました。

「かな入力」のままローマ字打ちで会話するスレ

ここでかな入力なのか?!と思い、所有している JIS 配列のキーボードを見ながらアルファベットに変換したところ、

kotaeha wakayamano minamino misakinamae komoji

答えは和歌山の南の岬 名前小文字

となりました。ここで岬の名前を検索した結果、潮岬(shionomisaki)ではないかと思ったのですが、解凍出来ず。しょうがないので和歌山の全ての岬の名前で試したりしましたがダメでした。その後も特に思いつかなかったため、ここで同じく問題を解いているらしいなーがに協力を仰ぎました。しかし二人でも特に思いつかなかったため、なーがが彼の先輩であるティマ先輩に協力を仰ぎました。そして三人で試行錯誤していた矢先、ティマ先輩がついに答えを見つけました!

答えは ushiomisaki でした。

ティマ先輩曰くとりあえず漢字の読み方を変えてみようと思って試したら上手く行ったとのことでした。圧倒的感謝🙏🙏😄😄

mondai5

5 問目です。問題ファイルは以下の様なものでした。

どうやらまた base64 のようです。なのでとりあえず一度デコードしてみたところ、また base64 がでてきました。そこで何度か base64 でエンコードされてるのか?!と思い、以下の様なスクリプトを書いて実行させてみました。

上記のスクリプトを動かすと mondai5_2 という以下のファイルを生成します。

begin で始まり end で終わっているあたりから uuencode でエンコードされたファイルだと分かったので以下のようにデコードします。

$ uudecode -o mondai5_3 mondai5_2

そして得られたファイルについて、どんなファイルなのか file コマンドを用いて調べます。

$ file mondai5_3
mondai5_3: gzip compressed data, from Unix, last modified: Thu Mar 19 17:31:56 2015

どうやら gzip ファイルのようなので素直に解凍。

$ gzip -dc mondai5_3 > mondai5_4

作成したファイルに対して再度 file コマンドを実行。

$ file mondai5_4
mondai5_4: Zip archive data, at least v1.0 to extract

zip ファイルなので再度解凍。

$ unzip mondai5_4
Archive: mondai5_4
extracting: nek 

再度 file コマンドを実行。

$ file nek
nek: bzip2 compressed data, block size = 900k

またまた解凍。

$ bzip2 -dc nek > mondai5_5

またまた file コマンドを実行。

$ file mondai5_5
mondai5_5: 7-zip archive data, version 0.3

解凍して出てきたファイルに対して file コマンド(ry

$ file n
n: RAR archive data, v1d, os: Win32

解凍して出てきたファイルに対し(ry

$ file ne
ne: LHarc 1.x/ARX archive data [lh0]

解凍して(ry

$ file nex
nex: xz compressed data

解(ry

$ file nex-1
nex-1: data

やっと圧縮ファイル以外が出てきたのでとりあえずバイナリを vim で眺めてみます。

$ vim -b nex-1

ファイルの最初に MSWIM と書いていたのでその単語でググった結果、どうやら Windows Imaging Format ではないかと分かりました。7-Zip で解凍出来るようなので解答して得られたファイルに対して file コマン(ry

$ file QRcode
QRcode: Sun raster image data, 123 x 123, 8-bit, RGB colormap

そのままだと表示出来なかったのでとりあえず jpeg ファイルに変換。

$ convert QRcode QRcode.jpg

以下がそのファイルです。

どうやら名前の通り QR コードなので適当に携帯のアプリで読み込んだところ

+BCcENQQxBEMEQAQwBEgEOgQw-

という文字列が出てきました。調べた所、UTF7 でエンコードされた文字だということがわかったため、以下のサイトを使ってデコードしました。

Encode/Decode_Tool

デコードした結果 Чебурашка でした。ドイツ語でチェブラーシカという意味だそうです。これがそのまま答えでした。

 

 

とりあえず疲れたので今回はここまでです。mondai6 以降は次の機会に。

ではでは〜

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