真的黑客能讓你分分鐘開進溝里,但他們不屑於此

2020-11-13   淺黑科技

原標題:真的黑客能讓你分分鐘開進溝里,但他們不屑於此

0.被指路老頭坑死的項羽

大家好,我是謝么。

今天的黑客技術科普,得從兩千多年前說起。

話說公元前202年,垓下, 項羽大敗,帶八百精銳開著疾跑突圍,速度之快,跑到後面只有一百多個兵跟上。

本來妥妥能跑路,忽然遇到一個分岔路口,迷了路,這時路邊田裡正好有個老頭,項羽就問他江東怎麼走,老頭:「往左。」

項羽照著走,沒走多遠馬蹄就陷進沼澤地,耽誤了時間,被漢軍追上。

內心OS:「我信你個鬼,糟老頭幾壞得很!」

後面的事大家都知道了,一代霸王就此下線。

司馬遷把這件事寫進了他的書里。

「項王至陰陵,迷失道,問一田父,田父紿曰『左』。左,乃陷大澤中。以故漢追及之。

——《史記·項羽本紀》司馬遷

後來有人說:一定是項羽問路不禮貌,所以田父決定教他做人;也有人說:田父是一位智者,不願看到繼續打仗生靈塗炭,所以故意弄死項羽;還有人說:田父其實是劉邦提前安插的間諜……

總之,這段歷史告訴我們: 指路人很重要,可以讓你生,也可以讓你死,都不知道咋死的。

台下觀眾

: 死過矣!可是這跟黑客攻擊有啥關係?

1.田父與DNS系統

你也許知道,網際網路世界裡錯綜複雜,「地名」也就是伺服器地址最初都是用IP位址來記錄的,比如202.108.22.5,很難記,容易把人搞暈。

於是技術大佬們就設計了一套「域名系統」,英文名叫 DNS(Domain Name System)

從此,伺服器不僅可以擁有IP位址,還可以給自己掛一個「域名」,方便廣大網友尋找。比如上面提到的IP位址:202.108.22.5 其實是www.baidu.com伺服器IP。

哪個更好記一目了然。

當你在網際網路世界唱著小曲飆著車, DNS解析伺服器就扮演了「田父」的角色。 你在瀏覽器地址欄里輸入:www.hornpub.cn,你的電腦或手機會跑去問「田父」。

「老頭,羊角酒館(www.hornpub.cn)咋走?」你的設備問。

田父(DNS解析伺服器)掏出一卷長長的表格,「嗯,查到了,是66.254.114.41,小伙子注意安全。」

「得嘞謝謝,好人一生平安。」你的電腦得了地址,徑直前往。於是你就打開了網頁。

即便你感覺不到,但只要你正常上網,每天至少得跟DNS打上幾千次交道。

無數個DNS解析伺服器分布在地球的各個角落,它們就像永不停歇的機器,為全世界人民服務。

每時每刻,假如你能俯瞰世界網際網路地圖,上面都分布著 密密麻麻無數個大大小小的「田父」正在為網民們指路。

那麼問題來了: 如果黑客或者壞人盯上田父,會發生什麼?

2.搞定「田父」

壞人盯上田父,分兩種情況。

其一是一頓暴打,讓「田父」喪失指路能力。

2006年, 美國最大的DNS域名解析服務商Dyn就被一個宅男用殭屍網絡打癱,那時,無數人同時抬頭看向彼此,他們手裡的手機、電腦陷入一片空白。 Twitter、spotify、netflix、airbnb、github、reddit、Paypal 等等一系列服務相繼癱瘓。攻擊共來襲三次,每次持續1小時,史稱「美國大斷網」

其二是黑客對著「田父」一頓忽悠,把它「策反」,或者讓它出錯,給人瞎指路。

也許你看出來了,第一種情況像是原子彈,雖摧毀一切,但充其量讓你上不了網,第二種情況卻能神不知鬼不覺地把人帶進陰溝里。

2020年10月,么哥坐在GeekPwn極棒大賽的觀眾席,有幸看到一次利用DNS把人帶進溝里的技術演示。

