DNS劫持新方法(“侧信道攻击“攻破“端口随机化“的研究)
0、被指路老頭坑死的項羽
大家好,我是謝幺。
今天的黑客技術科普,得從兩千多年前說起。
話說公元前202年,垓下,項羽大敗,帶八百精銳開著疾跑突圍,速度之快,跑到后面只有一百多個兵跟上。
本來妥妥能跑路,忽然遇到一個分岔路口,迷了路,這時路邊田里正好有個老頭,項羽就問他江東怎么走,老頭:“往左。”
項羽照著走,沒走多遠馬蹄就陷進沼澤地,耽誤了時間,被漢軍追上。
后面的事大家都知道了,一代霸王就此下線。
司馬遷把這件事寫進了他的書里。
“項王至陰陵,迷失道,問一田父,田父紿曰‘左’。左,乃陷大澤中。以故漢追及之。
——《史記·項羽本紀》司馬遷
后來有人說:一定是項羽問路不禮貌,所以田父決定教他做人;也有人說:田父是一位智者,不愿看到繼續打仗生靈涂炭,所以故意弄死項羽;還有人說:田父其實是劉邦提前安插的間諜……
總之,這段歷史告訴我們:指路人很重要,可以讓你生,也可以讓你死,都不知道咋死的。
臺下觀眾:死過矣!可是這跟黑客攻擊有啥關系?
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、搞定“田父”
壞人盯上田父,分兩種情況。
其一是一頓暴打,讓“田父”喪失指路能力。
2016年,美國最大的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=65536種可能性。
黑客一個一個去試就行了,行話叫“爆破”——暴力破解。
只要能趕在遞歸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×(65536-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號端口依次發一個UDP包,在20ms內完成。
黑客服務器:
“hello?在嗎?我是大娃……端口1024在嗎?”
“hello?在嗎?我是大娃……端口1025在嗎?”
“hello?在嗎?我是大娃……端口1026在嗎?”
“hello?在嗎?我是大娃……端口1027在嗎?”
互聯網世界有一個設定,默認情況下,無論是誰給你發一個UDP包,你都一定會返回給對方一個ICMP包,告訴對方你“在不在”。
“不在”
“不在”
“不在”
“不在”
……
因為1024~1074號端口全都沒開,所以遞歸DNS服務器會返回50個ICMP包給大娃(由于黑客偽裝成大娃的IP,所以目標服務器會把消息返還給大娃,而不是黑客)
此時,目標DNS服務器在20ms內的50次ICMP包限制被全部消耗完,當黑客再用自己的IP地址發送一個UDP包給目標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地址發一個UDP包過去,就能得到回應:“不在。”于是,黑客可以判斷:1075~1125號之間的某個端口開了。
之后再把1075~1125號端口繼續分組,用類似方法,逐漸縮小猜測范圍,最終就找到目標1075號端口。
一旦猜中端口號,就繞開了2008年的那套“端口隨機化”的緩解機制,之后再按照卡明斯基的那套方法做就好啦~
至此,2008年影響最大的DNS安全事件的攻擊手法,以及后續攻破其緩解機制的手法全部呈現在你眼前。
能讀到這里的都是親人,能看懂的個個都是人才。
9、從理論到攻擊程序
清華奇安信聯隊的一位選手小楊告訴我,盡管理論上聽起來的有點復雜,但實際制作攻擊程序……更復雜。
上面說到的那一套攻擊流程,猜端口號也好,猜QueryID也罷,每個步驟都必須完成地恰到好處,慢了,就沒法搶在真消息之前加塞,快了,整個步驟就會亂掉,失去效果。
為了搶在真正的DNS信息返回之前“加塞”,他們還需要用到各種手段為自己的攻擊擴大窗口期。
“DNS服務器之間的通訊有一個防護機制,為了防止被人濫用,一旦某個IP請求次數過多,就會被短暫的拉入黑名單。”他告訴我,他們利用這個機制,一邊猜端口號和詢問單號,一邊偽裝成目標DNS服務器給權威服務器不停地發請求,讓權威DNS服務器把目標DNS服務器給短暫“拉黑”,這樣就能“拖住”他們雙方之間的通信,為自己的攻擊爭取更大的窗口期。
在演示時,還得考慮丟包、網絡波動和舞臺上的信號干擾等情況,任何一點風吹草動都可能導致攻擊演示現場翻車。
“DNS在互聯網世界里無處不在。”小楊說,8月份接到攻擊演示的任務時,本來他們想了很多種攻擊場景。
比如劫持收銀系統的支付訂單,“可以做到你伸出二維碼讓店員掃,你扣了款,但是店員其實沒收到錢,錢進了壞人的口袋。”
再比如汽車安全,“你的汽車要更新系統固件,本來應該去官方地址請求,但是黑客可以通過DNS把它劫持到黑客的服務器,給你下發一個留有后門的固件。”
類似的方法還可以用到攝像頭、門鈴、手機APP等各種等各種場景,他們甚至設想過“讓所有參會者的健康碼都由綠碼變成紅碼,再變回綠碼。”
他們準備了一套收銀系統、攝像頭,但是最終主辦方考慮到舞臺網絡環境復雜,以及可能引起不必要的誤會(比如不明真相的吃瓜群眾看到收銀系統被黑,可能以為是設備有漏洞,或者誤以為是支付寶或者微信支付出了漏洞,三人成虎,以訛傳訛,相當可怕),于是他們最終決定取消這些展示,僅展示了劫持手機訪問網站。
當然,在展示之前,他們已經提前把漏洞通報給了Linux社區等相關單位和機構。
11、網絡世界的修復者
臨走前,我問小楊:“當你得知錢老師破了2008年DNS安全事件的緩解機制時,你心情怎么樣?激動不?”
小楊:“就還好吧,很正常啊……”
這對他們司空見慣。他說,研究諸如TCP、HTTP、DNS、CDN之類的底層網絡基礎協議或設施的安全問題,是他們的日常。
“錢老師的團隊之前就在極棒舞臺上展示過很多次各種破解。2019年,我們清華奇安信聯合實驗室也出過一個Https的攻擊演示。”他說。
走出奇安信的大樓,我看到不遠處帶著頭盔的工人叮叮咣咣正在修路,不由地感慨互聯網其實也像現實世界一樣,很多東西用著用著就老了,舊了,有些基礎設施在最初設計時并沒有考慮網絡安全問題,用著用著問題就暴露出來。
所幸,有這么一群白帽子黑客,他們能看到網絡世界的千瘡百孔,也有本事利用這些漏洞獲得高人一等的權和利,但他們決定一點一點修復這個世界。
也許這就是黑客精神吧。
參考資料:
Steve Friedl's Unixwiz.net Tech Tips.《An Illustrated Guide to the Kaminsky DNS Vulnerability》
看雪『Pwn』版主 BDomne.《TCP 的厄運,網絡協議側信道分析及利用 | GeekPwn 重點項目剖析》
總結
以上是生活随笔為你收集整理的DNS劫持新方法(“侧信道攻击“攻破“端口随机化“的研究)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tree 命令使用
- 下一篇: python实现栅栏密码加解密