论文部分内容阅读
摘要:阐述了DDoS攻击的原理与方法,详细介绍了DDos攻击的实现。
关键词:拒绝服务;DDoS;DDoS攻击
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)23-881-02
随着网络技术和网络应用的发展,网络安全问题显得越来越重要。拒绝服务攻击由于具有容易实施、难以防范、难以追踪等特点而成为最难解决的网络安全问题之一,给网络社会带来了极大的危害。同时,拒绝服务攻击也将是未来信息战的重要手段之一。因此,研究拒绝服务攻击及其对策是极为重要的。文章阐述了DDoS攻击的原理与方法,详细介绍了DDos攻击的实现。
1 DDoS 攻击技术
1.1 什么是DDoS
DDoS(分布式拒绝服务),它的英文全称为Distributed Denial of Service,它是一种基于DoS的特殊形式的拒绝服务攻击,是一种分布、协作的大规模攻击方式。
1.2 DDoS的攻击原理
首先攻击者向服务器发送众多的带有虚假地址的请求,服务器发送回复信息后等待回传信息,由于地址是伪造的,所以服务器一直等不到回传的消息,分配给这次请求的资源就始终没有被释放。当服务器等待一定的时间后,连接会因超时而被切断,攻击者会再度传送新的一批请求,在这种反复发送伪地址请求的情况下,服务器资源最终会被耗尽。
DDoS采用一种三层客户机/服务器结构,包括攻击主控机,攻击操纵机,攻击代理机三层。如图1所示。
1.3 DDoS的攻击过程
1.3.1 准备阶段,收集目标信息
通常,攻击者的攻击并非盲目地胡乱进行的,他不会用一台通过Modem连接的PC机去轰炸(flooding)一个大型网站(当然,如果该网站有一些漏洞使得剧毒包型攻击也能奏效的话,用一台PC 机通过剧毒包攻击大型网站奏效的情况也是存在的。因此,在攻击发生前,攻击者需要先对目标进行侦察,如利用扫描工具对目标进行扫描。
1.3.2 占领傀儡机和控制台
在DDoS中,攻击者可以通过自己的机器直接对目标发起攻击,这样攻击者可能会冒着被发现的风险。通常,为了掩蔽自己不被发现,攻击者需要占领一些傀儡机,用来实施攻击。另外,为了达到需要的攻击力度,单靠一台或数台机器对一个大型系统的攻击是不够的,因此攻击者也需要大量的傀儡机器用于增强攻击的“火力”。
1.3.3 攻击的实施
在前面的准备工作完成之后,实际的攻击过程却相对比较简单,攻击者只需通过控制台向傀儡机发出指令,令其立即或在某个时间向指定的受害者大量发送特定的攻击数据包即可[1]。
2 DDoS攻击的实现
2.1 拒绝服务攻击的检测方法
一般说来,同任何攻击一样,如果能够越早地检测出拒绝服务攻击,而不是等到受害者系统无法响应时才发觉攻击的存在,则对拒绝服务攻击的防范会有更多的帮助。
单独看起来,风暴型拒绝服务攻击的数据包与正常的数据包是没有什么两样的。因此,对数据包进行孤立地检测的方法是无法检测风暴型拒绝服务攻击的。对于风暴型攻击,唯有通过统计分析才能奏效。
2.2 SYN Flood的攻击方法
2.2.1 什么是SYN Flood攻击
SYN Flood攻击是一种典型的拒绝服务型(Denial of Service)攻击。所谓拒绝服务型攻击就是通过进行攻击,使受害主机或网络不能够良好的提供服务,从而间接达到攻击的目的。
SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击。大家知道协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN 包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK包回去,这样三次握手就结束了。我们把TCP连接的发起方叫作TCP客户机(TCP Client),TCP连接的接收方叫作TCP服务器(TCP Server)。值得注意的是在TCP服务器收到TCP SYN request包时,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即将形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连接状态成为半开连接(Half-open Connection)。
2.2.2 三次握手建立TCP连接
TCP是面向连接的协议。在连接建立的过程中要解决以下三个问题:①要是每一方能够确知对方的存在。②要允许双方协商一些参数(如最大报文段长度、最大窗口大小、服务质量等)。③能够运输实体资源(如缓存大小、连接表中的项目等)进行分配[2]。
第一次握手:建立连接时,客户端发送syn包(SEQ=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
2.2.3 功能需求分析
需求分析是软件定义时期的最后一个阶段,它的基本任务是准确回答“系统必须做什么?”这个问题。需求分析的结果是系统开发的基础,关系到工程的成败和软件产品的质量。因此用行之有效的对软件需求进行严格的审查验收。
SYN Flood为最常见的DDoS攻击,因此需要编制一个程序能够实现多线程的SYN数据包的发送。
2.3 系统功能函数的编程实现
2.3.1 数据包生成模块setup
用于进行初始设置,计算特定ip,特定端口,特定tcp序列号的检验和,生成数据包。如下代码作用为填充IP首部:
wsprintf( src_ip, "%d.%d.%d.%d", rand() % 250 + 1, rand() % 250 + 1, rand() % 250 + 1, rand() % 250 + 1 );
IpHeader.h_verlen = (4<<4 | sizeof(IpHeader)/sizeof(unsigned long));
IpHeader.tos = 0;
IpHeader.total_len = htons(sizeof(IpHeader)+sizeof(TcpHeader));
IpHeader.ident = 1;
IpHeader.frag_and_flags = 0x40;
IpHeader.ttl = 128;
IpHeader.proto = IPPROTO_TCP;
IpHeader.checksum = 0;
IpHeader.sourceIP = inet_addr(src_ip);
IpHeader.destIP = inet_addr(dst_ip);
2.3.2 数据包发送函数send_packet
send_packet函数负责向目标主机发送SYN数据包。如下代码:
int Ret = sendto(SendSocket, SendBuff[Tmp], sizeof(IP_HEADER) + sizeof(TCP_HEADER), 0, (struct sockaddr *) &Sin, sizeof(Sin));
if (Ret == SOCKET_ERROR)
{ printf("ErrorCode:%d\n", GetLastError());
CurrentThread--;
return 0; }
else
{CurrentThread--;
return 1; }
2.3.3 线程监测函数watchthread
watchthread函数用于检测当前线程数量,如果大于等于最大线程树林则休眠0.1秒等待其它线程的退出。实现代码如下:
void watchthread()
{ for (;; ) {if ( CurrentThread >= MaxThread ) { Sleep(100); } else break; }
2.4 计算检验和函数CheckSum
CheckSum 函数用于计算检验和并返回检验和。检验和字段检验的范围包括首部和数据这两个部分。为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16 bit的二进制反码进行求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16 bit的二进制反码进行求和。原代码如下:
USHORTchecksum(USHORT * buffer, int size)
{ unsignedlongcksum = 0;while (size > 1) { cksum += *buffer++;
size -= sizeof(USHORT); } if (size) { cksum += *(UCHAR *) buffer; }
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);return (USHORT) (~cksum); }
2.5 出错处理模块
if ( WSAStartup(MAKEWORD(2, 2), &WSAData) != 0 ) { printf( "初始化WSAStartu失败\n" ); return -1; }
参考文献:
[1] 曹爱鹃,刘爆旭,许榕生.网络陷阱与诱捕防御技术综述[J].计算机工程,2004,9(30):4.
[2] 谢希仁.计算机网络[M].3版.大连:大连理工大学出版社,2000:121-135.881,
关键词:拒绝服务;DDoS;DDoS攻击
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)23-881-02
随着网络技术和网络应用的发展,网络安全问题显得越来越重要。拒绝服务攻击由于具有容易实施、难以防范、难以追踪等特点而成为最难解决的网络安全问题之一,给网络社会带来了极大的危害。同时,拒绝服务攻击也将是未来信息战的重要手段之一。因此,研究拒绝服务攻击及其对策是极为重要的。文章阐述了DDoS攻击的原理与方法,详细介绍了DDos攻击的实现。
1 DDoS 攻击技术
1.1 什么是DDoS
DDoS(分布式拒绝服务),它的英文全称为Distributed Denial of Service,它是一种基于DoS的特殊形式的拒绝服务攻击,是一种分布、协作的大规模攻击方式。
1.2 DDoS的攻击原理
首先攻击者向服务器发送众多的带有虚假地址的请求,服务器发送回复信息后等待回传信息,由于地址是伪造的,所以服务器一直等不到回传的消息,分配给这次请求的资源就始终没有被释放。当服务器等待一定的时间后,连接会因超时而被切断,攻击者会再度传送新的一批请求,在这种反复发送伪地址请求的情况下,服务器资源最终会被耗尽。
DDoS采用一种三层客户机/服务器结构,包括攻击主控机,攻击操纵机,攻击代理机三层。如图1所示。
1.3 DDoS的攻击过程
1.3.1 准备阶段,收集目标信息
通常,攻击者的攻击并非盲目地胡乱进行的,他不会用一台通过Modem连接的PC机去轰炸(flooding)一个大型网站(当然,如果该网站有一些漏洞使得剧毒包型攻击也能奏效的话,用一台PC 机通过剧毒包攻击大型网站奏效的情况也是存在的。因此,在攻击发生前,攻击者需要先对目标进行侦察,如利用扫描工具对目标进行扫描。
1.3.2 占领傀儡机和控制台
在DDoS中,攻击者可以通过自己的机器直接对目标发起攻击,这样攻击者可能会冒着被发现的风险。通常,为了掩蔽自己不被发现,攻击者需要占领一些傀儡机,用来实施攻击。另外,为了达到需要的攻击力度,单靠一台或数台机器对一个大型系统的攻击是不够的,因此攻击者也需要大量的傀儡机器用于增强攻击的“火力”。
1.3.3 攻击的实施
在前面的准备工作完成之后,实际的攻击过程却相对比较简单,攻击者只需通过控制台向傀儡机发出指令,令其立即或在某个时间向指定的受害者大量发送特定的攻击数据包即可[1]。
2 DDoS攻击的实现
2.1 拒绝服务攻击的检测方法
一般说来,同任何攻击一样,如果能够越早地检测出拒绝服务攻击,而不是等到受害者系统无法响应时才发觉攻击的存在,则对拒绝服务攻击的防范会有更多的帮助。
单独看起来,风暴型拒绝服务攻击的数据包与正常的数据包是没有什么两样的。因此,对数据包进行孤立地检测的方法是无法检测风暴型拒绝服务攻击的。对于风暴型攻击,唯有通过统计分析才能奏效。
2.2 SYN Flood的攻击方法
2.2.1 什么是SYN Flood攻击
SYN Flood攻击是一种典型的拒绝服务型(Denial of Service)攻击。所谓拒绝服务型攻击就是通过进行攻击,使受害主机或网络不能够良好的提供服务,从而间接达到攻击的目的。
SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击。大家知道协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN 包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK包回去,这样三次握手就结束了。我们把TCP连接的发起方叫作TCP客户机(TCP Client),TCP连接的接收方叫作TCP服务器(TCP Server)。值得注意的是在TCP服务器收到TCP SYN request包时,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即将形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连接状态成为半开连接(Half-open Connection)。
2.2.2 三次握手建立TCP连接
TCP是面向连接的协议。在连接建立的过程中要解决以下三个问题:①要是每一方能够确知对方的存在。②要允许双方协商一些参数(如最大报文段长度、最大窗口大小、服务质量等)。③能够运输实体资源(如缓存大小、连接表中的项目等)进行分配[2]。
第一次握手:建立连接时,客户端发送syn包(SEQ=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
2.2.3 功能需求分析
需求分析是软件定义时期的最后一个阶段,它的基本任务是准确回答“系统必须做什么?”这个问题。需求分析的结果是系统开发的基础,关系到工程的成败和软件产品的质量。因此用行之有效的对软件需求进行严格的审查验收。
SYN Flood为最常见的DDoS攻击,因此需要编制一个程序能够实现多线程的SYN数据包的发送。
2.3 系统功能函数的编程实现
2.3.1 数据包生成模块setup
用于进行初始设置,计算特定ip,特定端口,特定tcp序列号的检验和,生成数据包。如下代码作用为填充IP首部:
wsprintf( src_ip, "%d.%d.%d.%d", rand() % 250 + 1, rand() % 250 + 1, rand() % 250 + 1, rand() % 250 + 1 );
IpHeader.h_verlen = (4<<4 | sizeof(IpHeader)/sizeof(unsigned long));
IpHeader.tos = 0;
IpHeader.total_len = htons(sizeof(IpHeader)+sizeof(TcpHeader));
IpHeader.ident = 1;
IpHeader.frag_and_flags = 0x40;
IpHeader.ttl = 128;
IpHeader.proto = IPPROTO_TCP;
IpHeader.checksum = 0;
IpHeader.sourceIP = inet_addr(src_ip);
IpHeader.destIP = inet_addr(dst_ip);
2.3.2 数据包发送函数send_packet
send_packet函数负责向目标主机发送SYN数据包。如下代码:
int Ret = sendto(SendSocket, SendBuff[Tmp], sizeof(IP_HEADER) + sizeof(TCP_HEADER), 0, (struct sockaddr *) &Sin, sizeof(Sin));
if (Ret == SOCKET_ERROR)
{ printf("ErrorCode:%d\n", GetLastError());
CurrentThread--;
return 0; }
else
{CurrentThread--;
return 1; }
2.3.3 线程监测函数watchthread
watchthread函数用于检测当前线程数量,如果大于等于最大线程树林则休眠0.1秒等待其它线程的退出。实现代码如下:
void watchthread()
{ for (;; ) {if ( CurrentThread >= MaxThread ) { Sleep(100); } else break; }
2.4 计算检验和函数CheckSum
CheckSum 函数用于计算检验和并返回检验和。检验和字段检验的范围包括首部和数据这两个部分。为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16 bit的二进制反码进行求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16 bit的二进制反码进行求和。原代码如下:
USHORTchecksum(USHORT * buffer, int size)
{ unsignedlongcksum = 0;while (size > 1) { cksum += *buffer++;
size -= sizeof(USHORT); } if (size) { cksum += *(UCHAR *) buffer; }
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);return (USHORT) (~cksum); }
2.5 出错处理模块
if ( WSAStartup(MAKEWORD(2, 2), &WSAData) != 0 ) { printf( "初始化WSAStartu失败\n" ); return -1; }
参考文献:
[1] 曹爱鹃,刘爆旭,许榕生.网络陷阱与诱捕防御技术综述[J].计算机工程,2004,9(30):4.
[2] 谢希仁.计算机网络[M].3版.大连:大连理工大学出版社,2000:121-135.881,