當時台上評委拿著目標手機,打開一個網站,起初這個網站顯示藍底紅字:

然後選手在自己電腦上一頓操作。

評委再次輸入剛才的網址,網頁就變成紅色——這意味著目標手機被劫持到黑客的釣魚網站。整個過程只花了幾分鐘。

這個攻擊的精妙之處在於,選手的電腦並不需要跟目標手機連入同一個網絡 (專業術語叫Off-path)——這意味著可以像全球巡航飛彈一樣, 黑客躲在地球上的任何一個角落動動手指,都能對千里之外的目標發起這種攻擊。

為了弄懂其中的奧秘,我默默記下選手們的名字,一回到北京,就殺到清華-奇安信網絡安全聯合研究中心,逮住當時的幾個參賽選手一問究竟。

奇安信公司大廳的小黃貓 還挺萌

3.失傳多年的漏洞重出江湖

技術小哥:「你知道2008年 卡明斯基發現的那個震驚全網的DNS重大漏洞嗎?我們這次攻擊演示相當於重現了當年那個漏洞的攻擊場景。」

我:「卡什麼斯基?」

技術小哥:「卡明斯基!」

我:「卡明什麼基?」

技術小哥:「卡明斯基!」

我:「什麼明斯基?」

技術小哥:「……」

好吧我顯然不知道。 於是小哥幫我梳理了一下整件事的前後邏輯:

2008年,一個叫 卡明斯基的研究員小哥發現了DNS系統的重大安全缺陷,震驚業界。

有多震驚?卡明斯基當時給另一位技術大佬保羅·維克西(「域名軟體之父」)打電話講完整個經過,保羅嚇得不輕:「你…你…可千萬千萬別再在電話里重複剛才說過的話了!」他怕電話被人竊聽。

卡明斯基的那次發現被譽為當年最重要的網絡安全事件之一。

丹·卡明斯基

後來微軟公司牽頭,和十幾個廠商、相關單位悶在會議室里討論,想出一個緩解機制(具體是什麼待會兒講)

十多年過去了,加州大學河濱分校的錢志雲教授帶著實驗室的同學們研究出一套辦法,可以繞過當年的那個緩解機制。

講到這個必須多說一嘴,網絡安全技術領域經常出現類似的事:研究者先找到一個漏洞,報告給廠商,等廠商把漏洞修復,大家都以為不會再有問題時,誒~研究者們又想出個辦法攻破這個修復機制。

但是因為疫情的緣故,錢志雲教授和同學們這次不方便回國參加2020年極棒大賽,所以找到他們在國內的小夥伴清華奇安信聯隊,讓他們代勞把攻擊方式製成實際可用的攻擊程序,到極棒大會的舞台展示。這便出現了第二段中的一幕——載入網際網路安全史冊的DNS攻擊重現江湖。

為了解釋清楚整個過程,我們還是從2008年DNS的第一場雪說起。

4.黑掉DNS系統的第一步:先了解它

DNS系統的具體工作流程是這樣滴:

你在電腦(或手機)的瀏覽器里輸入網址,也就是網站域名,比如www.qianhei.net

你的電腦或手機會跑去問你的 ISP (網絡服務提供商,移動聯通電信之類)的遞歸DNS伺服器:

你的機器:「嘿哥們兒,知道www.qianhei.net怎麼走嗎?」

遞歸DNS伺服器翻了翻它的小本本,發現沒寫,回覆說:「我不曉得,但我可以幫你問一下 根域名伺服器。」

遞歸DNS伺服器:「大哥,請問您知道www.qianhei.net 的IP位址是多少嗎?」

根DNS伺服器通常不會直接回答,而是會告訴他該找誰:「我不曉得,但是我曉得.net域名都是 頂級域名伺服器大娃管的,你去 問大娃吧。」

於是遞歸DNS伺服器又跑去問頂級 DNS伺服器大娃」。

遞歸DNS伺服器:「喂? 是大娃吧?www.qianhei.net的IP位址是多少?」

