作者:5t4rk
來源:http://blog.csdn.net/microzone/article/details/79262549?from=timeline&isappinstalled=0

一、基礎概念

*友情提醒:以下僅做技術研究,如有惡意利用,發起攻擊,將自負法律后果

本次反射式拒絕服務攻擊技術基于全球互聯網分布式的Memcached服務器,需要儲備一定得安全攻防知識,網絡協議知識和python代碼編程技術。希望在學習本篇文章知識前自行學習相關的基礎知識,文章后面同時附有參考鏈接。

關于Memcached系統

Memcached是一個自由開源的,高性能,分布式內存對象緩存系統。Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric為首開發的一款軟件。現在已成為mixi、hatena、Facebook、Vox、LiveJournal等眾多服務中提高Web應用擴展性的重要因素。Memcached是一種基于內存的key-value存儲,用來存儲小塊的任意數據(字符串、對象)。這些數據可以是數據庫調用、API調用或者是頁面渲染的結果。Memcached簡潔而強大。它的簡潔設計便于快速開發,減輕開發難度,解決了大數據量緩存的很多問題。它的API兼容大部分流行的開發語言。本質上,它是一個簡潔的key-value存儲系統。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。

關于分布式DDoS原理

分布式拒絕服務(DDoS:Distributed Denial of Service)攻擊指借助于客戶/服務器技術,將多個計算機聯合起來作為攻擊平臺,對一個或多個目標發動DDoS攻擊,從而成倍地提高拒絕服務攻擊的威力。通常,攻擊者使用一個偷竊帳號將DDoS主控程序安裝在一個計算機上,在一個設定的時間主控程序將與大量代理程序通訊,代理程序已經被安裝在網絡上的許多計算機上。代理程序收到指令時就發動攻擊。利用客戶/服務器技術,主控程序能在幾秒鐘內激活成百上千次代理程序的運行。

關于反射式DRDoS原理

DRDoS是英文“Distributed Reflection Denial of Service ”的縮寫,中文意思是“分布式反射拒絕服務”。與DoS、DDoS不同,該方式靠的是發送大量帶有被害者IP地址的數據包給攻擊主機,然后攻擊主機對IP地址源做出大量回應,形成拒絕服務攻擊。

二、攻擊流程

DDoS攻擊流程

要完成這個攻擊流程,得至少需要三個步驟。

  1. 攻擊者手里必須控制大量肉雞機器,并且分布式在互聯互通分布在互聯上。
  2. 攻擊者隨時可以通過代理或者控制程序同時向所有肉雞發送大量攻擊指令。
  3. 所有肉雞在接受指令后,同時大量并發,同時向受害者網絡或者主機發起攻擊行為。
DRDoS攻擊流程

DRDoS要完成一次反射放大攻擊:

  1. 攻擊者,必須提前需要把攻擊數據存放在所有的在線肉雞或者反射服務器之上。
  2. 攻擊者,必須偽造IP源頭。發送海量偽造IP來源的請求。當然這里的IP就是受害者的IP地址。
  3. 反射服務器,必須可以反射數據,運行良好穩定。最好是請求數據少,返回數據成萬倍增加。

如此不斷循環,就可以大規模攻擊其帶寬網絡,增加占用率和耗損目標機的硬件資源。

利用Memcached實現的DRDos攻擊反射流程

三、存活機器

首先我們要找到大量反射服務器,利用搜索引擎去發掘全球可利用在線服務器。這里我暫時用zoomeye進行搜集,你也可以用別的搜索引擎,比如shodan等。默認開啟端口號是11211,利用知道創宇得鐘馗之眼空間引擎搜索到全球538317臺機器開啟11211端口,運行著Memcached緩存服務系統。但是利用條件還有一個,就是我們還得進一步篩選確認是否開啟默認可以登錄的機器,這樣就可以被我們所利用了。有些已經設置了安全認證,那么就無法使用了。(這里就不公布了)

四、通信協議

從協議看,memcache同時監聽tcp和udp。也就是說它本身支持兩種協議同時可以發起交互和通信。這個就很關鍵了。大家可以看看tcp和udp協議區別。由于TCP是字節流,沒有包的邊界,無所謂大小,一次發送接受的數據取決于實現以及你的發送接收緩存大小。

TCP沒有限定,TCP包頭中就沒有“包長度”字段,而完全依靠IP層去處理分幀。

但是UDP協議就不一樣了,他不基于連接,直接發送數據報到目標機器。

注意這個Length字段,只占有兩個字節。所以說UDP協議發送數據就有了限制,單次最大發送2^16=65535=64KB。

如果想要發送更大數據包,那么只能使用TCP協議或者UDP多次發送來實現,這里我已經測試過,兩種協議均可以實現。

小結:

  1. TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接。
  2. TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交 付,即不保證可靠交付。
  3. TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的。UDP沒有擁塞控制,因此網絡出 現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)。
  4. 每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信。
  5. TCP首部開銷20字節;UDP的首部開銷小,只有8個字節。
  6. TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道。

好了,明白了這個,我們就看看怎么利用基于TCP和UDP協議通信的Memcached緩存系統。由于Memcached系統支持最大鍵值單數據對1M存儲。所以我們最大只能存儲1M,當然你可以作多個字段,這樣也會放大。那首先按照流程圖我們向遠程服務器提前存儲有效載荷,這里就是數據了。利用TCP協議可以一次性發1M,但是我們要是利用UDP就得循環發送多次才能完成1M數據傳輸。由于UDP具有不穩定性,數據包不保證可靠交付。這里我建議使用TCP進行發送。

五、數據格式

Memcached簡潔而強大。它的簡潔設計便于快速開發,減輕開發難度,解決了大數據量緩存的很多問題。它的API兼容大部分流行的開發語言。本質上,它是一個簡潔的key-value存儲系統。

