一位元之差:無需利用漏洞的DNS劫持

蔣生武發表於2014-07-24

Bitsquatting表示去註冊一個域名,它和知名的域名只有一個bit的差別。這個單詞源自typosquatting,意為註冊一個和知名域名只有一字之差的域名。在解析域名時,bitsquatting可能通過DNS導致計算機上的硬體錯誤。關於bitsquatting更詳細的資訊,可以參看我的Blackhat 2011 whitepaper。YouTube上有人釋出了我在DEF CON 19上有關此話題的演講視訊,當時使用的幻燈片可以在這裡下載

引言

計算機常常由於一個或多位元的記憶體損壞出現錯誤,而造成這些錯誤的原因可能是製造上的缺陷或者宇宙射線、高溫之類的環境因素。雖然單個機器中出現這樣的錯誤的可能性是極小的,但是整個網際網路上裝置的總量卻非常龐大:2010年時就有大約50億個裝置連線到網際網路。我們可以將這種存在於各個裝置上的小概率錯誤更加形象地描述,那就是買彩票。贏得頭獎的概率是極小的,但是隻要有足夠多的人去買,總有人會成為贏家。

研究人員之前就在很多驚人的地方利用了位元錯誤(bit-errors)。現在,在網際網路尺度上,我們又有新的辦法去利用它。Bitsquatting是其中之一,也就是註冊和某個常被訪問的域名僅一位元之差的新域名。

工作原理

當位元錯誤發生時,記憶體中的資料會被修改。計算機記憶體的內容可能代表各種意義,有時,它剛好就表示域名。如果程式使用這塊記憶體,就會讀取到錯誤的域名。

下面的圖解能夠更清楚的說明這個問題,表中是cnn.com的二進位制表示方法:

01100011 01101110 0110111 0101110 01100011 01101111 01101101
c n n . c o m

現在假設你使用的計算機含有損壞的記憶體模組,你開啟一個包含超連結到cnn.com的網頁,然後你點選了這個連結。會有多少個操作將cnn.com的二進位制資料儲存到你的記憶體?寫這篇文章時,我想到了下面這些:

  • TCP/IP協議棧由核心態向使用者態轉化時(根據作業系統的具體實現各有區別)
  • 在瀏覽器解析HTML時
  • 在建立DOM樹的內部表示時
  • 在建立新的HTTP請求時
  • 在作業系統解析域名時

更進一步,假設其中有一次將域名寫入到了損壞的記憶體模組,它的二進位制形式被修改了1bit,現在表示為:

01100011 01101111 0110111 0101110 01100011 01101111 01101101
c o n . c o m

 這樣一來,當你點選連結時,瀏覽器將會跳轉到con.com,而不是cnn.com。

實驗

這個實驗背後的概念很簡單:如果位元錯誤確實改變了裝置記憶體中的域名,那麼這些裝置會訪問到和正確域名一位元之差的bitsquat域名。因此很多頻繁解析的域名的bitsquat域名會被全球各地的裝置訪問到。

然而這個實驗實施起來卻沒有那麼容易,首要的問題是選擇合適的域名來進行位元修改。流行的網站和常被解析的域名是不太相同的,很多鮮為人知的域名實際上會被頻繁解析。這類域名一般屬於內容分發網路或者廣告網路,例如fbcdn.net,、2mdn.net和 akamai.com。由於很少有人實際在瀏覽器中輸入這些域名,它們也成為本次實驗中最合適的目標。還有個問題就是每次DNS查詢必須有兩次響應:一次是原本的域名,一次是經過位元修改的域名。因為原始的請求可能會得到正確域名的響應,而丟棄對無效域名的響應。這方面更多的資訊,請參考白皮書或者幻燈片

為了這次實驗我註冊了下面這些域名。

注:目前它們全都已經過期,不再屬於我了。

Bitsquat Domain Original Domain
ikamai.net akamai.net
aeazon.com amazon.com
a-azon.com amazon.com
amazgn.com amazon.com
microsmft.com microsoft.com
micrgsoft.com microsoft.com
miarosoft.com microsoft.com
iicrosoft.com microsoft.com
microsnft.com microsoft.com
mhcrosoft.com microsoft.com
eicrosoft.com microsoft.com
mic2osoft.com microsoft.com
micro3oft.com microsoft.com
li6e.com live.com
0mdn.net 2mdn.net
2-dn.net 2mdn.net
2edn.net 2mdn.net
2ldn.net 2mdn.net
2mfn.net 2mdn.net
2mln.net 2mdn.net
2odn.net 2mdn.net
6mdn.net 2mdn.net
fbbdn.net fbcdn.net
fbgdn.net fbcdn.net
gbcdn.net fbcdn.net
fjcdn.net fbcdn.net
dbcdn.net fbcdn.net
roop-servers.net root-servers.net
doublechick.net doubleclick.net
do5bleclick.net doubleclick.net

我使用Python指令碼應答DNS請求,並且使用Apache記錄HTTP請求。令我驚訝的是,有裝置連線了。

實驗發現

以下結論是基於2010年9月26日至2011年5月5日間的Apache日誌得出的。由搜尋引擎爬蟲和Web漏洞掃描器引起的日誌已經被手動過濾了。正因為是手動操作,所以最後統計時可能還有很小一部分漏網之魚。

