extracting-credentials-from-memory-dump について
インシデント対応者や調査担当者向けのメモリフォレンジックガイドです。Volatility 3やpypykatzなどでダンプを調べ、認証情報の露出状況を評価して記録します。
主な機能
- 01メモリダンプとシステム情報の確認
- 02SAMハッシュとLSASSデータの抽出
- 03NTLM認証情報とKerberosチケットの分析
- 04トークンなど認証情報の確認
- 05認証情報の露出状況の整理
活用シーン
- 01侵害後の認証情報露出範囲の評価
- 02認証情報を使った横展開の調査
- 03ランサムウェア事案での認証情報窃取の調査
- 04エンドポイントメモリ内のクラウド認証情報の検索
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill extracting-credentials-from-memory-dumpインストール後、Claude Code で/extracting-credentials-from-memory-dumpを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
メモリダンプからの認証情報の抽出
使用する場面
- インシデント対応中に、攻撃者がアクセスできた認証情報を特定する場合
- 侵害発生後に、認証情報の侵害範囲を評価する場合
- パスワードを直ちにリセットする必要があるアカウントを特定する場合
- ラテラルムーブメントや Pass-the-Hash/Pass-the-Ticket 攻撃を調査する場合
- プロセスメモリから暗号化キーや認証トークンを復元する場合
前提条件
- raw、ELF、またはクラッシュダンプ形式のメモリダンプ
- Windows のシンボルテーブルを備えた Volatility 3
- Mimikatz(抽出した LSASS ダンプをオフラインで分析する場合)
- pypykatz(Linux ベースの分析向けの Mimikatz の Python 実装)
- Windows 認証(NTLM、Kerberos、DPAPI)に関する理解
- 認証情報の抽出に対する適切な法的権限
ワークフロー
ステップ 1:ツールを準備し、メモリダンプを確認する
# Install analysis tools
pip install volatility3 pypykatz
# Verify memory dump integrity
sha256sum /cases/case-2024-001/memory/memory.raw
# Identify the OS version
vol -f /cases/case-2024-001/memory/memory.raw windows.info
# Verify LSASS process exists in memory
vol -f /cases/case-2024-001/memory/memory.raw windows.pslist | grep -i lsass
# Output:
# PID PPID ImageFileName Offset(V) Threads Handles SessionId
# 684 564 lsass.exe 0xffffe00123456 35 1234 0
ステップ 2:Volatility で認証情報のハッシュを抽出する
# Dump SAM database hashes from memory
vol -f /cases/case-2024-001/memory/memory.raw windows.hashdump \
| tee /cases/case-2024-001/analysis/hashdump.txt
# Output format:
# User RID LM Hash NTLM Hash
# Administrator 500 aad3b435b51404eeaad3b435b51404ee fc525c9683e8fe067095ba2ddc971889
# Guest 501 aad3b435b51404eeaad3b435b51404ee 31d6cfe0d16ae931b73c59d7e0c089c0
# DefaultAccount 503 aad3b435b51404eeaad3b435b51404ee 31d6cfe0d16ae931b73c59d7e0c089c0
# svcbackup 1001 aad3b435b51404eeaad3b435b51404ee 2b576acbe6bcfda7294d6bd18041b8fe
# Extract LSA secrets
vol -f /cases/case-2024-001/memory/memory.raw windows.lsadump \
| tee /cases/case-2024-001/analysis/lsadump.txt
# Extract cached domain credentials
vol -f /cases/case-2024-001/memory/memory.raw windows.cachedump \
| tee /cases/case-2024-001/analysis/cachedump.txt
ステップ 3:詳細な分析のために LSASS プロセスメモリをダンプする
# Dump LSASS process memory (PID from Step 1)
vol -f /cases/case-2024-001/memory/memory.raw windows.memmap --pid 684 --dump \
-o /cases/case-2024-001/analysis/lsass_dump/
# Alternative: Dump all files associated with LSASS
vol -f /cases/case-2024-001/memory/memory.raw windows.dumpfiles --pid 684 \
-o /cases/case-2024-001/analysis/lsass_files/
# Use procdump plugin for cleaner process dump
vol -f /cases/case-2024-001/memory/memory.raw windows.dumpfiles \
--pid 684 -o /cases/case-2024-001/analysis/
# Rename the dump file for pypykatz/mimikatz
mv /cases/case-2024-001/analysis/lsass_dump/pid.684.dmp \
/cases/case-2024-001/analysis/lsass.dmp
ステップ 4:pypykatz で認証情報を抽出する
# Run pypykatz against the full memory dump
pypykatz lsa minidump /cases/case-2024-001/analysis/lsass.dmp \
> /cases/case-2024-001/analysis/pypykatz_results.txt 2>&1
# Run pypykatz against the raw memory dump directly
pypykatz rekall /cases/case-2024-001/memory/memory.raw \
> /cases/case-2024-001/analysis/pypykatz_full.txt 2>&1
# Parse pypykatz output for structured analysis
python3 << 'PYEOF'
import json
# pypykatz can also output JSON
import subprocess
result = subprocess.run(
['pypykatz', 'lsa', 'minidump', '/cases/case-2024-001/analysis/lsass.dmp', '-j'],
capture_output=True, text=True
)
if result.stdout:
data = json.loads(result.stdout)
print("=== EXTRACTED CREDENTIALS ===\n")
for session_key, session in data.get('logon_sessions', {}).items():
username = session.get('username', 'Unknown')
domain = session.get('domainname', '')
logon_server = session.get('logon_server', '')
logon_time = session.get('logon_time', '')
sid = session.get('sid', '')
if username and username != '(null)':
print(f"Session: {domain}\\{username}")
print(f" SID: {sid}")
print(f" Logon Server: {logon_server}")
print(f" Logon Time: {logon_time}")
# NTLM hashes
msv = session.get('msv_creds', [])
for cred in msv:
nt = cred.get('NThash', '')
lm = cred.get('LMHash', '')
if nt:
print(f" NTLM Hash: {nt}")
if lm:
print(f" LM Hash: {lm}")
# Kerberos tickets
kerb = session.get('kerberos_creds', [])
for cred in kerb:
password = cred.get('password', '')
if password:
print(f" Kerberos Password: {password}")
tickets = cred.get('tickets', [])
for ticket in tickets:
print(f" Kerberos Ticket: {ticket.get('server', '')} (type: {ticket.get('enc_type', '')})")
# WDigest (plaintext on older systems)
wdigest = session.get('wdigest_creds', [])
for cred in wdigest:
pwd = cred.get('password', '')
if pwd:
print(f" WDigest Password: {pwd}")
# DPAPI master keys
dpapi = session.get('dpapi_creds', [])
for cred in dpapi:
mk = cred.get('masterkey', '')
if mk:
print(f" DPAPI Master Key: {mk[:40]}...")
print()
PYEOF
ステップ 5:Kerberos チケットとトークンを抽出する
# Extract Kerberos tickets from memory
python3 << 'PYEOF'
import subprocess, json
result = subprocess.run(
['pypykatz', 'lsa', 'minidump', '/cases/case-2024-001/analysis/lsass.dmp', '-j', '-k', '/cases/case-2024-001/analysis/kerberos/'],
capture_output=True, text=True
)
# pypykatz exports .kirbi files to the specified directory
import os
kirbi_dir = '/cases/case-2024-001/analysis/kerberos/'
if os.path.exists(kirbi_dir):
for f in os.listdir(kirbi_dir):
if f.endswith('.kirbi'):
filepath = os.path.join(kirbi_dir, f)
size = os.path.getsize(filepath)
print(f" Kerberos ticket: {f} ({size} bytes)")
PYEOF
# Search process memory for authentication tokens and API keys
vol -f /cases/case-2024-001/memory/memory.raw windows.strings --pid 684 | \
grep -iE '(bearer |authorization:|api[_-]key|token=|password=|secret=)' \
> /cases/case-2024-001/analysis/auth_strings.txt
# Search for cloud credentials in memory
vol -f /cases/case-2024-001/memory/memory.raw windows.strings | \
grep -iE '(AKIA[A-Z0-9]{16}|ASIA[A-Z0-9]{16}|aws_secret_access_key)' \
> /cases/case-2024-001/analysis/aws_credentials.txt
# Search for browser session tokens
vol -f /cases/case-2024-001/memory/memory.raw windows.strings | \
grep -iE '(session_id=|PHPSESSID=|JSESSIONID=|_ga=|sid=)' \
> /cases/case-2024-001/analysis/session_tokens.txt
ステップ 6:認証情報の調査結果レポートをまとめる
# Generate credential compromise assessment
python3 << 'PYEOF'
print("""
CREDENTIAL EXTRACTION REPORT
==============================
Case: 2024-001
Source: memory.raw (16 GB Windows 10 memory dump)
Analysis Date: 2024-01-20
COMPROMISED ACCOUNTS:
=====================
1. Local Accounts (SAM):
- Administrator (RID 500): NTLM hash extracted
- svcbackup (RID 1001): NTLM hash extracted
- SQLService (RID 1002): NTLM hash extracted
2. Domain Accounts (LSASS):
- CORP\\admin.user: NTLM hash + Kerberos TGT
- CORP\\svc.backup: NTLM hash + plaintext password (WDigest)
- CORP\\domain.admin: Kerberos TGS tickets for 3 services
3. Cached Domain Credentials:
- CORP\\helpdesk.user: DCC2 hash
- CORP\\it.manager: DCC2 hash
4. Cloud Credentials:
- AWS Access Key: AKIA... found in process memory (PID 3456)
- Azure AD token found in browser process memory
IMMEDIATE ACTIONS REQUIRED:
- Reset passwords for all listed accounts
- Revoke and rotate AWS access keys
- Invalidate all active Kerberos tickets (krbtgt reset)
- Review DPAPI-protected data for additional exposure
""")
PYEOF
主要な概念
| 概念 | 説明 |
|---|---|
| LSASS(Local Security Authority) | 認証を管理し、メモリ内に認証情報を保存する Windows プロセス |
| NTLM ハッシュ | 認証に使用されるユーザーパスワードの NT LAN Manager ハッシュ |
| Kerberos TGT | サービスチケットの要求を可能にする Ticket Granting Ticket |
| WDigest | メモリ内に平文パスワードを保存するレガシー認証プロトコル(Win8.1 より前) |
| DPAPI | ユーザー認証情報から導出したマスターキーを使用する Data Protection API |
| DCC2(Domain Cached Credentials) | オフラインログオン用にキャッシュされたドメインパスワードのハッシュ |
| LSA シークレット | LSA によって保存される、暗号化されたサービスアカウントのパスワードなどのシークレット |
| Pass-the-Hash | 平文パスワードを知らずに、抽出した NTLM ハッシュを使用する攻撃手法 |
ツールとシステム
| ツール | 用途 |
|---|---|
| Volatility 3 | hashdump、lsadump、cachedump プラグインを備えたメモリフォレンジックフレームワーク |
| pypykatz | クロスプラットフォームの LSASS 分析向け Mimikatz の Python 実装 |
| Mimikatz | Windows の認証情報抽出ツール(ダンプをオフラインで分析する際に使用) |
| secretsdump.py | SAM/SYSTEM/SECURITY からシークレットを抽出する Impacket ツール |
| hashcat | 復元した NTLM ハッシュと DCC2 ハッシュのパスワードクラッキング |
| John the Ripper | 代替のパスワードクラッキングツール |
| Rubeus | Kerberos チケットの操作および抽出ツール |
| Impacket | Windows のネットワークプロトコルと認証情報を扱うための Python ツールキット |
よくあるシナリオ
シナリオ 1:侵害発生後の認証情報評価 LSASS メモリからキャッシュされた認証情報をすべて抽出し、どのアカウントが漏えいしたかを特定します。特権レベルに基づいてパスワードリセットの優先順位を決め、Golden Ticket の材料(krbtgt ハッシュ)がないか確認し、クラウドの認証情報にアクセスできた可能性を評価します。
シナリオ 2:ラテラルムーブメントの調査 NTLM ハッシュと Kerberos チケットを抽出して攻撃者がシステム間をどのように移動したかを把握し、Pass-the-Hash/Pass-the-Ticket の痕跡を特定して、抽出した認証情報とイベントログ内のネットワークログオンイベントを関連付けます。
シナリオ 3:ランサムウェア攻撃者による認証情報の窃取 暗号化前のメモリダンプを分析して Mimikatz の実行証拠を探し、利用可能な認証情報の種類をすべて抽出して、ドメイン管理者の認証情報が取得されたかを特定します。krbtgt が侵害されたか(Golden Ticket)を評価し、認証情報のローテーション戦略を計画します。
シナリオ 4:エンドポイントからのクラウド認証情報の窃取 CLI ツールやブラウザーが保存した AWS アクセスキー、Azure トークン、GCP サービスアカウントキーをエンドポイントメモリから検索し、露出したクラウド権限を特定して、発見した認証情報を直ちにローテーションし、不正アクセスがないかクラウド監査ログを確認します。
出力形式
Credential Extraction Summary:
Source: memory.raw (16 GB, Windows 10 Build 19041)
LSASS PID: 684
Credentials Recovered:
Local NTLM Hashes: 4 accounts
Domain NTLM Hashes: 3 accounts
Kerberos TGTs: 2 tickets
Kerberos TGS: 5 service tickets
Plaintext Passwords: 1 (WDigest - svc.backup)
Cached Domain Creds: 2 DCC2 hashes
LSA Secrets: 3 service account passwords
DPAPI Master Keys: 4 keys recovered
Cloud Credentials: 1 AWS access key, 1 Azure token
Highest Privilege Compromised: Domain Admin (CORP\domain.admin)
Recommended Actions:
- Immediate: Reset all extracted account passwords
- Immediate: Rotate AWS access key AKIA...
- Urgent: Double krbtgt password reset (golden ticket mitigation)
- High: Revoke all Kerberos tickets via krbtgt rotation
- Medium: Audit DPAPI-protected data exposure