【入門編】 Windowsレジストリハイブ(SYSTEM, SOFTWARE, NTUSER.DAT)の解析 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

こんにちは!日々のインフラ運用や開発、本当にお疲れ様です。セキュリティの現場では、日々巧妙になるサイバー攻撃との終わりのない戦いが続いています。

「なんだかサーバーの動きが怪しい」「知らないうちに勝手にプログラムが動いている気がする……」

そんなとき、皆さんはどこを調べますか?
ネットワークのログや、怪しいファイルを探すのも大事ですが、ベテランのセキュリティアナリストがまず最初に「犯人の足跡」を探しにいく場所、それが今回お話しする「Windowsレジストリ」なんです。

今回は、レジストリの中でも特に攻撃者に好まれる3つの重要ファイル(SYSTEM、SOFTWARE、NTUSER.DAT)に焦点を当てて、泥棒の侵入経路や隠れ家を暴くフォレンジック(鑑識)の世界へ皆さんをご案内します!難しい専門用語も身近な例えで優しくほどいていきますので、ぜひ一歩ずつリラックスして学んでいきましょうね。

—

1. Windowsレジストリってなに?(おうちの「戸締まり台帳」に例えてみよう)

Windowsを使ったことがある方なら、一度はregeditという画面を開いたことがあるかもしれません。レジストリは、いわばWindowsの「設定が詰まった巨大なデジタル台帳」です。

これを、私たちの一戸建ての「おうち」に例えてみましょう。

  • 鍵の場所
  • 照明が自動で点く時間
  • 合カギを持っている人のリスト
  • 最近どんなお客様を招いたかのメモ

これらのおうちのルールがすべて、この台帳に細かく書き込まれています。
そして、この台帳にはいくつかの「章(ファイル)」に分かれています。フォレンジックの現場で特に私たちが目を光らせるのが、以下の3つのハイブ(ファイル)です。

1. SYSTEM ハイブ: おうちの骨組みや、配線、セキュリティシステムの全体像。
2. SOFTWARE ハイブ: おうちに入れた家具や家電(インストールされたアプリ)のリスト。
3. NTUSER.DAT ハイブ: 家族一人ひとりの部屋の鍵や、机の引き出しの使い方の好み(ユーザーごとの設定)。

もし、泥棒(攻撃者)が皆さんのパソコンにこっそり忍び込んだとしたら、彼らは間違いなくこの「台帳」を書き換えて、「ドアの鍵を開けっぱなしにする細工」や「自分が作った合カギの登録」を行います。これがいわゆる「永続化(Persistence)」と呼ばれる手口ですね。

—

2. 攻撃者が好む3大ターゲットと、その足跡の追い方

それでは、実際のインシデント調査の現場で、私たちがどのようにこの3つのファイルを覗き見(解析)しているのか、具体的な場所を見ていきましょう!

① SOFTWARE ハイブ:玄関の「勝手口」を作る(自動実行キーの罠)

攻撃者が大好きなのが、パソコンを起動したときに自動で怪しいプログラムを起動させる「自動実行キー(Run/RunOnce)」という設定です。これは、おうちの玄関とは別に、「朝になったら勝手に開く裏口」をこっそり作るようなものです。

レジストリの以下の場所に、怪しいプログラムが登録されていないかをチェックします。

  • 探す場所の例:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

ここに、見覚えのないアプリ名や、不審なスクリプト(powershell.exe などを使った怪しい呪文)が書かれていないかを確認するのが定石です。

② SYSTEM ハイブ:常駐する「見えない使用人」を仕込む(サービス設定)

もっと巧妙な攻撃者は、ユーザーがログインしていなくても裏でこっそり動き続ける「Windowsサービス」として自分のプログラムを登録します。これは、おうちの地下室に「家主が寝静まった深夜にコソコソ動き回る見えない使用人」を住まわせるようなものです。

SYSTEM ハイブの中にある以下の場所を調査します。

  • 探す場所の例:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services

ここに登録されている各サービスの「ImagePath(プログラムの実体があるパス)」を確認し、本来のWindowsのフォルダではなく、一時フォルダ(C:\Users\Public\ や C:\Windows\Temp\ など)から実行される不審なサービスがないかを暴いていきます。

③ NTUSER.DAT ハイブ:犯人が漁った「机の引き出しの履歴」

