【技术向】CVE-2019-1040漏洞分析&防御报告

发布者:星河Salaxy
发布于:2021-07-07 09:42

一.  CVE-2019-1040简介

2019年6月,Microsoft发布了一条安全更新。该更新针对CVE-2019-1040漏洞进行修复。此次漏洞,攻击者可以通过中间人攻击,绕过NTLM MIC(消息完整性检查)保护,将身份验证流量中继到目标服务器。通过这种攻击使得攻击者在仅有一个普通域账号的情况下可以远程控制Windows域内的任何机器,包括域控服务器。



二.  CVE-2019-1040描述


2.1  漏洞利用原理

CVE-2019-1040是一个允许绕过NTLM中继攻击的漏洞。该漏洞由Marina Simakov和Yaron Zinar(以及微软公告中的几个人发现)发现,他们在此发布了有关此漏洞的技术文章。此漏洞允许绕过NTLM身份验证中的消息完整代码。然而,如果将Lee Christensen发现的Printer Bug以及我们在Elad Shamir的Kerberos研究中开展的一些研究相结合,我们能发现这个漏洞的影响是相当大的。使用这些漏洞的组合,可以将SMB身份验证中继到LDAP。该漏洞使得在任何未修补的Windows服务器或工作站(位于不同Active Directory中的那些服务器或工作站)上以SYSTEM身份执行远程代码,并通过未修补的Exchange服务器升级到域管理员(除非域中的Exchange权限减少)。


NTLM身份验证由3种消息类型组成:NTLM_NEGOTIATE,NTLM_CHALLENGE,NTLM_AUTHENTICATE。微软为了在NTLM协商阶段防止中间人攻击,在最终的NTLM身份验证消息(NTLM_AUTHENTICATE)添加了一个额外字段——MIC,msvAvFlag字段表示该消息是否包含MIC,Flags:0x00000002表示该消息包含MIC字段。MIC是一个HMAC_MD5值,应用于3种NTLM消息的会话密钥,只有初始认证的账户和目标服务器知道。所以攻击者试图篡改消息时,由于无法生成相应的MIC,会导致攻击失败。但是该漏洞成因在于Microsoft服务器并不验证’msvAvFlag’字段,即服务器允许无MIC的NTLM_AUTHENTICATE消息,这使得不强制执行签名的服务器容易受到中间人攻击:

 

攻击思路如下:

(1) 取消设置NTLM_NEGOTIATE消息中的签名标志(NTLMSSP_NEGOTIATE_ALWAYS_SIGN,NTLMSSP_NEGOTIATE_SIGN)

(2) 从NTLM_AUTHENTICATE消息中删除MIC

(3) 从NTLM_AUTHENTICATE消息中删除版本字段(删除MIC字段而不删除版本字段将导致错误)。

(4) 取消设置NTLM_AUTHENTICATE消息中的以下标志:NTLMSSP_NEGOTIATE_ALWAYS_SIGN,NTLMSSP_NEGOTIATE_SIGN,NEGOTIATE_KEY_EXCHANGE,NEGOTIATE_VERSION。


该漏洞目前有两种攻击途径:

(1) 使用任何AD帐户,通过SMB连接到受害者Exchange服务器,并触发SpoolService错误。攻击者服务器将通过SMB连接回您,SMB可以使用修改版本的ntlmrelayx中继到LDAP。使用中继LDAP身份验证,向攻击者帐户授予DCSync权限。攻击者帐户现在可以使用DCSync转储AD中的所有密码哈希。

(2) 使用任何AD帐户,通过SMB连接到受害者服务器,并触发SpoolService错误。攻击者服务器将通过SMB连接回您,SMB可以使用修改版本的ntlmrelayx中继到LDAP。使用中继LDAP身份验证,将受害者服务器的基于资源的受限委派权限授予攻击者控制下的计算机帐户。攻击者现在可以作为受害者服务器上的任何用户进行身份验证。


2.2  漏洞针对的对象版本

Windows 7 sp1 至Windows 10 1903

Windows Server 2008 至Windows Server 2019



三.  Exchange攻击过程


3.1  实验环境

图片


图片

在域中新建一个用于测试的账户user2



3.2  漏洞利用过程


1. ntlmrelayx

执行ntlmrelayx.py脚本进行NTLM中继攻击,设置SMB服务器并将认证凭据中继到LDAP协议。其中--remove-mic选项用于清除MIC标志,--escalate-user用于提升指定用户权限。


图片


2. 触发SpoolService

执行printerbug.py脚本,触发SpoolService的bug


图片


3. dump出所有密码哈希值

通过secretsdump.py的DCSync功能dump出所有密码哈希值


图片



四.  Kerberos委派攻击过程


4.1  实验环境

图片


域控制器需要开启LDAPS支持,因为该攻击方式需要添加新的计算机账户,必须在LDAPS进行。

在域中新建一个用于测试的账户user1,一个域管理员admin2。


图片


图片



4.2  漏洞利用过程

4.2.1  漏洞检测

受影响范围内且未安装最新补丁程序的所有系统都容易受到攻击。用户可以检查当前系统是否已打补丁,并确定其是否容易受到攻击。


4.2.2  漏洞利用

1. 开启NTLM中继

执行ntlmrelayx.py脚本进行NTLM中继攻击,设置SMB服务器并将认证凭据中继到LDAP协议。其中--remove-mic选项用于清除MIC标志,delegate-access选项将中继计算机帐户(这里即辅助域控制器)的访问权限委托给攻击者。


图片


2. 执行printerbug.py脚本,触发SpoolService的bug


图片


3. printerbug.py脚本执行成功后,将触发辅助域控制器(SDC)回连攻击主机,回连使用的认证用户是辅助域控制器(SDC)本地计算机账户AAA/USER1$。ntlmrelayx.py通过ldaps将该用户账户中继到域控服务器(DC),因为这种攻击方式下所冒用的身份AAA/USER1$并不在Exchange Windows Permissions组内,不具有修改ACL权限,但是可以通过此身份在DC上添加一个新计算机账户(下图中FAXSEEZU$), 并修改其约束委派授权,授予它对受害计算机(辅助域控制器)的委派权限。


图片


图片


4. 使用impaket中的getSP.py脚本,通过-impersonate参数模拟用户admin2请求其票证,保存为ccache,admin2用户为Domain Admins组的成员,具有对辅助域控制器(SDC)的管理与访问权限。


图片


5. 使用上一步骤中保存的Kerberos服务票证,我们可以在目标主机(SDC)上模拟admin2身份,从而执行任何操作,例如使用secretsdump转储哈希值。


图片



五.  防御建议

1. 安装官方补丁:

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-1040

https://nsfocusglobal.com/windows-ntlm-tampering-vulnerability-cve-2019-1040-threat-alert/

安装完后需要重启服务器


2. 其他缓解措施

1) 强制执行SMB签名,开启域中所有服务器的强制SMB执行功能 (在 Windows 域环境下,默认只有域控服务器开启了强制 SMB 签名)

2) 尽量不使用NTLMv1,因为NTLMv1的安全性较低,可以通过设置GPO来完全禁止

3) 启用所有域控服务器的强制 LDAPS Channel Binding 功能 (此功能默认不启用。启用后有可能造成兼容性问题。)

4) 启用所有域控服务器的强制 LDAP Signing 功能,防止LDAP中的NTLM中继 (此功能默认不启用。启用后有可能造成兼容性问题。)

5) 开启EPA,防止Web服务器上的NTLM中继,强制所有Web服务器(OWA,ADFS)只接受EPA的请求

6) 开启所有重要服务器(比如所有 Exchange 服务器)上相关应用的Channel Binding 功能(如 IIS 的 Channel Binding 功能)

7) 减少使用NTLM,即使是安全配置和完全修补的NTLM也比Kerberos更不安全



六.  参考链接

https://www.freebuf.com/vuls/207399.html

https://xz.aliyun.com/t/5418

https://www.anquanke.com/post/id/180161




声明:该文观点仅代表作者本人,转载请注明来自看雪