【入門編】 メモリ上のコマンド履歴(cmd.exe, powershell.exe)の復元 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

こんにちは!インシデントレスポンスやデジタルフォレンジックの世界へようこそ。
セキュリティの現場で働いていると、「攻撃者がサーバーに入り込んで、一体どんなコマンドを実行したのか?」という謎解きに直面することがよくあります。

今回は、初心者の方や開発者の方に向けて、「パソコンのメモリ(記憶領域)から、過去に実行されたコマンド履歴をこっそり復元する技術」についてお話ししていきますね。

小難しい専門用語が出てきても大丈夫です。身近な例えを使いながら、一歩ずつ分かりやすく解説していきますので、一緒に紐解いていきましょう!

—

1. 家の鍵と泥棒に例える「メモリ上のコマンド履歴」

皆さんのご自宅には、玄関の鍵がありますよね。もし泥棒が家に侵入して、リビングの引き出しをあさり、金品を持ち去ったとします。警察や鑑識の人がやってくると、彼らは何をするでしょうか?

そう、犯人が触ったドアノブや家具に残された「指紋」や「足跡」を探しますよね。

パソコンの世界でもまったく同じことが起きます。悪意を持った攻撃者(ハッカー)が私たちのサーバーに侵入したとき、彼らは黒い画面(コマンドプロンプトやPowerShell)を開いて、次々と命令(コマンド)を入力し、システムを乗っ取ろうとします。

攻撃者は、作業が終わると証拠を隠すために、画面のログを消したり、履歴ファイルを削除したりして逃げようとします。まるで泥棒が手袋をして指紋を拭き取るようなものです。

しかし!ここで強力な味方になるのが「メモリ(RAM:主記憶装置)」なんです。

メモリは「短期記憶」の宝庫

メモリというのは、パソコンが現在進行形で作業をしている「机の上」のような場所です。電源を切るときれいさっぱり消えてしまうという特徴がありますが、電源が入っている最中に行われたすべての活動の「残骸」が、泥だらけの足跡のようにびっしりとこびりついています。

ディスク(ハードディスクやSSD)上のファイルは消されてしまっても、メモリという「机の上」を綺麗に掃除し忘れていることが多々あります。私たちフォレンジック調査員は、このメモリの残骸から、攻撃者が実行したコマンドの足跡をごっそり掘り起こすわけです。

—

2. コマンドはどこに隠れているのか?

Windows環境において、私たちがよく使う黒い画面といえば cmd.exe(コマンドプロンプト)や powershell.exe ですよね。

攻撃者もこれらを使ってシステム内部を探索します。例えば、次のような危険なコマンドを裏でコソコソと実行しているかもしれません。

  • システムのパスワード情報を盗み出すコマンド
  • 外部から怪しいマルウェアをダウンロードして実行するコマンド
  • ネットワーク内の他のパソコンに侵入を広げるコマンド

これらを入力した際、Windowsの内部では、その文字データ(文字列)が「コンソールバッファ」や「プロセスヒープ(一時的な作業スペース)」と呼ばれるメモリ領域に一時的に保存されます。

ウィンドウを閉じたり、コマンドプロンプトを終了させたりしても、そのメモリ領域の電源が直ちに完全にゼロクリアされるわけではないため、物理メモリのダンプ(丸ごとコピー)さえ取得できれば、後から復元することが十分に可能なのです。

—

3. 実践!メモリからコマンド履歴を覗いてみよう(フォレンジックの現場から)

では、実際に現場のエンジニアやアナリストがどのようにこの調査を行っているのか、そのアプローチを少しだけ覗いてみましょう。

実際のフォレンジック調査では、Volatility 3(ボラリティ・スリー)という非常に強力なオープンソースのメモリ解析ツールがよく使われます。

例えば、メモリのダンプファイルから cmd.exe や powershell.exe が過去にどんなコンソール入力を保持していたのかを探る際、以下のようなアプローチで調査を行います。

調査手順のイメージ(Pythonスクリプトによる解析の一例)

実際のツール内部や、カスタムでメモリのヒープ領域をスキャンする際の簡単な概念コードを見てみましょう。ここでは初心者向けに、メモリのバイナリデータから特定のキーワード(powershell や実行された引数)を探し出すイメージをPythonで表現しています。

