僵尸網(wǎng)絡(luò)之如何防護DDoS攻擊

2022-10-12    分類: 網(wǎng)站建設(shè)

大家好,最近看到國外有一篇和僵尸網(wǎng)絡(luò)有關(guān)的文章,今天分享給各位。

當然,我們面對DDoS當然是可以防御的,就比如云清洗。我寫這篇文章的目的是為了讓大家更多的去了解如何防護DDoS攻擊,所以請勿用作違法行為!愿這個世界再無黑產(chǎn)。

僵尸網(wǎng)絡(luò)之如何防護DDoS攻擊

簡單的 C&C 僵尸網(wǎng)絡(luò)

這個 hackpack 將引導(dǎo)您完成一個基本框架,該框架從根本上表征了僵尸網(wǎng)絡(luò)。 如果您以前使用過 C,它可能會有所幫助。 如果你喜歡這個教程,一定要給這個 repo 加星標!

注意:請勿將您在此處學到的任何內(nèi)容用于惡意目的。 這個 hackpack 只是一個用于教育目的的僵尸網(wǎng)絡(luò)案例研究。 在這個 hackpack 中學到的概念具有深遠的用例(基本上與網(wǎng)絡(luò)有關(guān)的任何事情)。 最重要的是,此 hackpack 旨在在本地進行測試和部署(因此請不要與其他黑客共享您構(gòu)建的與此 hackpack 相關(guān)的任何內(nèi)容)。 隱私很重要,所以請尊重它。

什么是僵尸網(wǎng)絡(luò)?

在構(gòu)建僵尸網(wǎng)絡(luò)之前,了解什么是僵尸網(wǎng)絡(luò)很重要。僵尸網(wǎng)絡(luò)是能夠遠程接收命令并在本地部署它們的計算機網(wǎng)絡(luò)。 或者,他們可以選擇將信息中繼回網(wǎng)絡(luò)中的其他節(jié)點。 它們已被用于從分布式拒絕服務(wù)攻擊到廣泛部署的間諜軟件的所有領(lǐng)域。

您過去可能聽說過許多僵尸網(wǎng)絡(luò)。 最突出的可能是 Mirai 和 Gameover Zeus,它們分別控制了 380 和 360 萬臺物聯(lián)網(wǎng)設(shè)備。 僵尸網(wǎng)絡(luò)執(zhí)行某些任務(wù)的方式存在很大差異。 但是為了成功構(gòu)建我們的僵尸網(wǎng)絡(luò),我們需要在我們的工作網(wǎng)絡(luò)中確保以下功能。

我們的僵尸網(wǎng)絡(luò)應(yīng)該:

包括一個控制網(wǎng)絡(luò)上所有其他節(jié)點的主節(jié)點; 在主機上部署偽裝的惡意軟件/從節(jié)點; 將命令從主節(jié)點傳輸?shù)綇墓?jié)點,執(zhí)行并將輸出返回給主節(jié)點。

這種結(jié)構(gòu)是所謂的命令與控制僵尸網(wǎng)絡(luò)的特征。 這些僵尸網(wǎng)絡(luò)有一臺主服務(wù)器和多臺從服務(wù)器。 然而,這種僵尸網(wǎng)絡(luò)風格已經(jīng)過時,可以通過切斷對主域的訪問來輕松取締。 更新和復(fù)雜的僵尸網(wǎng)絡(luò)遵循點對點架構(gòu),其中管理員權(quán)限分布在網(wǎng)絡(luò)中的所有節(jié)點或節(jié)點子集。

這些僵尸網(wǎng)絡(luò)讓安全專家非常頭疼,因為沒有中央控制點,并且可以增長到數(shù)百萬個節(jié)點。 消滅此類僵尸網(wǎng)絡(luò)本身就是一個有趣的讀物。 然而,為了這個 hackpack 的目的,讓我們保持簡單。 我們將為 C&C 僵尸網(wǎng)絡(luò)實現(xiàn)一個簡單的從節(jié)點。

