哈希传递 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
我们可以通过命令 sekurlsa::pth /user:<用户名> /domain:<域> /ntlm:<ntlm> 创建一个新的牺牲会话,并用我们提供的帐号、密码、域信息来替换虚假信息。该方法需要本地管理员特权,并且该操作会与LSASS交互,如果 PPL 启用的话,也会失败。
执行该命令需要本地管理员特权,但被认证的用户不需要有本地管理员权限,且PPL未启用(或者被绕过)。
如果 PPL 在启用状态时,会出现以下报错:
不接触 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 可以用于密码喷洒、权限确认(例如提供的用户是否拥有winrm访问权)、代码执行等。
xfreerdp 的 PTH 认证
我们甚至可以通过 PTH 来访问远程主机的 RDP 服务,这里我们需要用到工具 xfreerdp
然而,我们会得到这样的报错:
因此,我们需要开启受限管理模式。受限管理模式,即 Restricted Admin,可以防止用户通过 RDP 访问目标主机后,在目标主机上留下凭证(NTLM哈希)。在受限管理模式下,用户使用网络登录而非交互式登陆进行身份认证了。我们可以通过 powershell 命令 New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Lsa" -Name DisableRestrictedAdmin -Value 0 取消禁用受限管理模式(即开启)。
然后,我们就可以通过 xfreerfp 使用 PTH 访问 RDP 服务了。
当然,我们也可以在 mimikatz 中 直接进行 PTH 认证后通过网络认证访问 RDP 服务。