哈希传递 Pass The Hash
Pass The Hash,即哈希传递,是一种可以让我们使用 NTLM 哈希对 Windows 服务进行认证,而无需明文密码的技术。在上一个小节,我们讨论了如果只有 NTLM 哈希,要实现用户模仿该怎么做的时候有提到 PTH,在这一小节我们继续延伸和补充一下。
我们之前讲过 NTLM 认证的步骤,让我们再来回顾一下:
哈希传递认证可以跳过上图中的第一步,通过使用例如 Mimikatz 之类的工具实现。需要注意的是,哈希传递攻击仅可以用于 NTLM 认证,而非 Kerberos 认证。一些安全工具,例如 Impacket, 不仅可以通过 PTH 认证,而且还可以实现代码执行,而这之后的原理则是攻击者通过 SMB 协议使用 NTLM 哈希连接目标服务器。大部分工具通过 Service Control Manager API 开启一个新的 Windows 服务并且通过命名管道来通信。这项技术需要与目标 SMB 服务的连通,并且可以访问目标主机的 ADMIN$ (在 ADMIN$ 中写入一个服务二进制文件),这意味着需要本地管理员权限。接下来,我们来看看常见的 PTH 用法。
接触 LSASS
Mimikatz 的 PTH
我们可以通过以下命令创建一个新的牺牲会话,并用我们提供的帐号、NTLM 哈希、域信息来替换占位符信息。
该方法需要本地管理员特权,并且该操作会与 LSASS 交互,而且如果 PPL 启用的话,也会失败。
sekurlsa::pth /user:<用户名> /domain:<域> /ntlm:<ntlm>
执行该命令需要本地管理员特权,但被认证的用户不需要有本地管理员权限。
不接触 LSASS
Impacket 之 psexec
如上文所说,psexec不仅可以通过 PTH 认证,还能实现远程代码执行。原理则是通过 SMB 服务进行认证,在目标的 ADMIN$ 上传服务二进制文件,再通过 SCM 创建新的服务并获得 shell。需要目标用户对目标主机具有本地管理员特权。
在 psexec 的日志信息中,我们可以窥探到中间的过程。
Impacket 之 mssqlclient
Impacket 不仅可以协助我们通过 PTH 认证获得远程代码执行,但是我们也可用于访问特定服务,例如 MSSQL。
Impacket 之 secretdump
除此之外,PTH 还可以通过 Impacket 来远程导出目标主机的凭证,包含 SAM 数据库、域缓存凭证、DPAPI、LSA 机密等内容。原理为在认证之后通过操纵远程注册表来进行凭证导出操作,需要认证用户具有本地管理员权限。
CrackMapExec 中各项功能
除了 Impacket 外,我们之前提到过 CME (https://github.com/Porchetta-Industries/CrackMapExec) 也是一款内网渗透瑞士军刀,其功能越发丰富和完整。CME 可以用于 AD 枚举与利用、密码喷洒、权限确认 (例如该用户对目标主机是否具有 WinRM 访问权)、代码执行等。
xfreerdp 的 PTH 认证
我们甚至可以通过 PTH 来访问远程主机的 RDP 服务,这里我们需要用到工具 xfreerdp。
xfreerdp /v:<IP> /u:<用户名> /d:<域名 FQDB> /pth:<哈希> /dynamic-resolution
然而,我们会得到这样的报错:
因此,我们需要开启受限管理模式。受限管理模式,即 Restricted Admin,可以防止用户通过 RDP 访问目标主机后,在目标主机上留下凭证 (NTLM哈希)。在受限管理模式下,用户使用的是网络认证而非非交互式认证。我们可以通过以下 Powershell 命令取消禁用受限管理模式 (即开启)。
New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Lsa" -Name DisableRestrictedAdmin -Value 0
然后,我们就可以通过 xfreerfp 使用 PTH 访问 RDP 服务了。
当然,因为在受限管理模式下,RDP 是通过网络认证访问,我们也可以在 Mimikatz 中 直接进行 PTH 认证后通过网络认证访问 RDP 服务。
sekurlsa::pth /user:<用户> /domain:<域 FQDN> /ntlm:<NTLM 哈希> /run:"mstsc.exe /restrictedadmin"