NTLM-Relay攻击
NTML-Relay前置知识
什么是NTML协议
NTLM(New Technology LAN Manager)协议是微软提供的一种安全协议,用于在Windows环境中进行身份验证。它基于质询响应机制,允许用户向服务器证明自己的身份,以便使用服务器提供的服务。NTLM协议的认证过程分为三个步骤:协商、质询和验证。在工作组环境中,用户使用服务器的本地账户进行认证;而在域环境中,用户使用域账户进行认证,服务器需要与域控制器交互来完成认证。NTLM协议虽然不直接传输密码,但使用了密码的哈希值NTLM Hash来进行身份验证。
NTLM认证过程
在非域环境中
当客户端需要访问服务器时,客户端需要输入服务器的用户名和密码进行验证,并且客户端会将服务器的NTLM-Hash值缓存。之后客户端开始向服务器发送 TYPE 1 Negotiate协商消息。
服务器收到客户端发送来的 TYPE 1 协商消息后,会取出其中自己能够接受的内容,传入NTLM SSP,得到 TYPE 2 挑战消息,此 TYPE 2消息中包含了一个由服务端生成的16位随机值,被称为 Challenge。服务器将此challenge保存一份后将TYPE 2消息发送回客户端。
客户端收到服务器发来的TYPE 2消息后,读出其中的challenge值,用缓存的服务端密码的NTLM-Hash对其进行加密,并与用户名、challenge等一起组合得到 Net-NTLMHash ,最后将 Net-NTLMHash 封装到 TYPE 3 NTLM_AUTH消息中发往服务器。
服务器在收到 TYPE 3 的消息之后,用自己密码的 NTLM-Hash 对 Challenge 进行加密,并比较自己计算出的 Net NTLM-Hash 认证消息和客户端发送的认证消息是否匹配。如果匹配,则证明客户端掌握了正确的密码,认证成功,否则认证失败。
如果是在域环境中,那么认证过程会经过域控制器:
服务器接收到客户端发送来的 TYPE 3 消息后,取出其中的Net NTLM-Hash值,并向域控制器发送针对客户端的验证请求。该请求的内容包含:用户名、原始的 Challenge 和 加密后的Challenge(也就是Net NTLM-Hash)。
DC根据用户名取出该帐号的密码哈希值 NTLM-Hash,用密码哈希值 NTLM-Hash 对原始的Challenge进行加密得到Net NTLM-Hash。如果加密后的Challenge和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败。DC将验证结果发给服务器。
服务器根据DC返回的结果,对客户端进行回复
NTLM Hash和Net-NTLM Hash区别
NTLM Hash:
NTLM Hash是微软为了提高安全性的同时保证兼容性而设计的散列加密算法。它是基于MD4加密算法进行加密的,用于在Windows系统中存储用户的密码信息。具体来说,NTLM Hash的生成过程包括以下几个步骤:
- 将用户的密码转换为16进制格式。
- 将16进制格式的字符串进行ASCII转Unicode编码。
- 对Unicode编码的16进制字符串进行MD4单向哈希加密,得到最终的NTLM Hash值。
在Windows Vista和Windows Server 2008之前的系统中,还会使用LM Hash,但从这两个版本开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。通常情况下,NTLM Hash存储在Windows系统中的SAM文件或域控制器的NTDS.dit文件中。
简单来说就是当用户注销、重启、锁屏后,操作系统就会让winlogon.exe显示登录界面,也就是输入框。当winlogon.exe接收输入后,将密码交给lsass.exe进程,lsass.exe进程中会存一份明文密码,登录时就需要将lsass.exe进程转换的明文密码hash与sam文件进行比对,这种方式即为本地认证。在渗透测试中,可以通过Mimikatz等工具读取lsass.exe进程,从而获得已登录用户的NTLM Hash或是明文密码。此外,在NTLM认证过程中,客户端会使用用户的NTLM Hash对服务器发送的Challenge进行加密,生成Response,以证明客户端用户已经知道账户密码
Net-NTLM Hash:
Net-NTLM Hash是网络环境下NTLM(New Technology LAN Manager)认证协议中使用的一种密码哈希,它在客户端和服务器之间的身份验证过程中扮演重要角色。NTLM认证是一种质询/响应(Challenge/Response)机制,Net-NTLM Hash的生成和使用流程如下:
- 客户端向服务器发送一个登录请求,通常包括明文的登录用户名。
- 服务器接收到请求后,生成一个随机数(Challenge),并将其发送回客户端。
- 客户端收到Challenge后,使用登录用户的密码NTLM Hash对Challenge进行加密,生成加密后的Response,并将这个Response发送给服务器。
- 服务器接收到客户端发回的Response,使用存储的用户密码NTLM Hash对之前发送的Challenge进行加密,生成Challenge1。然后比较服务器生成的Challenge1和客户端发回的Response是否一致,如果一致则验证成功。
Net-NTLM Hash与存储在Windows系统SAM文件中的本地NTLM Hash不同,它是在网络认证过程中,客户端用来响应服务器Challenge的加密结果。在NTLM认证中,根据使用的挑战/响应协议的版本,存在不同格式的Net-NTLM Hash,包括Net-NTLM v1 Hash和Net-NTLM v2 Hash。Net-NTLM v1相对容易受到攻击,而Net-NTLM v2提供了更强的安全性。
NTLMv1、NTLM v2区别在于:
NTLM v1的Challenge有8位,NTLM v2的Challenge为16位。
NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。
他们的共同点就是都是通过NTLM Hash进行的加密
自Windows Vista/Server2008开始起,微软默认使用Net-NTLMv2协议,想要降级到Net-NTLMv1,首先需要获得当前系统的管理员权限。2008 win7 及以上都是用了v2协议。2000 xp使用v1协议认证。
将系统的v2修改成v1
(1)一条命令临时修改(适用:2008、2012、win7)
1 | reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 0 /f |
(2)这种方法亦可,区别在于确保Net-NTLMv1开启成功
1 | reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 2 /f |
NTML-Relay攻击
Net-NTLM Relay的攻击原理
由于本文章只是关于NTML-Relay攻击的知识 所以关于针对NTLM Hash的攻击放在后面的文章来讲述
首先我们要知道Windows系统名称解析顺序
当我们访问一个共享时 net use \\ip\xxx,其寻找这个主机名称会遵循以下的步骤:
- 本地hosts文件(%windir%\System32\drivers\etc\hosts)
- DNS缓存/DNS服务器
- 链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
如果没有在1、2项中找到对应名称,系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称,由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是这台机器。
因此当用户输入不存在、包含错误或者DNS中 没有的主机名时,通过Responder工具监听LLMNR和NetBIOS广播,就可以伪装成受害者要访问的这台机器,并从而让受害者交出相应的登陆凭证。核心过程与arp欺骗类似,我们可以让攻击者作中间人,截获到客户端的Net-NTLM Hash。
本地和缓存查询不到sfss时,内网主机就会将未经认证的UDP广播到网络中,询问谁是sfss,由于该过程未被认证,并且广播到整个网络,从而允许网络 上的任何机器响应并声称自己是sfss。此时kali伪装成sfss这台机器,接着进行ntlm认证。从而让受害者交出相应的登陆凭证(Net-NTLMhash)
触发NTLM认证的命令,这里大多数用的SMB通信协议
1 | net.exe use \\host\share |
Net-NTLM Relay攻击
暴力破解明文密码
首先攻击机利用kali工具(responder)进行监听
1 | responder -I eth0 -v //-I是指定网卡 -v是开启详细模式 |
受害者机器输入不能被解析的路径
监听到了这台机器的NTLM v2 凭证,这个v2凭证不能用来PTH,但是可以通过这个配合字典来破解出administrator的明文密码,可以通过hashcat来进行破解
保存下这个hash使用工具nth进行识别
nth工具安装
1 | pip3 install name-that-hash |
可以看到识别到5600,接下来就可以使用hashcat进行爆破
可以看到已经成功爆破出明文密码 (使用john也能爆破出来)
当然攻击芝士很多
详细的可以看这篇文章
1 | https://www.anquanke.com/post/id/193493 |
Windows内网协议学习NTLM篇之发起NTLM请求-安全客 - 安全资讯平台
NTLM重放攻击
利用场景如 在获取了高权限域内Net-NTLM Hash后对密码进行了爆破,如果爆破不出来 这时,就可以使用NTLM重放攻击进行域内横向移动
重放本身的含义就是:攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。
因此NTLM重放攻击也就是将窃听到的客户端Net-NTLM hash,重放到服务端。而由于攻击者拥有了该凭证,因此服务端自然而然就认为攻击者就是客户端。如果这个凭据权限足够,那么就可以控制域内其它主机,所以凭据的权限很重要。这里攻击者其实就充当了一个中间人的身份。
攻击前提
NTLM Relay攻击时在域中通过relay到smb服务将管理组成员冲放到到一些敏感的机器上。
因此relay到smb服务要求被攻击机器不能开启SMB签名,域内主机的 SMB 签名默认关闭,但域控是默认开启的。
实验环境
虚拟机 | IP |
---|---|
kali(攻击机) | 192.168.52.129 |
Win2003(域控) | 192.168.52.141 |
Win2008(域成员登录) | 192.168.52.138 |
Win7(受害机) | 192.168.52.143 |
1.先用RunFinger.py来查看下内网中开放的信息。
1 | python RunFinger.py -i 192.168.52.0/24 //RunFinger.py在responder工具目录 |
若域内其他主机开启了SMB Signing,可通过命令关闭对应服务( Windows Server系列中RequireSecuritySignature子键默认值为1)
1 | reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature /t REG_DWORD /d 0 /f |
2.修改responder的配置文件Responder.conf,不让其对 hash 进行抓取。将SMB和HTTP的On改为Off:
1 | sudo vim /usr/share/responder/Responder.conf |
3.先开启responder进行监听
4.启动MultiRelay.py(MultiRelay.py工具在responder/tools/下)
5.利用高权限域内主机进行广播
(这里的net use \\dsadasda 随便写一个不存在的就行 传递一个SMB流量)
6.返回了win7的shell 攻击成功
并且是高权限 实验完成 (Impacket中的smbrelayx.py也能做到)
参考
1 | https://www.anquanke.com/post/id/193493 |