跟着玄武大佬学NTLM relay攻防
0X01
偶然间看到了玄武实验室在2018Zero Nights会议上的分享的议题《NtlmRelay Reloaded: Attack methods you do notknow》,身边也恰巧有大佬解读,于是在小本本下记下,整理后发出来,与各位师傅一道学习。
0x02
在进一步了解NTLM的攻防前,自然要先明白什么是NTLM。
NTLM是NTLAN Manager的缩写,这也说明了协议的来源。NTLM是Windows NT早期版本的标准安全协议,Windows2000 支持NTLM 是为了保持向后兼容。Windows2000内置三种基本安全协议之一。它是为用户提供认证,完整性和机密性的一种网络协议。
NTLM协议有NTLMv1,NTLMv2,NTLMsession v2三种版本,协议的交互简图如下
NTLM是一种挑战/响应(Challenge/Response)形式的消息,主要包括三类消息类型:Type1 message (negotiation) :客户端向服务器发送一个包含明文登录用户名的请求
Type2 message (challenge) :服务端生成一个16位的随机数(即Challenge),明文发送回客户端。使用登录用户密码hash加密Challenge,获得Challenge1
Type3 message (authentication):客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,生成response,将response发送给服务器
服务器比较Challenge1和response,如果相同,验证成功。
微软的NTLMSSP(NTLMSecurity Support Provider)为NTLM认证的实现提供了基本功能,
是WindowsSSPI(SecuritySupport Provider Interface )的一种具体实现。NTLMSSP只是
实现了NTLM认证,并没有规定使用什么协议来进行传输。实际上SMB、HTTP、LDAP、MSSQL
等协议都可以携带NTLM认证的三类消息,也就是说我们可以通过这些协议来进行攻击。
需要注意的是,上述过程中,用户密码的hash被称为LMhash或NThash(Windows
Vista/Windowsserver 2008以后LMhash被弃用),即所谓的NTLMhash。而这类hash可以
用来进行passthe hash攻击,并不能用来relayattack。本文介绍的relayattack严格意义上讲是用于网络认证的Net-NTLMhash的relay,Net-LNTLMhash是由NTLM认证过程中服务端返回的challenge和客户端的response组成的。所以严格的讲,应该是Net-NTLMhash relay atack。
好吧,这里介绍了一大堆术语,再进行下一步前,先来弄明白分别是什么意思。
0x03
LM-Hash:LM-hashes是windows使用的最古老的密码存储,可以追溯到20世纪80年代的OS/2。由于允许的字符集有限,它们很容易破解。如果仍然可用,可以从windows上的SAM数据库或域控制器上的NTDS数据库中获取它们。
NTHash:这是密码存储在现代Windows系统上的方式,可以通过转储SAM数据库或使用Mimikatz获得。它们也存储在NTDS文件中的域控制器上。通常被称之为NTLM哈希(或者只是NTLM),这是误导性的,因为微软将其称为NTHash。
SSPI- Security Service Provider Interface 或Security Support ProviderInterface。这是Windows定义的一套接口,此接口定义了与安全有关的功能函数,包含但不限于:
A.身份验证机制
B.为其他协议提供的Session security 机制。SessionSecurity 指的是会话安全,即为通讯提供数据完整性校验以及数据的加、解密功能。
C. ...
SSP- Security Service Provider。SSPI的实现者,微软自己实现了如下的SSP,用于提供安全功能:
A.NTLM SSP
B.Kerberos
C.Cred SSP
D.Digest SSP
E.Negotiate SSP
F....
0x04
回到小本本。简单来说,实施攻击,需要两步:
一是获取受害者的Net-NTLMhash,二是重放攻击。
0x05
先说如何获取受害者的Net-NTLMhash
思路是让受害者把Net-NTLMhash发送给攻击者,也就是说只要是使用SMB、HTTP、LDAP、MSSQL等协议来进行NTLM认证的程序,都可以尝试用来向攻击者发送Net-NTLMhash。
比如浏览器、word文档、pdf文档、explorer.exe等等。如果新发现一个这类应用程序,或者发现这些程序的一种调用方法,就会多出一种攻击手段。几种常见的获取方法如下:
1.网络协议的欺骗与劫持
2.钓鱼攻击
3.与其他漏洞结合
以网络协议的欺骗与劫持为例。
LLMNR/NBNS欺骗
许多网络协议可以用来进行欺骗,从而进行中间人攻击,常见的有ARP、DHCP、DNS等。在实际的攻击中,使用LLMNR/NetBIOSNS欺骗的方式更多,因为这类欺骗的网络流量小,实施也更容易,与Net-NTLMhash relay attack的结合也更紧密。LLMNR和NetBIOSNS是Windows系统完成名称解析的一种方法。
Windows系统的名称解析顺序如下:
本地hosts文件(%windir%\System32\drivers\etc\hosts)
DNS缓存/DNS服务器
链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
如果前两种方法名称解析失败,就会使用第三种方法进行解析。所以可以使用这两种协议来进行欺骗。
LLMNR协议
NBNS协议
这类攻击很容易实现,Windows下可以使用Inveigh,在Linux下可以使用Responder,
metasploit也有auxiliary/spoof/llmnr/llmnr_response、
auxiliary/spoof/mdns/mdns_response等模块。下图是以Responder进行的攻击
WPAD劫持
Web Proxy Auto-Discovery Protocol是用来查找PAC文件的协议,其主要通过DHCP、DNS、LLMNR、NBNS协议来查找存放PAC文件的主机。一个典型的劫持方式是利用LLMNR/NBNS欺骗来让受害者从攻击者获取PAC文件,PAC文件指定攻击者就是代理服务器,然后攻击者就可以劫持受害者的HTTP流量,在其中插入任意HTML标签。
利用网络协议的欺骗与劫持的好处是不需要受害者主动交互来触发发送Net-NTLMhash的行为,受害者的任何正常行为都可以被欺骗,从而被攻击。缺点是这类工具回复所有的多播、广播数据包,容易被发现.
0x06
前文介绍了获取受害者Net-NTLMhash的思路,那么如何让受害者自动发送Net-NTLMhash
呢?这就需要看具体发送Net-NTLMhash的应用程序了。
这里重点分析下浏览器在什么情况下可以自动向攻击者发送Net-NTLMhash.
我们可以看出,Windows10上的IE和Edge,即使支持SMB协议,但是无法通过劫持WPAD的方式来触发,Chrome浏览器虽然可以进行WPAD劫持,但是不支持SMB协议。
一个解决思路就是放弃最常用的NTLMSSP over SMB,使用NTMLSSP over HTTP,使用HTTP协议来发送NTLM认证消息,如下:
那接下来的问题就是浏览器什么情况下会通过HTTP协议自动发送Net-NTLMhash呢?答案是IntranetZone
演讲者通过对IE的两个API分析,发现其跟policy和zone有关:
如果policy是URLPOLICY_CREDENTIALS_SILENT_LOGON_OK,IE会自动发送hash。如果policy是URLPOLICY_CREDENTIALS_MUST_PROMPT_USER,那么只有zone的值为0、1、2的时候才会自动发送hash。
经过测试,在Windows10上,工作组环境下,只要URL是主机名而不是完全限定性域名的情况下,就认为是LocalInternet Zone内的,如下图:
0x07
Relay到同一台主机还是不同的主机?首先说relay到不同的主机。
如果是relay其他主机的SMB服务,在工作组的环境下,两台主机的用户名和密码需要相同;在域环境下,还可以relay域用户的Net-NTLMhash。也可以relay到支持NTLM认证的EWS服务,典型的例子就是CVE-2018-8581,这里不再赘述。
再来说relay到同一台主机,如果relay同一台主机,由于Net-NTLMhash是从这台机器上发送过来的,肯定可以成功,,但实际上并没那么容易。在没打MS08068补丁的主机上,可以使用最原始的SMB协议进行Net-NTLMhash relay攻击,MS08-068的补丁,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。
因为NTLM认证消息可以嵌入到其他协议进行传输,所以还可以使用其他协议进行relay攻击。
HotPotato 本地提权就是个典型的攻击方法。不过,微软的MS16-075补丁防止了同一主机上从HTTP协议向SMB协议的Net-NTLMhash relay。
那么,还有办法relay攻击同一台主机吗?演讲者发现Windows上的Java可以用来发送带有Net-NTLMhash的HTTP请求,可以relay给同一台主机。
并且分析了通过XXE、SSRF等漏洞,触发Java应用发送HTTP请求时,可以自动发送Net-NTLM hash的原因。
这是OpenJDK的问题,该问题在2011年1月10日的OpenJDK7中引入(合入代码,可见http://hg.openjdk.java.net/jdk7/jdk7/jdk/rev/cc989209cbf1),在2018年10月8日进行了修复
0x08
接着演讲者演示了如何通过smb获取凭证,以及给出了实际案例(cve-2018-11758)。(slides里非常详细,不再解读)
0x09
议题最后分别针对客户端和服务端给出了一些防御措施,包括禁用WPAD,启动SMB签名等
0x10
Slides下载地址:
相关操作学习:
安全协议应用于分析:掌握网络安全协议基本概念及基本技术,点击前往 合天网安实验室 ,开始操作!