域内渗透手法 Ⅱ

NTLM Relay

有空再读一下这篇文章,补充一下该攻击手法:

其实应称为Net-NTLM Relay攻击,它发生在NTLM认证的第三步,在Responder信息中存在Net-NTLM hash,当攻击者获得了Net-NTLM Hash后,可以重放Net-NTLM Hash进行中间人攻击。

其实质并不是简单的重放Net-NTLM Hash,需要诱使客户端向攻击者进行NTLM 认证,攻击者会将该认证进行转发。

其原理如图:

攻击流程主要分为两步,第一步是捕获Net-NTLM Hash,第二步是重放Net-NTLM Hash

捕获Net-NTLM Hash

其主要分为两步:

  1. 使用工具来监听捕获目标服务器发来的NTLM请求,如responder

2. 使目标服务器主动向攻击者发起NTLM认证,常见方法如下:

LLMNR和NBNS协议

LLMNR(Link-Local Multicast Name Resolution 链路本地多播名称解析)和 NBNS(Network Basic Input Output System Name Service,网络基本输入输出系统名称服务)是局域网内的协议,主要用于局域网内的名称解析。当其他方式解析失败时,Windows系统就会使用LLMNR和NBNS协议解析名称。

Windows系统的名称解析顺序如下:

  1. LLMNR协议

    LLMNR协议是一个基于域名称解析系统数据包格式的协议,它定义在RFC4795中。该协议将局域网内的IPv4和IPv6的主机进行名称解析为同一本地链路上的主机,因此也称作多播DNS。Windwos 操作系统从Windows Vista 开始就内嵌支持LLMNR协议,Linux系统也通过了systemd实现了此协议。LLMNR协议监听的端口为UDP的5355端口,支持IPv4和IPv6。LLMNR协议类似于ARP协议,其解析名称的特点为端到端,IPv4的多播地址为224.0.0.252,IPv6的多播地址为FF02::1:3

  2. NBNS协议

    NBNS协议有IBM公司开发,主要用于20~200台计算机的局域网。NBNS协议通过UDP的137端口进行通信,仅支持IPv4而不支持IPv6.NBNS是一种应用程序接口,系统可以利用WINS服务、广播及Lmhosts文件等多种模式将NetBIOS名称解析为相应的IP地址,几乎所有局域网都是在NBNS协议基础上工作的。在Windows操作系统中,默认情况下在安装TCP/IP协议后会自动安装NetBIOS。NBNS协议进行名称解析的过程如下:

    1. 检查本地NetBIOS缓存

    2. 如果缓存中没有请求的名称且已配置了WINS服务器,则会向WINS服务器发生请求

    3. 如果没有配置WINS服务器或WINS服务器无响应,则会向当前子网域发送广播

    4. 发送广播后,如果无任何主机响应,则会读取本地的Lmhosts文件

  3. LLMNR 和 NBNS 协议的区别

    两者的区别如下:

    • NBNS基于广播,而LLMNR基于多播

    • NBNS在Windows NT以及更高版本的操作系统上均可使用,而LLMNR只有Windows Vista 以及更高版本的系统上才可用

    • LLMNR支持IPv6,而NetBIOS不支持IPv6

  • LLMNR&NBNS攻击

    用户输入任意一个不存在的名称,本地hosts文件和DNS服务器均不能正常解析该名称,于是系统就会发送LLMNR/NBNS数据包请求解析。攻击者收到请求后告诉客户端自己是不该存在的名称并要求客户端发送给Net-NTLM Hash 进行认证,这样攻击者就可以收到客户端发来的 Net-NTLM Hash 了

    1. 在局域网内主机10.10.10.140上请求解析不存在的名称

    1. 此时Responder对目标主机进行LLMNR/NBNS毒化,并要求输入凭据认证,然后就可以抓到目标机器的 Net-NTLM Hash

打印机漏洞

Windows 的 MS-RPRN 协议用于打印客户端和服务器之间的通信,默认情况下是启用的。该协议定义的RpcRemoteFindFirstPrinterChangeNotificationEx()方法调用会创建一个远程更该通知对象,该对象对打印机对象的更改进行监视,并将更改通知发送到打印客户端。任何经过身份验证的域成员都可以连接到远程服务器的打印服务spoolsv.exe,并请求对一个新的打印作业进行更新,令其将该通知发送给指定目标,之后它将会立即测试该连接,即向指定目标进行身份验证(攻击者可以选则通过Kerberos或NTLM进行验证)。

