生産性のない話

趣味の範囲でサイバーセキュリティの話

SECCON 2016!

会社の方々とチームで参加しました。

去年も参加したのですが、今年のSECCONは一味違いましたね。とてもCTFらしい問題ばかりでした。

昨年の問題を復習し、対策していたのですが、何一つとして役に立たなかったですね。

今年の問題SECCONらしい問題と言えば、SECCON TOWERくらいじゃないでしょうか。

www.youtube.com

他の方の解き方を見ると、画像を取得、機械学習で分析、デコードといった感じでした(まあ、そうだよな)。今どきのセキュリティ人材は機械学習くらいできなきゃダメなんですね。

こういう出題者を殴りたくなるような(いい意味で)問題こそSECCONの醍醐味だと思うのですが、これ以外は割と他のCTFでもありそうな一般的な問題ばかりでした。

ツールにかけるだけとか、頭をひねれば一発とか、とにかく時間をかけてQRコードを読み続ければフラグにたどりつけるみたいなイージーな問題はどこかにいってしまったようです。

 

■Vigenere

最初の問題で、これはそれほど難しくありません。Vigenère cipherだとご丁寧に Wikipedia つきで言ってくれてます。Vigenère cipher とはなんぞや、というとただの換字式暗号です。平文の各文字に対して鍵を順次一文字ずつ取り出し、平文の一文字と鍵の一文字を暗号表に当てはめれば暗号文の一文字が取り出せます。

問題の暗号は以下の通り。

k: ????????????
p: SECCON{???????????????????????????????????}
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ

 

k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe

 鍵の最初5文字は平文と暗号文から暗号表をたどれば出てきます。鍵は「VIGENER?????」です。

残りは5文字なので、これくらいなら総当たりで解けます。

鍵と暗号文から平文を生成する復号用のスクリプトを作成します。鍵の?にはA~Zに{}を含めた28文字を与え、その28*5のパターンの鍵からcを復号した平文のmd5を「f528a6ab914c1ecf856a1d93103948fe」と比較し、マッチしたものを出力します。

で、フラグが出ます。

くそコードは省略します。

 

■Memory Analysis

メモリダンプが落ちてきて変なプロセスがアクセスしているWebサイトを突き止めろという THE・フォレンジックな問題です。

こちらもご丁寧にHintにメモリフォレンジックの定番ツールである Volatility が紹介されています。

ただ、私のようなフォレンジック超初心者にはCUIツールは使いこなせないので、 KaniVola を使います。

KaniVolaはThe Volatility FrameworkのWindowsGUIインターフェースです。CLIであるVolatilityを実行する際に指定する複数のオプションを、少ない操作で入力し実行結果を簡単に保存できることを目的としています。

ということで、GUIでポチポチ選択すると適切なオプションを選んでくれてVolatilityのコマンドをたたいてくれるというツールです。いちいち調べたりせず、何も考えずそれらしいものを選択して実行するだけなので、とても簡単です。

さて、問題のメモリダンプを解析しましょう。問題は以下の通り。

Memory Analysis
Find the website that the fake svchost is accessing.
You can get the flag if you access the website!!

Webサイトと言っているので、ネットワーク関連を調べます。「connection」を選択し、実行します。

 Offset(V) Local Address Remote Address Pid
---------- ------------------------- ------------------------- ---
0x8213bbe8 192.168.88.131:1034 153.127.200.178:80 1080

 80番で怪しげな通信先につなげに行っています。次にsvchostがどうのこうの言っているので、プロセスも見てみましょう。「pstree」を選択し、実行します。

 Name Pid PPid Thds Hnds Time
-------------------------------------------------- ------ ------ ------ ------ ----
~~~
.... 0x81f0dbe0:spoolsv.exe 1644 672 15 133 2016-12-06 14:27:10 JST+0900
.... 0x81f65da0:svchost.exe 1776 672 2 23 2016-12-06 14:27:10 JST+0900
..... 0x8225bda0:IEXPLORE.EXE 380 1776 22 385 2016-12-06 14:27:19 JST+0900
...... 0x8229f7e8:IEXPLORE.EXE 1080 380 19 397 2016-12-06 14:27:21 JST+0900
~~~

先ほどのIPへアクセスしているプロセスID「1080」のプロセスの親にsvchost(PID: 1776 )がいますので、こいつが「the fake svchost」じゃないかと予想できます。

つまりIPアドレス「153.127.200.178」が設問にあるプロセスがアクセスしているWebサイトだとわかりました。

ここで、このアドレスをブラウザで打ち込んでみると、nginxのサイトが立っていることが分かりました。でもそれだけ。どうやらURLが必要なようです。

このままVolatilityで調べることも可能なのでしょうが、フォレンジック雑魚の私にはどのコマンドを打てばいいのか分からりません。

ということで別のツールを使います。

bulk_extractor という、メモリからファイルを抽出できるツールです。ダウンロードしてインストールしてもいいですが、REMnuxに入っています。

REMnux: A free Linux Toolkit for Reverse-Engineering and Analyzing Malware

REMnuxで先ほどのメモリダンプに対してbulk_extractorを実行します。

bulk_extractor forensic_100.raw ./out

これで ./out ディレクトリにメモリダンプから抽出されたファイルが出力されます。

中身を見るとパケットファイルがあり、これをWireSharkで見てみます。

先ほどのIPで絞ってもいいですし、HTTPでフィルタをかけてもそのIPしか出てきません。

f:id:blueBLUE:20161213210541p:plain

で、そのIPのドメインは「crattack.tistory.com」となっており、なんのサイトか調べると、なにやら韓国語のサイトが出てきました。このドメインを逆引きしても先ほどのIPにはならず、それぞれのIPのwhois情報も違っていることが分かります。

そこで、先ほどのIPにこのドメインのURLを組み合わせるたものへアクセスします。

http:// 153.127.200.178/entry/Data-Science-import-pandas-as-pd

これでフラグが書かれたファイルが落ちてきました。

私はいくつかのツールを動かしただけなのであまりがっつり解析しなくても正解できるフォレンジック入門者にはうってつけの問題ではないでしょうか。

ただ、私にとってはHintに紹介されたVolatilityよりもbulk_extractorのほうが使い勝手がいいように感じました。(コマンド一つで問題がパケット解析になるので)

 

以上2問を解いた後、ほかの問題をつまみ食いしながらどの問題にも歯が立たず、SECCON TOWERを眺めていたら時間になりました。

冒頭にも書きましたが、去年とSECCONの問題の傾向か変わったようで、来年以降どうなるかはわかりません。少なくとも今回で、デバッガや逆アセンブラを使えるようになり、バイナリとお友達になる必要性は感じました。