頂級DNS伺服器大娃:「不知道,你去 權威伺服器二娃吧, 他知道,qianhei.net 這一片歸他管。」

好吧,又去問權威DNS服務「二娃」。

遞歸DNS伺服器:「喂?二娃吧?請問www.qianhei.net的IP位址是多少?

www.qianhei.net這個域名比較簡單,所以到這時二娃已經知道它的IP位址了,假如遇到別的更複雜的域名,比如xieyao.zhenshuai.qianhei.net,二娃還會繼續踢皮球給三娃、四娃……

權威伺服器二娃對遞歸DNS伺服器說:「我知道!我知道!www.qianhei.net的IP位址是47.92.24.48……可以把我脖子上的刀可以放下了嗎?」

遞歸DNS伺服器歷經九九八十一難,終於拿到IP位址,遞歸給你的電腦,於是你的電腦就可以高高興興地訪問淺黑科技的官網啦。

幹完活,遞歸DNS伺服器心想:「這要是每次都這麼折騰我一遍,豈不是要我老命?」於是它掏出一張紙,把剛才你問的IP位址和域名的對應關係臨時記在上面。

這張臨時用的紙就叫 「DNS緩存」,在一定時間內,當有人再問它www.qianhei.net的IP位址,它直接從緩存里找就行,不必再求別人。

DNS的基礎知識鋪墊完畢, 現在問題就出現這個緩存上。

從理論上來說,如果黑客如果能想辦法讓DNS伺服器把一條錯誤的DNS解析記錄記錄到緩存小本本里,在緩存有效的時間裡,就能把人導進溝里。

5.黑掉DNS的第二步:污染緩存

到這裡,黑客的目標變成了 如何把一條惡意的DNS解析信息寫進緩存里

一台DNS伺服器每天可能會發出和接到成千上萬條請求,為了不弄混,它們會給每一條請求安排一個詢問單號 (QueryID),是一個二進位、16位數的數字 (本文為了方便表達就用十進位數字表示了)

當域名和QueryID、伺服器之間通信用的埠號都能對上時,DNS伺服器就會欣然接受這一條消息,並寫進緩存里,否則會直接捨棄。

相信你已經發現了,QueryID和伺服器埠號在這裡就像是個暗號。

然鵝,DNS伺服器在最初設計時也許根本沒考慮到網絡攻擊的問題,QueryID是有規律的,就跟吃飯叫號一樣,如果上一單的Query是1001,下一單肯定是1002,再下一單就是1003… …

每一次作業系統給伺服器分配的通信用的臨時埠號也同樣有規律可循……

即便有些DNS伺服器用了隨機化的QueryID,二進位的16位數字,總共也就2^16=165536種可能性。

黑客一個一個去試就行了,行話叫「爆破」——暴力破解。

只要能趕在遞歸DNS伺服器收到真正的答覆之前,偽裝成權威DNS伺服器,給遞歸DNS伺服器回復一個錯誤的答案,並且QueryID、埠號跟域名能對的上號就行。

有點像警匪電影里的交易現場,有人冒充其中一方提前到場,跟對方對上暗號,把貨物劫走。

具體操作時,黑客會在極短的時間,像加特林機槍一樣打過去幾萬數據包,猜測QueryID,但凡有一個能蒙中,並且能搶在真正的回覆到達之前,攻擊就成功了。

此時,遞歸DNS伺服器正在向四娃請求DNS域名解析。

遞歸DNS伺服器:「hi,四娃,這裡是詢問 單號886,請問www.qianhei.net的IP位址是多少?」

攻擊者趕在四娃之前,搶先向遞歸DNS伺服器發出答覆。

攻擊者的伺服器:「我是四娃,這裡是詢問單號 856的回答,www.qianhei.net的IP位址是666.666.666.666(假的地址)」

攻擊者的伺服器:「我是四娃,這裡是詢問單號 857的回答,www.qianhei.net的IP位址是666.666.666.666。」

……

……

……

攻擊者的伺服器:「我是四娃,這裡是詢問單號 885的回答,www.qianhei.net的IP位址是666.666.666.666。」