微软表示这个Bug是系统的实际特点,无需修复。由于打印机是以System权限运行的,因此可以访问打印机的MS-RPRNRPC接口,迫使打印机服务向指定的机器发起请求,就能取得目标机器的Net-NTLM Hash了。

脚本下载:

这里由于网络环境问题,没办法复现,只能使用网上的图片

DC:192.168.41.10

kali:192.148.41.13

  1. 强制目标主机DC也就是192.168.41.10通过MS-RPRNRPC接口攻击者192.148.41.13进行NTLM身份认证

2. 此时Responder已经收到目标机器发送的SMB类型的Net-NTLM Hash 了,如图所示:

PetitPotam

2021年7月19日,法国安全研究员 Gilles Lionel 批露了一种新型的触发 Net-NTLM Hash的手法——PetitPotam,该漏洞利用了微软加密文件系统远程协议(Microsoft Encrypting File System Remote Protocol, MS-EFSRPC)。 MS-EFSRPC用于对远程协议存储和通过网络访问的数据执行维护和管理操作。利用PetitPotam,安全研究员可以通过连接到LSARPC强制触发目标机器向指定的远程服务器发送Net-NTLM Hash。

使用Petitpotam.py脚本执行如下的命令,强制目标主机DC也就是10.10.10.159向我们的kali机器10.10.10.128发起NTLM身份认证。PetitPotam脚本也支持匿名触发。

  1. 使用petiepotam脚本触发目标机器向攻击机发起SMB认证

2. 此时可以接收到域控主机OWA发送的SMB类型的NET-NTLM Hash

图标

当图标的一些路径改成指定的UNC路径,就能收到目标机器发来的NTLM请求。

  1. desktop.ini 文件

    每个文件夹下都有一个隐藏的desktop.ini,其作用是指定文件夹的图标等。可以通过修改文件夹属性“隐藏受保护的操作系统文件(推荐)”来显示desktop.ini文件。

    1. 首先创建一个test文件夹。修改该文件夹的图标为其中任意一个,如图所示

    • 在“文件夹选项”对话框的“查看”选项卡中取消勾选该文件夹的“隐藏受保护的操作系统(推荐)属性”,同时将在“隐藏文件和文件夹”选项下勾选“显示隐藏的文件、和文件夹和驱动器”如图所示:

      按alt可以显示顶部菜单栏→工具→文件夹选项

    • 此时可以看到desktop.ini文件

    • 将IconResource的内容替换为指定机器的UNC路径,如图所示

    • 只要有人访问了test文件夹,目标机器就会去请求指定的UNC的图标资源,于是该机器将当前用户的Net-NTLM Hash发送给指定的UNC机器,在指定的UNC机器上就能接收到目标机器了发来的 Net-NTLM Hash 了

  2. .scf后缀文件

    一个文件夹内若含有.scf文件,由于scf包含IconFile属性,因此explore.exe会尝试获取文件夹的图标。而IconFile是支持UNC路径的,所以当打开文件夹的时候,目标机器就会请求指定UNC的图标资源,并将当前用户的NTLM v2 Hash 发送给指定的机器,我们在该机器上使用Responder监听,就能收到目标机器发来的Net-NTLM Hash 了。

    创建一个文件夹,在该文件夹下创建test.scf文件,文件内容如下:

只要有人访问了test文件夹,目标机器就会请求指定的UNC路径的图标资源,于是该机器会将当前用户 NTLM v2 Hash 发送给指定机器 192.168.41.13,在该机器上就能收接受到目标机器发来的Net-NTLM Hash了。

浏览器

当浏览器访问的页面中含有UNC路径,浏览器在解析该页面时也会尝试请求该UNC地址,然后发起NTLM认证。

不同的浏览器对插入不同格式的UNC路径的测试结果如图所示:

比如,在如下的网页文件中插入的UNC格式为\10.10.10.128\test

