Windowsレジストリアーティファクトの分析
使用するタイミング
- インシデント発生時にWindowsシステム上のユーザーアクティビティを調査する場合
- マルウェアが使用する自動起動・永続化メカニズムを特定する場合
- インストールソフトウェア、USBデバイス、ネットワーク接続の追跡を行う場合
- 内部関係者による脅威の調査でユーザーの操作を再構築する場合
- レジストリのタイムスタンプを他のフォレンジックアーティファクトと関連付ける場合
前提条件
- フォレンジックイメージまたは抽出済みのレジストリハイブファイル
- RegRipper、Registry Explorer(Eric Zimmerman)、またはpython-registry
- レジストリハイブのパスにアクセス可能であること(SAM、SYSTEM、SOFTWARE、NTUSER.DAT、UsrClass.dat)
- Windowsレジストリの構造(ハイブ、キー、値)の理解
- SIFT Workstationまたはフォレンジック分析環境
ワークフロー
ステップ1:フォレンジックイメージからレジストリハイブを抽出する
# フォレンジックイメージを読み取り専用でマウント
mkdir /mnt/evidence
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/evidence.dd /mnt/evidence
# システムレジストリハイブをコピー
cp /mnt/evidence/Windows/System32/config/SAM /cases/case-2024-001/registry/
cp /mnt/evidence/Windows/System32/config/SYSTEM /cases/case-2024-001/registry/
cp /mnt/evidence/Windows/System32/config/SOFTWARE /cases/case-2024-001/registry/
cp /mnt/evidence/Windows/System32/config/SECURITY /cases/case-2024-001/registry/
cp /mnt/evidence/Windows/System32/config/DEFAULT /cases/case-2024-001/registry/
# ユーザー固有のハイブをコピー
cp /mnt/evidence/Users/*/NTUSER.DAT /cases/case-2024-001/registry/
cp /mnt/evidence/Users/*/AppData/Local/Microsoft/Windows/UsrClass.dat /cases/case-2024-001/registry/
# トランザクションログのコピー(ダーティハイブ復元用)
cp /mnt/evidence/Windows/System32/config/*.LOG* /cases/case-2024-001/registry/logs/
# 抽出したすべてのハイブをハッシュ化
sha256sum /cases/case-2024-001/registry/* > /cases/case-2024-001/registry/hive_hashes.txt
ステップ2:RegRipperを使用した自動アーティファクト抽出
# RegRipperのインストール
git clone https://github.com/keydet89/RegRipper3.0.git /opt/regripper
# NTUSER.DAT(ユーザープロファイル)に対してRegRipperを実行
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-f ntuser > /cases/case-2024-001/analysis/ntuser_report.txt
# SYSTEMハイブに対して実行
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-f system > /cases/case-2024-001/analysis/system_report.txt
# SOFTWAREハイブに対して実行
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SOFTWARE \
-f software > /cases/case-2024-001/analysis/software_report.txt
# SAMハイブ(ユーザーアカウント)に対して実行
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SAM \
-f sam > /cases/case-2024-001/analysis/sam_report.txt
# 特定のプラグインを実行
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-p userassist > /cases/case-2024-001/analysis/userassist.txt
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p usbstor > /cases/case-2024-001/analysis/usbstor.txt
ステップ3:永続化と自動起動エントリの抽出
# python-registryを使用したターゲット抽出
pip install python-registry
python3 << 'PYEOF'
from Registry import Registry
# SOFTWAREハイブを開く
reg = Registry.Registry("/cases/case-2024-001/registry/SOFTWARE")
# Runキー(自動起動)を確認
autorun_paths = [
"Microsoft\\Windows\\CurrentVersion\\Run",
"Microsoft\\Windows\\CurrentVersion\\RunOnce",
"Microsoft\\Windows\\CurrentVersion\\RunServices",
"Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run",
"Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run"
]
for path in autorun_paths:
try:
key = reg.open(path)
print(f"\n=== {path} (最終更新日時:{key.timestamp()}) ===")
for value in key.values():
print(f" {value.name()}: {value.value()}")
except Registry.RegistryKeyNotFoundException:
pass
# インストールされたサービスを確認
key = reg.open("Microsoft\\Windows NT\\CurrentVersion\\Svchost")
print(f"\n=== Svchostグループ ===")
for value in key.values():
print(f" {value.name()}: {value.value()}")
PYEOF
# NTUSER.DATでユーザー固有の自動起動を確認
python3 << 'PYEOF'
from Registry import Registry
reg = Registry.Registry("/cases/case-2024-001/registry/NTUSER.DAT")
user_autorun = [
"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce",
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run"
]
for path in user_autorun:
try:
key = reg.open(path)
print(f"\n=== {path} (最終更新日時:{key.timestamp()}) ===")
for value in key.values():
print(f" {value.name()}: {value.value()}")
except Registry.RegistryKeyNotFoundException:
pass
PYEOF
ステップ4:ユーザーアクティビティアーティファクトの分析
# UserAssistデータ(ROT13エンコードされたプログラム実行履歴)を抽出
python3 << 'PYEOF'
from Registry import Registry
import codecs, struct, datetime
reg = Registry.Registry("/cases/case-2024-001/registry/NTUSER.DAT")
ua_path = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist"
key = reg.open(ua_path)
for guid_key in key.subkeys():
count_key = guid_key.subkey("Count")
print(f"\n=== {guid_key.name()} ===")
for value in count_key.values():
decoded_name = codecs.decode(value.name(), 'rot_13')
data = value.value()
if len(data) >= 16:
run_count = struct.unpack('<I', data[4:8])[0]
focus_count = struct.unpack('<I', data[8:12])[0]
timestamp = struct.unpack('<Q', data[60:68])[0] if len(data) >= 68 else 0
if timestamp > 0:
ts = datetime.datetime(1601,1,1) + datetime.timedelta(microseconds=timestamp//10)
print(f" {decoded_name}: 実行回数={run_count}, フォーカス回数={focus_count}, 最終更新={ts}")
else:
print(f" {decoded_name}: 実行回数={run_count}, フォーカス回数={focus_count}")
PYEOF
# 最近使用したドキュメント(MRUリスト)を抽出
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-p recentdocs > /cases/case-2024-001/analysis/recentdocs.txt
# 入力されたURL(ブラウザ)を抽出
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-p typedurls > /cases/case-2024-001/analysis/typedurls.txt
# エクスプローラーで入力されたパスを抽出
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/NTUSER.DAT \
-p typedpaths > /cases/case-2024-001/analysis/typedpaths.txt
ステップ5:システム情報とネットワーク情報の抽出
# SYSTEMハイブからコンピュータ名とOSバージョンを取得
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p compname > /cases/case-2024-001/analysis/system_info.txt
# ネットワークインターフェースと設定
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p nic2 >> /cases/case-2024-001/analysis/system_info.txt
# ワイヤレスネットワーク履歴
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SOFTWARE \
-p networklist > /cases/case-2024-001/analysis/network_history.txt
# タイムゾーン設定
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p timezone > /cases/case-2024-001/analysis/timezone.txt
# シャットダウン時刻
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SYSTEM \
-p shutdown > /cases/case-2024-001/analysis/shutdown.txt
# Uninstallキーからインストール済みソフトウェア
perl /opt/regripper/rip.pl -r /cases/case-2024-001/registry/SOFTWARE \
-p uninstall > /cases/case-2024-001/analysis/installed_software.txt
主要な概念
| 概念 | 説明 |
|---|---|
| レジストリハイブ | レジストリのセクションを保存するバイナリファイル(SAM、SYSTEM、SOFTWARE、NTUSER.DAT) |
| MRU(最近使用したもの) | 最近アクセスしたファイル、コマンド、検索語を追跡するリスト |
| UserAssist | ROT13エンコードされたレジストリエントリで、プログラムの実行をタイムスタンプ付きで追跡 |
| ShimCache | 実行されたプログラムを記録するアプリケーション互換性キャッシュ |
| AmCache | 実行ファイルのSHA-1ハッシュを含む詳細な実行履歴 |
| BAM/DAM | バックグラウンド/デスクトップアクティビティモデレーター、Win10+でプログラム実行を追跡 |
| 最終更新日時 | レジストリキーが最後に変更された日時を示すタイムスタンプ |
| トランザクションログ | 不適切なシャットダウン後にレジストリの状態を復元できるジャーナルファイル |
ツールとシステム
| ツール | 目的 |
|---|---|
| RegRipper | プラグインアーキテクチャによる自動レジストリアーティファクト抽出 |
| Registry Explorer | Eric ZimmermanのGUIツール。対話的なレジストリ解析用 |
| python-registry | Pythonライブラリ。プログラムによるレジストリハイブ解析用 |
| RECmd | Eric Zimmermanのコマンドラインレジストリ解析ツール |
| yarp | Pythonベースのもう一つのレジストリパーサー |
| AppCompatCacheParser | ShimCache/AppCompatCache専用パーサー |
| AmcacheParser | AmCache.hve専用解析ツール |
| ShellBags Explorer | ShellBagアーティファクト解析専用ツール |
一般的なシナリオ
シナリオ1:マルウェアの永続化調査 SOFTWAREハイブとNTUSER.DATハイブを抽出し、すべてのRun/RunOnceキーで不正なエントリを確認。サービスの不審な追加を調査。スケジュールタスクのレジストリキーを確認。自動起動のタイムスタンプをマルウェアの実行タイムラインと関連付ける。
シナリオ2:ユーザーアクティビティの再構築 UserAssistを分析してプログラム実行履歴を確認。RecentDocsでアクセスされたファイルを調査。TypedPathsでエクスプローラーでの移動を確認。ShellBagsでフォルダアクセスパターンを抽出。インシデントの時間帯におけるユーザーアクティビティのタイムラインを構築。
シナリオ3:不正ソフトウェアの検出 Uninstallキーからすべてのインストール済みアプリケーションを解析。許可されたソフトウェアベースラインと比較。BAM/DAMで許可リストにない最近実行されたプログラムを確認。アンインストール後でもAppCompatCacheで実行痕跡を調査。
シナリオ4:USB経由のデータ流出調査 SYSTEMハイブからUSBSTORエントリを抽出して接続デバイスを特定。デバイスのシリアル番号をMountedDevicesと関連付け。NTUSER.DATのMountPoints2でリムーバブルメディアへのユーザーアクセスを確認。SetupAPIログで初回接続のタイムスタンプを調査。
出力形式
レジストリ分析サマリ:
システム:DESKTOP-ABC123(Windows 10 Pro Build 19041)
タイムゾーン:東部標準時(UTC-5)
最終シャットダウン:2024-01-18 23:45:12 UTC
自動起動エントリ:
HKLM Run: 5エントリ(1つ疑わしい:"updater.exe" -> C:\ProgramData\svc\updater.exe)
HKCU Run: 3エントリ(すべて正当)
サービス: 142エントリ(2つ不明:"WinDefSvc"、"SysMonAgent")
ユーザーアクティビティ(NTUSER.DAT):
UserAssistプログラム: 234エントリ
最近使用したドキュメント: 89エントリ
入力されたURL: 45エントリ
入力されたパス: 12エントリ
USB接続デバイス:
- Kingston DataTraveler(シリアル:0019E06B4521) - 初回:2024-01-10、最終:2024-01-18
- WD My Passport(シリアル:575834314131) - 初回:2024-01-15、最終:2024-01-15
インストール済みソフトウェア: 127アプリケーション
疑わしい発見事項: 3項目を確認用にフラグ