僵尸网络项目代码-DDOS攻击复现-研究报告
代碼地址:Aoyama-master:https://github.com/Leeon123/Aoyama
另外一個找不到了。。。
一、背景意義
- 研究背景:
僵尸網絡主要由3部分組成:僵尸主機(bots)、僵尸網絡的控制者(botmaster)和命令控制通道(command and control,C&C),是攻擊者出于惡意目的,傳播僵尸程序控制大量主機,可以實現多種惡意活動,如分布式拒絕服務攻擊(Distributed Denial of Service,DDoS)、垃圾郵件(Spare)、釣魚網站(Phishing)、信息竊取(Information theft)等。僵尸網絡是從傳統惡意代碼形態包括計算機病毒、網絡蠕蟲、特洛伊木馬和后門工具的基礎上進化,并通過相互融合發展而成的目前最為復雜的攻擊方式之一。由于僵尸網絡靈活機動和遠程調度的特點,僵尸網絡得到了攻擊者的青睞和進一步的發展,從而已成為因特網最為嚴重的威脅之一。
僵尸網絡帶來的嚴重安全威脅引起了國際上的廣泛關注。在學術界,USENIX協會從2007年開始舉辦僵尸網絡專題研討會HotBots(Workshop on?Hot Topics in Understanding Botnets),2008年,W0RM與HotBots合并為LEET(Workshop on?Lager-scale Exploits and Emergent Threats),專門探討僵尸網絡、間諜軟件和蠕蟲。同時,近年來在USENIX Security Symposium,NDSS,CCS,RAID等著名會議上發表的僵尸網絡研究成果呈明顯增多趨勢。在工業界,微軟公司在2004年發起了國際反僵尸網絡工作。在政府部門,2006年6月美國陸軍研究辦公室ARO、國防高級研究計劃署DARPA和國土安全部DHS 3個部門聯合在GA Tech舉辦了名為“ARO—DARPA—DHS Special Workshop onBotnet”的僵尸網絡專門研討會,對這一嚴重安全威脅進行了深入探討。
- 研究意義
DDOS攻擊被視為最恐怖的攻擊,其中僵尸網絡在現代的DDOS攻擊中發揮了巨大的作用,由于其產生的巨大危害性,以及現在對于此攻擊的防護手段難以產生有效的作用,本文希望通過研究攻擊來達到提高防御的效果。通過對GitHub中的兩個開源項目Aoyama-master、Botnet-master的學習,來模擬僵尸網絡中的DDOS攻擊,以達到將該攻擊的基本流程和結構框架深入研究的目的,將攻擊具體化、細節化的呈現出來,方便更多專業的安全人士對癥下藥,以實現更好的防護手段。
- 研究內容
通過調研僵尸網絡和DDOS攻擊原理,分析Aoyama-master、Botnet-master等演示代碼,復現基于僵尸網絡的DDOS攻擊,設計實現HTTP flood、UDP Flood?等攻擊行為,為針對僵尸網絡DDOS攻擊的防護手段提供技術支持。
- 技術說明
(一)Botnet-master項目
1. 項目簡介
該項目主要由Master.py(僵尸主機的控制者),Bot.py(僵尸主機),TragetServer.py(目標服務器)三部分構成,還包含一個Util.py,具有其他文件可以調用的各種實用函數。Botnet-master項目擬模擬一種最簡單的DDOS攻擊,為了解DDOS攻擊的流程方法提供了較好的實例。
圖1 botnet-master 攻擊流程示意
該項目具體的攻擊流程實現如下:
第一步:控制者與僵尸主機驗證身份并順利連接,通過與僵尸主機的信息交互告知僵尸主機發起攻擊的目標地址、端口號、時間。
第二步:僵尸主機獲取攻擊信息后,休眠至指定的時間后對目標服務器發起攻擊,連續發送30秒的無用數據。
第三步:目標服務器為每一個偵聽到的客戶端創建一個線程進行處理,在接收30秒的數據后斷開連接。
TragetServer.py 的主要功能是在指定端口上運行一個虛擬服務器,通過調用多線程的方法對每個客戶端進行處理,并將產生的日志文件寫入到log.txt中。主要函數分析如下:
(1)log()函數
圖2 log函數
由于目標服務器調用了多線程處理客戶端,因此避免沖突是必要的。log函數首先通過filebusy變量對當前log.txt文件的使用狀態進行判斷,若存在線程正在進行寫的操作,則休眠0.5秒后再進行判斷,如此往復,避免了多個線程對文件寫的沖突。通過以 ‘a’?的形式打開log.txt ,并在文件不存在時自動創建,將日志寫入該文件,以達到記錄運行日志的目的。
(2)shutdown()函數
圖3 shutdown函數
該函數起到關閉服務器的功能。通過globals()函數檢查全局變量中是否存在‘server’字符來判斷server服務,從而進行逐一關閉。
(3)handle()函數
圖4 handle函數
該函數對每個連接的客戶端進行處理。生成日志數據并調用log函數,通過while循環持續接受客戶端傳輸的數據。
(4)多線程
圖5 多線程處理
服務器啟動一個線程運行在本地的端口,該線程負責為每個偵聽的客戶端啟動一個線程進行數據傳輸的處理。
Bot.py在指定端口上創建一個套接字,并開始偵聽控制者。建立連接后,首先使用握手過程對其進行身份驗證,如果身份驗證成功,?僵尸主機將向控制者發送當前時間。控制者返回信息,包含目標服務器的主機名和端口號,以及攻擊時間,同時考慮到?僵尸主機和主服務器之間的時間差。?
僵尸主機進行休眠,直到指定的攻擊時間后,連接到指定端口上的目標服務器,并持續發送消息30秒,即模擬DoS攻擊。一旦 30 秒結束即攻擊完成,?僵尸主機就會斷開與目標服務器的連接并退出。
主要內容分析如下:
(1)signal信號捕捉
圖6 signal信號
SIGINT /* interrupt */ ,該函數實現捕捉SIGINT信號,即程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl+C)時發出,用于通知前臺進程組終止進程。實現SIGINT信號和shutdown函數的綁定。
(2)Socket 屬性設置
圖7 設置socket屬性
setsockopt函數用于設置套接字描述符的屬性。服務端程序的端口釋放后可能會處于 TIME_WAIT 狀態(等待),要等待兩分鐘后才能被再次使用,可以通過設置地址復用,即設置 SO_REUSEADDR 選項,讓端口釋放后立即可以被再次使用。
(3)listenForMaster()函數
圖8 ?listenForMaster函數
Bot首先與Master建立連接,然后通過信息的交互驗證身份。Bot接收Master的驗證消息,若等于Util.MASTER_PASSPHRASE字符串,則發送自己的驗證消息——Util.BOT_PASSPHRASE字符串,待雙方都驗證通過后才保持連接。
(4)attack()函數
該函數實現對于攻擊時間的判斷和發起30秒的持續攻擊。
圖9 計算等待時間
如果現在的時間加上偏移時間未達指定的攻擊時間,Bot會休眠一段時間,待達到攻擊時間后發起攻擊。
圖10 攻擊30秒
通過while循環和time()函數判斷攻擊時間是否達到了30s,持續發送字符串進行模擬攻擊。
4.Master.py
控制者讀取包含僵尸主機信息的文本文件,然后循環遍歷每個僵尸主機。對于每個僵尸主機,它在指定的端口進行連接,并通過握手過程對自身進行身份驗證。控制者向僵尸主機詢問其當前時間,并確定自身與僵尸主機之間的時差??刂普呦蚪┦鳈C發送目標服務器的主機名、攻擊端口、攻擊時間、時差。
(1)readBotsFile()函數
圖11 readBotsFile函數
控制者通過該函數打開bots_list.txt 文件獲取Bot的地址和端口號,以便于進行控制和通信。
(2)connectToBots()函數
該函數主要功能為與Bot建立連接并進行驗證,同時對時間進行處理,得到并發送具體的攻擊時間。
圖12 Master 的驗證
與Bot一樣,Master也具有驗證身份的代碼段,身份驗證通過后才能保持穩定的連接。
圖13 時間差處理
由于相互發送消息的延遲和不同機器時間的差異,會造成攻擊時間的不確定性,因此Master對時間差進行了處理。得到一個delta時間作為Bot 的延遲時間。消除時間的差異性,進而精準的設置攻擊時間。
(二)Aoyama-master項目
1.項目簡介
該項目主要由cnc.py和client.py組成,cnc.py模擬僵尸主機的控制主機,包括發送控制信息,建立telnet遠程連接服務等功能,client.py模擬僵尸主機,用于向目標服務器發起DDOS攻擊,包括HTTP flood,UDP/STD flood ,?slowloris 等攻擊手段。為方便讀者閱讀,下面先介紹DDOS攻擊的相關知識。
DDOS攻擊,分布式拒絕服務攻擊,指通過大規模互聯網流量淹沒目標服務器或其周邊基礎設施,以破壞目標服務器、服務或網絡正常流量的惡意行為。用一個比喻形容,將互聯網上的服務器看作一個商店,將訪問的客戶當作購物的客人,DDOS攻擊就相當于讓一群小混混闖進商店,不僅不買東西還賴著不走,讓正常的客人無法進入購物。DDOS攻擊通過互聯網進行,僵尸網絡就是最好的載體,控制者通過C&C服務器遠程控制僵尸主機發起攻擊,以造成資源擁塞等問題。
該項目的特點:
項目啟動后,cnc主機會自動檢測client.py創建的僵尸主機并與其驗證連接,此時cnc主機等待接受C&C Server的指令。控制者通過telnet遠程登錄到cnc主機,模擬C&C Server向cnc主機發送攻擊指令,僵尸主機按照指令對目標服務器發起DDOS攻擊。
圖14 Aoyama-master 攻擊流程示意圖
2.cnc.py
cnc.py主要負責開啟telnet服務、對用戶進行驗證登錄和向僵尸主機發送攻擊指令。
(1)commander()函數
圖15 commander函數
該函數根據用戶輸入的用戶名和密碼與log.txt中的正確用戶名和密碼進行比較,若不一致則關閉連接。
圖16 加載Server
驗證成功后,出現加載視圖,加載完畢后即可輸入指令進行操作,指令將被發送至僵尸主機進行攻擊。
圖17 C&C Server 視圖
(2)handle_bot()函數
該函數通過cnc主機與僵尸主機進行信息的交互獲取僵尸主機存活信息,并與不能進行信息交互的僵尸主機(已損壞)斷開連接。
圖18 handle_bot函數
cnc主機向僵尸主機發送加密后的‘ping’字符串,僵尸主機接收此字符串并解密后會回復加密后的‘pong’字符串,以此達到信息交互即檢驗存活主機的目的。
(3)xor_enc、xor_dec函數
xor_enc、xor_dec函數主要負責對cnc主機和僵尸主機之間信息交互時的流量加解密,原理為簡單的異或運算。
圖19 流量加解密函數
2.client.py
該函數通過指令處理函數對cnc主機攻擊指令進行解讀,從而調用相應的攻擊函數進行DDOS攻擊。
(1)handle()函數
圖20 handle函數
若輸入指令的第一個字符為‘!’,則該指令為攻擊指令,繼續識別字符,若遇到‘http’則為http flood攻擊,函數會將后續的IP 地址、端口號、進程數、路徑交付給http攻擊函數,攻擊函數利用相應的攻擊信息進行攻擊。
(2)HTTP()函數
大部分Flood攻擊都需要攻擊者以root權限控制大批量的傀儡機。收集大量root權限的傀儡機很花費時間和精力,而且在攻擊過程中傀儡機會由于流量異常被管理員發現,攻擊者的資源快速損耗而補充緩慢,導致攻擊強度明顯降低而且不可長期持續。HTTP Flood攻擊則不同,攻擊者并不需要控制大批的傀儡機,取而代之的是通過端口掃描程序在互聯網上尋找匿名的HTTP代理或者SOCKS代理,攻擊者通過匿名代理對攻擊目標發起HTTP請求。HTTP Flood攻擊會引起嚴重的連鎖反應,不僅僅是直接導致被攻擊的Web前端響應緩慢,還間接攻擊到后端的Java等業務層邏輯以及更后端的數據庫服務,增大它們的壓力,甚至對日志存儲服務器都帶來影響。
HTTP()函數通過自己的字符串列表隨機組裝HTTP請求報文,包括連接類型、瀏覽器版本,同時隨機化的添加一些字符串進行請求報文的差異化,達到一定的避免識別的目的。在攻擊端口為443端口時,由于443端口主要是用于HTTPS服務,是提供加密和通過安全端口傳輸的另一種HTTP,函數會調用SSLContext函數對socket進行更高級的安全性設置,如數字證書等等。
?????????
圖21 HTTP Flood攻擊函數
(3)UDP/STD ()函數
由于UDP協議排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應用來完成,極大降低了執行時間,使傳輸速度得到了保證,使得UDP協議得到廣泛應用,為黑客們發動UDP Flood攻擊提供了平臺。UDP Flood屬于帶寬類攻擊,黑客們通過僵尸網絡向目標服務器發起大量的UDP報文,這種UDP報文通常為大包,且速率非???#xff0c;通常會造成以下危害:
UDP()函數通過200個循環,持續發送由_urandom隨機生成的指定大小的數據包對目標進行模擬攻擊,占用了大量的服務器資源。
圖22 UDP函數
STD()函數與UDP函數類似,區別是將內容替換為垃圾字符串。
圖23 STD函數
(4)slowloris 攻擊
HTTP協議規定,HTTP Request以\r\n\r\n結尾表示客戶端發送結束,服務端開始處理。Slowloris就是利用這一點發起DDoS攻擊的。攻擊者在HTTP請求頭中將Connection設置為Keep-Alive,要求Web Server保持TCP連接不要斷開,隨后緩慢地每隔幾分鐘發送1個key-value格式的數據到服務端,如a:b\r\n,導致服務端認為HTTP頭部沒有接收完成而一直等待。如果攻擊者使用多線程或者僵尸主機來做同樣的操作,服務器的Web容器很快就被攻擊者占滿了,TCP連接而不再接受新的請求。
由于測試后該項目中的slowloris函數不起作用,因此筆者自行上網查找了一個成功的代碼——slowloris.py,分析如下:
圖24 init_socket函數
init_socket函數創建socket并對目標服務器進行畸形連接,即不發送最后的‘\r\n’,迫使服務器不能斷開連接,占用資源。
圖25 半包請求
為使連接持續建立,僵尸主機會持續發送key:value形式的半包請求,并隨機填充內容。僵尸主機定期檢查socket連接狀況,若發現某socket斷開,則重新建立socket并重新連接,保證攻擊的持續有效。
- 演示說明
(一)環境搭建
本文的兩個項目均在Linux下的環境中運行,因此筆者采用了Vmware虛擬機下的Ubuntu系統進行實驗。
(二)測試內容
1.Botnet-master項目
該項目運行在python2的環境中,先在8081端口啟動目標服務器
圖26 啟動TragetServer
再通過demo.py啟動4個Bot僵尸主機,demo.py包含啟動4個僵尸主機的指令
圖27 demo.py
圖28 啟動4個Bot
最后運行控制者的程序,控制者向僵尸主機發送攻擊信息,僵尸主機對目標服務器發起攻擊,此時目標服務器會接受30s的無用消息,達到攻擊效果。
圖29 攻擊效果示意
2.Aoyama-master項目
(1)創建僵尸主機
創建兩個僵尸主機client.py ,client2.py ,準備與cnc主機建立連接。
圖30 client僵尸主機
(2)創建cnc主機
開啟cnc主機,自動檢測到等待連接的兩臺僵尸主機。
圖31 cnc主機
(3)telnet 遠程連接
telnet登錄到cnc主機,輸入用戶名和密碼,驗證后成功登錄。
圖32 telnet登錄
登錄成功后,進入加載C&C Server頁面,加載完畢后輸入bots 指令查看當前建立連接的僵尸主機數量。
圖33 C&C Server模擬
(4)利用Flask庫建立TCP服務器
在本地5000端口的’/’和’/http’路徑下開啟TCP服務器并進行監聽。
圖34 ?flask服務器代碼
圖35 開啟TCP服務器
圖36 ?TCP服務器頁面
(5)HTTP Flood
? 在C&C Server 輸入!http 127.0.0.1 5000 1000 /http 對/http路徑下的網頁進行HTTP Flood 攻擊。
圖37 發動HTTP Flood指令
在終端可以監聽到有大量的HTTP請求涌入/http網頁。
圖38 大量HTTP請求
再次嘗試登錄127.0.0.1:5000/http 網頁,發現加載長時間無反應,攻擊成功,造成Web前端響應緩慢。
圖39 網頁響應緩慢
(6)Slowloris 攻擊
運行slowloris.py進行攻擊,-p指定攻擊端口,-s指定攻擊線程。
圖40 發動slowloris攻擊
發起攻擊后可以看到運行了1021個sockets線程進行攻擊,猜測該web頁面最多同時響應1021個請求,我們在瀏覽器訪問該頁面,發現無法加載,攻擊成功。
圖41 web頁面無法加載
攻擊進行時,沒有監聽到HTTP請求,停止攻擊后,終端監聽到1021個HTTP請求。由此得出,slowloris攻擊實現作用。
圖42 停止攻擊后監聽到請求
(7)建立UDP服務器
運行udp.py在本地6000端口建立UCP服務器。
圖43 建立UCP服務器
圖44 udp.py
運行udp2.py與udp服務器建立連接并發送關閉消息,udp服務器接收消息后關閉服務器,模擬udp服務環境。
圖45 udp2.py
圖46 udp服務器成功關閉
(8)UDP/STD Flood
輸入指令發動UDP Flood 攻擊,1000個線程,UDP數據包的大小為555bit。
圖47 發動UDP Flood
圖48 服務器接收UDP數據包
嘗試運行udp2.py與服務器進行連接并將服務器關閉,發現無法建立連接并發送數據,體現出UDP Flood攻擊成功,造成鏈路擁塞,網絡癱瘓。在停止攻擊后,重新運行udp2.py,成功關閉服務器。
圖49 udp2.py無法與服務器建立連接
同理,可以成功發動STD Flood,僵尸主機發送垃圾字符串,造成鏈路擁塞。
圖50 STD Flood攻擊
(三)實驗結論
本實驗通過Aoyama-master、Botnet-master兩個項目演示了利用僵尸網絡發動DDOS攻擊的場景,模擬了HTTP Food,Slowloris,UDP/STD Flood攻擊的具體實現,檢驗了利用僵尸網絡發起DDOS攻擊的可行性,展示了僵尸網絡發動攻擊的嚴重危害。通過本實驗,僵尸網絡的危害性顯而易見,對于如何有效抵御由僵尸網絡發起的分布式拒絕服務攻擊的研究迫在眉睫,筆者有一些思考:通過防火墻對非正常流量進行限流,若某段會話的報文速率超過某個閾值,防火墻可以鎖定該會話,待到流量正常時,解鎖會話。此外,客戶端可以通過分析學習Flood攻擊流量的共同特點來判斷是否產生攻擊,即指紋學習技術。
- 應用場景
(一)模擬僵尸網絡環境
在進行僵尸網絡的學習教育中,筆者認為不僅僅需要從理論上了解僵尸網絡,了解僵尸網絡的歷史,構造,發展和現狀后,更應該親自動手實踐,從環境的搭建開始,去感受僵尸網絡的實際效果。實踐是檢驗真理的唯一標準,通過本文的兩個項目,學者可以更好的體會僵尸網絡,繼而去研究如何進行有效的防護,并在本項目的基礎上進一步的完善,筆者認為可以開發一個針對僵尸網絡DDOS攻擊的項目,并在本項目上進行實踐,驗證效果。
(二)項目拓展
本文的兩個項目都是在本地模擬環境下實現的僵尸網絡攻擊,若要進行進一步的、更深入的去研究僵尸網絡,筆者認為可以在兩個項目的基礎上進一步完善,擴展到局域網、互聯網環境下的僵尸網絡,同時僵尸主機也不要僅限于本地端口,可以利用一些簡單的漏洞和病毒去操控真實的主機。在更真實,貼近于現實的環境下,可以帶來更好的參考價值。
總結
以上是生活随笔為你收集整理的僵尸网络项目代码-DDOS攻击复现-研究报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些高薪职位的能力需求。
- 下一篇: 必须使用javadoc形式的注释