| name | extracting-credentials-from-memory-dump |
| description | 使用 Volatility 和 Mimikatz 从内存转储中提取缓存的凭据、密码哈希、Kerberos 票据和身份验证令牌,用于取证调查。 |
| domain | cybersecurity |
| subdomain | digital-forensics |
| tags | ["forensics","credential-extraction","memory-forensics","volatility","mimikatz","password-hashes","incident-response"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
从内存转储中提取凭据
适用场景
- 在事件响应中确定攻击者可以访问哪些凭据时
- 评估违规后凭据泄露的范围时
- 识别需要立即重置密码的账户时
- 调查横向移动及哈希传递(Pass-the-Hash)/票据传递(Pass-the-Ticket)攻击时
- 从进程内存中恢复加密密钥或身份验证令牌时
前置条件
- raw、ELF 或崩溃转储格式的内存转储文件
- 带有 Windows 符号表的 Volatility 3
- Mimikatz(用于对提取的 LSASS 转储进行离线分析)
- pypykatz(Mimikatz 的 Python 实现,用于基于 Linux 的分析)
- 了解 Windows 身份验证(NTLM、Kerberos、DPAPI)
- 凭据提取的适当法律授权
工作流程
步骤 1:准备工具并验证内存转储
pip install volatility3 pypykatz
sha256sum /cases/case-2024-001/memory/memory.raw
vol -f /cases/case-2024-001/memory/memory.raw windows.info
vol -f /cases/case-2024-001/memory/memory.raw windows.pslist | grep -i lsass
步骤 2:使用 Volatility 提取凭据哈希
vol -f /cases/case-2024-001/memory/memory.raw windows.hashdump \
| tee /cases/case-2024-001/analysis/hashdump.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.lsadump \
| tee /cases/case-2024-001/analysis/lsadump.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.cachedump \
| tee /cases/case-2024-001/analysis/cachedump.txt
步骤 3:转储 LSASS 进程内存进行详细分析
vol -f /cases/case-2024-001/memory/memory.raw windows.memmap --pid 684 --dump \
-o /cases/case-2024-001/analysis/lsass_dump/
mv /cases/case-2024-001/analysis/lsass_dump/pid.684.dmp \
/cases/case-2024-001/analysis/lsass.dmp
步骤 4:使用 pypykatz 提取凭据
pypykatz lsa minidump /cases/case-2024-001/analysis/lsass.dmp \
> /cases/case-2024-001/analysis/pypykatz_results.txt 2>&1
python3 << 'PYEOF'
import json, 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("=== 提取的凭据 ===\n")
for session_key, session in data.get('logon_sessions', {}).items():
username = session.get('username', 'Unknown')
domain = session.get('domainname', '')
if username and username != '(null)':
print(f"会话:{domain}\\{username}")
print(f" SID:{session.get('sid', '')}")
for cred in session.get('msv_creds', []):
if cred.get('NThash'):
print(f" NTLM 哈希:{cred['NThash']}")
for cred in session.get('wdigest_creds', []):
if cred.get('password'):
print(f" WDigest 明文密码:{cred['password']}")
PYEOF
步骤 5:提取 Kerberos 票据和令牌
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
vol -f /cases/case-2024-001/memory/memory.raw windows.strings | \
grep -iE '(AKIA[A-Z0-9]{16}|aws_secret_access_key)' \
> /cases/case-2024-001/analysis/aws_credentials.txt
关键概念
| 概念 | 描述 |
|---|
| LSASS(本地安全认证子系统服务) | 管理身份验证并在内存中存储凭据的 Windows 进程 |
| NTLM 哈希 | 用于身份验证的用户密码 NT LAN Manager 哈希 |
| Kerberos TGT | 允许请求服务票据的票据授予票据 |
| WDigest | 在内存中以明文存储密码的遗留身份验证协议(Win8.1 之前) |
| DPAPI | 使用从用户凭据派生的主密钥的数据保护 API |
| DCC2(域缓存凭据) | 用于离线登录的已缓存域密码哈希 |
| LSA 机密 | 由 LSA 存储的加密服务账户密码和其他机密 |
| 哈希传递 | 使用提取的 NTLM 哈希而无需知道明文密码的攻击技术 |
工具与系统
| 工具 | 用途 |
|---|
| Volatility 3 | 带有 hashdump、lsadump、cachedump 插件的内存取证框架 |
| pypykatz | 用于跨平台 LSASS 分析的 Mimikatz Python 实现 |
| Mimikatz | Windows 凭据提取工具(用于对转储进行离线分析) |
| secretsdump.py | 从 SAM/SYSTEM/SECURITY 提取机密的 Impacket 工具 |
| hashcat | 恢复的 NTLM 和 DCC2 哈希密码破解工具 |
| Impacket | 用于 Windows 网络协议和凭据的 Python 工具包 |
常见场景
场景 1:违规后凭据评估
从 LSASS 内存中提取所有已缓存的凭据以确定哪些账户已暴露,根据权限级别优先重置密码,检查黄金票据材料(krbtgt 哈希),评估云凭据是否可被访问。
场景 2:横向移动调查
提取 NTLM 哈希和 Kerberos 票据以了解攻击者如何在系统间移动,识别哈希传递/票据传递制品,将提取的凭据与事件日志中的网络登录事件相关联。
场景 3:勒索软件操作者凭据窃取
分析加密前的内存转储以获取 Mimikatz 执行证据,提取所有可用的凭据类型,确定是否获取了域管理员凭据,评估 krbtgt 是否已泄露(黄金票据),制定凭据轮换策略。
场景 4:端点云凭据窃取
在端点内存中搜索 AWS 访问密钥、Azure 令牌和 CLI 工具及浏览器存储的 GCP 服务账户密钥,识别暴露的云权限,立即轮换发现的凭据,审计云审计日志中的未授权访问。