NTLM中继攻击
NTLM中继攻击原理
之前说过hash的分类,简单分为LM hash
、Net-NTLM Hash v1
和Net-NTLM Hash v2
现在一般都是Net-NTLM Hash v2
,破解和爆破都比较困难,所以一般获取不到明文
ntlm relay
的原理可以简述为:存在一个中间人,也就是攻击者,然后客户端认为他是服务端,服务端认为他是客户端。所以全程客户端都在和攻击者进行交互,然后攻击者将获得到的信息拿来和服务端交互,所以服务端认为攻击者是客户端,这样也就达到了伪造客户端进行认证的目的
Net-Ntlm relay
攻击的大致思路就是在Ntlm协议认证的第三步
,通过获取Hash
值,然后进行重放到服务器上进行验证。所以我们这里大致分为两步:第一步是获得Net-Ntlm Hash值,第二步是进行重放
获取Net-ntlm hash
这里的实现方式就是让受害者把Hash
传递给自己,所以说我们可以利用所有基于NTLM
协议的上层协议进行relay
,比如SMB
、HTTP
、LDAP
协议
Responder
这两个工具的原理是LLMNR
和NetBIOS欺骗
LLMNR
全称链路本地多播名称解析,是基于域名系统(DNS
)数据包格式的协议,IPv4
和IPv6
的主机可以通过此协议对同一本地链路上的主机执行名称解析。简单理解为就是一种在局域网内寻找主机的协议
NetBios
全称网络基本输入输出系统,它提供了OSI
模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。NetBIOS
也是计算机的标识名称,主要用于局域网内计算机的互访。NetBIOS
的工作流程就是正常的机器名解析查询应答过程。在Windows
操作系统中,默认情况下在安装TCP/IP
协议后会自动安装NetBIOS
Windows
解析主机名的顺序为:
- 查看本地
hosts
文件 - 查看
DNS
缓存或者DNS
服务器中进行查找 - 利用
LLMNR
(链路本地多播名称解析)和NetBIOS
名称服务进行查找
在局域网环境下,当用户输入了一个不存在的,或者错误的,DNS
中不存在的主机名的时候,Windows
系统根据主机名解析的顺序开始查找,最终在局域网内广播LLMNR/NBNS
数据包来请求解析主机名。所以当我们在攻击机上进行监听,然后在被攻击机上进行广播查找,当LLMNR
(链路本地多播名称解析)和NetBIOS
名称服务进行查找时,我们就可以抓到被攻击机的Hash
下载链接:https://github.com/lgandx/Responder
然后我们在攻击机(kali)上执行下面的命令
1 |
|
然后在被攻击机上访问一个不存在的主机,使得被攻击机进行广播,这里随便输一个\\dddddd
或者在终端执行net use \\dddddd
,这里是利用SMB协议进行中继攻击,所以这里是SMB Relay
其实这里的原理是LLMNR&NBNS
攻击,当用户输入任意一个不存在的名称,本地hosts文件和DNS服务器均不能正常解析该名称,所以系统就会发送LLNMR/NBNS
数据包请求解析,此时Responder对目标主机进行LLNMR/NBNS
毒化,并要求其输入凭据认证,然后就可以抓到目标机器的Net-Ntlm hash
desktop.ini
每个文件夹下都有个隐藏文件desktop.ini
其作用来用来指定文件夹图标等,正常情况是不可见的,可以通过修改文件夹属性去显示此文件
当图标的一些路径改成指定的UNC路径,就能收到目标机器发来的NTLM请求
通用命名规则 UNC (Universal Naming Convention) ,也叫通用命名规范、通用命名约定,指用一种通用语法来描述网络资源(如共享文件,目录或打印机)的位置
Microsoft Windows UNC,通用命名约定或统一命名约定的简称,指定了一种通用语法来描述网络资源(如共享文件,目录或打印机)的位置。Windows系统的UNC语法具有通用形式:\\ComputerName\SharedFolder\Resource
我们先新建一个文件夹111
,然后随便修改一个文件夹图标
取消勾选隐藏受保护的操作系统文件
此时可以看到desktop.ini
文件
然后将该文件里的UNC路径
替换为指定机器的UNC路径
,这样当有人访问了111
文件夹,目标机器就会去请求指定的UNC的图标资源,于是该机器就会将当前用户的Net-NTLM Hash
发送给指定UNC的机器,我们在攻击机上用Responder
监听,就能接受到发来的Net-NTLM Hash
.scf后缀文件
SCF后缀的文件通常是Windows操作系统中使用的一种快捷方式文件。SCF文件是Shell Command File(Shell 命令文件)的缩写,它包含了一系列命令,用于执行特定的操作或打开特定的应用程序
这个利用方法和上面的desktop.ini
的原理是一样的,.scf
文件中包含IconFile
属性,所以explore.exe
服务器会尝试获取文件夹的图标,所以打开.scf
所在的文件夹时,目标机器会尝试获取文件夹的图标,那我们通过修改IconFile
也就像上面一样达到访问指定UNC机器的目的了
.scf
文件的基本格式如下:
1 |
|
浏览器
当浏览器的访问页面含有UNC路径时,浏览器在解析该页面时也会尝试请求该UNC地址,发起NTLM认证。不同的浏览器有不同的UNC路径格式
这里示范一下在IE浏览器下的。在网站(phpstudy)下新建 1.html ,内容如下:
1 |
|
然后在被攻击机上访问这个文件,成功抓到Net-NTLM Hash
系统命令
下面列举一些常见的系统命令来访问指定的UNC路径去触发Net-NTLM Hash
1 |
|
然后Responder
监听接收到了hash值
除了上面的这些方法之外还可以用Office
、PDF
、outlook
、WPAD欺骗
、打印机漏洞
等
利用Net-ntlm hash进行攻击
破解Net-NTLM Hash
1 |
|
我们抓到的这个是Net-NTLM Hash v2
,密码强度较高,一般都跑不出来,所以基本都是用中继攻击
中继Net-NTLM Hash
我们知道,由于NTLM只是底层的认证协议,必须镶嵌在上层应用协议里面,消息的传输依赖于使用NTLM的上层协议,比如SMB、HTTP、LDAP等。因此,我们可以将获取到的Net-NTLM Hash
Relay到其他使用NTLM进行认证的应用上
攻击前提:
目标主机没有开启smb签名。一般情况下域控默认开启smb签名,其余域内机器不开启
关闭SMB签名的命令如下:
1 |
|
用nmap探测SMB签名是否打开命令(不一定准确):
1 |
|
Relay To SMB
SMB-Relay又分为在工作组环境
下和在域环境
下,但是一般工作组环境下比较少
- 工作组环境:在工作组环境中,工作组中的机器之间相互没有信任关系,每台机器的账号密码只是保存在自己的SAM文件中,这个时候Relay到别的机器,除非两台机器的账号密码一样,不然没有别的意义了。但是如果账号密码相同的话,为何不直接
Pass The Hash
攻击呢?因此在工作组环境下,Relay到其他机器不太现实。这个时候的攻击手段就是将机器Relay回机子本身。因此微软在ms08-068
中对Relay到自身机器做了限制,严禁Relay到机器自身。CVE-2019-1384(Ghost Potato)
就是绕过了该补丁。 - 域环境:在域环境中,默认普通域用户可以登录除域控外的其他所有机器(但是为了安全,企业运维人员通常会限制域用户登录的主机),因此可以将
Net-NTLM Hash Relay
到域内的其他机器。如果是拿到了域控机器的Net-NTLM Hash
,可以Relay到除域控外的其他所有机器(为啥不Relay到其他域控,因为域内只有域控默认开启SMB签名)。
responder MultiRelay
利用 MultiRelay.py 攻击,获得目标主机的 shell:
1 |
|
现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下 responder 的配置文件Responder.conf,不让其对 hash 进行抓取。将 SMB 和 HTTP 的 On 改为 Off:
1 |
|
重启 Responder.py,准备毒化(这里 responder 的作用就是当访问一个不存在的共享路径,将称解析降到 LLMNR/NBNS 时,来抓取网络中所有的 LLMNR 和 NetBIOS 请求并进行响应)
1 |
|
在 DC(192.168.58.144)上随便传递一个 SMB 流量
1 |
|
可以看到已经拿到了目标机器的 shell
Impacket smbrelayx
1 |
|
让任意主机访问这个攻击者精心构造好的 SMB 服务器:
1 |
|
此时,攻击者的 smbrelayx 脚本上就会发现命令成功执行了
Impacket ntlmrelayx.py
1 |
|
Relay To HTTP
中继到HTTP协议,基本都是用上面SMB说的三个脚本,这三个脚本也可以应用到HTTP协议中,就像impacket下的smbrelayx.py最后中继到http协议的一样,一般就是在域内的一台主机上访问一个不存在的网页,然后输入凭证
所以只要我们开始欺骗投毒并且运行脚本之后,只要域内有机器用到了SMB或者HTTP协议就会触发,使得我们成功横向移动