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