利用域名(host碰撞)碰撞实现从任何地方发起中间人攻击(理论篇)
簡述
相比大家對中間人劫持的攻擊相當了解,尤其是局域網中的中間人攻擊。有很多的利用手段比如ARP投毒、DNS投毒、ICMP重定向等等,這類的文章在網上非常的多。但是今天要討論的是一個全新的中間人攻擊方式,這種方式在近幾年的頂會論文中被研究。這種中間人攻擊條件一旦具備,攻擊者可以從任何地方對網絡發起中間人劫持。
在這篇文章里我將總結和分析這類攻擊的原理,并列舉目前網絡上存在這些漏洞的服務應用。最后討論一下作為軟件開發人員應該怎么去防范這類攻擊。
背景知識
在很多私有網絡環境里會使用許多私有的域名后綴比如.ntld等等。在ICANN(The Internet Corporation for Assigned Names and Numbers)互聯網名稱與數字地址分配機構?最初指定的頂級域名中有.com、.org等,這些后綴的域名可以被公共網絡的用戶注冊和使用。但是幾年前,該組織對gTLD(Generic top-level domain,通用頂級域)進行了擴充,將許多泄露的私有域名后綴列為了合法的通用頂級域。這個舉措就導致了后面的攻擊發生。
在介紹攻擊之前,需要介紹本文涉及的一些知識點。
-
(1)WPAD協議
全稱:WebProxy Auto Discovery Protocol。WPAD 通過讓瀏覽器自動發現代理服務器,使代理服務器對用戶來說是透明的,進而輕松訪問互聯網。WPAD 可以借助 DNS 服務器或 DHCP 服務器來查詢代理自動配置(PAC)文件的位置。 -
(2)PAC文件
全稱: Proxy auto-config。一個PAC文件包含一個JavaScript形式的函數“FindProxyForURL(url, host)”。這個函數返回一個包含一個或多個訪問規則的字符串。 用于控制用戶訪問網絡資源的時候是否需要使用代理以及使用何種代理。一個典型的例子如下:
-
(3)基于DNS的服務發現協議
英文名稱:DNS-based Service Discovery。基于DNS的服務發現協議在RFC 6763文件中被定義,簡稱DNS-SD。比如想發現一個comp.ntld域下的svc服務所在的IP和端口,整個過程如下:- DNS PTR請求發送給DNS服務器得到所有的服務實例名稱
- 對于每一個服務實例名稱,一條SRV請求會被處理得到服務的IP和端口
- 上述PTR和SRV請求的格式都會是_svc._prot.comp.ntld這樣的,這也是標準的格式。
-
(4)AS域
自治系統:autonomous system。在互聯網中,一個自治系統(AS)是一個有權自主地決定在本系統中應采用何種路由協議的小型單位。
WPAD中間人攻擊
在你的瀏覽器中開啟自動切換代理就是開啟了WPAD協議,我們設想一個這樣的攻擊場景(如圖)。受害者啟用WPAD協議,然后去DNS服務器上請求PAC文件所在的鏈接,之后DNS服務器返回受害者PAC資源路徑,然后受害者電腦下載這個PAC文件并設置。
問題就在于如果DNS返回給用戶的是惡意的PAC文件,這個文件將所有流量代理設置為攻擊者的服務器,那么受害者之后所有的流量都會被傳送攻擊者,這就是中間人攻擊的模型。
整個中間人攻擊的核心就是圖中紅色的返回內容,但是過去的攻擊基本都要依靠局域網的投毒或者從DNS投毒、緩存等角度去實現。這篇文章利用的是域名碰撞,接下來我們將詳細分析。
利用域名碰撞實現任何地方發起的中間人攻擊
如下圖所示,在受害者的自治域(AS)內,有一條WPAD服務請求被泄露發送到公網的DNS服務器里,比如root根服務器,由于這個服務請求是請求company.ntld域下的WPAD服務,這是個私有域,公網的根服務器當然不知道這種域名的情況,因此會返回給請求的客戶端NXD消息( Non-eXistent Domain )。泄露的原因多種多樣,因為DNS服務器本身查詢這種不存在域名的時候會向根服務器發送查詢指令導致泄露,有可能是服務應用本身配置不當導致的泄露。
公網的根服務器或者數據收集機構可能會記錄下這樣的域名查詢記錄(wpad.company.ntld)。如果攻擊者通過某種手段知道了這樣的域名,并且在gTLD擴充之后.ntld后綴被允許注冊,那么攻擊者可以合法的注冊一個公網的company.ntld域名,并且綁定到攻擊者的服務器。
那么危害就來了,如果私有網絡自治域內的應用向外網請求了wpad.company.ntld這樣的一條請求,希望知道WPAD服務器的IP和端口,那么公網的DNS服務器會解析這個域名到攻擊者的服務器上,之后攻擊者可以可以任意控制自治域的受害者主機代理配置,劫持受害者的流量。如果這個請求來自受害者自治域的服務程序(為這個AS所有用戶提供WPAD服務),那么攻擊者甚至可以將整個AS域內的全部主機流量劫持,這種危害相當巨大。
這種中間人攻擊,對于攻擊者來說,只需要去公網注冊這樣的域名就可以造成巨大的危害,成本很低。而且現實中許多服務應用在對系統底層請求DNS解析的內容都是無條件信任的,攻擊者只要利用這種域名碰撞就能輕松地實現對漏洞的利用。
服務應用漏洞的定義
不僅僅是提供WPAD服務的應用,上面只是用WPAD舉例,但是從前面的攻擊分析可以知道,只要服務應用滿足以下二個條件就能被攻擊者利用:
只要攻擊者知道了這個DNS服務發現的請求鏈接,并在公網注冊這樣的域名就能返回給這樣的服務應用攻擊者決定的內容,可以導致很多漏洞的發生,包括中間人攻擊、惡意代碼注入、程序流程劫持等等。
尋找存在漏洞的服務應用
如何獲得這樣的DNS服務發現請求鏈接呢(比如wpad.company.ntld)?
作為黑客,可以通過社工、竊密、其他漏洞等等得到一個AS自治域的一些私有域名信息。作為科研人員,我們可以直接DNS根服務器記錄中去發現,比如DNS-OARC Day In The Life of the Internet (DITL) 數據集。
從根服務器的記錄中,我們去尋找二類記錄:
- 一是gTLD擴充前的響應為NXD的DNS請求
- 二是現在gTLD擴充的域名后綴
從這些記錄中整理提取出泄露的DNS服務發現請求,對應這些鏈接和服務在網絡上也可以找到對應的服務程序。這里列舉去年研究人員總結的服務應用和漏測試的漏洞情況如下:
防范這類攻擊主要從二種層面:
- 網絡管理層面:做好網絡配置,避免自治域的私有請求發送到公網。在網絡內也要檢測是否被外網的服務劫持。
- 軟件層面:對請求返回的內容加以驗證,比如IP地址是否是允許的范圍內,對一些敏感操作需要嚴格的控制和驗證,避免惡意代碼注入。
總結
以上是生活随笔為你收集整理的利用域名(host碰撞)碰撞实现从任何地方发起中间人攻击(理论篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery之简单的表单验证
- 下一篇: 取某个日期所在周的任意一天日期