發現1:位元錯誤可以被利用在DNS上

在記錄日誌期間總共有52317次針bitsquat域名的請求,它們來自與12949個獨立IP。除去其中3次產生巨大網路流量的事件,平均每天有59個獨立IP對32個bitsquat域名進行了請求。這些請求不是來自於拼寫錯誤或者其他形式的手工輸入URL,還有一部分表現出有多個位元錯誤的特徵。以下是一些實際的例子(個人資訊已經移除):

static.ak.fjcdn.net 109.242.50.xxx “GET /rsrc.php/z67NS/hash/4ys0envq.js HTTP/1.1” “http://www.facebook.com/profile.php?id=xxxxxxxxxx” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; GTB6.5; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.2; Hotbar 11.0.78.0; OfficeLiveConnector.1.5; OfficeLivePatch.1.3; AskTbZTV/5.8.0.12304)”

msgr.dlservice.mic2osoft.com 213.178.224.xxx “GET /download/A/6/1/A616CCD4-B0CA-4A3D-B975-3EDB38081B38/ar/wlsetup-cvr.exe HTTP/1.1” 404 268 “Microsoft BITS/6.6”

s0.2ldn.net 66.82.9.xxx “GET /879366/flashwrite_1_2.js HTTP/1.1” “http://webmail.satx.rr.com/_uac/adpage.html” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPNTDF; AskTB5.2)”

mmv.admob.com 109.175.185.xxx “GET /static/iphone/img/app@2x.png HTTP/1.1” “Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; HW iPhone2,1; en_gb) AppleWebKit/525.18.1 (KHTML, like Gecko) (AdMob-iSDK-20101108; iphoneos4.2)”

發現2:並不是所有的位元錯誤都造成同等程度的影響

有些機器相比其他而言,明顯控制著更多的網路流量。當一個位元錯誤發生在普通PC機或者手機上時,它只會影響到一個使用者。然而當它發生在代理、DNS伺服器或者資料庫快取中時,將會影響到成千上萬的使用者。在我的實驗中,已經觀察到了位元錯誤出現在Web應用、DNS解析伺服器和代理伺服器中。例如,一個位元錯誤將fbcnd.net變為fbbdn.net,將使上千個開心農場的玩家請求到我的伺服器。

發現3:手機和嵌入式裝置可能比傳統硬體受的影響更大

我對2011年3月期間訪問Wikipedia和bitsquat域名的HTTP User-Agent進行了對比,展示在下面的圖例中。其中Other包括了各種手機、遊戲機控制檯和其他嵌入式裝置,它們在對bitsquat域名的訪問中,增加的幅度最大。令人好奇的是,來自MacOS針對bitsquat域名的訪問相比Wikipedia有顯著減少,對此我還沒有一個合理的解釋。(譯註:這裡是按兩個域名各自的裝置分佈算的,其中有增多必然有減少,也許分別計算每種裝置訪問錯域名的機率更加合理,即訪問錯誤域名的次數 / 對兩種域名的訪問總數。)

bitsquat_1

發現4:對bitsquat域名的訪問流量是日常網路流量的真實寫照

Bitsquat域名的訪問者來自於全球各地,其使用的裝置也幾乎涵蓋每種主流的作業系統和嵌入式平臺。除使用MacOS的訪問者所佔的百分比在兩種域名間有顯著差別之外,使用Windows、Linux、Android和iPhones的百分比基本相同。另外,基於IP地理位置資料庫,我們可以觀察到來自於美國的訪問者在一天內的流量走勢。


bitsquat_2

發現5:HTTPS/TLS不會有幫助,DNSSEC可能會有一丁點

HTTP 1.1在頭中包含了一個叫Host的欄位,其數值是客戶端想要訪問的域名。如果Host中包含著bitsquat域名,那麼位元錯誤在域名解析前就發生了。如果Host中是原始域名,那麼錯誤就是發生在域名解析中。我資料中96%的情況是在DNS解析前就出現了位元錯誤。

bitsquat_3

像SSL和TLS這種安全傳輸技術是用於保證兩端之間資料的機密性、真實性和完整性,但是位元錯誤更多發生在資料在某一端還未傳輸的時候。DNSSEC只能解決那4%發生在域名解析過程中的位元錯誤。

資料

DNS流量的全部PCAP在此:dnslogs.tar.7z,56Mb

HTTP日誌可能包含個人資訊,因此不會公開發布。如果你有正當的研究目的需要它們,請聯絡我

這裡有個工具可以快速識別潛在的bitsquat域名:bitsquat.pygithub

進一步研究

來自Verisign的Duane Wessels也在DNS查詢中尋找過網路級別的位元錯誤,他指出“網路中位元錯誤相對而言是很少見的,但是有一個可預期的概率”。他研究的主要目的,是確定那4%發生在域名解析時的位元錯誤是否由UDP包在傳輸後的損壞造成。結論是網路中傳輸的包不太可能被損壞,用他自己的話說:“我們相信UDP的校驗和能夠有效防範bitsquat攻擊或者其他DNS查詢時的錯誤。無論如何,在進入網路前發生的位元錯誤不會從中受益,因為在傳輸前計算的校驗和是基於錯誤的資料得出的。“

我非常鼓勵讀者重複我的實驗,並且分享你們的結果。如果需要更多資訊,請隨時聯絡我

相關文章