# -*- coding: utf-8 -*-
import re

def search_command_history(memory_dump_path):
    """
    メモリダンプファイルから怪しいコマンドラインの痕跡を正規表現で探索するサンプル関数
    """
    print(f"[*] 解析対象のメモリダンプ: {memory_dump_path}")
    
    # 実際の現場では巨大なファイルを扱うためチャンクごとに読み込みますが、
    # ここでは分かりやすくファイルを開いたと仮定します。
    try:
        with open(memory_dump_path, "rb") as f:
            memory_data = f.read()
            
        # PowerShellの実行や不審なダウンロード文字(Invoke-WebRequest等)のパターンを検索
        # エンコーディング(UTF-16LEなど)を考慮してパターンマッチングを行います
        pattern = re.compile(b'powershell.*?-enc\s+[A-Za-z0-9+/=]+', re.IGNORECASE)
        
        matches = pattern.findall(memory_data)
        
        print(f"[+] 検出された怪しいコマンドの痕跡: {len(matches)} 件")
        for i, match in enumerate(matches, 1):
            # バイナリデータを読める文字列に変換して表示(デコードエラーは無視)
            decoded_cmd = match.decode('utf-16le', errors='ignore')
            print(f"  ({i}) {decoded_cmd}")
            
    except FileNotFoundError:
        print("[-] 指定されたメモリファイルが見つかりません。")

# 実行例(実際の環境ではダンプファイルを指定します)
# search_command_history("c_drive_memory_dump.raw")

このように、攻撃者がどれだけ画面を閉じようとも、メモリの奥底には「Base64で難読化されたPowerShellスクリプト」や「実行したコマンドの引数」がそのまま残っていることが多いのです。

—

4. 一歩ずつ学ぶ!インシデントに備えるための対策

「メモリにコマンドが残るなら、怖くてパソコンを使えないよ……」なんて思わないでくださいね!セキュリティ対策は、こうした弱点を知ることから始まります。

日々の開発やインフラ運用において、私たちが実践できる具体的な防犯対策をいくつかご紹介します。

① PowerShellのログ設定を強化する

デフォルトの状態のままだと、PowerShellの細かい動きは記録されません。グループポリシー等で「Script Block Logging(スクリプトブロックロギング)」を有効に設定しましょう。これにより、メモリ上だけでなく、イベントログ(Event Viewer)に実行されたコマンドの全容が綺麗に残るようになります。

# 【管理者向け設定の参考】
# PowerShellのスクリプトブロックロギングを有効にするレジストリ設定の概念
# 攻撃者が難読化して実行したスクリプトも、実行直前にデコードされた状態でログに残ります。
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' -Name 'EnableScriptBlockLogging' -Value 1

② 多層防御(EDRの導入)

メモリ上のコマンド履歴を事後的に調べるのは私たちアナリストの仕事ですが、そもそも攻撃をリアルタイムで検知・ブロックするには、EDR(Endpoint Detection and Response)製品の導入が非常に効果的です。EDRは、cmd.exe から不自然に powershell.exe が呼び出されたり、メモリ上で怪しい挙動があったりする瞬間を監視し、自動でアラートを上げてくれます。

③ 最小権限の原則を守る

普段の開発作業や日常業務で、何でもかんでも「管理者権限(Administrator)」でログインしていませんか?
もし権限を最小限に絞ってい万が一マルウェアに感染したとしても、実行できるコマンドの範囲を狭めることができます。これは泥棒に入られたときに「頑丈な内鍵をかけておく」ようなものです。

—

おわりに

今回は、メモリ上のコマンド履歴の復元という、ちょっとディープなフォレンジックの世界をご紹介しました。

攻撃者はあの手この手で証拠を隠そうとしますが、デジタル世界の「机の上(メモリ)」には、必ず何かしらの足跡が残されます。私たちセキュリティエンジニアは、その足跡を丁寧にたどりながら、セキュリティの安全を守っているのです。

難しそうに見える技術も、基本の仕組みを知れば怖くありません。一歩ずつ、安全なシステム作りと防犯の知識を一緒に深めていきましょう!それではまた次回のブログでお会いしましょう。

コメント

タイトルとURLをコピーしました