MWS CUP 2019
課題2: 静的解析
中津留勇
石丸傑
石淵一三
中島将太
古川和祈

課題2 担当

去年のふりかえり課題2 新担当

課題2 変わらぬテーマ

静的解析を通じ・・・

マルウェアを正しく理解する

最新情報を得る

実務に近い作業MWS Cup 2019
課題2 概要今年の検体は Datper
e38d3a7a86a72517b6ebea89cfd312db0f433385a33d87f2ec8bf83a62396bb3

https://blogs.jpcert.or.jp/ja/2019/02/tick-activity.html

新たな挑戦・・・64bit

https://docs.microsoft.com/en-us/cpp/build/x64-callingconvention?view=vs-2019

Windows APIの難読化解除配布したIDBではAPIを解決しているが実際は難読化されている

IDAのブックマーク機能• ALT + M -> ブックマーク登録• CTRL + M -> ブックマークリスト配布した.i64にブックマークを設定しましたMWS Cup 2019
課題2 解答例

設問の意図実務における解析を行う目的となりえる要素を設問として出題

1. 機能の特定•RAT である当該検体がどのような命令を実行可能なのか解析せよ

2. 暗号とエンコーディング•

当該検体の暗号やエンコーディングに関連した処理について設問に答えよ3. マルウェアの特定•

これまでの回答やその他の解析結果を元に当該検体の名称（Emdivi、Daserf、Oni、Plead 等）を答えよ1-1 マルウェアの設定を理解する1-1 直前で呼ばれているAPIについて調べる1-1 構造体の適用！

1-1 解答
現在時刻が dword_AFB030 より後で dword_AFB034 より前のとき loc_A51AE0 の処理へ進み、それ以外の時刻では1000ミリ秒停止したこの比較処理を繰り返す

1-2 マルウェアの挙動を理解する1-2 WinAPIから収集情報を確認システムロケールの言語ID

コンピュータ名(Ascii)

ｖ

コンピュータ名(Wide)OSバージョン
IPアドレス

1-2 解答1-3 マルウェアの挙動を理解する

コマンド解析のための補足
特定の変数[rdp+ver_sC8]の値をハードコードされた数値と比較する
分岐処理がある• RATのコマンド分岐処理• 分岐後の処理が問題として出題されている

コマンド解析のための補足
各分岐の最後に呼び出されているsub_A4EA30を確認する

コマンド解析のための補足
sub_A4EA30から呼び出される処理に通信系の処理がある• コマンド実行後、C2へ結果を送信している処理と推測する

1-3 呼び出されるアドレスを確認する

lpCommandLineの代入元

CreateProcessWを使う処理であること、第2引数であるlpCommandLine（rdx）を参照し、値の代入元を確認してみると削除やインストールを予測出来る文字列が見つからないことから推測

1-3 解答1-4 マルウェアの挙動を理解する1-4 API呼び出しの流れを理解

ファイルを読み込む処理であること、
そのあとC2に通信を行うことから推測

1-4 解答1-5 マルウェアの挙動を理解する1-5 GetProcAddress
GetProcAddressを呼び出してAPIのアドレスを解決••

shell32.dll
SHFileOperationA1-5 呼び出されるAPIを確認する

1-5 解答wFuncにFO_DELETE、fFlagsにFOF_SILENTとFOF_NOCONFIRMATIONを指定してSHFileOperationAを呼び出すことによりダイアログを出さずにファイルを削除する

https://github.com/wine-mirror/wine/blob/master/include/shellapi.h

1-6 マルウェアの挙動を理解する1-6 呼び出されるアドレスを確認する

1-6 呼び出されるAPIを確認する

1-6 解答

ワイルドカードを指定してFindFirstFileWとFindNextFileWを呼び出してファイルの一覧を取得する

2-1 アルゴリズムを理解する2-1 解答
変換テーブル: PzLS3wlhemAnfxsUiGNOgT5R6aH9^`KyD8Cocd04EFIvWBQJZXpj1qtu2rkb7VMY!
パディングに使用する文字は変換テーブル最後の"!"PzLS3wlhemAnfxsUiGNOgT5R6aH9^`KyD
8Cocd04EFIvWBQJZXpj1qtu2rkb7VMY!

