mcpField
E
extracting-credentials-from-memory-dump

extracting-credentials-from-memory-dump

github.com/mukul975セキュリティ35.2k106 回インストール8 週間前に更新
リポジトリ

extracting-credentials-from-memory-dump について

インシデント対応者や調査担当者向けのメモリフォレンジックガイドです。Volatility 3やpypykatzなどでダンプを調べ、認証情報の露出状況を評価して記録します。

主な機能

  1. 01メモリダンプとシステム情報の確認
  2. 02SAMハッシュとLSASSデータの抽出
  3. 03NTLM認証情報とKerberosチケットの分析
  4. 04トークンなど認証情報の確認
  5. 05認証情報の露出状況の整理

活用シーン

  1. 01侵害後の認証情報露出範囲の評価
  2. 02認証情報を使った横展開の調査
  3. 03ランサムウェア事案での認証情報窃取の調査
  4. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
api-reference.md
scripts/
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 3hashdump、lsadump、cachedump プラグインを備えたメモリフォレンジックフレームワーク
pypykatzクロスプラットフォームの LSASS 分析向け Mimikatz の Python 実装
MimikatzWindows の認証情報抽出ツール(ダンプをオフラインで分析する際に使用)
secretsdump.pySAM/SYSTEM/SECURITY からシークレットを抽出する Impacket ツール
hashcat復元した NTLM ハッシュと DCC2 ハッシュのパスワードクラッキング
John the Ripper代替のパスワードクラッキングツール
RubeusKerberos チケットの操作および抽出ツール
ImpacketWindows のネットワークプロトコルと認証情報を扱うための 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

コメント