剝開(kāi)層層迷霧,深度追蹤針對(duì)GitHub的DDoS攻擊
就在幾周前,GitHub 網(wǎng)站遭受了有史以來(lái)最嚴(yán)重的DDoS攻擊。本文中將使用http-traceroute來(lái)深入分析此次攻擊的來(lái)源。
攻擊真的來(lái)自中國(guó)嗎?
GitHub是全球最大的社交編程及代碼托管網(wǎng)站,上面托管了大量的開(kāi)源項(xiàng)目,比如就有著名開(kāi)源操作系統(tǒng)Linux。
瑞典網(wǎng)絡(luò)安全公司Netresec認(rèn)為:
這次DDoS攻擊是通過(guò)一些中間人劫持設(shè)備并劫持了世界上其他地方向中國(guó)發(fā)起的訪問(wèn)流量,攻擊者替換了其中的javascript代碼,間接對(duì)GitHub發(fā)起攻擊。
由于此次攻擊似乎來(lái)自任何地方,這讓GitHub難以抵擋。
用TTL值追蹤中間人攻擊
Netresec 通過(guò)查看數(shù)據(jù)包中的 TTL 值可以斷定這是一起中間人攻擊事件。
科普:什么是TTL?
TTL,或者 time-to-live,所有網(wǎng)絡(luò)中的數(shù)據(jù)包中都用這個(gè)字段來(lái)表示數(shù)據(jù)包經(jīng)過(guò)了幾跳。每一次路由器將一個(gè)數(shù)據(jù)包發(fā)出去的時(shí)候,就會(huì)將這個(gè)字段減一。當(dāng)這個(gè)字段為零的時(shí)候,數(shù)據(jù)包將會(huì)被丟棄。以防止路由器無(wú)限制發(fā)送數(shù)據(jù)包造成死循環(huán)。
很多操作系統(tǒng)發(fā)送數(shù)據(jù)包的時(shí)候默認(rèn) TTL 值是64,因此,當(dāng)一個(gè)數(shù)據(jù)包到達(dá)的時(shí)候,如果 TTL 值為46,我們便會(huì)知道這個(gè)數(shù)據(jù)包在你的機(jī)器和發(fā)送數(shù)據(jù)包的機(jī)器之間經(jīng)過(guò)了18個(gè)節(jié)點(diǎn)(64-18=46)。
netresec 所發(fā)現(xiàn)的結(jié)果正如下圖中所示,下圖顯示了客戶(hù)端和服務(wù)器之間的一些數(shù)據(jù)包,我機(jī)器發(fā)送給百度服務(wù)器的數(shù)據(jù)包 TTL 起始值是64,第一個(gè)響應(yīng)包的 TTL 值是46,因?yàn)榘俣劝l(fā)送的數(shù)據(jù)包起始值為64,期間經(jīng)過(guò)18次路由跳轉(zhuǎn)才到達(dá)我的電腦。當(dāng)我發(fā)起 web 請(qǐng)求之后,我收到的數(shù)據(jù)包中的 TTL 值很奇怪,TTL 值分別是98和99。這表明數(shù)據(jù)包明顯不是來(lái)自最初的服務(wù)器,而是一些中間設(shè)備。
我知道在我和百度之間肯定有中間人設(shè)備,但是它在哪里?為了回答這個(gè)問(wèn)題,我們使用 traceroute。
Traceroute工具幫了大忙
Traceroute 是一個(gè)很棒的工具。它可以發(fā)送TTL 為任意值的數(shù)據(jù)包,比如1,2,3.。。等等。因?yàn)橛腥绱说偷?TTL,這些數(shù)據(jù)包無(wú)法到達(dá)目標(biāo)機(jī)器,當(dāng)這些數(shù)據(jù)包的 TTL 值為0的時(shí)候,路由器就會(huì)丟掉這個(gè)包,并且路由器會(huì)返回一個(gè)用于通知的數(shù)據(jù)包,叫做Time-Exceeded message,地址是路由器的地址。因此,我可以收集到我喝目標(biāo)服務(wù)器之間的所有路由器。
下圖顯示了這個(gè)工具的用法,是我電腦traceroute 到百度服務(wù)器的結(jié)果:
第二列是時(shí)間,如你所見(jiàn),從我機(jī)器到Los Angeles用了大概80毫秒,然后,延遲飆到230毫秒才到達(dá)中國(guó),另外,我發(fā)送的數(shù)據(jù)包沒(méi)有到達(dá)目標(biāo)服務(wù)器,第16跳得時(shí)候遇到了防火墻。
那么中間人劫持的設(shè)備到底在哪里?為了回答這個(gè)問(wèn)題,我需要寫(xiě)代碼,我自己寫(xiě)了一個(gè)小的 traceroute 工具,它并不是只發(fā)送一個(gè)數(shù)據(jù)包,而是首先建立一個(gè)有正常TTL 值的鏈接,所以,無(wú)論如何數(shù)據(jù)包都可以到達(dá)目標(biāo)機(jī)器,然后,使用發(fā)起一個(gè) http 請(qǐng)求,攜帶的包得 TTL 值是比較小的,所以這個(gè)數(shù)據(jù)包在到達(dá)目標(biāo)前就會(huì)被丟棄掉,但是,當(dāng)中間人劫持設(shè)備受到這個(gè)數(shù)據(jù)包的時(shí)候,會(huì)更新 TTL 的值,這樣,我就可以發(fā)現(xiàn)中間人設(shè)備在什么地方了。
我發(fā)現(xiàn)中間人設(shè)備潛伏在11和12跳之間。web請(qǐng)求中 TTL 值為11的時(shí)候數(shù)據(jù)包沒(méi)有響應(yīng),而 TTL 值為12的時(shí)候,返回了正常響應(yīng),如下圖所示:
上面黑色被背景的就是我發(fā)送的數(shù)據(jù)包,TTL 值為12,橘黃色的數(shù)據(jù)包(及它上面的兩個(gè)數(shù)據(jù)包)是從中間人設(shè)備傳回的數(shù)據(jù)包,當(dāng)我將數(shù)據(jù)包的 TTL 值置為11的時(shí)候,不會(huì)從中間人設(shè)備獲得響應(yīng)包。
從traceroute的 IP 地址可以看到,中間人設(shè)備放置在中國(guó)聯(lián)通的骨干網(wǎng)絡(luò)中。
下一步就是從其他方面 traceroute,從中國(guó)到一個(gè)被封鎖的地址。用http://www.linkwan.net/tr.htm,這個(gè)網(wǎng)站,獲得了如下數(shù)據(jù):
結(jié)論
通過(guò)http-traceroute,Netresec判定攻擊 GitHub 的中間人設(shè)備在中國(guó)。當(dāng)然,這并不說(shuō)明此次攻擊就是中國(guó)發(fā)起的——還有其他的可能,比如黑客攻擊或控制了這些網(wǎng)絡(luò)設(shè)備。