執(zhí)行

這個 hackpack 將主要處理實現(xiàn)客戶端惡意軟件。 對于主服務(wù)器,我們可以使用開源 TCP 服務(wù)器調(diào)用 Netcat。 Netcat 與僵尸網(wǎng)絡(luò)無關(guān)。 它只是一個方便的、既定的工具,我們可以重新使用它來向來自客戶端的發(fā)送文本數(shù)據(jù)包(這才是真正的主人)。 我稍微調(diào)整了 netcat 服務(wù)器并將其編譯為名為“master”的二進制文件。 這里不再需要工作了! 我們的主人已經(jīng)準備好使用了。

奴隸

讓我們繼續(xù)討論更有趣的部分:接收和執(zhí)行遠程命令(我們稍后會擔心偽裝我們的惡意軟件)。 這里的目標是使我們的從節(jié)點盡可能簡單并遵守上面詳述的要求。 請注意,在 lib/macros.h 中定義了許多常量,因此可以隨意使用它們。 所有實現(xiàn)的函數(shù)簽名都可以在 lib/connect.h 或 lib/utils.h 中找到。

1. 啟動

打開 bot.c 文件。 在我們的服務(wù)器中啟動一個新節(jié)點時,我們可能應(yīng)該命名它,以便 master 知道將命令部署到哪些客戶端。 可以使用許多命名約定。 使用 IP 地址可能是最好的,因為它是每個客戶端的唯一標識符。

然而,為了讓普通人更容易閱讀,讓我們使用計算機的用戶名。 使用 C 函數(shù)getenv()有論據(jù)"USER"返回計算機存儲在 USER 環(huán)境變量中的任何內(nèi)容。 這是存儲用戶用戶名的一個地方,所以讓我們使用它。 另外,既然你的奴隸正在運行,讓我們找到主人。 為此,我們必須知道主人的 IP 地址。 每個網(wǎng)絡(luò)設(shè)備都有一個 IP 地址。 它負責識別其他節(jié)點和位置尋址。

此外,master 可以有許多服務(wù)器在不同的端口上運行。 所以,我們不僅要連接到master,還要指定正確的端口。 此端口由主設(shè)備選擇,但可以更改。 在這個 hackpack 中,我們想在本地進行測試。 因此,我們將使用您的計算機作為我們的網(wǎng)絡(luò)。

每臺計算機的本地 IP 地址(“l(fā)ocalhost”也解析為)是"127.0.0.1". 在 master 中,我指定它在端口上運行9999. 有了這三樣?xùn)|西(主 IP 地址、主端口和從名稱),我們就可以在服務(wù)器和客戶端之間啟動一個稱為套接字的通信管道。 將這三個參數(shù)傳遞給函數(shù)init_socket()創(chuàng)建一個套接字。

init_function()不是內(nèi)置的 C 命令。 相反,我們需要實施它。 然后,我們需要在堆棧上分配一些空間來保存?zhèn)魅氲南ⅰ?我們使用大約 10KB 的堆??臻g調(diào)用這個堆棧指針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 網(wǎng)絡(luò)結(jié)構(gòu)稱為server保存有關(guān)我們與 master 連接的信息。

首先將傳入的 ip 地址從人類可讀的格式(帶有數(shù)字和點)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序的二進制格式。 這是使用一個名為的特殊 C 函數(shù)完成的inet_addr()來自套接字庫。 它只是接收一個 ip 地址并將其以網(wǎng)絡(luò)可用的二進制文件形式輸出。

在 C 中,我們可以通過填寫一個名為的結(jié)構(gòu)體的字段來輕松地指定一個網(wǎng)絡(luò)sockaddr_in.我們那個結(jié)構(gòu)體的實例被稱為server. 我們需要填寫該結(jié)構(gòu)體的 3 個字段:server.sin_addr.s_addr(主 IP 地址)、server.sin_family(指定通信域的 1 字節(jié)值)和 server.sin_port(我們將在主服務(wù)器上連接的端口) )。 sin_family 可以給出套接字庫提供的 C 宏。

