关于 extracting-credentials-from-memory-dump
这是一份面向事件响应和取证人员的内存凭据提取指南,使用 Volatility 3、pypykatz 等工具检查转储文件,评估凭据泄露范围。
主要功能
- 01检查内存转储及系统信息
- 02提取 SAM 哈希与 LSASS 数据
- 03分析 NTLM 凭据和 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详细介绍
从内存转储中提取凭据
何时使用
- 在事件响应期间,确定攻击者可以访问哪些凭据
- 在发生入侵后评估凭据泄露的范围
- 用于识别需要立即重置密码的账户
- 在调查横向移动和哈希传递/票据传递攻击时
- 用于从进程内存中恢复加密密钥或身份验证令牌
前提条件
- raw、ELF 或 crash dump 格式的内存转储
- 带有 Windows 符号表的 Volatility 3
- Mimikatz(用于对提取的 LSASS 转储进行离线分析)
- pypykatz(Mimikatz 的 Python 实现,用于基于 Linux 的分析)
- 了解 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 hash | 用于身份验证的用户密码的 NT LAN Manager 哈希 |
| Kerberos TGT | 允许请求服务票据的票据授予票据 |
| WDigest | 将明文密码存储在内存中的旧式身份验证协议(Windows 8.1 之前) |
| DPAPI | 使用从用户凭据派生的主密钥的数据保护 API |
| DCC2(Domain Cached Credentials) | 用于离线登录的缓存域密码哈希 |
| LSA Secrets | 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 内存中提取所有缓存的凭据,以确定哪些账户已暴露,根据权限级别优先安排密码重置,检查黄金票据材料(krbtgt 哈希),评估云凭据是否可被访问。
场景 2:横向移动调查 提取 NTLM 哈希和 Kerberos 票据,以了解攻击者如何在系统之间移动,识别哈希传递/票据传递痕迹,将提取的凭据与事件日志中的网络登录事件关联起来。
场景 3:勒索软件操作者窃取凭据 分析加密前的内存转储以查找 Mimikatz 执行证据,提取所有可用的凭据类型,确定是否获取了域管理员凭据,评估 krbtgt 是否已泄露(黄金票据),规划凭据轮换策略。
场景 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
评论
支持 Markdown