Google DNS劫持背後的技術分析 | WooYun知識庫

0x00 背景


最近世界真是越來越不太平了,尤其是對於大部分普通人而言。昨天又傳來噩耗,根據網路監測公司BGPMon,Google的公開DNS伺服器 IP 8.8.8.8被劫持到了委內瑞拉和巴西超過22分鐘。

Google DNS 伺服器平均每天處理超過1500億個查詢,在被劫持的22分鐘里起碼幾百萬個查詢包括金融系統,政府和個大商業網站的DNS查詢流量都被劫持走了。

根據磚家們的推測,這次劫持可能是黑客利用了Border Gateway Protocol(BGP) 協議中一個眾所周知的漏洞來實現的,BGP協議為ISP級的路由協議,一般用來協調大型ISP之間的路由走向。這次劫持可以讓黑客把網上的部分流量劫持從而經過他們所控制的路由。

這已經不是Google DNS伺服器被第一次劫持了,在2010年也Google DNS的流量也曾經被劫持到了羅馬尼亞和奧地利境內。

BGP劫持攻擊是一種大規模的中間人攻擊,並且較難發現,因為數據包的最終目的地並沒有變,只是繞了下路而已。

0x01 BGP劫持詳解


本部分來源於Tony Kapela 和 Alex Pilosov在2008年 Defcon會議上的演講。

什麼是BGP

首先互聯網整體上來說是一個分散式的網路,並沒有整個網路的中心。但是整個互聯網實際上是由成百上千個不同的ISP的子網路組成的。

這些子網路互相連接,通過BGP協議告訴對方自己子網路里都包括哪些IP地址段,自己的AS編號(AS Number)以及一些其他的信息。

這裡又要扯到互聯網的IP地址分配方式。互聯網的IP地址分配是中心化的,ICANN這個機構把IP地址大段分給Regional Internet Registries(RIR),區域互聯網註冊管理機構。RIR再把IP地址段細分後分給ISP們。

大部分情況下,AS Number和分給該AS什麼IP段是沒有任何關係的。

下面問題來了,BGP協議里雖然有一些簡單的安全認證的部分,但是對於兩個已經成功建立BGP連接的AS來說,基本會無條件的相信對方AS所傳來的信息,包括對方聲稱所擁有的IP地址範圍。

對於ISP分配給大公司客戶的地址段,ISP往往會對BGP做一些有限的過濾。但是對於大型ISP來說,因為對方所擁有的IP地址段可能過於分散,所以一般是按最大範圍設置BGP prefix 地址過濾。比如假設ISP A擁有地址段20.1.0.0/16和20.200.0.0/16,那麼ISP B可能會設置過濾對方傳來的20.0.0.0/8以外的路由。

當然這種情況比較極端,一般ISP分配到的IP地址段都是連續的,但是基本也都有可操作的空間,可以把數百到幾萬個不屬於自己的IP合法加到自己的BGP信息里。

多數ISP甚至都沒有把自己本身的IP段過濾掉,也就是說如果其他AS聲稱擁有該ISP自己的IP段,這個ISP的BGP路由也會相信。

為了解決這個問題,有人發明了一個叫Internet Routing Registry (IRR)的東西,相當於一個開放式的資料庫,像DNS 根伺服器一樣採用分散式鏡像伺服器放在世界各地。

ISP可以向IRR註冊自己的IP地址段和路由策略,其他ISP就可以查詢IRR從而對自己的BGP路由器做過濾。這樣做的確防止了一些由於無意而導致的路由劫持。

但是IRR這個東西本身也是不靠譜的。IRR里存了大約10萬條記錄,如果全部載入進路由器的話是個不小的負擔。另外IRR基本沒人管,任何人可以可以往裡面註冊任何路由記錄。

所以在大部分ISP都無條件相信IRR的時代,IRR也帶來了不少的麻煩。