通常,在這種情況下,我們將此字段設(shè)置為AF_INET. 這意味著我們的連接通過 IP 地址識別網(wǎng)絡(luò)節(jié)點,這正是我們想要的。 但是,也可以使用PF_INET這類似于AF_INET但指定網(wǎng)絡(luò)可以使用協(xié)議中的任何內(nèi)容來識別特定節(jié)點。 兩者存在的原因還有很多假設(shè)的歷史原因,但這是我真正不知道或真正關(guān)心的事情。 只需使用AF_INET.

最后,在設(shè)置服務(wù)器端口時,我們必須通過port通過一個特殊的函數(shù)調(diào)用htons()(主機到網(wǎng)絡(luò)短)。 這會將數(shù)據(jù)從主機字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。 這種字節(jié)順序混亂與稱為 Endianness 的東西有關(guān)。

最后,我們需要定義主從之間的實際連接! 為此,定義一個網(wǎng)絡(luò)套接字,通過它可以發(fā)送數(shù)據(jù)。 將 master 視為有許多“電源插座”。 現(xiàn)在,我們需要在 slave 上構(gòu)建一個適合 master 的“墻上插座”的“插頭”。 我們可以使用套接字庫的socket()功能。 多么方便!socket()包含 3 個參數(shù):通信域、套接字類型和協(xié)議。

對于通信領(lǐng)域,您可能已經(jīng)猜到了:AF_INET. 對于套接字類型,我們希望我們的套接字能夠簡單地雙向傳輸數(shù)據(jù)。 因此,使用給定的宏SOCK_STREAM. 讓我們不用擔心套接字協(xié)議。 這是一個相當基本的網(wǎng)絡(luò),所以讓我們使用一個值0表示默認協(xié)議。 該函數(shù)返回一個int代表套接字。 將此值存儲在頻道中。

接下來,我們要啟動我們的插座(將奴隸插入主人的墻上插座)。 調(diào)用 C 函數(shù)connect(). 這需要三個參數(shù):通道、sockaddr 結(jié)構(gòu)和結(jié)構(gòu)的大小(以字節(jié)為單位)。 如果connect()返回一個正整數(shù),你與master的連接成功! 為了測試我們新發(fā)現(xiàn)的連接,讓我們向 master 發(fā)送問候! 填充我們的消息緩沖區(qū)并使用respond()(尚未實施)發(fā)送msg通過通道回到主人。 最后,我們希望init_channel()函數(shù)返回這個成功的連接。

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)聽消息并立即根據(jù)命令采取行動。 因此,讓我們使用無限 while 循環(huán)來接收和解析這些消息。 在 bot.c 中,在printf語句,添加一個調(diào)用兩個函數(shù)的無限 while 循環(huán):recieve()和parse()以該順序。 兩個函數(shù)都取channel和msg堆棧緩沖區(qū)作為參數(shù)。 您可以在 lib/utils.h 中找到它們的函數(shù)簽名。 這應(yīng)該類似于:

Infinite Loop { recieve(...); parse(...); }

去 utils.c 執(zhí)行recieve()和respond().recieve()從頻道中抓取消息并respond()通過通道發(fā)回消息。respond()的參數(shù)是套接字地址,s,和我們的堆棧緩沖區(qū),msg_buf. 我們要使用 C 函數(shù)write()將堆棧緩沖區(qū)包含的任何內(nèi)容寫入通道并返回其狀態(tài)。write()需要 3 個參數(shù):套接字地址、消息緩沖區(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)在,調(diào)用套接字庫函數(shù)read()閱讀消息。read()采用 3 個參數(shù):套接字地址、消息緩沖區(qū)和消息的大預(yù)期長度。

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í)行命令

