【技術向】CVE-2019-1040漏洞分析&防御報告
一. 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