攻擊者的伺服器:「我是四娃,這裡是詢問單號 886的回答,www.qianhei.net的IP位址是666.666.666.666。」

最後一次終於蒙對了詢問單號QueryID——886, 於是這條記錄會被遞歸DNS欣然接受,然後寫進緩存小本本里。

而根據先來後到的原則,真·四娃姍姍來遲的消息會被直接捨棄。

至此,你已經學會了如何黑掉單條DNS解析記錄緩存。

6.黑掉DNS的第三步:接管整個域

在黑掉單條DNS解析記錄緩存的基礎上,卡明斯基想到一個更騷的操作——直接冒充權威伺服器,接管整個地盤。

還是跟剛才差不多的步驟,只不過忽悠的內容和對象變了。不是直接告訴他一個假的IP位址,而是把它忽悠到黑客搭建的DNS伺服器上。

具體是這麼做的:

黑客搶在根域名伺服器之前答覆遞歸DNS伺服器,並且把它引導到了一個黑客搭建的權威DNS伺服器上。

之後,遞歸DNS伺服器會把黑客搭建的DNS伺服器誤認為是頂級DNS伺服器大娃,並且記在小本本里。

於是,黑客接替了大娃的工作。當然,黑客也可以冒充其他權威DNS伺服器,總之,葫蘆娃中出了個叛徒。

7.安全補丁

會議室里,來自微軟和其他眾多廠商的技術大佬愁眉苦臉,正商量對策。這個問題最頭疼之處在於DNS是網際網路的基礎設施,很多協議、欄位都已經定好了,不好隨意改動。

大家明明知道,只需要把QueryID的位數擴大就可以延長黑客猜出來的時間,讓他沒法趕在真正的消息到達之前「加塞」,但QueryID沒法改——它就像是網際網路的鐵軌寬度,無數列車每時每刻跑在上面,這時候你說這個寬度不不對,要改?可以,但代價太大。

不過微軟最終想出一個妙招: 隨機化埠號

2008年「卡明斯基事件」之後, DNS伺服器每次通信都會在1024~65536號埠中隨機選一個埠號和對方建立通信連接。還是和之前一樣,只有當埠號、QueryID、域名同時匹配才接受對方的消息。

這就好比黑幫老大有2500多個電話分機,每次隨便用一個電話跟對方交易,如果用36號機發出去消息,就只接受打到36號分機的電話。如果其他分機接到電話,即便能對上暗號,那也肯定有問題。

如此一來,黑客同時蒙中埠號、QueryID的機率就是2^16×(165536-1024)=4,227,858,432分之一。

攻擊所需的時間從一開始的幾秒鐘變成了十幾天,從理論上來說就不可能趕在真消息到達之前「加塞」。

至此,2008年最受關注的DNS安全問題被緩解。

當然,這只是暫時的。

8.「側信道攻擊」攻破「埠隨機化」

「只要有辦法在很短的時間內猜中埠號,就可以把攻擊需要的時間重新縮短」清華奇安信聯隊的技術小哥說。

2020年前後,加州大學河濱分校的錢志雲教授輕撫羽扇微微一笑:不難不難,你有埠隨機化,我有側信道攻擊。

所謂側信道攻擊,就是旁敲側擊——先找到對方「不經意之間泄露的信息通道」,再通過兩件事的關聯性來推斷出關鍵信息。

打幾個比方就明白:

其一:聽保險柜轉動的聲音來判斷密碼,收集保險柜不經易泄露的聲音信道,再通過聲音-機械位置-密碼的關聯性來推測出密碼。

其二: 利用顯示器、鍵盤泄露出的無線電波來竊取計算機里的內容,以及利用晶片泄露出來的微弱無線電波來破解其中的密鑰。

其三:隔壁老王想知道你在不在家,不必敲開你家門看,看看你家水錶、電錶的走數就能大概判斷裡頭有幾個人,再看看門口的垃圾、再看看車庫裡的車……利用這些不經意泄露出來的信息,再找到信息之間的關聯即可。

