利用域名碰撞實現從任何地方發起中間人攻擊
利用域名碰撞實現從任何地方發起中間人攻擊
相比大家對中間人劫持的攻擊相當瞭解,尤其是區域網中的中間人攻擊。有很多的利用手段比如ARP投毒、DNS投毒、ICMP重定向等等,這類的文章在網上非常的多。但是今天要討論的是一個全新的中間人攻擊方式,這種方式在近幾年的頂會論文中被研究。這種中間人攻擊條件一旦具備,攻擊者可以從任何地方對網路發起中間人劫持。
在這篇文章裡我將總結和分析這類攻擊的原理,並列舉目前網路上存在這些漏洞的服務應用。最後討論一下作為軟體開發人員應該怎麼去防範這類攻擊。
背景知識
在很多私有網路環境裡會使用許多私有的域名字尾比如.ntld等等。在ICANN(The Internet Corporation for Assigned Names and Numbers)ofollow,noindex">網際網路名稱與數字地址分配機構 最初指定的頂級域名中有.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/">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服務發現的請求連結,並在公網註冊這樣的域名就能返回給這樣的服務應用攻擊者決定的內容,可以導致很多漏洞的發生,包括中間人攻擊、惡意程式碼注入、程式流程劫持等等。
尋找存在漏洞的服務應用
如何獲得這樣的DNS服務發現請求連結呢(比如wpad.company.ntld)?
作為黑客,可以通過社工、竊密、其他漏洞等等得到一個AS自治域的一些私有域名資訊。作為科研人員,我們可以直接DNS根伺服器記錄中去發現,比如DNS-OARC Day In The Life of the Internet (DITL) 資料集。
從根伺服器的記錄中,我們去尋找二類記錄:
- 一是gTLD擴充前的響應為NXD的DNS請求
- 二是現在gTLD擴充的域名字尾
從這些記錄中整理提取出洩露的DNS服務發現請求,對應這些連結和服務在網路上也可以找到對應的服務程式。這裡列舉去年研究人員總結的服務應用和漏測試的漏洞情況如下: