Dos攻击

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一.Dos攻击

1.1什么是Dos攻击?

DoS(Denial Of Service),拒绝服务的缩写,是指故意攻击网络协议实现的缺陷或直接通过野蛮手段耗尽被攻击对象的资源,目的是让目标计算机或网络无法提供正常的服务,使目标系统停止响应甚至崩溃。这些服务资源包括网络带宽,文件系统空间容量,开放的进程或者允许的连接。这种攻击会导致资源的匮乏,无论计算机的处理速度多快、内存容量多大、网络带宽的速度多快都无法避免这种攻击带来的后果。例如剪断大楼的电话线路造成用户无法通话。而以网络来说,由于频宽、网络设备和服务器主机等处理的能力都有其限制,因此当黑客产生过量的网络封包使得设备处理不及,即可让正常的使用者无法正常使用该服务。

例如黑客试图用大量封包攻击一般频宽相对小得多的拨接或 ADSL 使用者,则受害者就会发现他要连的网站连不上或是反应十分缓慢。要知道任何事物都有一个极限,所以总能找到一个方法使请求的值大于该极限值,因此就会故意导致所提供的服务资源匮乏,表面上好象是服务资源无法满足需求。所以千万不要自认为拥有了足够宽的带宽和足够快的服务器就有了一个不怕DoS攻击的高性能网站,拒绝服务攻击会使所有的资源变得非常渺小。

1.2如何进行Dos攻击及其原理

DoS 攻击方法中,又可以分为下列几种:

(1).TCP Syn Flooding

由于TCP协议连接三次握手的需要,在每个TCP建立连接时,都要发送一个带SYN标记的数据包,如果在服务器端发送应答包后,客户端不发出确认,服务器会等待到数据超时,如果大量的带SYN标记的数据包发到服务器端后都没有应答,会使服务器端的TCP资源迅速枯竭,导致正常的连接不能进入,甚至会导致服务器的系统崩溃。这就是TCP SYN Flooding 攻击的过程。

(2).Smurf

黑客采用 ICMP(Internet Control Message Protocol RFC792)技术进行攻击。常用的ICMP有 PING 。首先黑客找出网络上有哪些路由器会回应 ICMP 请求。然后用一个虚假的IP 源地址向路由器的广播地址发出讯息,路由器会把这讯息广播到网络上所连接的每一台

设备。这些设备又马上回应,这样会产生大量讯息流量,从而占用所有设备的资源及网络带宽,而回应的地址就是受攻击的目标。

(3).Fraggle:

基本概念及做法像 Smurf, 但它是采用UDP echo 讯息。

Dos攻击的基本原理是是利用合理的服务请求来占用过多的服务资源,致使服务超载,无法响应其他合法用户的请求。服务资源可以是网络带宽、文件系统空间容量、开放的进程或者向内的连接等等。这种攻击会导致资源的匮乏,所以无论计算机的处理速度多么快、内存容量多么大、互连网的速度多么快都无法避免这种攻击带来的后果。当服务资源匮乏时,对其他合法用户造成的影响就像是所请求的服务被拒绝一样。

Dos的攻击流程如下:

首先攻击者向服务器(被攻击者)发出带有虚假用户地址的合理请求,服务器回复请求后等待用户响应消息,由于用户地址是虚假的,服务器无法得到相应的用户响应,在等待一段时间(数秒)后该连接和相应的资源才会因超时而释放。在此期间连接会占用一定的服务器和网络资源,当服务器接收到过多的这种连接时就会耗尽资源而对正常用户的服务请求产生拒绝现象,由此产生拒绝服务攻击。

下面举个具体实例:

正常的两台机器使用tcp协议的通信的时候,会经过一个三次握手的过程。这样A、B 之间建立通行通道,可以进行数据传输。如果在建立握手的过程中,A对B进行欺骗,使其认为握手邀请是C发出的。(这个握手请求包就叫syn包)此时B向C发出握手回应。但是此时C不会对A反映。这样,A就必须在一段时间里保持半连接状态。以次达到消耗A资源的目的。由这个分析我们可以看到,Syn-flooding成功的关键就是那次欺骗。为了欺骗的完成,我们需要做的事情很简单,那就是伪造ip地址,然后借此向被攻击方不断发送syn 报文。这里的报文指的是ip 和tcp报文。

掌握了报文的格式,那么我们就要想办法获得报文。其实整个程序真正发挥作用的是sendto 函数。这里采用MFC中winsock2的相关函数sendto发送报文。

int sendto (

SOCKET s, //一个表识套接口的描述字

const char FAR * buf, //包含待发送数据的缓冲区。

int len, //buf长度

int flags, //调用方式标志位。

const struct sockaddr FAR * to, //指向目的套接口的地址。

int tolen //tolen就是to长了

);

我们用一个伪装的ip和tcp数据报,用sendto函数向目标地址发送。

//填充TCP伪首部用来计算TCP头部的效验和

psdHeader.saddr=ipHeader.SourceIP;

psdHeader.daddr=ipHeader.DestIP;

psdHeader.mbz=0;

psdHeader.ptcl=IPPROTO_TCP;

psdHeader.tcpl=htons(sizeof(tcpHeader));

//发送数据包

int Syn=sendto(sock, SendBuff, sizeof(ipHeader)+sizeof(tcpHeader), 0, (struct sockaddr*)&syn_in, sizeof(syn_in));

if(Syn==SOCKET_ERROR)

{ return false; }

}

但是我们需要注意的就是,在ip数据报中,存在一个叫做校验和的东西,为了使得我们精心修改的数据表能够有效发送,还需要对伪装的效验和计算,并且将它加到报表中去。这个计算依靠效验和的定义。

//计算效验和

USHORT checksum(USHORT *buffer,int size)

{ unsigned long check=0;

相关文档
最新文档