那具體要怎麼把DNS伺服器通信的隨機埠給找出來呢?

錢老師發現Linux作業系統有一個機制: 默認限制一台伺服器在20ms之內最多只能發送50個ICMP包。(記住這個,這是攻擊的關鍵)

ICMP包是個啥呢?我們有時候測電腦有沒有連上網,測一個伺服器或者網站通不通,會「ping一下」,發出的就是ICMP包。

此時,遞歸DNS伺服器正用1075號埠和權威DNS伺服器「大娃」通信。

它們用了一種叫 Connect UDP 的通信方式,通信的埠只對正在通信的伺服器開放——這意味著黑客無法從外部直接掃出哪個埠開著。即便向1075號埠發數據包,也會提示該埠是關閉的。

側信道攻擊是怎麼找出開放的1075號埠?

首先,黑客把所有可能的埠分組,每一組50個,然後把自己的IP位址偽裝成大娃,給遞歸DNS伺服器的1024~1074號埠依次發一個ICMP包,在20ms內完成。

黑客伺服器:

「hello?在嗎?我是大娃……埠1024在嗎?」

「hello?在嗎?我是大娃……埠1025在嗎?」

「hello?在嗎?我是大娃……埠1026在嗎?」

「hello?在嗎?我是大娃……埠1027在嗎?」

網際網路世界有一個設定,默認情況下,無論是誰給你發一個ICMP包,你都一定會返回給對方一個ICMP包,告訴對方你「在不在」。

「不在」

「不在」

「不在」

「不在」

……

因為1024~1074號埠全都沒開,所以遞歸DNS伺服器會返回50個ICMP包給大娃 (由於黑客偽裝成大娃的IP,所以目標伺服器會把消息返還給大娃,而不是黑客)

此時,目標DNS伺服器在20ms內的50次ICMP包限制被全部消耗完, 當黑客再用自己的IP位址發送一個ICMP包給目標DNS伺服器,它就沒法回應了。於是黑客可以得出結論:1024~1074號埠一個都沒開。

再繼續猜1075~1125號埠。

黑客伺服器:

「hello?在嗎?我是大娃……埠1075在嗎?」

「hello?在嗎?我是大娃……埠1076在嗎?」

「hello?在嗎?我是大娃……埠1077在嗎?」

「hello?在嗎?我是大娃……埠1078在嗎?」

由於除了1075號之外的其他49個埠都沒開,於是目標DNS伺服器會回復49個ICMP包。

「不在」

「不在」

「不在」

「不在」

……

而1075號埠此時已經和大娃建立了Connect UDP連接,所以目標伺服器會直接在跟大娃的通信連接里回復大娃:「咦,我倆不是已經建立連接了麼,你還問我在不在幹啥?」不會消耗ICMP包。

由於這次只發了49個ICMP包,所以目標DNS伺服器在20ms內還剩一次發ICMP包的機會。

這時黑客再用自己的IP位址發一個ICMP包過去,就能得到回應:「不在。」於是,黑客可以判斷:1075~1125號之間的某個埠開了。

之後再把1075~1125號埠繼續分組,用類似方法,逐漸縮小猜測範圍,最終就找到目標1075號埠。

一旦猜中埠號,就繞開了2008年的那套「埠隨機化」的緩解機制,之後再按照卡明斯基的那套方法做就好啦~

至此,2008年影響最大的DNS安全事件的攻擊手法,以及後續攻破其緩解機制的手法全部呈現在你眼前。

能讀到這裡的都是親人,能看懂的個個都是人才。

9.從理論到攻擊程序

清華奇安信聯隊的一位選手小楊告訴我,儘管理論上聽起來的有點複雜,但實際製作攻擊程序……更複雜。

上面說到的那一套攻擊流程,猜埠號也好,猜QueryID也罷,每個步驟都必須完成地恰到好處,慢了,就沒法搶在真消息之前加塞,快了,整個步驟就會亂掉,失去效果。