快完成了! 我們的僵尸網(wǎng)絡(luò)現(xiàn)在很無聊。 它只能通過套接字接收和傳輸消息。 讓我們讓它實際執(zhí)行它在終端上收到的內(nèi)容。 我們先實現(xiàn)函數(shù)parse(). 它的作用正如其名:解析命令。 我們可以做一些簡單的錯誤檢查來查看消息是否格式錯誤。 此外,我們希望默默地忽略收到但并非有意為之的消息。 該消息將從 master 格式化為(僵尸網(wǎng)絡(luò)的名稱):(要執(zhí)行的命令)。 我已經(jīng)為你做了前者。 如果兩項檢查都通過,讓我們將命令傳遞給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; }

關(guān)鍵部分,execute()應(yīng)該將它接收到的任何命令通過管道傳輸?shù)浇K端并將任何輸出寫入套接字回主。 創(chuàng)建一個堆棧緩沖區(qū)來存儲每一行輸入。 然后使用popen()C函數(shù)運行輸入并將輸出存儲在文件中f(此時有很多方法可以解決這個問題。

您可以自定義您的僵尸網(wǎng)絡(luò)以使用主輸入做非??岬氖虑?,并與僵尸網(wǎng)絡(luò)中的其他節(jié)點執(zhí)行一些自主協(xié)作/更新。隨意發(fā)揮您的創(chuàng)造力。我們現(xiàn)在只會堅持我們的香草目標)。 解析通過f逐行并通過套接字轉(zhuǎn)儲所有內(nèi)容。 關(guān)閉 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; }

使用以下終端命令編譯您的新僵尸網(wǎng)絡(luò):

gcc -lcurl lib/connect.c lib/utils.c bot.c -o bin/slave

在一個終端窗口上運行 bin/master,在其他窗口上運行 bin/slave。 輸入命令為(從用戶名):(遠程終端命令)。 恭喜! 你剛剛建立了一個僵尸網(wǎng)絡(luò)!

4. 偽裝你的惡意軟件

你可以做一些很酷的事情來偽裝和部署惡意軟件。 事實上,它本身就是一個完整的領(lǐng)域。 您可以做的一個示例是將惡意軟件屏蔽為圖像。 讓我們使用熊貓的圖像。 我在 utils.c 中添加了一個簡單的函數(shù),它可以卷曲熊貓的圖像并將其呈現(xiàn)在預(yù)覽中。 這為用戶提供了打開熊貓圖像的概念,而實際上用戶正在運行您的惡意軟件。 要添加它,請在 bot.c 中包含以下代碼行:

char* open_cmd = alias_img(); system(open_cmd); free(open_cmd);

接下來,右鍵單擊任何圖像并選擇“獲取信息”。 對 bin/slave 執(zhí)行相同操作。 將圖像縮略圖拖到 bin/slave 的可執(zhí)行縮略圖上。 這應(yīng)該會改變它在桌面上的外觀。 但是,我們?nèi)匀蝗鄙偬卣?.png 文件結(jié)尾。 將您的可執(zhí)行文件重命名為:

panda⒈png

現(xiàn)在,這看起來像一個 png 文件。 但是,我們使用 Unicode 字符“1”。 代替 ”?!?隱藏這仍然是 Unix 可執(zhí)行文件的事實。 您可以使用更多可信的 Unix 技巧,例如用于屏蔽可執(zhí)行文件名的 LEFT-TO-RIGHT OVERRIDE 字符。 在更極端的情況下,您可以在圖像和文件宏中嵌入代碼以在主機打開時同時運行(有點像特洛伊木馬......)。 然而,因為 TreeHacks 沒有人是網(wǎng)絡(luò)罪犯,我們不應(yīng)該太在意這些技術(shù)。

5. 擴展

既然您擁有一個完全可以正常工作的僵尸網(wǎng)絡(luò),那么您可以使用許多擴展來挑戰(zhàn)自己。 我們的僵尸網(wǎng)絡(luò)仍然很無趣。 除非用戶每次都點擊它,否則它無能為力。 以下是一些建議:

(1) 實現(xiàn)持久性

