前回記事で、IDAを使ったマルウェア解析で得られたパラメータを掲載しました。
これらのデータを、マルウェア解析の結果を元にメモリフォレンジックでC&Cサーバのアドレスを得ることはできないか、というのでちょっと簡単に試してみました。
前々回の記事で、マルウェアの挙動から不審なプロセス名はsvchost.exeで、ツリーがおかしいことが分かっており、これを用いて問題のプロセスを特定し、メモリ内のテキストで保持されているIPアドレスを取り出すことができないか、というものです。
今回は、その手順と結果を例示します。
環境等の情報
- マルウェアが動作するVMware上のWindows 10
- SANS SIFT Workstation (解析用Linux)
- Magnet RAM Capture Ver 1.0 (メモリキャプチャ)
- 検体
マルウェアが動作するVMware上のWindows 10は、マルウェアを実行させて、マルウェアが動いている状況でメモリダンプを取るためのものです。細かいバージョンにはこだわらないと思いますが、バージョン情報は把握しておくと良いでしょう。パッカーの動作と本体の動作のそれぞれの記事で示したとおり、感染でいろいろなパラメータを書き換えたりファイルを作成したりするため、VMを使うことを強く推奨します。また、今回は通信は行わないようネットワークに繋がらないスタンドアロン状態で実行しました。
SANS SIFT Workstationは、SANSがUbuntuをベースに構築した、デジタル・フォレンジックを目的とした解析プラットフォームです。VMで実行できる(個人的にはVMware推奨)ようになっています。メールアドレスの登録は必要ですが、無料でダウンロードして使うことが可能です。色々な機能があり、使いこなすにはSANSのトレーニングを受けた方がベターです。
SANS DFIR Community downloads SIFT Workstation
https://digital-forensics.sans.org/community/downloads
Magnet RAM Captureは、メモリダンプを取るために使用しました。メモリダンプを取れれば別にどのツールでもいいのですが、このツールはGUIベースで、USBメモリ等にいれてお手軽にメモリダンプを取れるので重宝しています。こちらも、登録は必要ですが無料でダウンロードして使うことが可能です。実行には管理者権限が必要です。ちなみに、この会社のツールでは、お仕事ではディスクフォレンジックツールとしてAXIOMを使わせてもらってます。特にタイムライン解析が秀逸なので重宝してます(タダでツール使わせてもらってる分くらいは宣伝しないと)。
MAGNET Forensics Resource Center MAGNET RAM Capture
https://www.magnetforensics.com/resources/magnet-ram-capture/
検体は、このシリーズでおなじみのものです。Emotetらしいですが、保証はないのと、検体古めなので最新の検体でも今回の手法が通るかは試してみないと分からないです(だから検体をチョウライとあれほd)。
以下にハッシュ値を再掲します。
MD5:
545BFDC9B1976AE0003443FF4F90EB7E
SHA1:
92E8CE006BB3C4A1DDB8D8BA8DE3A90C0BBB6326
検体の実行とメモリダンプの取得
用意したマルウェアが動作するVMware上のWindows 10に、検体を適当なフォルダに設置して実行するだけです。
Windows Defenderが検知するようなら切っておきましょう。
プロセスのモニタツール等で検体が実行され、svchost.exeが起動されていればOKです。
この状態で、Magnet RAM Captureを実行します。今回は、ツールを適当なフォルダに置き、出力先も適当でかまいません。フォレンジック調査の場合は、ディスクをなるべく書き換えないよう、外部デバイス等を使うなどの配慮が必要です。
VMの場合は、ダンプしたデータを一旦ホストに出力します。メモリのサイズに応じて数ギガのサイズになりますので、多少時間がかかります。これも面倒なら、VMのゲストでキャプチャをする際にUSBメモリ等を出力先にしておくのも手でしょう。
Volatilityでの解析とプロセスデータの抽出
メモリのダンプが終わったら、検体を実行したWindows VMを終了します。この時に、スナップショットを戻してしまっても構いません。
次に、SANS SIFT Workstationを起動します。
起動したら、メモリダンプをホストから適当なディレクトリにコピーします。
SIFT Workstationでは、/casesというディレクトリが予め作られており、解析ではこちらを利用することが多いので、今回もここにコピーしました。USBメモリ等を出力先にしていた場合、SIFTにマウントして参照してもOKです。
メモリダンプをSIFTで参照できるようになったら、Volatilityで解析を開始します。
SIFTにはVolatilityが既にインストールされています。
ただし、最近のWindows 10では、半年に1回程度?の大きいバージョンアップの度に、メモリの構成が微妙に変わっているようで、新しいバージョンのWindows 10の場合はツールも更新する必要があります。
以前、「SANS SIFTのVolatilityの更新」の記事でプラグインの更新方法を書いておいたので、もし上手くいかないならVolatilityの更新をしてから再度実行してください。
Imageinfoでプロファイルを取得
まず、メモリダンプでプロファイルを確認するためにimageinfoでプロファイルを確認する必要があります。
メモリフォレンジックをよくやっていて、環境のプロファイルを既に把握している場合はスキップ可能です。
以下のコマンドでimageinfoを実行します。
vol.py -f (メモリダンプへのフルパス名) imageinfo
メモリダンプの情報を収集するため、多少時間がかかります。
待っている間に、推しのウ=ス異本でも眺めていると幸せです。
完了すると、上のような結果が出力されます。
なお、私にとってはゆゆ様のウ=ス異本を愛でるには全然足りないくらいの時間で終わりました。
(要るか?この記載。)
このときに注目するのは、INFOにある「Suggested Profile(s)」です。
プロファイルの候補が出てきています。まあ、複数出ているので、「どれだよw」って言いたいのは分かりますが(汗)。
基本的には、新しいプロファイルから試していく感じになります。OSのバージョンが分かっていれば、プロファイルを選ぶ際に参考になるので、対象のOSバージョンを確認しておくことを推奨します。
pstreeでプロセスツリーを確認
プロファイルが分かったら、そのプロファイルを元にメモリを分析していきます。
今回は、マルウェアが実行されているプロセスのダンプを取りたいので、マルウェアのプロセスIDを知る必要があります。
今回のケースでは、プロセスツリーでおかしくなっているsvchost.exeが当たりと分かっているので楽に知ることができます。
なお、別にVolatilityを使わなくても、上の画像のプロセスIDでもOKっちゃOKです。
あくまで、ヒントを元にメモリフォレンジックで進めることを主眼にしているので、このステップを踏みます。
以下のコマンドでpstreeを実行します。
vol.py -f (メモリダンプへのフルパス名) --profile=(プロファイル名) pstree
ツリー情報が出ていることが分かります。
今回はタネが分かっていますが、未知のマルウェアを探す際にこのツリーを使う方法もあります。
前回記事で触れたSANSのポスターが秀逸なので、それを参考にすると良いでしょう。
少々多いですがツリーを見ていくと、親プロセスが無い(service.exeでない)svchost.exeが見つかります。
これにより、これがマルウェアのプロセスであり、PIDは5512であることが分かります。
memdumpでプロセスデータを抽出
プロセスの特定ができたら、今度はそのプロセスのデータを抜き出します。
Volatiityでは、memdumpでPIDを指定することで、そのプロセスが利用しているメモリ情報も含めて抽出してくれます。
以下のコマンドでmemdumpを実行します。
vol.py -f (メモリダンプへのフルパス名) --profile=(プロファイル名) memdump -p (プロセスID) --dump-dir (出力先ディレクトリ)
出力結果は、指定のディレクトリに(PID).dmpで出力されています。
これが、この検体が実行されていたメモリ上のデータとなります。
プロセスのダンプから文字列を抽出
プロセスのダンプデータより、今回の目的のIPアドレスを抽出します。
今回は、前回の記事でメモリ上にUnicodeの文字列として展開されていることが分かっていますので、これをターゲットとしてみます。
メモリデータからこの情報を得るには、ダンプしたプロセスのメモリデータからStrings解析で文字列を抽出することで達成できそうです。
ツールは何でもいいのですが、今回はSIFT Workstationにインストールされているstringsコマンドで試してみます。
IPアドレスの文字列はUnicodeで登録されていますが、SIFT WorkstationにインストールされているstringsはUnicodeに対応しているためです。
以下のコマンドでstringsを実行します。
strings (プロセスのメモリダンプ) > (出力先ファイル名)
この出力されたテキストファイルを参照してみましょう。
テキストエディタはなんでもOKです。
ほおれ、これがこのマルウェアのC&C通信のIPアドレスだよ?
まあ、なんて簡単!検体と環境(マルウェアを実行するVMと解析するSIFT Workstation)の準備がしてあれば、1時間もあればこのIPアドレスが抜けちゃいます。
(ちなみに、IPで検索していくと、他にもURLとおぼしき文字列がでてきますよ?Emotet検体がある人は試してみると面白いかも?)
しかも、この手順で一番時間を食うのはVolatilityのimageinfo、次いでメモリダンプのコピーなので、同じVMを使うことでimageinfoをスキップし、メモリダンプのコピーを効率化(USBメモリを使う、ホストとの共有フォルダを使ってコピーを発生させない等)することで、さらに時間短縮ができます。
stringsの解析結果も結構な量なので、この結果をさらにIP部分をきれいに抜ける正規表現を考えてみるのも手じゃないでしょうか。
今回は、マルウェア解析の結果から、検体からメモリフォレンジックを用いて効率的にC&Cサーバのアドレスを抽出する方法を考えて実際にやってみました。
このIPアドレスが取れるならば、通信のブラックリストや通信履歴からC&Cとの通信の有無をチェックできるのではないでしょうか。
マルウェアを解析して、その挙動や痕跡の残り方から、他の解析に役立つ情報が得られるのではないか、という例です。
こういうのを目標として、マルウェア解析にトライするのもいいんじゃないでしょうか。
まあ、そのためには、マルウェア解析以外の技術もある程度知っておく必要があるんですけどね!