2022-10-12 分類: 網站建設
大家好,最近看到國外有一篇和僵尸網絡有關的文章,今天分享給各位。
當然,我們面對DDoS當然是可以防御的,就比如云清洗。我寫這篇文章的目的是為了讓大家更多的去了解如何防護DDoS攻擊,所以請勿用作違法行為!愿這個世界再無黑產。
簡單的 C&C 僵尸網絡這個 hackpack 將引導您完成一個基本框架,該框架從根本上表征了僵尸網絡。 如果您以前使用過 C,它可能會有所幫助。 如果你喜歡這個教程,一定要給這個 repo 加星標!
注意:請勿將您在此處學到的任何內容用于惡意目的。 這個 hackpack 只是一個用于教育目的的僵尸網絡案例研究。 在這個 hackpack 中學到的概念具有深遠的用例(基本上與網絡有關的任何事情)。 最重要的是,此 hackpack 旨在在本地進行測試和部署(因此請不要與其他黑客共享您構建的與此 hackpack 相關的任何內容)。 隱私很重要,所以請尊重它。
什么是僵尸網絡?在構建僵尸網絡之前,了解什么是僵尸網絡很重要。僵尸網絡是能夠遠程接收命令并在本地部署它們的計算機網絡。 或者,他們可以選擇將信息中繼回網絡中的其他節(jié)點。 它們已被用于從分布式拒絕服務攻擊到廣泛部署的間諜軟件的所有領域。
您過去可能聽說過許多僵尸網絡。 最突出的可能是 Mirai 和 Gameover Zeus,它們分別控制了 380 和 360 萬臺物聯(lián)網設備。 僵尸網絡執(zhí)行某些任務的方式存在很大差異。 但是為了成功構建我們的僵尸網絡,我們需要在我們的工作網絡中確保以下功能。
我們的僵尸網絡應該:
包括一個控制網絡上所有其他節(jié)點的主節(jié)點; 在主機上部署偽裝的惡意軟件/從節(jié)點; 將命令從主節(jié)點傳輸到從節(jié)點,執(zhí)行并將輸出返回給主節(jié)點。這種結構是所謂的命令與控制僵尸網絡的特征。 這些僵尸網絡有一臺主服務器和多臺從服務器。 然而,這種僵尸網絡風格已經過時,可以通過切斷對主域的訪問來輕松取締。 更新和復雜的僵尸網絡遵循點對點架構,其中管理員權限分布在網絡中的所有節(jié)點或節(jié)點子集。
這些僵尸網絡讓安全專家非常頭疼,因為沒有中央控制點,并且可以增長到數百萬個節(jié)點。 消滅此類僵尸網絡本身就是一個有趣的讀物。 然而,為了這個 hackpack 的目的,讓我們保持簡單。 我們將為 C&C 僵尸網絡實現(xiàn)一個簡單的從節(jié)點。
執(zhí)行這個 hackpack 將主要處理實現(xiàn)客戶端惡意軟件。 對于主服務器,我們可以使用開源 TCP 服務器調用 Netcat。 Netcat 與僵尸網絡無關。 它只是一個方便的、既定的工具,我們可以重新使用它來向來自客戶端的發(fā)送文本數據包(這才是真正的主人)。 我稍微調整了 netcat 服務器并將其編譯為名為“master”的二進制文件。 這里不再需要工作了! 我們的主人已經準備好使用了。
奴隸讓我們繼續(xù)討論更有趣的部分:接收和執(zhí)行遠程命令(我們稍后會擔心偽裝我們的惡意軟件)。 這里的目標是使我們的從節(jié)點盡可能簡單并遵守上面詳述的要求。 請注意,在 lib/macros.h 中定義了許多常量,因此可以隨意使用它們。 所有實現(xiàn)的函數簽名都可以在 lib/connect.h 或 lib/utils.h 中找到。
1. 啟動打開 bot.c 文件。 在我們的服務器中啟動一個新節(jié)點時,我們可能應該命名它,以便 master 知道將命令部署到哪些客戶端。 可以使用許多命名約定。 使用 IP 地址可能是最好的,因為它是每個客戶端的唯一標識符。
然而,為了讓普通人更容易閱讀,讓我們使用計算機的用戶名。 使用 C 函數getenv()有論據"USER"返回計算機存儲在 USER 環(huán)境變量中的任何內容。 這是存儲用戶用戶名的一個地方,所以讓我們使用它。 另外,既然你的奴隸正在運行,讓我們找到主人。 為此,我們必須知道主人的 IP 地址。 每個網絡設備都有一個 IP 地址。 它負責識別其他節(jié)點和位置尋址。
此外,master 可以有許多服務器在不同的端口上運行。 所以,我們不僅要連接到master,還要指定正確的端口。 此端口由主設備選擇,但可以更改。 在這個 hackpack 中,我們想在本地進行測試。 因此,我們將使用您的計算機作為我們的網絡。
每臺計算機的本地 IP 地址(“l(fā)ocalhost”也解析為)是"127.0.0.1". 在 master 中,我指定它在端口上運行9999. 有了這三樣東西(主 IP 地址、主端口和從名稱),我們就可以在服務器和客戶端之間啟動一個稱為套接字的通信管道。 將這三個參數傳遞給函數init_socket()創(chuàng)建一個套接字。
init_function()不是內置的 C 命令。 相反,我們需要實施它。 然后,我們需要在堆棧上分配一些空間來保存?zhèn)魅氲南ⅰ?我們使用大約 10KB 的堆??臻g調用這個堆棧指針msg. 最后,有一個printf聲明表示一切進展順利。
char* name = //Get the client is username and store it in name int channel = //initiate a channel given SERVER, PORT, and name; //Allocate stack space of size CMD_LENGTH to hold data of type char. Call the stack pointer msg printf("%s joining the botnet\n", name);現(xiàn)在切換到 lib/connect.c。 讓我們實施init_channel(). 首先,我定義了一個名為的堆棧字符緩沖區(qū)msg長度CMD_LENGTH和一個特殊的 C 網絡結構稱為server保存有關我們與 master 連接的信息。
首先將傳入的 ip 地址從人類可讀的格式(帶有數字和點)轉換為網絡字節(jié)順序的二進制格式。 這是使用一個名為的特殊 C 函數完成的inet_addr()來自套接字庫。 它只是接收一個 ip 地址并將其以網絡可用的二進制文件形式輸出。
在 C 中,我們可以通過填寫一個名為的結構體的字段來輕松地指定一個網絡sockaddr_in.我們那個結構體的實例被稱為server. 我們需要填寫該結構體的 3 個字段:server.sin_addr.s_addr(主 IP 地址)、server.sin_family(指定通信域的 1 字節(jié)值)和 server.sin_port(我們將在主服務器上連接的端口) )。 sin_family 可以給出套接字庫提供的 C 宏。
通常,在這種情況下,我們將此字段設置為AF_INET. 這意味著我們的連接通過 IP 地址識別網絡節(jié)點,這正是我們想要的。 但是,也可以使用PF_INET這類似于AF_INET但指定網絡可以使用協(xié)議中的任何內容來識別特定節(jié)點。 兩者存在的原因還有很多假設的歷史原因,但這是我真正不知道或真正關心的事情。 只需使用AF_INET.
最后,在設置服務器端口時,我們必須通過port通過一個特殊的函數調用htons()(主機到網絡短)。 這會將數據從主機字節(jié)順序轉換為網絡字節(jié)順序。 這種字節(jié)順序混亂與稱為 Endianness 的東西有關。
最后,我們需要定義主從之間的實際連接! 為此,定義一個網絡套接字,通過它可以發(fā)送數據。 將 master 視為有許多“電源插座”。 現(xiàn)在,我們需要在 slave 上構建一個適合 master 的“墻上插座”的“插頭”。 我們可以使用套接字庫的socket()功能。 多么方便!socket()包含 3 個參數:通信域、套接字類型和協(xié)議。
對于通信領域,您可能已經猜到了:AF_INET. 對于套接字類型,我們希望我們的套接字能夠簡單地雙向傳輸數據。 因此,使用給定的宏SOCK_STREAM. 讓我們不用擔心套接字協(xié)議。 這是一個相當基本的網絡,所以讓我們使用一個值0表示默認協(xié)議。 該函數返回一個int代表套接字。 將此值存儲在頻道中。
接下來,我們要啟動我們的插座(將奴隸插入主人的墻上插座)。 調用 C 函數connect(). 這需要三個參數:通道、sockaddr 結構和結構的大小(以字節(jié)為單位)。 如果connect()返回一個正整數,你與master的連接成功! 為了測試我們新發(fā)現(xiàn)的連接,讓我們向 master 發(fā)送問候! 填充我們的消息緩沖區(qū)并使用respond()(尚未實施)發(fā)送msg通過通道回到主人。 最后,我們希望init_channel()函數返回這個成功的連接。
int init_channel (char *ip, int port, char *name) { char msg[CMD_LENGTH]; struct sockaddr_in server; server.sin_addr.s_addr = //convert the ip to network byte order server.sin_family = //set the server is communications domain server.sin_port = //convert port to network byte order int channel = //define a SOCK_STREAM socket if(channel <0) { perror ("socket:"); exit(1); } int connection_status = //use the defined channel to connect the slave to the master server if (connection_status <0) { perror ("connect:"); exit(1); } //send a greeting message back to master by loading a string into msg (hint: snprintf will come in handy) respond (channel, msg); return channel; } 2. 監(jiān)聽消息一旦從站連接到主站,它需要不斷地監(jiān)聽消息并立即根據命令采取行動。 因此,讓我們使用無限 while 循環(huán)來接收和解析這些消息。 在 bot.c 中,在printf語句,添加一個調用兩個函數的無限 while 循環(huán):recieve()和parse()以該順序。 兩個函數都取channel和msg堆棧緩沖區(qū)作為參數。 您可以在 lib/utils.h 中找到它們的函數簽名。 這應該類似于:
Infinite Loop { recieve(...); parse(...); }去 utils.c 執(zhí)行recieve()和respond().recieve()從頻道中抓取消息并respond()通過通道發(fā)回消息。respond()的參數是套接字地址,s,和我們的堆棧緩沖區(qū),msg_buf. 我們要使用 C 函數write()將堆棧緩沖區(qū)包含的任何內容寫入通道并返回其狀態(tài)。write()需要 3 個參數:套接字地址、消息緩沖區(qū)和消息長度。
int respond(int s, char *msg_buf) { //write the contents of msg_buf into socket s and return status }recieve()也是一個簡單的幫手。 重置msg緩沖區(qū)(提示:使用memset())。 現(xiàn)在,調用套接字庫函數read()閱讀消息。read()采用 3 個參數:套接字地址、消息緩沖區(qū)和消息的大預期長度。
int recieve(int s, char *msg) { //reset the msg buffer int read_status = //read contents of socket s into msg if (read_status) { perror("log:"); exit(1); } return 0; } 3. 執(zhí)行命令快完成了! 我們的僵尸網絡現(xiàn)在很無聊。 它只能通過套接字接收和傳輸消息。 讓我們讓它實際執(zhí)行它在終端上收到的內容。 我們先實現(xiàn)函數parse(). 它的作用正如其名:解析命令。 我們可以做一些簡單的錯誤檢查來查看消息是否格式錯誤。 此外,我們希望默默地忽略收到但并非有意為之的消息。 該消息將從 master 格式化為(僵尸網絡的名稱):(要執(zhí)行的命令)。 我已經為你做了前者。 如果兩項檢查都通過,讓我們將命令傳遞給execute()功能。
int parse (int s, char *msg, char* name) { char *target = msg; //check whether the msg was targetted for this client. If no, then silently drop the packet by returning 0 char *cmd = strchr(msg, ':'); if (cmd == NULL) { printf("Incorrect formatting. Reference: TARGET: command"); return -1; } //adjust the cmd pointer to the start of the actual command //adjust the terminated character to the end of the command //print a local statement detailing what command was recieved execute (s, cmd); return 0; }關鍵部分,execute()應該將它接收到的任何命令通過管道傳輸到終端并將任何輸出寫入套接字回主。 創(chuàng)建一個堆棧緩沖區(qū)來存儲每一行輸入。 然后使用popen()C函數運行輸入并將輸出存儲在文件中f(此時有很多方法可以解決這個問題。
您可以自定義您的僵尸網絡以使用主輸入做非??岬氖虑?,并與僵尸網絡中的其他節(jié)點執(zhí)行一些自主協(xié)作/更新。隨意發(fā)揮您的創(chuàng)造力。我們現(xiàn)在只會堅持我們的香草目標)。 解析通過f逐行并通過套接字轉儲所有內容。 關閉 f 就完成了!
int execute (int s, char *cmd) { FILE *f = //use popen to run the command locally if (!f) return -1; while (!feof (f)) { //parse through f line by line and send any output back to master } fclose(f); return 0; }使用以下終端命令編譯您的新僵尸網絡:
gcc -lcurl lib/connect.c lib/utils.c bot.c -o bin/slave在一個終端窗口上運行 bin/master,在其他窗口上運行 bin/slave。 輸入命令為(從用戶名):(遠程終端命令)。 恭喜! 你剛剛建立了一個僵尸網絡!
4. 偽裝你的惡意軟件你可以做一些很酷的事情來偽裝和部署惡意軟件。 事實上,它本身就是一個完整的領域。 您可以做的一個示例是將惡意軟件屏蔽為圖像。 讓我們使用熊貓的圖像。 我在 utils.c 中添加了一個簡單的函數,它可以卷曲熊貓的圖像并將其呈現(xiàn)在預覽中。 這為用戶提供了打開熊貓圖像的概念,而實際上用戶正在運行您的惡意軟件。 要添加它,請在 bot.c 中包含以下代碼行:
char* open_cmd = alias_img(); system(open_cmd); free(open_cmd);接下來,右鍵單擊任何圖像并選擇“獲取信息”。 對 bin/slave 執(zhí)行相同操作。 將圖像縮略圖拖到 bin/slave 的可執(zhí)行縮略圖上。 這應該會改變它在桌面上的外觀。 但是,我們仍然缺少特征 .png 文件結尾。 將您的可執(zhí)行文件重命名為:
panda⒈png現(xiàn)在,這看起來像一個 png 文件。 但是,我們使用 Unicode 字符“1”。 代替 ”?!?隱藏這仍然是 Unix 可執(zhí)行文件的事實。 您可以使用更多可信的 Unix 技巧,例如用于屏蔽可執(zhí)行文件名的 LEFT-TO-RIGHT OVERRIDE 字符。 在更極端的情況下,您可以在圖像和文件宏中嵌入代碼以在主機打開時同時運行(有點像特洛伊木馬......)。 然而,因為 TreeHacks 沒有人是網絡罪犯,我們不應該太在意這些技術。
5. 擴展既然您擁有一個完全可以正常工作的僵尸網絡,那么您可以使用許多擴展來挑戰(zhàn)自己。 我們的僵尸網絡仍然很無趣。 除非用戶每次都點擊它,否則它無能為力。 以下是一些建議:
(1) 實現(xiàn)持久性
如果僵尸網絡以某種方式留在計算機上,即使計算機關閉,它們也可以真正成為攻擊者惡意活動的可靠來源。 嘗試在每次啟動時重新啟動奴隸。 這樣,一旦用戶點擊惡意軟件,他/她的計算機就會被感染,直到他清除它。 實現(xiàn)這一目標的一個建議是將您的可執(zhí)行進程變成一個守護進程。 然后,生成一個配置文件,將您的可執(zhí)行文件添加到應在啟動時執(zhí)行的守護程序列表(云存儲應用程序、團隊消息傳遞平臺等已經執(zhí)行此操作)。
(2) 實現(xiàn)點對點網絡
實現(xiàn)對等網絡無非是重新安排網絡設計。 然而,P2P 網絡的關鍵是管理員/攻擊者可以通過網絡上的任何節(jié)點實現(xiàn)主控。 因此,攻擊者應該擁有某種主密鑰和加密登錄,以允許對任何節(jié)點進行主控。
(3) 添加多個級別的誤導
你實現(xiàn)的主從結構不是很安全。 通過殺死主節(jié)點可以輕松地釋放從節(jié)點。 好情況下,您將切換到 P2P 設計。 但是,您也可以在將 master 的命令部署到僵尸網絡之前,通過一系列攻擊者控制的 bot 隨機引導它的命令,從而稍微提高 master 的安全性。 這使得專家更難定位命令中心并跟蹤攻擊者節(jié)點和客戶端節(jié)點之間的僵尸網絡調用。
(4) 探索合適的網絡協(xié)議
也許,更重要的是,您想更多地玩弄網絡。 我們的網絡非常簡單。 在很多方面,它都極其薄弱,絕對不嚴謹。 因此,您可能想要探索已建立的網絡協(xié)議,例如 Internet 中繼聊天 (IRC),以構建更合適的網絡。 雖然這需要一段時間,但它極具教育意義,而且是一筆值得的投資。
(5) 嘗試實現(xiàn)自己的master
在這個 hackpack 中,我們使用了一個免費的開源項目來替代我們的主服務器。 然而,其中涉及許多缺點。 首先,我們無法自定義我們的主服務器以通過我們的網絡發(fā)送自動命令。 它僅限于使用命令行輸入。 其次,您可能已經注意到,僵尸網絡上的所有奴隸都會收到每個命令。
我們執(zhí)行的條件是檢查目標名稱是否與從站名稱匹配。 如果為 false,則該命令將被靜默刪除。 這被稱為廣播網絡。 更優(yōu)化的可能是多播網絡。 在廣播網絡中,節(jié)點將數據包中繼到其所有連接的節(jié)點。 在多播系統(tǒng)中,可以指定某個節(jié)點子集來接收數據包。 此外,使用多播網絡將命令分配從客戶端移動到它所屬的主服務器。 實現(xiàn)您自己的主節(jié)點以將僵尸網絡從廣播切換到多播。
當然,我們面對DDoS當然是可以防御的,就比如云清洗。我寫這篇文章的目的是為了讓大家更多的去了解如何防護DDoS攻擊,所以請勿用作違法行為!愿這個世界再無黑產
當前標題:僵尸網絡之如何防護DDoS攻擊
網站地址:http://jinyejixie.com/news41/204791.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供做網站、全網營銷推廣、網站建設、品牌網站設計、外貿建站、ChatGPT
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容