作者:騰訊安全玄武實驗室 tomato, salt
博客:https://xlab.tencent.com/cn/2019/03/18/ghidra-from-xxe-to-rce/
0x00 背景
Ghidra是 NSA 發布的一款反匯編工具,它的發布引起了安全研究人員的極大興趣。
有研究人員發現Ghidra在加載工程時會存在XXE,基于筆者之前對XXE漏洞利用研究發現,攻擊者可以利用Java中的特性以及Windows操作系統中NTLM認證協議的缺陷的組合來完成RCE。
0x01 技術細節
Java在使用內置類 sun.net.www.protocol.http.HttpURLConnection 發送HTTP請求遇到狀態碼為401的HTTP返回頭時,會判斷該頁面要求使用哪種認證方式,若采用的NTLM認證則會自動使用當前用戶憑據進行認證。
其根本原因在于Windows下的Java默認啟用了透明NTLM認證,并且將所有由外部傳入的URL地址都認為是可信的。如下面代碼段所示
sun.net.www.protocol.http.AuthScheme#NTLM
if (tryTransparentNTLMServer) {
tryTransparentNTLMServer =
NTLMAuthenticationProxy.supportsTransparentAuth;
/* If the platform supports transparent authentication
* then check if we are in a secure environment
* whether, or not, we should try transparent authentication.*/
if (tryTransparentNTLMServer) {
tryTransparentNTLMServer =
NTLMAuthenticationProxy.isTrustedSite(url);
}
}
再跟入NTLMAuthenticationProxy.isTrustedSite方法
public static boolean isTrustedSite(URL url) {
try {
return (Boolean)isTrustedSite.invoke(null, url);
} catch (ReflectiveOperationException roe) {
finest(roe);
}
return false;
}
通過反射調用了sun.net.www.protocol.http.ntlm.NTLMAuthentication中的isTrustedSite方法,在此方法中將所有外部傳入的URL都判定為可信的。
攻擊者通過搭建基于NTLM認證的HTTP Server即可獲取到當前用戶的Net-NTLM Hash。
我們再來看NTLM認證協議的缺陷。NTLM認證協議中存在一種很古老的攻擊的技術,被稱作為NTLM Relay攻擊。此攻擊的原理網上已經有很多文章進行說明,在此不再贅述。
但在此次漏洞利用方式中我們使用的憑據反射攻擊,即為攻擊者將受害者的Net-NTLM Hash再次Relay給受害者,達到以彼之道還施彼身的效果。
下面來看看這個過程的具體實現,攻擊者首先搭建基于NTLM認證的惡意HTTP Server,然后通過XXE/SSRF等漏洞使受害者向惡意的HTTP Server進行NTLM認證。
值得注意的是,NTLM認證分為兩個版本NTLMv1和NTLMv2,在進行NTLMv1類型認證時攻擊將獲取到的Net-NTLM Hash直接Relay給受害者的SMB服務即可,但是在使用NTLMv2類型認證時,攻擊者在Relay時需要將NTLM認證中Type 2 Message的Negotiate Flags進行修改,將Negotiate Always Sign與Negotiate 0x00004000 兩個標志位從設置改為不設置,這其中具體代表的含義為讓此次認證被認作在網絡上(Relay給本機會被當做是一次本地認證)進行以及將認證中的簽名進行去除。
為完成該攻擊過程,筆者已經編寫好腳本。
0x03 復現步驟
受害者環境 Oracle JDK 8u161、Win10、Administrator賬戶
攻擊者環境 Ubuntu16.04 IP為192.168.130.136
首先在局域網內另一臺機器上運行前面提到的腳本
python ultrarelay.py -ip 192.168.130.136 -smb2support
腳本將會在80端口開啟HTTP服務。然后回到Win10中新建一個Ghidra工程,修改工程中的project.prp,插入XXE攻擊代碼,如下圖所示

再次使用Ghidra打開此惡意工程,攻擊者就能獲取到受害者機器的NTLM Hash,也可通過腳本中的參數在受害者機器上執行任意命令。
0x04 防御措施
-
開啟Windows防火墻,禁止外部請求訪問SMB服務
-
若要提供SMB服務 則建議開啟SMB Sign
-
升級JDK至最新版本
0x05 參考資料
https://twitter.com/sghctoma/status/1103392091009413120
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/861/
暫無評論