攻撃者は侵入した後、パスワードが書かれたメモや、機密データを探して色々なファイルを開きます。このとき残るのが「最近使ったファイル(Recent Docs)」の履歴です。これは、泥棒が侵入した後に「どの部屋の引き出しを漁ったか」という指紋や足跡そのものです。

各ユーザーのプロファイル内にある NTUSER.DAT の中には、以下のような情報が残されています。

  • 探す場所の例:

Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs

「おや、深夜3時にこの怪しい拡張子のファイルを触っているぞ……?」といったユーザーの行動履歴をタイムラインで復元する重要な手がかりになります。

—

3. 実務で役立つ!Pythonを使ったレジストリ解析の自動化サンプル

実際のインシデントレスポンスでは、何十台もの端末からレジストリハイブを回収し、手作業ですべて調べるのは到底無理です。そこで、Pythonなどのスクリプトを使って自動で怪しいキーを抽出し、ログに残す仕組みを作っておくのがプロの現場の流儀です。

ここでは、オープンソースのライブラリ(regipy など)を使って、自動実行キーに登録された怪しいエントリをサクッと検出し、JSON形式で出力するサンプルコードをご紹介します。開発やインフラの自動化スクリプトを書く際の参考にしてみてくださいね!

import json
from regipy.registry import RegHive

def check_run_keys(system_hive_path):
    """
    SOFTWAREハイブの自動実行キー(Run)を読み込み、
    不審なプログラムが登録されていないかをチェックするサンプル関数です。
    """
    try:
        # レジストリハイブファイルを開く
        hive = RegHive(system_hive_path)
        
        # ターゲットとなる自動実行キーのパスを指定
        # ※SOFTWAREハイブの場合の相対パス例
        run_key_path = r"Microsoft\Windows\CurrentVersion\Run"
        
        key = hive.get_key(run_key_path)
        suspicious_findings = []

        print(f"[*] 検査中: {run_key_path}")

        # 登録されている値(エントリ)をひとつずつループして確認
        for val in key.values:
            value_name = val.name
            value_data = val.value
            
            print(f"  - 発見: [{value_name}] -> {value_data}")

            # 簡易的な検知ルール:
            # パワーシェルやテンポラリフォルダが含まれていたら「怪しい!」と判断してリストに追加
            if "powershell" in str(value_data).lower() or "temp" in str(value_data).lower():
                suspicious_findings.append({
                    "name": value_name,
                    "path": value_data,
                    "reason": "不審なキーワード(PowerShellまたはTempフォルダ)を検知しました"
                })

        return suspicious_findings

    except Exception as e:
        print(f"[!] エラーが発生しました: {e}")
        return []

if __name__ == "__main__":
    # 実際の調査では、C:\Windows\System32\config\SOFTWARE などを安全にコピーしたもの指定します
    target_hive = "path/to/extracted/SOFTWARE"
    
    results = check_run_keys(target_hive)
    
    # 検知結果を分かりやすくJSON形式で保存
    if results:
        print("\n[!] 警告: 不審な自動実行エントリが検出されました!")
        print(json.dumps(results, indent=4, ensure_ascii=False))
    else:
        print("\n[+] 良好です。不審なエントリは検出されませんでした。")

このように、スクリプトの力も借りながら「何がいつ登録されたか」を素早くキャッチできるように日頃から備えておくことが、迅速なインシデント初動対応の大きなカギになります。

—

4. 一歩ずつ対策を学んでいきましょう!

いかがでしたでしょうか?「レジストリ解析」と聞くと、なんだか黒い画面に難しいコマンドが並ぶ難解な世界を想像してしまいますが、本質は「おうちの防犯チェック」と何ら変わりません。

  • 普段と違う設定書き換え(Runキーなど)がないか目を光らせる
  • 怪しいサービスがこっそり裏で動いていないか疑う
  • ユーザーの足跡(履歴)をたどって行動を点検する

こうした基本の積み重ねが、組織をサイバー攻撃から守る強固な盾となります。
すべてを一度に完璧に理解する必要はありません。まずは「Windowsにはこんな防犯台帳があるんだな」「怪しいプログラムはこういうところに足跡を残すんだな」という感覚を掴んでいただければ大成功です!

明日からのインフラ運用やセキュリティ対策に、ぜひこの視点を取り入れてみてくださいね。それでは、また次回のセキュリティ解説でお会いしましょう!

コメント

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