2-2 アルゴリズムを理解する2-2 RC4
伝統と格式のRC4問題！
問題のマルウェアファミリを変更しても課題2では毎年出題されている

DaserfOni

Plead

2-2 開催中に提示したヒント

2-2 解答
オープンソースのARC4のソースコードと比べてみる

https://elixir.bootlin.com/linux/v4.1/source/crypto/arc4.c

2-2 解答•

配列の初期化時に値を5ずらした配列を作っている

通常のRC4 [0, 1 ... 255]

問題のカスタムRC４[5, 6 ... 255, 0 ... 4]

2-3 アルゴリズムを理解する2-3 固定値
怪しい固定値のxorに注目2-3 アルゴリズムの確認

2-3 解答3-1 マルウェアを特定する

出題意図• マルウェアの特徴を基に公開情報を活用できるか

3-1 OSINT(Google)
これまでの解析結果を基にOSINTして候補を絞る

Datperxxmm

2016年MWS CUP課題
Daserf3-1 APIデコード処理に注目する１
APIのデコード処理生成された文字列を用いて
5j2Cnx`^@$*(]{}|+mX k3DK'LGc!hHNPgZ,z0T8_sRU7)<>"[lBpdfI#%bu;ytYeoW?4vAMQVa.6qJi:=wFO9&/1ESr

https://www.paloaltonetworks.jp/company/in-the-news/2017/tick-continues-cyber-espionage-attacks

Minzen(XXMM) か Datper である可能性が高い

3-1 APIデコード処理に注目する２
エンコードされたAPIの文字列を用いて

3-1 コンフィグ• 1-1で設定されていた時刻はコンフィグからロードされている• aa_load_configの処理を解析するとコンフィグの各設定が|||で区切られていることが判明する

3-1 コンフィグ
コンフィグの特徴はDatperと一致する

https://blog.kaspersky.co.jp/the-bald-knight-rises-apt/19376/

3-1 コンフィグの復号
競技時間中でのコンフィグの復号は想定していないがコンフィグの情報から検体の名称を特定することもできる

https://blogs.jpcert.or.jp/ja/2019/02/tick-activity.html

MWS Cup 2019
課題2 採点結果と振り返り課題2の難易度はどうでしたか？

課題2の分量はどうでしたか？

課題2として取り上げてほしい内容はありますか？
マルウェアの種類に関する意見••••Linuxのマルウェア
Windows以外を対象とする検体の解析
Cutwail
ランサムウェア

問題に関する意見• 難読化されたコードの解析• 動的解析環境検知手法に関する内容• 動的解析では得られない情報を取得するもの

現状でカバーできている意見• これまで同様の実際のマルウェア• 最新のマルウェア• 復習したときに基本教材として使えるようなもの

課題2に対する意見、コメント問題に関して•••マルウェアを特定する問題について、それまでの問題がどのくらい伏線になっていたのかが気になった
着目すべきアドレスが問題文で指定されていが、検体全体から重要な処理を探すかという設問も解いてみたい
分量が多かった

良かった点
••
•
•

静的解析お役立ち情報を伝えるのは良かった
初学者には難易度が高かったが、勉強になり楽しく取り組めた
課題がx64アーキテクチャであったため新鮮だった
各問題へのブックマークが便利だったので、今後もあると嬉しい•

昨年「今年から問題などを公開する方向」とのことで待っていたのだが、公開されていないのが残念だった

その他

問題作成者振り返り••問題に関して• 簡単な問題として選択問題を用意したが、選択問題は部分点をあげられないのが悩ましい• 全体としてバランス良く分布していたので今回は良し？
• デコンパイラ使用禁止の注意書きを入れるべきだった• 内容についての意見は次回の参考にします• 公開については、できてなくてごめんなさい• 来年こそは！
その他••

実務解析者がチームにいる場合の考慮が必要•
教育という観点では実務者がチームにいて相談できるのはよい•
実務者は専門外の問題を解くことをルール化したい•
その場合問題レベルも再考が必要
公開されてないやんけ、とかアドバイスとか、何でも聞いてくださーい