最簡單的方式就是通過Whois找到目標IP段的 管理員郵箱,如果該郵箱或者郵箱所在的域名已經過期,那麼就自己註冊一個,然後就可以隨便通過郵件向IRR修改記錄了。

或者直接通過BGP路由向ISP發送,反正大家都不care……

實際案例

現在我們來看一個Youtube被劫持的案例:

youtube有5個網段,其中一個是

208.65.152.0/22

因為覺得Youtube不和諧,於是巴基斯坦政府決定封鎖Youtube。

巴基斯坦電信在路由器上加了條static route把

208.65.153.0/24

弄到了null0介面(GFW之黑洞路由大法)

巴電信的工程師手抖把static route redistribute到BGP了(Cisco路由器上同步不同協議路由表的方法),也就是說把該路由器上的靜態路由表添加到BGP的路由表了,靜態路由同步到其他路由表裡的優先值最高。

BGP把這條路由向其他AS的路由器同步了,最先中槍的是香港的電訊盈科(PCCW),然後接著被逐漸同步到了全世界。

這時互聯網的大部分用戶想上Youtube的時候數據包都跑到巴基斯坦了,結果當然是打不開了(因為進來就被弄到null0了)。

Youtube發現後重新用BGP聲明了對該IP段和其他IP段的所有權,成功刷新了部分ISP路由器的路由表。

兩小時後PCCW斷開了和巴基斯坦電信路由器的BGP連接。3-5分鐘後,一切恢復正常,除了苦逼的巴基斯坦用戶們。

這意味著只要控制了任何一個ISP的任何一個BGP路由,都將具備影響全世界互聯網的能力。

BGP劫持很難被發現,如果不是因為巴基斯坦電信把youtube的IP段轉發到了null0介面,數據包就只會在巴基斯坦網路里繞一圈然後再到達Youtube。

如果攻擊者的路由器具備篡改TTL的功能,那麼即使通過traceroute也很難發現數據包被劫持,唯一的方法就是像前面所說的BGPmon那樣檢測全世界範圍內的AS路由表和BGP信息。

BGP劫持理論

當我們控制了ISP的BGP路由後,像平常一樣發送路由信息。通過修改AS Path等BGP信息,讓其他AS認為你到目標網路的距離最短。

為了讓回來的數據包也經過你的路由器,你需要記錄trace route到目標網路的時候都會經過哪些AS。

使用AS-PATH prepend list包括這些AS Number

設置static route到traceroute出現的第一個ASN

詳解:

目標IP段

10.10.220.0/22

在AS 200中ASN 200向相鄰的AS 20和30發送BGP通告。此時為正常的狀態。

攻擊者控制了AS 100的BGP路由。

AS 100的路由表和BGP表顯示到達

10.10.200.0/22

需要經過 AS 10.

於是我們把AS10,20和200加入我們的AS PATH prepend list

通過route-map把目標IP段加入BGP路由表

10.10.220.0/24 is announced with a route-map: route-map hijacked permit 10 match ip address prefix-list jacked set as-path prepend 10 20 200

然後在AS100的路由器中加入static route,把流向目標IP段的數據包指向AS10

ip route 10.10.220.0 255.255.255.0 4.3.2.1

完成後可以看出,AS30 40 50 60的數據包如果想要到AS 200去,都會先經過AS 100.

到了這裡我們已經可以分析出,BGP劫持的本質再次回到安全的本質既是信任這一點,因為BGP直接無條件信任對方AS發來的路由信息,並且缺乏有效的認證和過濾手段,導致BGP劫持屢次得手。


推薦閱讀:

全面分析土雞蛋和飼料蛋哪個更好,結論出乎意料
舒樂助產1682例臨床分析
王建:中國外匯儲備快速增長原因與前景分析———天益:學習型社會領航者
Android frameworks層啟動分析
八字分析綱要24

TAG:知識 | 技術 | 技術分析 | Google | 背後 | DNS劫持 | 知識庫 | 劫持 | 分析 | WooYun |