这时用户使用IE浏览器访问该页面时,在10.10.10.128机器上就能获得目标用户的SMB类型的Net-NTLM Hash 了。

解决了浏览器对UNC路径的解析后,我们就要思考如何在网页中插入UNC路径了。常见的Web漏洞(如XSS、SSRF、XXE等)都可以在web页面中插入代码

Outlook

这个没有接触过,没有办法写复现🤪

系统命令

通过执行系统命令,访问指定的UNC路径,也可以获取到目标机器的Net-NTLM Hash。触发Net-NTLM Hash的常见命令如下:

例如:

Office

新建一个word文件,插入一张图片

用压缩软件打开,进入 1.docx\word\_rels 目录,找到并打开document.xml.rels文件

可以看到Target参数是本地路径,我们将上述的路径修改为指定的UNC路径,然后加上TargetMode="External"

只要有人访问了该word文档,目标主机就会去请求指定UNC的图片资源,于是该主机会将当前用户的NTLM v2 hash发送给指定的机器,我们在该机器上使用Responder监听,就能接收到目标机器发来的Net-NTLM Hash了

PDF

PDF文件可以添加请求远程SMB服务器文件的功能,于是可以利用该功能窃取windows系统的NET-NTLM Hash。当用户使用PDF阅读器打开一份恶意的PDF文档。该PDF会向远程SMB服务器发出请求

使用WorsePDF.py脚本向PDF文件中加入请求远程SMB服务器10.10.10.128的功能,生成恶意的PDF文件

https://github.com/3gstudent/Worse-PDF

只要目标用户使用Adobe PDF阅读器打开恶意的PDF文件。在10.10.10.128机器上就可以收到目标用户的Net-NTLM Hash了

经测试发现,只有使用Adobe PDF阅读器才能收到目标主机的Net-NTLM Hash,chrome、Edge和WPS的PDF阅读器均不能收到Net-NTLM Hash。

WPAD

WPAD 网络代理自动发现协议是一种客户端使用DCHP、DNS、LLMNR、NBNS协议来定位一个代理配置文件(PAC)URL的方法。WPAD通过让浏览器自动发现代理服务器,查找存放PAC 文件的主机来定位代理配置文件,下载编译并运行,最终自动使用代理访问网络。

由于浏览器默认勾选了"自动检测设置",选项,因此造成了WPAD攻击。

  1. 配合LLMNR/NBNS投毒

    一个典型的劫持方式是利用LLMNR/NBNS协议投毒让受害者从攻击者的机器上获取PAC文件,而PAC文件指定攻击者的机器为代理服务器,然后攻击者就可以劫持受害者的HTTP流量,在其中插入任意的HTML标签。

    此时只需要执行:

2. 配合DNS IPv6

攻击者使用工具在内网应答客户端发起的DHCPv6请求,并为其分配地址,攻击者可以将目标机器的IPv6 DNS服务器设置为指定的机器。而IPV6的优先级高于IPv4,因此目标机器在通过DNS服务解析WPAD时就可以进行欺骗了

破解Net-NTLM Hash

重放Net-NTLM Hash

由于NTLM只是底层的认证协议,必须镶嵌在上层应用协议里面,消息的传输依赖于使用NTLM的上层协议,比如SMB、HTTP、LDAP等。因此,我们可以将获取到的Net-NTLM Hash Relay到其他使用NTLM进行认证的应用上。

中继到SMB协议

直接Relay到SMB服务器,是最直接简单的方法。可以直接控制该服务器执行任意命令等操作。根据工作组和域环境的不同,分为两种场景,具体如下:

  1. 工作组

    在工作组环境中,工作组中的机器之间相互没有信任关系,除非两台机器的账号密码相同,否则中继不成功。但是如果账号密码相同的话,为何不直接Pass The Hash攻击呢?因此在工作组环境下,Relay到其他机器不太现实。那么,我们可以Relay到机器自身吗?答案是可以的。但是后来微软在MS08-068补丁中对Relay到自身机器做了限制,严禁中继到机器自身。道高一尺魔高一丈,这个补丁在CVE-2019-1384(Ghost Potato)被攻击者绕过了。

    • MS08-068 Relay To Self。当收到用户的SMB请求之后,最直接的就是把请求Relay回本身,即Reflect,从而控制机器本身。漏洞危害特别高,该漏洞编号为MS08-068。微软在KB957097补丁里面通过修改SMB身份验证答复的验证方式来防止凭据重播,从而解决了该漏洞。防止凭据重播的做法如下:

      在Type 1阶段,主机A访问主机B进行SMB认证的时候,将 pszTargetName 设置为CIFS/B

      在Type 2阶段,主机A拿到主机B发送的Challenge挑战值之后,在lsass进程里面缓存(Challenge,CIFS/B)

      在Type3阶段,主机B在拿到主机A的认证消息之后,会去查询lsass进程里面有没有缓存(Challenge,CIFS/B),如果存在缓存,那么认证失败。

      因为如果主机A和主机B是不同主机的话,那么lsass进程里面就不会缓存(Challenge,CIFS/B)。如果是同一台主机的话,那lsass里面就会缓存(Challenge,CIFS/B),这个时候就会认证失败。

      如图所示,中继到自身就会失败:

    • CVE-2019-1384 Ghost Potato。

      这个漏洞绕过了KB957097补丁措施中,这个缓存是有时效性,时间是300s,也就是300s后,缓存就会被清空,这时主机A和主机B是同一台主机,那么由于缓存已经被清除,那么lsass进程里面肯定没有(Challenge,CIFS/B)缓存。 执行如下的命令,该漏洞的POC基于impacket进行修改,目前只能支持收到Http协议请求的情况。该poc在sleep 315秒之后,再发送Type 3认证消息,于是就绕过了KB957097补丁。

  1. 域环境

    在域环境中,普通域用户默认可以登录除域控以外的其他所有机器,因此可以将域用户的Net-NTLM Hash 中继到域内的其他机器。但是如果拿到了域控的Net-NTLM Hash,可以relay到除域控外的其他所有机器,但是不能relay到其他域控(域控默认开启SMB签名)

  • impackt 下的 smbrelayx.py。运行smbrelayx.py脚本执行如下的命令,该脚本接受域用户的Net-NTLM Hash,然后中继到域内其他机器执行指定命令。

接受来自域控(10.10.10.158)的Net-NTLM Hash,中继到10.10.10.161机器,并执行whoami命令

  • impacket下的ntlmrelayx.py

接受来自域控(10.10.10.158)的Net-NTLM Hash,中继到10.10.10.161机器,并执行whoami命令

  1. Responder下的MultiRelay.py脚本。该脚本功能强大,通过ALL参数可以获得一些稳定的shell,还有抓取密码等功能。-t 参数用于指定要中继的机器。该脚本接受域用户的Net-NTLM Hash,然后中继到域内其他机器执行命令。

该脚本具体在kali中的/usr/share/responder/tools目录下

中继到HTTP

很多HTTP服务也支持NTLM认证也支持NTLM认证,因此可以中继到HTTP,HTTP的默认策略是不签名的。

  • Exchange认证。

    Exchange认证也支持NTLM SSP的,是我们可以将SMB流量Relay到Exchange的EWS接口,从而可以进行收发邮件等操作。

    ntlmRelayToEWS下载地址:ntlmRelayToEWS下载

    使用ntlmRelayToEWS.py脚本执行如下的命令进行监听:

  • ADCS注册接口

    详见域内漏洞及利用

中继到LDAP协议

由于域内默认使用的就是LDAP,而LDAP也支持使用NTLM认证,因此可以将流量中继到LDAP,这也是域内NTLM Relay 常用的一种攻击方式。LDAP的默认策略是协商签名,而并不是强制签名。也就是说是否签名是由客户端决定的,服务端跟客户端协商是否需要签名。

从HTTP和SMB协议中继到LDAP的不同之处在于:

  • 从HTTP协议Relay到LDAP是不要求进行签名的,可以直接进行Relay,如CVE-2018-8581。域内最新的中继手法就是想办法将HTTP类型的流量中继到LDAP。

  • 从SMB协议Relay到LDAP是要求进行签名的,这时,并不能直接进行Relay。CVE-2019-1040就是绕过了NTLM的MIC消息完整性校验,使得SMB协议Relay到LDAP时不需要签名,从而可以发动攻击。

防御

