摘要:闡述了DDoS攻擊的原理與方法,詳細(xì)介紹了DDos攻擊的實(shí)現(xiàn)。
關(guān)鍵詞:拒絕服務(wù);DDoS;DDoS攻擊
中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)23-881-02
隨著網(wǎng)絡(luò)技術(shù)和網(wǎng)絡(luò)應(yīng)用的發(fā)展,網(wǎng)絡(luò)安全問(wèn)題顯得越來(lái)越重要。拒絕服務(wù)攻擊由于具有容易實(shí)施、難以防范、難以追蹤等特點(diǎn)而成為最難解決的網(wǎng)絡(luò)安全問(wèn)題之一,給網(wǎng)絡(luò)社會(huì)帶來(lái)了極大的危害。同時(shí),拒絕服務(wù)攻擊也將是未來(lái)信息戰(zhàn)的重要手段之一。因此,研究拒絕服務(wù)攻擊及其對(duì)策是極為重要的。文章闡述了DDoS攻擊的原理與方法,詳細(xì)介紹了DDos攻擊的實(shí)現(xiàn)。
1 DDoS 攻擊技術(shù)
1.1 什么是DDoS
DDoS(分布式拒絕服務(wù)),它的英文全稱為Distributed Denial of Service,它是一種基于DoS的特殊形式的拒絕服務(wù)攻擊,是一種分布、協(xié)作的大規(guī)模攻擊方式。
1.2 DDoS的攻擊原理
首先攻擊者向服務(wù)器發(fā)送眾多的帶有虛假地址的請(qǐng)求,服務(wù)器發(fā)送回復(fù)信息后等待回傳信息,由于地址是偽造的,所以服務(wù)器一直等不到回傳的消息,分配給這次請(qǐng)求的資源就始終沒(méi)有被釋放。當(dāng)服務(wù)器等待一定的時(shí)間后,連接會(huì)因超時(shí)而被切斷,攻擊者會(huì)再度傳送新的一批請(qǐng)求,在這種反復(fù)發(fā)送偽地址請(qǐng)求的情況下,服務(wù)器資源最終會(huì)被耗盡。
DDoS采用一種三層客戶機(jī)/服務(wù)器結(jié)構(gòu),包括攻擊主控機(jī),攻擊操縱機(jī),攻擊代理機(jī)三層。如圖1所示。
1.3 DDoS的攻擊過(guò)程
1.3.1 準(zhǔn)備階段,收集目標(biāo)信息
通常,攻擊者的攻擊并非盲目地胡亂進(jìn)行的,他不會(huì)用一臺(tái)通過(guò)Modem連接的PC機(jī)去轟炸(flooding)一個(gè)大型網(wǎng)站(當(dāng)然,如果該網(wǎng)站有一些漏洞使得劇毒包型攻擊也能奏效的話,用一臺(tái)PC 機(jī)通過(guò)劇毒包攻擊大型網(wǎng)站奏效的情況也是存在的。因此,在攻擊發(fā)生前,攻擊者需要先對(duì)目標(biāo)進(jìn)行偵察,如利用掃描工具對(duì)目標(biāo)進(jìn)行掃描。
1.3.2 占領(lǐng)傀儡機(jī)和控制臺(tái)
在DDoS中,攻擊者可以通過(guò)自己的機(jī)器直接對(duì)目標(biāo)發(fā)起攻擊,這樣攻擊者可能會(huì)冒著被發(fā)現(xiàn)的風(fēng)險(xiǎn)。通常,為了掩蔽自己不被發(fā)現(xiàn),攻擊者需要占領(lǐng)一些傀儡機(jī),用來(lái)實(shí)施攻擊。另外,為了達(dá)到需要的攻擊力度,單靠一臺(tái)或數(shù)臺(tái)機(jī)器對(duì)一個(gè)大型系統(tǒng)的攻擊是不夠的,因此攻擊者也需要大量的傀儡機(jī)器用于增強(qiáng)攻擊的“火力”。
1.3.3 攻擊的實(shí)施
在前面的準(zhǔn)備工作完成之后,實(shí)際的攻擊過(guò)程卻相對(duì)比較簡(jiǎn)單,攻擊者只需通過(guò)控制臺(tái)向傀儡機(jī)發(fā)出指令,令其立即或在某個(gè)時(shí)間向指定的受害者大量發(fā)送特定的攻擊數(shù)據(jù)包即可[1]。
2 DDoS攻擊的實(shí)現(xiàn)
2.1 拒絕服務(wù)攻擊的檢測(cè)方法
一般說(shuō)來(lái),同任何攻擊一樣,如果能夠越早地檢測(cè)出拒絕服務(wù)攻擊,而不是等到受害者系統(tǒng)無(wú)法響應(yīng)時(shí)才發(fā)覺(jué)攻擊的存在,則對(duì)拒絕服務(wù)攻擊的防范會(huì)有更多的幫助。
單獨(dú)看起來(lái),風(fēng)暴型拒絕服務(wù)攻擊的數(shù)據(jù)包與正常的數(shù)據(jù)包是沒(méi)有什么兩樣的。因此,對(duì)數(shù)據(jù)包進(jìn)行孤立地檢測(cè)的方法是無(wú)法檢測(cè)風(fēng)暴型拒絕服務(wù)攻擊的。對(duì)于風(fēng)暴型攻擊,唯有通過(guò)統(tǒng)計(jì)分析才能奏效。
2.2 SYN Flood的攻擊方法
2.2.1 什么是SYN Flood攻擊
SYN Flood攻擊是一種典型的拒絕服務(wù)型(Denial of Service)攻擊。所謂拒絕服務(wù)型攻擊就是通過(guò)進(jìn)行攻擊,使受害主機(jī)或網(wǎng)絡(luò)不能夠良好的提供服務(wù),從而間接達(dá)到攻擊的目的。
SYN Flood攻擊利用的是IPv4中TCP協(xié)議的三次握手(Three-Way Handshake)過(guò)程進(jìn)行的攻擊。大家知道協(xié)議規(guī)定,如果一端想向另一端發(fā)起TCP連接,它需要首先發(fā)送TCP SYN 包到對(duì)方,對(duì)方收到后發(fā)送一個(gè)TCP SYN+ACK包回來(lái),發(fā)起方再發(fā)送TCP ACK包回去,這樣三次握手就結(jié)束了。我們把TCP連接的發(fā)起方叫作TCP客戶機(jī)(TCP Client),TCP連接的接收方叫作TCP服務(wù)器(TCP Server)。值得注意的是在TCP服務(wù)器收到TCP SYN request包時(shí),在發(fā)送TCP SYN+ACK包回TCP客戶機(jī)前,TCP服務(wù)器要先分配好一個(gè)數(shù)據(jù)區(qū)專門服務(wù)于這個(gè)即將形成的TCP連接。一般把收到SYN包而還未收到ACK包時(shí)的連接狀態(tài)成為半開(kāi)連接(Half-open Connection)。
2.2.2 三次握手建立TCP連接
TCP是面向連接的協(xié)議。在連接建立的過(guò)程中要解決以下三個(gè)問(wèn)題:①要是每一方能夠確知對(duì)方的存在。②要允許雙方協(xié)商一些參數(shù)(如最大報(bào)文段長(zhǎng)度、最大窗口大小、服務(wù)質(zhì)量等)。③能夠運(yùn)輸實(shí)體資源(如緩存大小、連接表中的項(xiàng)目等)進(jìn)行分配[2]。
第一次握手:建立連接時(shí),客戶端發(fā)送syn包(SEQ=x)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=x+1),同時(shí)自己也發(fā)送一個(gè)SYN包(SEQ=y),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=y+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。
2.2.3 功能需求分析
需求分析是軟件定義時(shí)期的最后一個(gè)階段,它的基本任務(wù)是準(zhǔn)確回答“系統(tǒng)必須做什么?”這個(gè)問(wèn)題。需求分析的結(jié)果是系統(tǒng)開(kāi)發(fā)的基礎(chǔ),關(guān)系到工程的成敗和軟件產(chǎn)品的質(zhì)量。因此用行之有效的對(duì)軟件需求進(jìn)行嚴(yán)格的審查驗(yàn)收。
SYN Flood為最常見(jiàn)的DDoS攻擊,因此需要編制一個(gè)程序能夠?qū)崿F(xiàn)多線程的SYN數(shù)據(jù)包的發(fā)送。
2.3 系統(tǒng)功能函數(shù)的編程實(shí)現(xiàn)
2.3.1 數(shù)據(jù)包生成模塊setup
用于進(jìn)行初始設(shè)置,計(jì)算特定ip,特定端口,特定tcp序列號(hào)的檢驗(yàn)和,生成數(shù)據(jù)包。如下代碼作用為填充IP首部:
wsprintf( src_ip, \"%d.%d.%d.%d\", rand() % 250 + 1, rand() % 250 + 1, rand() % 250 + 1, rand() % 250 + 1 );
IpHeader.h_verlen = (4<<4 | sizeof(IpHeader)/sizeof(unsigned long));
IpHeader.tos = 0;
IpHeader.total_len = htons(sizeof(IpHeader)+sizeof(TcpHeader));
IpHeader.ident = 1;
IpHeader.frag_and_flags = 0x40;
IpHeader.ttl = 128;
IpHeader.proto = IPPROTO_TCP;
IpHeader.checksum = 0;
IpHeader.sourceIP = inet_addr(src_ip);
IpHeader.destIP = inet_addr(dst_ip);
2.3.2 數(shù)據(jù)包發(fā)送函數(shù)send_packet
send_packet函數(shù)負(fù)責(zé)向目標(biāo)主機(jī)發(fā)送SYN數(shù)據(jù)包。如下代碼:
int Ret = sendto(SendSocket, SendBuff[Tmp], sizeof(IP_HEADER) + sizeof(TCP_HEADER), 0, (struct sockaddr *) Sin, sizeof(Sin));
if (Ret == SOCKET_ERROR)
{ printf(\"ErrorCode:%d\\", GetLastError());
CurrentThread--;
return 0; }
else
{CurrentThread--;
return 1; }
2.3.3 線程監(jiān)測(cè)函數(shù)watchthread
watchthread函數(shù)用于檢測(cè)當(dāng)前線程數(shù)量,如果大于等于最大線程樹(shù)林則休眠0.1秒等待其它線程的退出。實(shí)現(xiàn)代碼如下:
void watchthread()
{ for (;; ) {if ( CurrentThread >= MaxThread ) { Sleep(100); } else break; }
2.4 計(jì)算檢驗(yàn)和函數(shù)CheckSum
CheckSum 函數(shù)用于計(jì)算檢驗(yàn)和并返回檢驗(yàn)和。檢驗(yàn)和字段檢驗(yàn)的范圍包括首部和數(shù)據(jù)這兩個(gè)部分。為了計(jì)算一份數(shù)據(jù)報(bào)的IP檢驗(yàn)和,首先把檢驗(yàn)和字段置為0。然后,對(duì)首部中每個(gè)16 bit的二進(jìn)制反碼進(jìn)行求和(整個(gè)首部看成是由一串16 bit的字組成),結(jié)果存在檢驗(yàn)和字段中。當(dāng)收到一份IP數(shù)據(jù)報(bào)后,同樣對(duì)首部中每個(gè)16 bit的二進(jìn)制反碼進(jìn)行求和。原代碼如下:
USHORTchecksum(USHORT * buffer, int size)
{ unsignedlongcksum = 0;while (size > 1) { cksum += *buffer++;
size -= sizeof(USHORT); } if (size) { cksum += *(UCHAR *) buffer; }
cksum = (cksum >> 16) + (cksum 0xffff);
cksum += (cksum >> 16);return (USHORT) (~cksum); }
2.5 出錯(cuò)處理模塊
if ( WSAStartup(MAKEWORD(2, 2), WSAData) != 0 ) { printf( \"初始化WSAStartu失敗\\" ); return -1; }
參考文獻(xiàn):
[1] 曹愛(ài)鵑,劉爆旭,許榕生.網(wǎng)絡(luò)陷阱與誘捕防御技術(shù)綜述[J].計(jì)算機(jī)工程,2004,9(30):4.
[2] 謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)[M].3版.大連:大連理工大學(xué)出版社,2000:121-135.881,