在密碼學和計算機安全領域中,中間人攻擊 ( Man-in-the-middle attack,通常縮寫為MITM )是指攻擊者與通訊的兩端分別創建獨立的聯系,并交換其所收到的數據,使通訊的兩端認為他們正在通過一個私密的連接與對方直接對話,但事實上整個會話都被攻擊者完全控制。在中間人攻擊中,攻擊者可以攔截通訊雙方的通話并插入新的內容。
1. 沒有對SSL證書進行校驗;
2. 沒有對域名進行校驗;
3. 證書頒發機構(Certification Authority)被攻擊導致私鑰泄露等。攻擊者可通過中間人攻擊,盜取賬戶密碼明文、聊天內容、通訊地址、電話號碼以及信用卡支付信息等敏感信息,甚至通過中間人劫持將原有信息替換成惡意鏈接或惡意代碼程序,以達到遠程控制、惡意扣費等攻擊意圖。
在各大漏洞平臺上,有大量存在HTTPS證書不校驗漏洞,例如國內絕大部分Android APP存在信任所有證書漏洞、亞馬遜最新官方Android版存在一處信任所有證書漏洞、Yahoo雅虎在國內訪問遭遇SSL中間人攻擊、攜程旅游網最新Android客戶端https未校驗證書導致https通信內容完全被捕獲。
Android系統
1)中間人攻擊漏洞位置:
X509TrustManager 、HostnameVerifier 、 setHostnameVerifier (X509HostnameVerifier hostnameVerifier)
2) 漏洞觸發前提條件:
自定義的X509TrustManager不校驗證書;
或實現的自定義HostnameVerifier不校驗域名接受任意域名;
或使用setHostnameVerifier (ALLOW_ALL_HOSTNAME_VERIFIER);
3) 漏洞原理:
由于客戶端沒有校驗服務端的證書,因此攻擊者就能與通訊的兩端分別創建獨立的聯系,并交換其所收到的數據,使通訊的兩端認為他們正在通過一個私密的連接與對方直接對話,但事實上整個會話都被攻擊者完全控制。在中間人攻擊中,攻擊者可以攔截通訊雙方的通話并插入新的內容。
4.Android HTTPS中間人攻擊漏洞證明
1) 客戶端不校驗SSL證書(包含簽名CA是否合法、域名是否匹配、是否自簽名證書、證書是否過期)包含以下幾種編碼錯誤情況:
a. 自實現的不校驗證書的X509TrustManager接口的Java代碼片段 (其中的checkServerTrusted()方法實現為空,即不檢查服務器是否可信):
b. 不檢查站點域名與站點證書的域名是否匹配的Java代碼片段:
c. 接受任意域名的Java代碼片段:
SSLSocketFactory sf;
……
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
2)針對某個不校驗SSL證書的客戶端進行中間人攻擊演示如下圖所示,可通過中間人劫持獲取到登錄用戶名和密碼(該密碼參數只是對明文密碼進行了一次MD5):
對SSL證書進行強校驗
出于安全考慮,建議對SSL證書進行強校驗(簽名CA是否合法、證書是否是自簽名、主機域名是否匹配、證書是否過期等),詳細修復方案請參照Google官方關于SSL的安全建議。
文章來源:FreeBuf黑客與極客(FreeBuf.COM)