
[!] この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
この記事では、デジタルフォレンジックの基本的な手順や分析方法をご紹介します。また、分析の題材として、ファイルレスマルウェアを取り上げます。サイバーセキュリティの強化として、デジタルフォレンジックに取り組みたい方の一助になれば幸いです。
なお、この記事のコマンド出力結果は、一部を省略や加工をしています。
ファイルレスマルウェアEmotetに新型、より欺かれやすく
2022年4月頃から、Windowsのショートカットファイル(拡張子.lnk)を悪用したファイルレスマルウェア型Emotetが発生しています。(詳細は、Emotet(エモテット)と呼ばれるウイルスへの感染を狙うメールについて (情報処理推進機構) ⧉参照。)
ファイルレスマルウェアとは、ウイルス本体をディスクドライブ上に直接格納せず、OSに備わっているPowerShellやMicrosoft Office等の機能を使って、攻撃者のサーバーから悪意あるコードをメモリ上にダウンロードし、実行・動作するタイプのウイルスのことです。
もし実行してしまったら
もしマルウェアを実行した場合、再発防止策の検討や、取引先への説明のため、原因調査が不可欠です。しかし、一時的なデータはOSによる自動的な消去や、マルウェア自身が痕跡を消去するなど、電子機器内の情報は刻一刻と変化するため、初動が遅いと、原因調査の致命傷となる可能性があります。また、対象の電子機器内で、psコマンドなどを人の手で無闇に実行することも、データを誤って改変したり、消去したりするリスクに加え、時間を浪費する点で望ましくありません。
そこで、デジタルフォレンジック(Digital forensics:電子機器の証拠保全・分析)を行うことが重要となります。特にファイルレスマルウェアの場合、メモリにしか攻撃コードなどのデータが残らないため、メモリの保全がポイントとなります。また、分析のアウトソースや司法機関などへの提出も可能になります。
デジタルフォレンジックでのデータ収集方法
この記事における前提条件
デジタルフォレンジックで収集するデータは、OSの種類や機器によって取得方法が変わります。この記事では範囲を限定するため、一般的な「Windowsパソコン」(PC)を対象とします。PCが接続されているネットワーク機器などのログは重要ですが、この記事では扱いません。
また、以下のコードを「リンク先」に仕込んだショートカットファイルを、擬似的なファイルレスマルウェアと見立てて使用します。「リンク先」は、ショートカットのプロパティ画面で設定できます。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe Start-Process -FilePath powershell.exe -ArgumentList \"-command 《攻撃コード》\"
このショートカットの挙動は以下の通りです。
-
《攻撃コード》をPowerShellに注入して実行させます。Windows標準のPowerShellを悪用し、Windows正規プロセスに見せかけます。Windowsの場合、エクスプローラー上で実行したプロセスのほとんどは、Explorer.exeの子プロセスとして実行されます。
-
《攻撃コード》は、C&Cサーバ(攻撃者の制御サーバ)へ通信を行うものです。今回はダミーで自社サーバに接続するものとしました(具体的なコードは省略)。
-
《攻撃コード》は、ショートカットによって起動されたPowerShellの、子のPowerShellのプロセスで実行されます。 その結果、以下のようなプロセスツリーになります。なお、図の「conhost.exe」は、コマンドプロンプトを実行するアプリケーションで、記事の本題と関係ないため、説明の対象外とします。
-
親のPowerShellプロセスは、子のPowerShellプロセスとして実行させた《攻撃コード》を開始したのち、終了します。
- 終了する理由は、後述の「本物のマルウェアの場合」を模倣するためです。ただし、ダウンロードやファイル削除は行いません。
-
一方、《攻撃コード》を実行している子プロセスは終了されず、単独のプロセスとなって実行を継続します。その結果、以下のようなプロセスツリーになります。この《攻撃コード》を実行しているPowerShellプロセスは、どのプロセスの子にもなっていません。
この記事では、この《攻撃コード》実行中のメモリダンプを取得します。
本物のマルウェアの場合
本物のマルウェアは、マルウェア本体を攻撃者のサーバーからダウンロードして実行します。マルウェア本体は、Windows標準のプログラム(PowerShellなど)に悪意のあるコードを注入して実行させます。悪意のあるコードの実行を開始したのち、すぐにマルウェア本体を停止・削除します(ウイルス対策ソフトなどに検知される可能性を低減するため)。このとき、上記の通り、悪意のあるコードはマルウェア本体がなくなっても独立したプロセスで稼働を継続するため、動作に支障はありません。
収集するデータは最低でも2種類
デジタルフォレンジックで収集すべきデータのうち、最低限必要なものは、以下の2種類です。
- メモリダンプ
- プロセスの活動状況や、一時的に使用する揮発性データ(ファイルレスマルウェアの攻撃コードを含む)を取得します。
- 取得するまで、インシデント発生時からシャットダウンしてはいけません。
- HDDの完全ディスクイメージ
- HDDの全セクターを、別の新品HDDなどにコピーします。
- 単なるファイルやフォルダのコピー&ペーストでは、削除済ファイルの確保は不可能です。
- しかし、セクター単位で全ての情報を取得する完全ディスクイメージなら、OSで論理削除したファイルを抽出できる可能性があります。
デジタルフォレンジックのデータ収集は、手順の間違い、さらには証拠隠滅を目的とした意図的なデータ消去・改ざんのリスクを軽減するため、手順に精通したCSIRT(Computer Security Incident Response Team:情報セキュリティインシデント対応チーム)などの専門組織が行うのが理想です。しかし、人員には限りがあります。データの保全は、インシデント発生時点からの経過時間が重要なため、CSIRTの到着を長時間待つこともよくありません。そのため、CSIRTの指示に従って現場でデータを収集するなど、リスク軽減のための臨機応変な対応が求められます。
メモリダンプの取得手順
メモリダンプの取得は簡単です。この記事では、AccessData社の「FTK Imager」を使用します。これは情報セキュリティサービス基準(経産省) ⧉が参照する証拠保全ガイドライン第8版 (デジタル・フォレンジック研究会) ⧉に、「主要なデジタル・フォレンジック調査・解析用ツール(ソフト)」の1つとして掲載されています。
メモリダンプの取得方法は以下の通りです。
- FTK Imager ⧉の最新版をダウンロードし、インストールします。
- 迅速にメモリダンプを取得できるよう、インシデント発生前にインストールしておくことが望ましいです。
- FTK Imagerを起動し、ツールバー内の「メモリ」アイコン(下図の赤枠部参照)をクリックします。
- 「Browse」ボタンをクリックし、画面の案内に従って、メモリダンプの保存先を指定します。
- 保存先はUSBメモリも可能です。(ご自身の環境によりご判断ください)
- ただし、端末が搭載しているメモリと同じサイズのダンプファイルが生成されるため、保存先の空き容量に注意します。
- 「lnclude pagefile」のチェックボックスをONにします。これにより、メモリからページアウトされたデータも取得対象にします。
- 「Capture Memory」ボタンをクリックします。メモリダンプの取得が開始されます。
- 所要時間は、端末の性能によります。ご参考として、以下の端末の場合、約30秒で完了しました。
- CPU:Intel Core i5-6600 (最大3.90 GHz)
- 搭載物理メモリ:8GB(内約4GB使用中)
- 仮想メモリ:約400MB使用中
- メモリダンプ保存先:ローカルのSSD
- 所要時間は、端末の性能によります。ご参考として、以下の端末の場合、約30秒で完了しました。
HDDの完全ディスクイメージの取得手順
ファイルレスマルウェアは、ファイルをHDDに残しません。しかし、マルウェアが別のマルウェアのダウンロードやログの記録など、HDDに痕跡を残す可能性はゼロではありません。そのため、HDDの完全ディスクイメージも重要です。
メモリダンプを取得したのち、フォレンジック対象端末の電源を落とし、慎重にHDDを取り外します。このとき、静電気対策手袋などを使用するとよいでしょう。
取り外したのち、以下の手順で、HDDの完全ディスクイメージを取得します。
- 誤消去を防ぐため、もしあれば「逆方向書き込み防止装置」(HDDへの書き込みを禁止する装置)をフォレンジック対象HDDに接続し、書き込み不可にします。
- この記事では、HDDの接続方法の詳細は割愛します。
- ご使用の逆方向書込み防止装置や、SATA⇔USB変換ケーブル等のマニュアルをご参照ください。
- 任意のLinuxマシンに、「(逆方向書き込み防止装置が接続された)フォレンジック対象HDD」と「コピー先のHDD」を接続します。
- このとき、HDDをマウントせずにライブ起動できるKali Linux Forensics Mode ⧉などを使用するとよいでしょう。
- 「コピー先のHDD」には、新品のHDDか、0x00(ゼロ)で埋め尽くしたHDDを使用します。
- Linuxにログインし、以下のコマンド(例)でHDDの完全ディスクイメージを取得します。
Terminal window $ dd if=/dev/sda of=/dev/sdb bs=512- ここで、
if
(フォレンジック対象HDD)とof
(コピー先HDD)を間違えないようにしてください。逆方向書き込み防止装置を使用していない場合、間違えると、「空のHDD」を「フォレンジック対象HDD」にコピーし、「フォレンジック対象HDD」は空になってしまいます。
- ここで、
HDDの完全ディスクイメージは、mountコマンドなどでマウントできます。
デジタルフォレンジックのデータ分析方法
デジタルフォレンジックに必要なデータを収集したのち、次は分析を行います。
分析の糸口
メモリダンプには数多くの情報が格納されています。この記事では、デジタルフォレンジックの基礎を紹介しているSuper Easy Memory Forensics (IIJ) ⧉を参考に、 「プロセス自体はWindows標準のものだが、正しい親子関係で実行されておらず、独立して実行されているプロセス」 を探すことを糸口に分析してみます。
これによると、Windowsの場合、エクスプローラー上で実行したプログラムのほとんどは、Explorer.exeの子プロセスとして実行されます。これはプロセスの正しい親子関係で、マルウェアも同じです。しかし、マルウェアは、その子プロセスとしてWindows正規のプロセス(PowerShellなど)を起動し、攻撃コードを注入して実行させたのち、マルウェアのプロセスが検知されないよう、自身を終了します。この結果、マルウェアの子プロセス(Explorer.exeの孫プロセス)だった、攻撃コードを実行中のWindows正規のプロセスは、親プロセスの終了により、Explorer.exeからも独立したプロセスとして稼動を続けます。独立したプロセスは全て悪意のあるプログラムではないものの、着目すべきプロセスとなります。
この記事の冒頭に示した擬似的なファイルレスマルウェアも、同様の挙動を行うようにしています。
Volatility3による分析
無償利用可能なVolatility3 ⧉を使用して、メモリダンプを分析します。
Volatility3はCLIのツールで、メモリダンプの分析結果をコンソールに出力します。Windowsのほか、macOSやLinuxのメモリダンプも分析できます。
インストール手順は、Volatility3のGitHub ⧉に説明がありますが、これだけではうまくいかない場合があります。そのため、Ubuntuでは以下の手順で行うとよいでしょう。WSL2上のUbuntuなどにもインストールできます。なお、Python3はインストール済とします。
$ sudo apt install python3-pip python-setuptools build-essential python3-dev python3-tk python3-yara libssl-dev libffi-dev libsnappy-dev$ git clone https://github.com/volatilityfoundation/volatility3.git$ cd volatility3$ sudo pip install distorm3 pefile -r requirements.txt
インストール終了後、以下のコマンドでヘルプを表示します。インストールに成功している場合、指定できる引数の情報などが表示されます。
$ python3 vol.py -hVolatility 3 Framework 2.4.0usage: volatility [-h]......(略)
以下のコマンドで、メモリダンプのプロセスツリーを分析できます。
$ python3 vol.py -f /mnt/c/TEMP/memdump.mem windows.pstree
Volatility 3 Framework 2.4.0
PID PPID ImageFileName Offset(V) Threads Handles SessionId Wow64 CreateTime ExitTime
704 544 wininit.exe 0xXXXXXXX96300 1 - 0 False 2022-12-12 01:15:33.000000 N/A* 776 704 services.exe 0xXXXXXXXe9300 8 - 0 False 2022-12-12 01:15:33.000000 N/A** 3608 776 LMS.exe 0xXXXXXXX52300 14 - 0 True 2022-12-12 01:15:36.000000 N/A7860 10060 powershell.exe 0xXXXXXXXcf340 27 - 2 False 2022-12-12 06:08:07.000000 N/A ←独立したpowershell.exeプロセス* 1900 7860 conhost.exe 0xXXXXXXXaa340 4 - 2 False 2022-12-12 06:08:07.000000 N/A
引数のmemdump.mem
はメモリダンプのファイル名、windows.pstree
はプラグイン名です。この例では、プロセスツリーを視覚的に表示できます。例えば、wininit.exe(PID:704)の子プロセスとしてservices.exe(PID:776)があり、さらにその子プロセスとしてLMS.exe(PID:3608)が存在します。
powershell.exe(PID:7860)は独立したプロセスとして稼働していたことがわかります。(なお、このプロセスの親プロセスIDとして出力されているPID:10060は、PowerShellプロセス(PID:7860)を子プロセスとして起動し、《攻撃コード》を実行させた親プロセスのPIDです。この親プロセスはメモリダンプ取得時点で既に終了しているため、分析結果に出力されません。)
powershell.exe(PID:7860)で実行されたコマンドは、windows.cmdline
プラグインで確認できます。
$ python3 vol.py -f /mnt/c/TEMP/memdump.mem windows.cmdline
Volatility 3 Framework 2.4.0
PID Process Args
7860 powershell.exe "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -command 《攻撃コード》
注入された《攻撃コード》が記録されていることが確認できました。
次に、このプロセスのネットワークの接続状況を、windows.netstat
プラグインで見てみます。
$ python3 vol.py -f /mnt/c/TEMP/memdump.mem windows.netstat
Volatility 3 Framework 2.4.0
Offset Proto LocalAddr LocalPort ForeignAddr ForeignPort State PID Owner Created
0xXXXXXXX7b7b0 TCPv4 192.168.111.11 63447 xx.xx.xx.xx(IPアドレス) 443 CLOSED 7860 powershell.exe 2022-12-12 06:08:29.000000
powershell.exe(PID:7860)が、《攻撃コード》内で指定されていたIPアドレス(C&Cサーバに見立てた自社サーバ)に接続していた(CLOSED)ことがわかりました。
ここまでの調査で、「どのプロセスが」「どのようなスクリプトを注入され」「どこに通信していた」かわかりました。
Volatility3では、プラグイン一覧 ⧉にある分析機能を使用できます。引数には、モジュール名から「OS名.機能名」の部分だけを抜き出して指定します。例えばモジュール名が「volatility3.plugins.windows.pstree module」なら、引数にwindows.pstree
を指定します。
Volatility3は分析実行の都度、メモリダンプを読み込むため、複数のプラグインの実行結果を取得したいときは、その数に比例して処理に時間がかかります。闇雲にプラグインを実行させると時間を浪費しかねません。そこで、まずは以下のプラグインの実行結果を、分析の糸口にするとよいでしょう。プラグインの説明は、リンク先のドキュメントをご参照ください。
- windows.cmdline ⧉
- windows.netscan ⧉
- windows.netstat ⧉
- windows.pslist ⧉
- windows.psscan ⧉
- windows.pstree ⧉
なお、Windowsのメモリダンプの場合、現時点ではページファイルの指定はできないようです。
MemProcFSによる分析
メモリダンプの分析は、MemProcFS ⧉でも行えます。こちらも無償で利用できます。
MemProcFSは、メモリダンプ分析結果をファイル形式で閲覧できるソフトです。データは区分別にフォルダで分類されています。また、MemProcFSではページファイルのダンプも含めて分析できることも特徴です。反面、Volatility3ではできた分析が、MemProcFSでは分析できなかったケースがあります。たとえば、この記事のメモリダンプでは、《攻撃コード》のネットワーク接続状況は出力されませんでした。逆のケースもあるかと思われますので、複数のツールの扱い方を備えておくことが重要です。
インストール手順は、MemProcFS - Installing: ⧉を参照してください。この記事では、Windowsにインストールしたものとします。
インストール終了後、以下のコマンドをPowerShellで実行します。
MemProcFS.exe -device .\memdump.mem -pagefile .\pagefile.sys -forensic
引数のmemdump.mem
はメモリダンプのファイル名、pagefile.sys
はページファイル名です。実行すると、デフォルトで「Mドライブ」に、メモリダンプの分析結果の一式がマウントされます。たとえば、ファイル「M:\sys\proc\proc-v.txt
」に、プロセスの詳細情報が出力されます。分析結果のほとんどのファイルはテキストファイルですので、任意のテキストエディタで開けます。proc-v.txt
を開いた結果は以下の通りです。
Process Pid Parent Flag User Path / Command / Time / Integrity- powershell.exe 7860 10060 \Device\HarddiskVolume3\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -command 《攻撃コード》 2022-12-12 06:08:07 UTC -> ***-- conhost.exe 1900 7860 \Device\HarddiskVolume3\Windows\System32\conhost.exe C:\WINDOWS\system32\conhost.exe \??\C:\WINDOWS\system32\conhost.exe 0x4 2022-12-12 06:08:07 UTC -> ***
Volatility3では「*」で視覚的に表現されていたプロセスツリーは、MemProcFSでは「-」で表現されます(MemProcFSでは、最上位のプロセスに「-」が1つ付与されます)。MemProcFSでも、powershell.exe(PID:7860)は独立したプロセスとして稼働し、《攻撃コード》を実行していたことがわかります。
参考:EDRの活用
有償のEDR(Endpoint Detection and Response:端末の異常な挙動を検知・抑制するソフト)製品も活用すると、さらに詳しい情報も調査できます。たとえば、マルウェアの侵入経路の特定(ブラウザやメールソフトの種類など)や、フォレンジックデータのクラウドへの転送など、CSIRTの活動を支援する機能を多く備えています。
EDR製品は複数のセキュリティ企業が販売しており、その多くがウイルス対策機能も兼ね備えていますので、自社の業務に合うものを導入しておくべきでしょう。当社ではEDRを導入し、外部の分析専門組織の助言も活用して、リアルタイムな脅威検知・分析に役立てています。
おわりに
サイバー攻撃の脅威は拡大し続けています。サイバー犯罪の届出件数と被害額は、2017年から2021年において共に右肩上がりで、総届出件数は276万件、総被害額は187億ドルに達しました。(情報処理推進機構『情報セキュリティ白書2022』図1-1-1 サイバー犯罪の届出件数と被害額の推移 より)
サイバー空間の攻撃と防御は「いたちごっこ」です。脅威を検知してから、デジタルフォレンジックの方法を調査している余裕はありません。また、多層防御の考え方と同じく、複数の手段の準備が重要です。攻撃が防御を上回って突破されたときを見据え、デジタルフォレンジックにも平時から備えておくことは、「百年兵を養うは、一日これを用いんがため」なのです。
参考資料
これらの資料から、多大なる知見や情報を頂きました。この場を借りて、厚く御礼を申し上げます。