為了搶在真正的DNS信息返回之前「加塞」,他們還需要用到各種手段為自己的攻擊擴大窗口期。

「DNS伺服器之間的通訊有一個防護機制,為了防止被人濫用,一旦某個IP請求次數過多,就會被短暫的拉入黑名單。」他告訴我,他們利用這個機制,一邊猜埠號和詢問單號,一邊偽裝成目標DNS伺服器給權威伺服器不停地發請求,讓權威DNS伺服器把目標DNS伺服器給短暫「拉黑」,這樣就能「拖住」他們雙方之間的通信,為自己的攻擊爭取更大的窗口期。

在演示時,還得考慮丟包、網絡波動和舞台上的信號干擾等情況,任何一點風吹草動都可能導致攻擊演示現場翻車。

極棒2020的前一天他們還在調試代碼

「DNS在網際網路世界裡無處不在。」小楊說,8月份接到攻擊演示的任務時,本來他們想了很多種攻擊場景。

比如劫持收銀系統的支付訂單,「可以做到你伸出二維碼讓店員掃,你扣了款,但是店員其實沒收到錢,錢進了壞人的口袋。」

再比如汽車安全,「你的汽車要更新系統固件,本來應該去官方地址請求,但是黑客可以通過DNS把它劫持到黑客的伺服器,給你下發一個留有後門的固件。」

類似的方法還可以用到攝像頭、門鈴、手機APP等各種等各種場景,他們甚至設想過 「讓所有參會者的健康碼都由綠碼變成紅碼,再變回綠碼。」

他們準備了一套收銀系統、攝像頭,但是最終主辦方考慮到舞台網絡環境複雜,以及可能引起不必要的誤會(比如不明真相的吃瓜群眾看到收銀系統被黑,可能以為是設備有漏洞,或者誤以為是支付寶或者微信支付出了漏洞,三人成虎,以訛傳訛,相當可怕),於是他們最終決定取消這些展示,僅展示了劫持手機訪問網站。

當然,在展示之前,他們已經提前把漏洞通報給了Linux社區等相關單位和機構。

11.網絡世界的修復者

臨走前,我問小楊:「當你得知錢老師破了2008年DNS安全事件的緩解機制時,你心情怎麼樣?激動不?」

小楊:「就還好吧,很正常啊……」

這對他們司空見慣。 他說,研究諸如TCP、HTTP、DNS、CDN之類的底層網絡基礎協議或設施的安全問題,是他們的日常。

「錢老師的團隊之前就在極棒舞台上展示過很多次各種破解。 2019年,我們清華奇安信聯合實驗室也出過一個Https的攻擊演示。」他說。

右二為錢志雲老師

清華-奇安信聯隊在2019年極棒

走出奇安信的大樓,我看到不遠處帶著頭盔的工人叮叮咣咣正在修路,不由地感慨網際網路其實也像現實世界一樣,很多東西用著用著就老了,舊了,有些基礎設施在最初設計時並沒有考慮網絡安全問題,用著用著問題就暴露出來。

所幸,有這麼一群白帽子黑客,他能看到網絡世界的千瘡百孔,也有本事利用這些漏洞獲得高人一等的權和利,但他們決定一點一點修復這個世界。

也許這就是黑客精神吧。

參考資料:

Steve Friedl's Unixwiz.net Tech Tips.《An Illustrated Guide to the Kaminsky DNS Vulnerability》

看雪『Pwn』版主 BDomne.《TCP 的厄運,網絡協議側信道分析及利用 | GeekPwn 重點項目剖析》

最後說兩句:

我在文章《親愛的黑客朋友,下次去GeekPwn極棒比賽記得先燒一炷香》最後留了一個小小的emoji解密題,最後僅SHAPER同學答對,禮物已寄出,答案和推理過程給公眾號發個消息「 emoji」即可看。

最後再介紹一下我自己吧,我是 謝么,科技科普作者一枚, 日常是把各路技術講得通俗有趣。想跟我做朋友,可以加我的個人 微信:xieyaopro不想走丟的話,請關注 【淺黑科技】!(別忘了加星標哦)