对于防守方或蓝队来说,如何针对 NTLM Relay 攻击进行防御和检测呢? 由于域内NTLM Relay 攻击最常见的就是中继到LDAP执行高危险操作,因此需要对LDAP进行安全加固。

微软于2019年9月份发布相关通告称计划于2020年1月发布安全更新。为了提升域控的安全性,该安全更新将强制开启所有域控上LDAP通到绑定与LDAP签名功能。如果域控上的LDAP强制开启了签名,那么攻击者将无法将其他流量中继到LDAP进行高危险操作了。

滥用DCSync

在域中,不同的域控之间,默认每隔15min就会进行一次域数据同步。当一个额外的域控想从其他域控同步数据时,额外域控会像其他域控发起请求,请求同步数据。如果需要同步的数据比较多,则会重复上述过程。DCSync就是利用这个原理,通过目录复制服务(Directory Replication Service,DRS)的GetNCChanges接口向域控发起数据同步请求,以获得指定域控上的活动目录数据。目录复制服务也是一种用于在活动目录中复制和管理数据的RPC协议。该协议由两个RPC接口组成。分别是drsuapi和dsaop。

在DCSync功能出现以前,要想获得域用户的哈希数据等,需要登陆域控并在其上执行操作才能获得域用户数据。2015年8月,新版的mimikatz增加了DCSync功能,他有效的''模拟“了一个域控,并向目标域控请求账户哈希值等数据。该功能的最大特点是可以实现不登陆域控而获取目标域控上的数据。

注意:默认情况下,不允许从只读域控上获取数据,因为只读域控是不能复制同步数据给其他域控的。

DCSync的工作原理

主要分为两步:

  1. 在网络中发现域控

  2. 利用目录复制服务的GetNCChanges接口向域控发起数据同步请求

修改DCSync ACL

运行DCSync需要具有特殊的权限,默认情况下,只有以下组中的用户具有运行DCSync的权限:

  • Administrator 组内的用户

  • Domain Admins 组内的用户

  • Enterprise Admins 组内的用户

  • 域控计算机账户

我们可以使用Adfind执行如下的命令查询域内具备具备DCSync权限的用户:

可以使用以下方法使普通域用户也获得DCSync权限

  1. 图形化赋予指定用户的DCSync权限

    打开“Active Directory 用户和计算机”——>"查看“——>"高级功能”,找到域 hack.com ,右击,选择“属性"选项,然后在弹出的对话框中单击"安全"选项卡的”高级“按钮,可以看到Domain Controlles具备"复制目录更改所有项的权限",这也就是为什么Domain Controlles具备 DCSync权限了。然后单击”添加" 按钮,"主体”选项选择需要赋予权限的用户,这里的选择用户 god\liukaifeng01,"应用于"选择“只是这个对象",如图所示

  2. Powershell脚本赋予指定用户DSCync权限

    可以使用Empire下的PowerView.ps1脚本执行命令如下,赋予用户test DCSync权限。

DCSync攻击

如果拿到了具有DCSync权限的用户,就能利用DCSync功能从指定域控获得域内所有用户的凭据信息了。

用户liukaifeng01当前以被赋予了DCSync权限,下面介绍利用不同工具进行DCSync攻击。

Impacket

Impacket下的secretsdump.exe可以通过DCSync功能导出域用户的Hash,使用方法如下

mimikatz

mimikatz也可以通过DCSync功能导出域用户的Hash,使用方法如下:

PowerShell脚本

这个我没做复现。

Invoke-DCSync.ps1脚本也可以通过DCSync功能导出域用户的Hash,使用方法如下:

https://gist.github.com/monoxgas/9d238accd969550136db?spm=wolai.workspace.0.0.566258b4njYnJN

利用DCSync获取明文凭据

有时候利用DCSync可以获取明文凭据,这是因为账户勾选了"使用可逆加密存储密码的属性",用户再次更改密码会显示其明文密码。

防御

1、DCSync攻击防御

由于DCSync攻击的原理是模拟域控向另外的域控发起数据同步的请求,因此,可以配置网络安全设备过滤流量并设置白名单,只允许指定白名单内的域控IP请求数据同步。

2、 DCSync ACL 滥用检测(powershell≥3)

