假設(shè)1枚炮彈擊中目標(biāo)的傷害為10,而4枚炮彈同時擊中目標(biāo)的傷害為200。現(xiàn)在我方只有一門火炮,4枚炮彈。此火炮每次只能發(fā)射一枚炮彈。問如何操作可以使其傷害達到200?
答案是”讓子彈多飛一會兒”,不過這個回答不是來自姜文的電影,而是源于美軍在二戰(zhàn)中提出的 MRSI (Multiple Rounds Simultaneous Impact)技術(shù),粗糙的翻譯一下就是“發(fā)射多次卻同時命中”。
我們知道炮彈飛行的時間取決于開炮時的發(fā)射仰角,比如仰角大于45度時,炮彈的飛行的長度和時間比仰角小于45度要長。那么我們就可以采用MRSI 技術(shù),以從大到小的發(fā)射仰角,連續(xù)發(fā)射4次。這樣第一次發(fā)射的炮彈飛行時間最長,最后一次發(fā)射的飛行時間最短。只要我們精確的計算好角度和發(fā)射的時間間隔,就有可能讓4枚炮彈同時擊中目標(biāo),從而造成200的傷害。
簡而言之,就是利用炮彈的飛行時間差來彌補發(fā)射的間隔時間。
Ryan Rasti在Temporal Lensing and its Application in Pulsing Denial-of-Service Attacks一文中提出了一種利用網(wǎng)絡(luò)延遲來增強DDoS攻擊效果的方法。以DNS放大攻擊為例。假設(shè)攻擊者選擇了兩個DNS 服務(wù)器(A和B)來攻擊目標(biāo), 已知A到目標(biāo)的網(wǎng)絡(luò)延遲為110毫秒,B到目標(biāo)的網(wǎng)絡(luò)延遲為40毫秒。而攻擊者到A和B的延遲忽略不計。那么攻擊者可以先給A發(fā)一個假冒的DNS請求,讓A反射目標(biāo)。略等70毫秒以后(110-40=70毫秒),攻擊者再發(fā)給B請求,讓B反射目標(biāo)。這樣,雖然攻擊者的兩個DNS請求不是同時發(fā)出的,但是反射出來的攻擊消息卻可以同時擊中目標(biāo)。如下圖所示
這么做的好處是什么呢?當(dāng)然是提高了DDoS的效率,攻擊者的發(fā)報率是1包/70毫秒,而在某個時間點卻有2個反射包擊中目標(biāo)。這相當(dāng)于巧妙的利用了網(wǎng)絡(luò)延遲而把所有的攻擊包匯聚在某一個特定的時間點上。例子中只用到了2個DNS服務(wù)器,但是在實際攻擊中,可以擴展到n個。攻擊方式也不僅限于DNS放大攻擊,用http 代理的CC攻擊也可以。
優(yōu)化過的DDoS步驟是
1.假設(shè)有n條線路(取決于具體的攻擊方法,可能有n個DNS服務(wù)器,n個http代理等等),攻擊者先測量出每條攻擊路線的延遲, 對應(yīng)記為 (L1,L2,…,Ln)。
2.從(L1,L2,…,Ln)中找出最大延遲,記為Lmax
3. 對于路線i(1≤ i ≤n),攻擊者在發(fā)送前須等待 Lmax-Li
普通的DDoS是拼命打,有多少打多少。這樣的結(jié)果是數(shù)據(jù)包擊中最終目標(biāo)的時間是平均分布的,如下圖所示
而優(yōu)化過的DDoS應(yīng)該是這樣的
然而為了成功的優(yōu)化DDoS,我們還必須得解決一個首要問題,如何測量網(wǎng)絡(luò)延遲。 對于HTTP CC類攻擊來說比較簡單,攻擊者配制好代理,對攻擊目標(biāo)發(fā)一個http請求,接收http響應(yīng),就可以得到請求往返時間,然后用這個請求往返時間來估算網(wǎng)絡(luò)延遲。當(dāng)然,在實際情況中,網(wǎng)絡(luò)延遲取決于很多因素,還需要用不同的方法降低噪音帶來的影響,比如多次測量取平均值等等。
對于DNS放大攻擊,一般用King測量法。比如攻擊者(A)打算用DNS服務(wù)器D來攻擊目標(biāo)T。然而,直接測量 A經(jīng)過D到T的網(wǎng)絡(luò)延遲 (LADT)是很難的。但是,我們可以利用DNS遞歸查詢的特性,測量出 A經(jīng)過D到T的DNS服務(wù)器 的網(wǎng)絡(luò)延遲(LADT(DNS))。方法是讓A對D發(fā)一個關(guān)于T域的DNS查詢,在這種情況下D會向T的DNS服務(wù)器遞歸查詢。從而該攻擊者可以用此DNS請求往返時間來估算LAT(DNS)。一般來說, DNS服務(wù)器都在離其他服務(wù)器很近的地方,延遲差別可以忽略不計,因此LAT ≈ LAT(DNS) 。
比如攻擊者打算利用google DNS (8.8.8.8)來攻擊test.com的web 服務(wù)器。為了優(yōu)化,攻擊者需要先知道他到8.8.8.8再到test.com web服務(wù)器的延遲。怎么計算延遲呢? 攻擊者可以給8.8.8.8發(fā)送一個DNS查詢:[隨機子域].test.com 。由于8.8.8.8 并不負責(zé)test.com子域名,它只能遞歸詢問test.com的DNS服務(wù)器。test.com的DNS服務(wù)器收到該詢問以后,會進行本地記錄查詢。因為該子域是隨機產(chǎn)生的,所以肯定會返回找不到啦,8.8.8.8收到回答以后,會再把這一回答繼續(xù)轉(zhuǎn)發(fā)給攻擊者。這樣攻擊者就可以計算出他到8.8.8.8再到test.com DNS服務(wù)器的延遲。由于一般DNS服務(wù)器都在離WEB服務(wù)器很近的地方,因此可以推算出到8.8.8.8再到test.com web服務(wù)器的延遲。
為什么查詢的時候要使用隨機子域呢?是為了防止查詢結(jié)果被cache緩存。如果查詢結(jié)果被緩存了,那么DNS服務(wù)器就不遞歸查詢了,從而導(dǎo)致測量結(jié)果不準(zhǔn)確。
參考資料
1.Ryan Rasti et al., Temporal Lensing and its Application in Pulsing Denial-of-Service Attacks, IEEE S&P 2015
2.GUMMADI, K. P., SAROIU, S., AND GRIBBLE, S. D. King: Estimating Latency Between Arbitrary Internet End Hosts. In Proc. ACM Internet Measurment Workshop (2002)