常见的几种拒绝服务类攻击(DoS)
要理解DoS攻击的实现原理,必须要对TCP有一定了解。
1.何为DoS?
DoS(Denial of Service)的含义即让目标机器停止提供服务或资源访问。相当于在某家店客满的时候,不再接受更多的客人,后来的客人只能在外面等着。
2.熟悉TCP
要理解DoS,首先要对TCP有足够的了解。TCP是在不可靠的因特网中提供可靠的、端对端的字节流通讯协议。在常见的TCP/IP通信中,IP层不保证数据包正确传送到目的地,TCP则从本地机器中接受数据流,然后将其分成不超过64K字节的数据片段,每个数据片段作为单独的IP数据包发送出去。最后在目的机器中组合成完整的数据流,TCP协议必须保证可靠性。
TCP传输中,发送方和接收方以数据段的形式交换数据,一个数据段包含固定的20字节+可选部分+数据。当发送方将数据段发送出去后,将启动一个定时器,接收方在接受到数据段后,将回传一个数据段,其中包含一个确认序号,表示希望收到的下一个数据段的顺序号。如果发送方在收到回传数据前定时器超时了,将判断为数据丢失,发送方将重新发送该数据段。在整个过程中,关键信息都在tcp数据头中。
3.TCP数据头
32位序号:是指发送数据包的第一个字节的序列号,
32位确认序号:确认序号是希望接收的字节号。以上两者均是32位。
4位首部长度(Data offset):表明TCP头包含多少个32位字,用来确定TCP头的长度,因为头中有可选字段长度是不固定的( ?)。
6位保留位:暂时没用,目前均为0。
接下来是6个比较重要的标志,它们与DoS攻击都非常相关:
URG:紧急指针使能位,要用到后面的紧急指针时置1。用来避免TCP流中断。
ACK:确认序号使能位,置1时表示确认序号有用,为0时则忽略确认序号。
PSH:置1时请求的数据段在接收方得到之后即可送至应用程序,而无需等到缓冲区满。
RST:用于复位由于某些原因导致的连接错误,也用于拒绝非法数据和请求。如果接收到RST位时,通常是发生了某些错误。
SYN (Synchronize Sequence Number):用于建立连接,在连接请求中,SYN=1,ACK=0,连接响应时,SYN=1,ACK=1。即两者是用于区分请求和相应。
FIN (no more data from sender):用于释放连接,表明发送方已经没有数据要送了。
接下里继续介绍16位的窗口指针:表示确认了字节后还可以发送多少字节。为0时,表示已经收到了包括确认号-1在内的所有数据段。
接下来的校验和紧急指针就不介绍了。
4.TCP三次握手
了解了TCP数据头,接下来就该看看三次握手过程是如何实现的,DoS攻击就是利用握手过程中的漏洞来进行的。
-
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
-
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
-
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
1.客户端发送一个带SYN位的请求(此时SYN标志位为1,ACK标志位为0,因为请求不需要用到确认号),向服务器表明连接请求,假定请求序号为10,那么“32位序号”(SYN)=10,确认序号(ACK)=0 。发送之后,等待服务器的反应。
2.服务收到该请求报文后,检查是否在LISTEN的指定端口,如果不是则拒绝,是的话就接受请求:假定服务器自身的SYN内码为100,确认序号则是客户端请求序号+1,即10+1=11,所以发送响应报文SYN=100,ACK=11(两个使能位均为1)
3.客户端接收到该消息后,将发送最后一个连接确认到服务器。SYN位是服务器发送的ACK位,而ACK位则是服务器发送的SYN位+1,即SYN=11,ACK=101。至此,连接建立,可以开始发送数据了。
理解难点:三次握手的宏观过程很好理解,但是微观细节有一点绕。需要把握两点,SYN和ACK的标志位只能取0或1,它们只是使能标志,起辅助作用。上述过程的描述中更多指的是它们分别对应的序号内容,SYN对应于TCP头中的“32位序号”,ACK对应于“32位确认序号”。另外一个把握的难点在于,客户端与服务器端之间两个序号内容的交叉交换,特别要体会ACK=对方SYN+1的这种处理方式的目的所在。
5.未连接队列(服务器的缓冲区队列Backlog Queue)
服务器不会在每次接收到SYN请求的时候立即与客户端建立连接,而是为连接请求分配内存空间,建立会话,并放到一个等待队列之中。如果这个队列已满,就不再接受新的请求,即新的请求将被直接丢弃,这就是拒绝服务。
如果服务器接收到一个RST置位的信息,就判断这是一个有错误的数据段,会根据客户端IP,把对应的连接从缓冲队列中清除掉。这对IP欺骗有影响,也可以作为DoS攻击。
通过了解TCP协议和连接过程,我们要对Server进行DoS攻击,只需要抓住两点:
a.让服务器的缓冲区满,不接受新的请求;
b.使用IP欺骗,使得正常连接被复位,从而影响合法用户。
这两点是DoS攻击的基本思想,具体实现起来有如下方法:
SYN FLOOD
利用服务器的连接缓冲区,和特殊程序,设置TCP的Header,向服务器不断成倍发送具有只有SYN标志的TCP连接请求。当服务器接收之后,判断为均是没有建立起来的连接请求,于是给这些请求建立会话,排到缓冲区队列中。
直到你发送的SYN请求超过了服务器的缓冲区,服务器便不再接受其他的合法请求了。你可以持续的进行SYN请求,从而致使缓冲区里都是你发送的SYN请求。
IP欺骗DoS攻击
这种攻击利用RST位来实现。假设有一个合法用户(1.1.1.1)与服务器建立了正常的连接,攻击者构造攻击TCP数据,伪装自己的IP也是1.1.1.1,并向服务器发送一个带有RST位的数据段。此时服务器收到该数据段后,便认为从1.1.1.1发送的请求连接有错,便从缓冲区中将该连接清除,从而导致合法用户与服务器断开了连接。如果合法用户要继续传输数据,就得重新发送合法的连接请求。
在进行IP欺骗DoS攻击时,通常伪造大量的合法用户IP进行攻击,向目标发送RST数据,使得服务器拒绝对合法用户服务。
带宽DoS攻击
如果你的连接带宽足够大,而服务器的带宽有限,你可以通过发送大量请求来攻击,以消耗服务器的缓冲区和带宽。若配合SYN进行,威力不小。这种属于初级DoS攻击,对攻击者资源要求较高。
自身消耗的DoS攻击
这种攻击方法比较古老,只有老式的系统有这种bug,比如Win95,Cisco IOSv.10.x等过时的系统。
这种攻击是将请求客户端IP和端口弄成主机的IP端口相同,发送给主机。使得主机自己给自己发送TCP请求连接。这种自连接的行为将很快耗费资源导致当机。目前这种攻击对于身份认证系统还是威胁巨大。( ?)
以上这些攻击方法都是充分利用了TCP协议的漏洞,还有其他DoS攻击手段:
塞满服务器硬盘
如果服务器可以没有限制的执行写操作,那么都能成为塞满硬盘造成DoS攻击的主要途径。
1.发送垃圾邮件:通常邮件服务器与WEB服务器都放在一起,破坏者通过发送大量的垃圾邮件,将邮件队列塞满,从而把邮箱撑爆或是硬盘塞满。
2.填满日志记录:入侵者通过构造大量的错误信息,让服务器记录这些信息,甚至可能造成日志文件非常庞杂,塞满硬盘。同时,让管理员痛苦的面对大量的日志文件,极难发现其入侵的真正途径。
3.合理利用策略:一般服务器都有关于账户锁定的策略,如某账户连续3次登录失败,则会自动锁定。这点也会被破坏者利用。他们伪装一个合法账号登录多次,致使该账户被锁定,然后合法用户便无法登录了。(这种攻击方法真是无聊到爆!)