DOS攻击原理以及常见方法介绍
已经有很多介绍DOS(Denial of Service,即拒绝服务)攻击的文章,但是,多数人还是不知道DOS到底是什么,它到底是怎么实现的。本文主要介绍DOS的机理和常见的实施方法。因前段时间仔细了解了TCP/IP协议以及RFC文档,有点心得。同时,文中有部分内容参考了Shaft的文章翻译而得。要想了解DOS攻击得实现机理,必须对TCP有一定的了解。
1、什么是DOS攻击
DOS:即Denial Of Service,拒绝服务的缩写,可不能认为是微软的dos操作系统了。好象在5·1的时候闹过这样的笑话。拒绝服务,就相当于必胜客在客满的时候不再让人进去一样,呵呵,你想吃馅饼,就必须在门口等吧。DOS攻击即让目标机器停止提供服务或资源访问。
2、有关TCP协议的东西
TCP(transmission control protocol,传输控制协议),是用来在不可靠的因特网上提供可靠的、端到端的字节流通讯协议,在RFC793中有正式定义,还有一些解决错误的东西在RFC 1122中有记录,RFC 1323则有TCP的功能扩展。我们常见到的TCP/IP协议中,IP层不保证将数据报正确传送到目的地,TCP则从本地机器接受用户的数据流,将其分成不超过64K字节的数据片段,将每个数据片段作为单独的IP数据包发送出去,最后在目的地机器中再组合成完整的字节流,TCP协议必须保证可靠性。发送和接收方的TCP传输以数据段的形式交换数据,一个数据段包括一个固定的20字节,加上可选部分,后面再跟上数据,TCP协议从发送方传送一个数据段的时候,还要启动计时器,当数据段到达目的地后,接收方还要发送回一个数据段,其中有一个确认序号,它等于希望收到的下一个数据段的顺序号,如果计时器在确认信息到达前超时了,发送方会重新发送这个数据段。
上面,我们总体上了解一点TCP协议,重要的是要熟悉TCP的数据头(header)。因为数据流的传输最重要的就是header里面的东西,至于发送的数据,只是header附带上的。客户端和服务端的服务响应就是同header里面的数据相关,两端的信息交流和交换是根据header中的内容实施的,因此,要实现DOS,就必须对header中的内容非常熟悉。
下面是TCP数据段头格式。RFC793中的
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP Header Format
Source Port和 Destination Port :是本地端口和目标端口
Sequence Number 和 Acknowledgment Number :是顺序号和确认号,确认号是希望接收的字节号。这都是32位的,在TCP流中,每个数据字节都被编号。
Data offset :表明TCP头包含多少个32位字,用来确定头的长度,因为头中可选字段长度是不定的。
Reserved : 保留的6位,现在没用,都是0
接下来是6个1位的标志,这是两个计算机数据交流的信息标志。接收和发送断根据这些标志来确定信息流的种类。下面是一些介绍:
URG:(Urgent Pointer field significant)紧急指针。用到的时候值为1,用来处理避免TCP数据流中断
ACK:(Acknowledgment field significant)置1时表示确认号(Acknowledgment Number)为合法,为0的时候表示数据段不包含确认信息,确认号被忽略。
PSH:(Push Function),PUSH标志的数据,置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。
RST:(Reset the connection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到RST位时候,通常发生了某些错误。
SYN:(Synchronize sequence numbers)用来建立连接,在连接请求中,SYN=1,ACK=0,连接响应时,SYN=1,ACK=1。即,SYN和ACK来区分Connection Request和Connection Accepted。
FIN:(No more data from sender)用来释放连接,表明发送方已经没有数据发送了。
知道这重要的6个指示标志后,我们继续来。
16位的WINDOW字段:表示确认了字节后还可以发送多少字节。可以为0,表示已经收到包括确认号减1(即已发送所有数据)在内的所有数据段。
接下来是16位的Checksum字段,用来确保可靠性的。
16位的Urgent Pointer,和下面的字段我们这里不解释了。不然太多了。呵呵,偷懒啊。
我们进入比较重要的一部分:TCP连接握手过程。这个过程简单地分为三步。
在没有连接中,接受方(我们针对服务器),服务器处于LISTEN状态,等待其他机器发送连接请求。
第一步:客户端发送一个带SYN位的请求,向服务器表示需要连接,比如发送包假设请求序号为10,那么则为:SYN=10,ACK=0,然后等待服务器的响应。
第二步:服务器接收到这样的请求后,查看是否在LISTEN的是指定的端口,不然,就发送RST=1应答,拒绝建立连接。如果接收连接,那么服务器发送确认,SYN为服务器的一个内码,假设为100,ACK位则是客户端的请求序号加1,本例中发送的数据是:SYN=100,ACK=11,用这样的数据发送给客户端。向客户端表示,服务器连接已经准备好了,等待客户端的确认
这时客户端接收到消息后,分析得到的信息,准备发送确认连接信号到服务器
第三步:客户端发送确认建立连接的消息给服务器。确认信息的SYN位是服务器发送的ACK位,ACK位是服务器发送的SYN位加1。即:SYN=11,ACK=101。
这时,连接已经建立起来了。然后发送数据,。这是一个基本的请求和连接过程。需要注意的是这些标志位的关系,比如SYN、ACK。
3、服务器的缓冲区队列(Backlog Queue)
服务器不会在每次接收到SYN请求就立刻同客户端建立连接,而是为连接请求分配内存空间,建立会话,并放到一个等待队列中。如果,这个等待的队列已经满了,那么,服务器就不在为新的连接分配任何东西,直接丢弃新的请求。如果到了这样的地步,服务器就是拒绝服务了。
如果服务器接收到一个RST位信息,那么就认为这是一个有错误的数据段,会根据客户端IP,把这样的连接在缓冲区队列中清除掉。这对IP欺骗有影响,也能被利用来做DOS攻击。
####################################################################
上面的介绍,我们了解TCP协议,以及连接过程。要对SERVER实施拒绝服务攻击,实质上的方式就是有两个:
一,迫使服务器的缓冲区满,不接收新的请求。
二,使用IP欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接这就是DOS攻击实施的基本思想。具体实现有这样的方法:
1、SYN FLOOD
利用服务器的连接缓冲区(Backlog Queue),利用特殊的程序,设置TCP的Header,向服务器端不断地成倍发送只有SYN标志的TCP连接请求。当服务器接收的时候,都认为是没有建立起来的连接请求,于是为这些请求建立会话,排到缓冲区队列中。
如果你的SYN请求超过了服务器能容纳的限度,缓冲区队列满,那么服务器就不再接收新的请求了。其他合法用户的连接都被拒绝掉。可以持续你的SYN请求发送,直到缓冲区中都是你的只有SYN标记的请求。现在有很多实施SYN FLOOD的工具,呵呵,自己找去吧。
2、IP欺骗DOS攻击
这种攻击利用RST位来实现。假设现在有一个合法用户(1.1.1.1)已经同服务器建立了正常的连接,攻击者构造攻击的TCP数据,伪装自己的IP为1.1.1.1,并向服务器发送一个带有RST位的TCP数据段。服务器接收到这样的数据后,认为从1.1.1.1发送的连接有错误,就会清空缓冲区中建立好的连接。这时,如果合法用户1.1.1.1再发送合法数据,服务器就已经没有这样的连接了,该用户就必须从新开始建立连接。
攻击时,伪造大量的IP地址,向目标发送RST数据,使服务器不对合法用户服务。
3、带宽DOS攻击
如果你的连接带宽足够大而服务器又不是很大,你可以发送请求,来消耗服务器的缓冲区消耗服务器的带宽。这种攻击就是人多力量大了,配合上SYN一起实施DOS,威力巨大。不过是初级DOS攻击。呵呵。Ping白宫??你发疯了啊!
4、自身消耗的DOS攻击
这是一种老式的攻击手法。说老式,是因为老式的系统有这样的自身BUG。比如Win95 (winsock v1), Cisco IOS v.10.x, 和其他过时的系统。
这种DOS攻击就是把请求客户端IP和端口弄成主机的IP端口相同,发送给主机。使得主机给自己发送TCP请求和连接。这种主机的漏洞会很快把资源消耗光。直接导致当机。这种伪装对一些身份认证系统还是威胁巨大的。
实施DOS攻击最主要的就是构造需要的TCP数据,充分利用TCP协议。这些攻击方法都是建立在TCP基础上的。当然还有更多的实施方法,可以自己去研究。
防不胜防——DOS攻击
最近《计算机世界》报道说,Cs3集团10月31日宣布,公司推出了一款能防止‘拒绝服务’攻击的网络设备--Reverse Firewall。这个设备安装在互联网及其保护的网络之间,它通过限制网络向外输出的信息量来保护系统不受‘拒绝服务’的攻击。
我们可以通过:http://www.iduba.com/secure_channel/secure_info/2001/11/05/10618.htm
查看这则新闻。
拒绝服务攻击一直是安全界迟迟没有解决的一大问题,有的专家认为是网络协议本身的安全缺陷造成的,同时,基本上所有的防火墙在解决拒绝服务攻击上都能力有限,而且很多防火墙或者入侵检测系统反而自己成了拒绝服务攻击的目标。
Cs3能够解决拒绝服务攻击,当然可以成为一则非常吸引人的消息。但是,DOS攻击真的是防不胜防,Cs3真的解决这个问题了么?
以前我写了一个非常基础的介绍DOS攻击的原理,DOS(拒绝服务)攻击即攻击者想办法让目标机器停止提供服务或资源访问,这些资源包括磁盘空间、内存、进程甚至网络带宽,从而阻止正常用户的访问。从大家认可这个对拒绝服务攻击的定义,我们看出,其实对网络带宽进行的消耗性攻击只是DOS的一个小部分,只要能够对目标造成麻烦,从而使得某些服务被暂停甚至主机当机,都是DOS。
首先我们来看看通过消耗网络带宽实施的拒绝服务攻击,这种DOS攻击实质上就是两个方式:
一,迫使服务器的缓冲区满,不接收新的请求。
二,使用IP欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接
1、SYN FLOOD
利用服务器的连接缓冲区(Backlog Queue),利用特殊的程序,设置TCP的Header,向服务器端不断地成倍发送只有SYN标志的TCP连接请求。当服务器接收的时候,都认为是没有建立起来的连接请求,于是为这些请求建立会话,排到缓冲区队列中。
如果你的SYN请求超过了服务器能容纳的限度,缓冲区队列满,那么服务器就不再接收新的请求了。其他合法用户的连接都被拒绝掉。可以持续你的SYN请求发送,直到缓冲区中都是你的只有SYN标记的请求。
现在有很多实施SYN FLOOD的工具,呵呵,自己找去吧。
2、IP欺骗DOS攻击
这种攻击利用RST位来实现。假设现在有一个合法用户(1.1.1.1)已经同服务器建立了正常的连接,攻击者构造攻击的TCP数据,伪装自己的IP为1.1.1.1,并向服务器发送一个带有RST位的TCP数据段。服务器接收到这样的数据后,认为从1.1.1.1发送的连接有错误,就会清空缓冲区中建立好的连接。这时,如果合法用户1.1.1.1再发送合法数据,服务器就已经没有这样的连接了,该用户就必须从新开始建立连接。
攻击时,伪造大量的IP地址,向目标发送RST数据,使服务器不对合法用户服务。
3、带宽DOS攻击
如果你的连接带宽足够大而服务器又不是很大,你可以发送请求,来消耗服务器的缓冲区消耗服务器的带宽。这种攻击就是人多力量大了,配合上SYN一起实施DOS,威力巨大。不过是初级DOS攻击。
4、自身消耗的DOS攻击
这是一种老式的攻击手法。说老式,是因为老式的系统有这样的自身BUG。比如Win95 (winsock v1), Cisco IOS v.10.x, 和其他过时的系统。
这种DOS攻击就是把请求客户端IP和端口弄成主机的IP端口相同,发送给主机。使得主机给自己发送TCP请求和连接。这种主机的漏洞会很快把资源消耗光。直接导致当机。这中伪装对一些身份认证系统还是威胁巨大的。
上面这些实施DOS攻击的手段最主要的就是构造需要的TCP数据,充分利用TCP协议。这些攻击方法都是建立在TCP基础上的。其实这种消耗性的拒绝服务攻击本身就是非常难对付的,理论上这是没有办法克服的安全问题,任何主机的网络资源都是有限的,只要这些有限的资源被消耗掉,总是能够造成网络堵塞,正常访问要么速度缓慢,要么根本就没有办法访问。
让我们看看Cs3吹嘘的设备“Reverse Firewall”,报道中是这样描述的:通过Cs3的‘公平服务安排’技术来实现这一目的。该技术是把带宽平均分配给所有的出口联结,而不是让一个联结占据了所有的信息输出,而且该技术还优先进行双向连接。即优先允许数据在两台电脑间传输,而不是让数据单向流动。当发现过量的信息输出时,该设备就会通知系统管理员,从而帮助系统管理员识别出攻击及用来进行攻击的机器。
这就是用来对付我上面说的消耗带宽的拒绝服务攻击,但是,你仔细看,可以发现,Cs3的设备是牺牲新访问保全已连接的访问来达到保护自己的目的。“优先允许数据在两台电脑间传输”,就是对已经连接并正常访问的用户实施保护,继续维持他们的连接,但是对于新用户访问来说,就没有办法了,因为消耗带宽实施的攻击一定是制造很多的新用户来的。
我们可以制造变化多端的方式来实施拒绝服务。看看到底Cs3能不能防。
5、利用服务漏洞
很多软件或者服务都能被造成拒绝服务,比如,最近的UPnP 拒绝服务漏洞。这样的拒绝服务漏洞,很容易造成主机内存消耗、CPU消耗,轻则速度缓慢,重则当机。
6、日志DOS
不管是什么,防火墙也好、系统本身也好,为了安全就必须记录日志。既然你要记录日志,哈哈,我们就让你记录个够。可以构造大量的错误信息发送出来,服务器记录这些错误,可能就造成日志文件非常庞大,甚至会塞满硬盘。同时会让管理员痛苦地面对大量的日志,甚至就不能发现入侵者真正的入侵途径。哈哈,日志开始拒绝服务啦。
7、塞垃圾邮件
发送垃圾邮件。一般公司的服务器可能把邮件服务器和WEB服务器都放在一起。破坏者可以发送大量的垃圾邮件,这些邮件可能都塞在一个邮件队列中或者就是坏邮件队列中,直到邮箱被撑破或者把硬盘塞满。如果这样,那么邮件不是就拒绝服务了么?
8、塞满硬盘
通常,如果服务器可以没有限制地执行写操作,那么都能成为塞满硬盘造成DOS攻击的途径,比如:向匿名FTP塞垃圾文件。这样也可以塞满硬盘空间。硬盘塞满了,看这么办。
9、合理利用策略
一般服务器都有关于帐户锁定的安全策略,比如,某个帐户连续3次登陆失败,那么这个帐号将被锁定。这点也可以被破坏者利用,他们伪装一个帐号去错误登陆,这样使得这个帐号被锁定,而正常的合法用户就不能使用这个帐号去登陆系统了。登录开始拒绝服务啦。
其实拒绝服务真的很难对付,还有很多其他的办法可以满足拒绝服务的需要。就是一个思想“有限的资源就只能提供有限访问”。希望安全专家真能从根本上解决这个大问题。 |