下载地址:https://github.com/cyberark/ACLight

1)可以在网络安全设备上检测来自白名单以外的域控数据同步复制 2)使用工具检测域内具备DCSync权限的用户。这里可以使用Execute-ACLight2.bat脚本文件进行检测,该工具输出的结果比较直观。执行完该脚本以后,会在当前目录的results生成三个文件。Privilege Accounts -Layes Analysis.txt是我们要查看生成的结果文件,打开该文件即可看到有哪些用户具有DCSync权限

如果发现域内恶意用户被赋予了DCSync权限后,可以使用Empire下的PowerView.ps1脚本执行如下的命令移除DCSync权限:

PTH

PTH(pass the hash,哈希传递攻击)是内网横向移动的一种方式。

原理

由于NTLM认证过程和Kerberos认证过程默认都是使用用户密码的NTLM hash来进行加密,因此当获取到了用户密码的NTLM hash而没有解出明文时,可以利用该NTLM hash进行PTH,对内网其他机器进行hash碰撞,碰撞到使用相同密码的机器时,通过135或445端口横向移动到其他机器上。

在windows server 2012及以后的机器中,默认不会在内存中保存明文密码,因此当我们使用mimikatz等抓取密码的工具抓取不到明文密码时,PTH就显得尤为重要了。

限制

对于本地账户来说:

  • windows vista系统之前的机器,可以使用本地管理员组内的所有用户进行PTH

  • Windows vista及更高版本系统的机器,只有administrator用户才可以进行PTH,其他非administrator的本地管理员用户不能使用PTH,会提示拒绝访问

对于域账户来说:

  • 针对普通域主机,可以使用该域主机本地管理员组内的普通用户进行PTH

  • 针对域控,可以使用域管理员组内所有用户进行PTH

造成限制的主要原因为UAC的存在。具体可以参考P297

利用PTH进行横向移动

msf

mimikatz

在新弹出的cmd窗口中,使用wmiexec.vbs获得交互式的shell:

impacket

可以使用impacket中的psexec.py、smbexec.py、wmiexec.py、atexec.py、dcomexec.py等进行PTH

这里举例使用psexec.py

hash碰撞

在企业内网环境中,很多计算机在安装的时候使用的是相同的密码。因此,当获得了其中某一台机器的密码hash而无法解密成明文时,可以利用hash碰撞来找出使用相同密码的机器

crackmapexec

msf

实际上内网使用MSF来进行hash碰撞,需要修改payload,修正为正向的payload

这个我没有复现成功

定位用户登录的主机

在域横向移动或拿下域控之后的后渗透测试阶段中,往往需要精确定位某些用户当前在哪台机器登录,才能有针对性的地去拿下某台主机,从而获得主机上登录的用户的权限。

注册表查询

可以使用普通域用户枚举域内服务器当前的登录的用户,其原理如下:

当用户登录了某台主机,在该主机的HKEY_USERS注册表内有该用户的文件夹。可以通过远程连接机器查看其注册表项值来知道谁在登录目标机器。远程查看注册表项值操作可以通过API来实现,并且域普通用户可调用该API进行查询。

默认普通机器是没有开启注册表远程连接的,因此无法查询当前登录的用户 默认服务器开启了注册表远程连接,因此服务器可以查询当前登录的用户 域内任何用户,即使配置了不能远程RDP登录域内机器,只要域内机器开启了远程注册表连接,就可以通过API查询该机器的注册表项值

Psloggedon

是一款微软官方提供的可以查询服务器当前登录用户的工具。

  1. 查询本机登录的用户

2. 查询指定主机登录的用户

在域中,仅需一个域用户权限,即可枚举出域内服务器(包括域控)当前登录用户

PVEFindADUser

是一款使用C#语言编写的可用于查询指定主机当前登录用户的工具

https://github.com/chrisdee/Tools/blob/master/AD/ADFindUsersLoggedOn/PVEFindADUser.exe
  1. 查询所有机器当前的登录用户

  1. 查询指定主机当前的登录用户

  1. 查询指定用户当前登录的主机

域控日志查询

sharpADUserIP

我没编译出来😢讨厌一切需要自己编译的项目

域林渗透

最后更新于

这有帮助吗?