如果僵尸網(wǎng)絡(luò)以某種方式留在計算機上,即使計算機關(guān)閉,它們也可以真正成為攻擊者惡意活動的可靠來源。 嘗試在每次啟動時重新啟動奴隸。 這樣,一旦用戶點擊惡意軟件,他/她的計算機就會被感染,直到他清除它。 實現(xiàn)這一目標的一個建議是將您的可執(zhí)行進程變成一個守護進程。 然后,生成一個配置文件,將您的可執(zhí)行文件添加到應(yīng)在啟動時執(zhí)行的守護程序列表(云存儲應(yīng)用程序、團隊消息傳遞平臺等已經(jīng)執(zhí)行此操作)。

(2) 實現(xiàn)點對點網(wǎng)絡(luò)

實現(xiàn)對等網(wǎng)絡(luò)無非是重新安排網(wǎng)絡(luò)設(shè)計。 然而,P2P 網(wǎng)絡(luò)的關(guān)鍵是管理員/攻擊者可以通過網(wǎng)絡(luò)上的任何節(jié)點實現(xiàn)主控。 因此,攻擊者應(yīng)該擁有某種主密鑰和加密登錄,以允許對任何節(jié)點進行主控。

(3) 添加多個級別的誤導(dǎo)

你實現(xiàn)的主從結(jié)構(gòu)不是很安全。 通過殺死主節(jié)點可以輕松地釋放從節(jié)點。 好情況下,您將切換到 P2P 設(shè)計。 但是,您也可以在將 master 的命令部署到僵尸網(wǎng)絡(luò)之前,通過一系列攻擊者控制的 bot 隨機引導(dǎo)它的命令,從而稍微提高 master 的安全性。 這使得專家更難定位命令中心并跟蹤攻擊者節(jié)點和客戶端節(jié)點之間的僵尸網(wǎng)絡(luò)調(diào)用。

(4) 探索合適的網(wǎng)絡(luò)協(xié)議

也許,更重要的是,您想更多地玩弄網(wǎng)絡(luò)。 我們的網(wǎng)絡(luò)非常簡單。 在很多方面,它都極其薄弱,絕對不嚴謹。 因此,您可能想要探索已建立的網(wǎng)絡(luò)協(xié)議,例如 Internet 中繼聊天 (IRC),以構(gòu)建更合適的網(wǎng)絡(luò)。 雖然這需要一段時間,但它極具教育意義,而且是一筆值得的投資。

(5) 嘗試實現(xiàn)自己的master

在這個 hackpack 中,我們使用了一個免費的開源項目來替代我們的主服務(wù)器。 然而,其中涉及許多缺點。 首先,我們無法自定義我們的主服務(wù)器以通過我們的網(wǎng)絡(luò)發(fā)送自動命令。 它僅限于使用命令行輸入。 其次,您可能已經(jīng)注意到,僵尸網(wǎng)絡(luò)上的所有奴隸都會收到每個命令。

我們執(zhí)行的條件是檢查目標名稱是否與從站名稱匹配。 如果為 false,則該命令將被靜默刪除。 這被稱為廣播網(wǎng)絡(luò)。 更優(yōu)化的可能是多播網(wǎng)絡(luò)。 在廣播網(wǎng)絡(luò)中,節(jié)點將數(shù)據(jù)包中繼到其所有連接的節(jié)點。 在多播系統(tǒng)中,可以指定某個節(jié)點子集來接收數(shù)據(jù)包。 此外,使用多播網(wǎng)絡(luò)將命令分配從客戶端移動到它所屬的主服務(wù)器。 實現(xiàn)您自己的主節(jié)點以將僵尸網(wǎng)絡(luò)從廣播切換到多播。

當然,我們面對DDoS當然是可以防御的,就比如云清洗。我寫這篇文章的目的是為了讓大家更多的去了解如何防護DDoS攻擊,所以請勿用作違法行為!愿這個世界再無黑產(chǎn)

當前標題:僵尸網(wǎng)絡(luò)之如何防護DDoS攻擊
網(wǎng)站地址:http://www.muchs.cn/news41/204791.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計、外貿(mào)建站、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司