一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。

支持有如下所有命令和操作。

Memcached 存儲命令
Memcached set 命令
Memcached add 命令
Memcached replace 命令
Memcached append 命令
Memcached prepend 命令
Memcached CAS 命令
Memcached 查找命令
Memcached get 命令
Memcached gets 命令
Memcached delete 命令
Memcached incr/decr 命令
Memcached 統計命令
Memcached stats 命令
Memcached stats items 命令
Memcached stats slabs 命令
Memcached stats sizes 命令
Memcached flush_all 命令

這里我們重點介紹三種命令,因為我們的攻擊流程中將會涉及了這三種方式。

第一個是上傳有效載荷Memcached set 命令

Memcached set 命令用于將 value(數據值) 存儲在指定的 key(鍵) 中。

如果set的key已經存在,該命令可以更新該key所對應的原來的數據,也就是實現更新的作用。

set 命令的基本語法格式如下:

set key flags exptime bytes [noreply] 
value 

參數說明如下:

key:鍵值 key-value 結構中的 key,用于查找緩存值。
flags:可以包括鍵值對的整型參數,客戶機使用它存儲關于鍵值對的額外信息 。
exptime:在緩存中保存鍵值對的時間長度(以秒為單位,0 表示永遠)
bytes:在緩存中存儲的字節數
noreply(可選): 該參數告知服務器不需要返回數據
value:存儲的值(始終位于第二行)(可直接理解為key-value結構中的value)

第二個反射有效載荷Memcached get 命令

Memcached get 命令獲取存儲在 key(鍵) 中的 value(數據值) ,如果 key 不存在,則返回空。

get 命令的基本語法格式如下:

get key

多個 key 使用空格隔開,如下:

get key1 key2 key3

參數說明如下:

key:鍵值 key-value 結構中的 key,用于查找緩存值。

第三個是退出遠程服務器。quit\r\n命令即可,沒有任何參數,注意要有回車換行。

六、攻擊步驟

自動化上傳有效載荷

到了這里,我們接下來就是如何利用這個過程實現DRDoS反射拒絕服務攻擊。

思路是這樣的:我們先批量上傳指定數據到遠程開放服務器Memcached上面,然后我們再去Memcached服務器請求查詢數據上一步存儲的數據,(這一步很關鍵,我們只能利用UDP協議進行反射,后面說明一下為什么。)這樣就可以將數據通過Memcached服務器反射到目標受害機器上了。這里我們可以自己手動編寫程序實現批量自動化上傳有效載荷到遠程服務器,等待上傳完了我們就可以進行UDP反射攻擊了。

這里我用python腳本完成payload數據上傳。

代碼就不公布了,防止非法利用。直接輸出測試結果。

輸出結果

自動化反射有效載荷

這里得注意一下,上面的自動化上傳我使用了TCP協議發送數據包,反射我必須使用UDP協議。因為只有UDP協議是基于無連接的,這樣我們直接發送數據到目標服務器,不需要進行三次握手。同時服務器接收方也無法驗證客戶源IP,因此這個過程我們才可以利用UDP偽造源地址,實現反射DRDoS攻擊過程。

利用socket和scapy庫開發,采用多線程進行循環請求。(特別注意UDP協議使用的時候,每個操作命令必須都要添加數據包結構要加頭部8字節標志位, "\x00\x00\x00\x00\x00\x01\x00\x00")

這里使用python腳本完成反射攻擊。

代碼就不公布了,防止非法利用。直接輸出測試結果。

輸出,可以實現

測試wireshark抓包

這里不妨可以進行一個大概理論計算

比如單臺服務器我們雖然只發送的攻擊指令只有二十個字節數據,但卻可以返回1M數據。1M/20=5W(5萬倍放大率),這可謂四兩撥千斤。假設理想狀況下我們現在手里有50W可用機器,那么我們的DRDoS理論值數值將會達到約50W*1M=500GB。大家想想這個是多么恐怖的帶寬和數據。現在目前國內能夠抵御短時間發起這么大的DDoS攻擊的,幾乎沒有。比如去年攻擊阿里云超過14小時,峰值流量達到453.8G。而DRDos可以只需要一分鐘就能實現高達500G流量,這將是多么可怕的事情,多大的災難。

七、總結體會

關于這項DRDoS技術經過幾天摸索研究也算已經了解清楚了,但是測試中發現有的網絡環境里面會被一些路由器糾正源地址,使得反射攻擊失敗。究其原因是因為其增加的uRPF機制,(Unicast Reverse Path Forwarding是一種單播反向路由查找技術,用于防止基于源地址欺騙的網絡攻擊行為。)重新修復了UDP源地址偽造。不過有些環境中沒有這種機制的,那么我們就可以利用此方法實現攻擊。在這里分享給大家,希望可以有人繼續深入分析和鉆研,其中涉及利用的思路和技巧也可學習學習。比如說利用其免費的互聯網存儲資源,將你的數據源進行分布式存儲,當做你的分布式私密云盤。

友情提醒:以上僅做技術研究,如有惡意利用,發起攻擊,將自負法律后果

八、參考學習

http://memcached.org

http://www.runoob.com/memcached/memcached-tutorial.html

https://baike.baidu.com/item/DRDoS/9222989?fr=aladdin

http://artur.ejsmont.org/blog/content/memcache-over-udp-transport-protocol-is-not-really-so-cool

https://github.com/memcached/memcached/blob/master/doc/protocol.txt

https://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E6%8B%92%E7%BB%9D%E6%9C%8D %E5%8A%A1%E6%94%BB%E5%87%BB/3802159?fr=aladdin&fromid=444572&fromtitle=DDOS


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/535/