基於Memcached的DRDos的研究與攻擊復現
【宣告】本文僅作學習研究之用,歡迎一起探討,請勿發動惡意攻擊,否則後果自負!
核彈級DDoS攻擊肆掠全球
進入3月,春天到了,萬物復甦,又到了動物交配的季節!咦!不對不對,我要說什麼來著。。O(∩_∩)O哈哈~皮這麼一下確實很好玩哦 (^▽^)) 下面咱們說說正事,自從進入三月份啊,爆炸性的新聞就不斷啊!先是阿里雲爆出成功監控和防禦一起流量高達758.6Gbps的Memcached DDoS反射攻擊
接著全球最大的同性交友網站GayhubGithub也宣稱自己遭遇有史以來最大的DDoS攻擊,在2月28日的17:21-17:26之間,GitHub網站無法正常訪問。從17:26-17:30,網站只能間歇性的可以訪問。簡單說,這10分鐘該網站已處於癱瘓狀態。二者遭遇的新型DDos皆是利用Memcache作為DRDoS放大器,這種反射性DDos能夠利用很少的計算資源反射出巨大的流量,破壞力強大
通過Memcached型反射型DDoS攻擊的抓包樣本,從UDP協議+源埠11211的特徵,可以快速分辨這種攻擊型別。
什麼是DRDos?
DDos相信大家都知道是什麼,但是DRDos可能有些人還是第一次聽說,那麼什麼是DRDos呢?
DRDoS是英文“Distributed Reflection Denial of Service ”的縮寫,中文意思是“分散式反射拒絕服務”。與DoS、DDoS不同,該方式靠的是傳送大量帶有被害者IP地址的資料包給攻擊主機,然後攻擊主機對IP地址源做出大量回應,形成拒絕服務攻擊。
黑客往往會選擇那些響應包遠大於請求包的服務來利用,這樣才可以以較小的流量換取更大的流量,獲得幾倍甚至幾十倍的放大效果。一般來說,可以被利用來做放大反射攻擊的服務包括DNS服務、NTP服務、SSDP服務、Chargen服務、Memcached等。
————來自百度
什麼是Memcached?
Memcached 是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashmap。其守護程序(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護程序通訊。
————來自百度
簡單點理解呢,就是它是一個簡潔的key-value儲存系統。一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、提高可擴充套件性。那麼如何利用Memcached來DRDos呢?請看下面。
Memcached的放大攻擊原理
從協議上看,Memcached執行在11211埠,支援TCP與UDP協議,也就是我們可以使用這兩種協議來與Memcached主機通訊,這也為我們偽造資料包提供了機會。學習過計算機網路的都知道,TCP是面向連線的,經過三次握手與伺服器建立連線,能重傳,提供可靠的服務,而UDP是無連線的不需要事先與伺服器建立連線,提供不可靠的服務,不需要進行三次握手。同時伺服器接收方也無法驗證客戶源IP。因此我們可以通過傳送源地址為被攻擊主機IP的資料包來將Memcached伺服器返回的包發現被攻擊主機,從而達到反射攻擊的目的。還有一點,由於Memcached系統支援最大鍵值單資料對1M儲存。所以我們最大隻能儲存1M,當然你可以作多個欄位,這樣也會放大。這裡我們將使用TCP來上傳我們的攻擊載荷,使用UDP構造請求來發起攻擊。
Memcached有如下一些命令和操作:
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 命令 |
這裡我們主要用到的是這三個:set
、get
、delete
、quit
。set
用於將攻擊載荷上傳到Memcached伺服器,get
用於UDP包請求我們存的攻擊載荷,delete
用於刪除攻擊載荷,quit
則用來退出服務。
攻擊復現
獲取Memcached主機資訊
通過shodan或者Zoomeye我們能夠獲取Memcached的主機資訊情況,或者你有精力的話也可以掃一掃全網啊~看一看有木有11211開放的主機存在。。這裡我直接通過指令碼拿到了1w IP(多了不敢拿啊。。),但是其中可以用來發起攻擊的估計只有很少一部分吧(因為自從攻擊事件發生後很多伺服器都做了相應的防護策略。。)。
獲取IP的指令碼很簡單,我就不發了(不敢發啊~),有興趣的童鞋可以自己寫一寫(搜一搜)。。
上傳攻擊載荷
這裡我們使用python指令碼,利用socket來發起一個TCP連線,上傳一個1M大小(Memcached最大支援1M的鍵值資料)的載荷。載荷上傳成功後Memcached伺服器會回顯STORED
訊息,因為我們可以利用這個來確定我們的載荷是否上傳成功。同樣我們也可以使用telnet連線Memcached伺服器,直接get xxx(你上傳的key的名稱)
來驗證載荷是否成功上傳。
上傳的指令碼很簡單,我就不發了(不敢發啊~),有興趣的童鞋可以自己寫一寫(搜一搜)。。
傳送偽造IP的UDP包
這裡我們使用了python的scapy來偽造UDP包向Memcached伺服器傳送請求查詢我們儲存的key,這樣Memcached伺服器返回的資料就被指向了我們要攻擊的IP(這裡我選擇了我的本地地址。。),當然為了結果更加明顯,你也可以利用多執行緒控制更多伺服器數量或者乾脆多發幾個包。。。
傳送的指令碼很簡單,我就不發了(不敢發啊~),有興趣的童鞋可以自己寫一寫(搜一搜)。。
監聽檢視返回結果
我直接將被攻擊IP(UDP資料包中的源IP地址)設定為了我的本地地址,埠12345,開啟控制檯,直接nc -l -u -p 12345
監聽一下,可以看到,Memcached伺服器返回的資料正源源不斷地發來~可以試想一下,我們發出區區20位元組的資料包,卻可以返回高達1M的資料,1M/20=52100倍,再加上數十萬Memcached伺服器的存在,這要是打起來,這酸爽~我啥也不說了,自行體會吧。
最後刪除載荷並退出(保持好習慣~)
防禦措施
如何避免被利用成為Memcached反射端
建議對執行的Memccached服務進行安全檢查和加固,防止被黑客利用發起DDoS攻擊造成不必要的頻寬流量;
如果您的Memcached版本低於1.5.6,且不需要監聽UDP。您可以重新啟動Memcached加入 -U 0啟動引數,例如:Memcached -U 0,禁止監聽在udp協議上
如何防護Memcached DDoS反射攻擊
建議優化業務架構,將業務分散到多個IP上,或者購買網路產品服務商提供的安防服務。
Tips
在看大佬們的資料的時候發現十分好玩的一個東西,就是利用Memcached的開放服務特性,我們可以利用Memcached伺服器來儲存我們的一些不是那麼重要的東西啊,畢竟這儲存資源free啊,不好好利用多麼浪費啊~