DOS攻击不是DOS
DOS攻击是利用程序漏洞一对一的执行资源耗尽的Denial of Service拒绝服务攻击
DenialOfServie != DiskOperationSystem
DDoS分布式拒绝服务
DOS攻击拼的是各自的资源,效果比较差
而DDOS则是汇聚资源能力,多对一,属于资源耗尽型攻击
历史
以前:欠缺技术能力的无赖,我ping死你(最难缠的无赖)
现在:最强大最危险的攻击,攻击方式众多(专业化的要求勒索)
亲身经历:电商网站被勒索、Bi11 gates僵尸程序
贩卖和租用肉鸡已经成为黑产中重要的一部分
最终的办法就是拼资源,投资抗D,或者乖乖交保护费
从攻击者到被害者
网络—FW—服务器OS—服务应用
资源耗尽
网络:带宽
FW:吞吐量、并发连接
服务器:CPU、内存、I/0
应用:处理请求能力,对
0S资源的使用权
程序漏洞攻击
缓冲区溢出
协议、程序逻辑漏洞
链路上任何一点都可成为目标
带宽攻击
以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求无法通过。
连通性攻击
指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。
D网络
基于巨量的Flood耗尽目标网络带宽资源
如:ICMP Flood,UDP Flood D协议
攻击协议漏洞发起的拒绝服务攻击
如:Syn Flood、Ping of Death、ARP、DNS、802.11、SSL
要理解dos攻击,首先要理解TCP连接的三次握手过程(Three-wayhandshake)。
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入SYN SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=i1),同时自己也发送一个SYN包(SYN=j),即SYN ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN ACK包,向服务器发送确认包ACK(ACK=j1),此包发送完毕,客户端和服务器进入ESTAB LISHED状态,完成三次握手,客户端与服务器开始传送数据
**半连接:**收到SYN包而还未收到ACK包时的连接状态称为半连接,即尚未完全完成三次握手的TCP连接。
**半连接队列:**在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包(SYN=i)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。
**SYN-ACK重传次数:**服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
**半连接存活时间:**是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
首先说一说放大攻击及Sockstress相应原理:
放大攻击原理:攻击者向目标发送一个很小的流量,但是会造成产生的攻击流量是一个巨大的、成百上千倍上万倍流量被放大的一个效果,才适合作为一个拒绝服务攻击效果。(实现攻击者很小的流量打垮一个看似很大的被攻击者)
攻击者资源消耗小(CPU、内存、宽带)
异步攻击,单机可拒绝服务高配资源服务器
主要机理在于:window窗口实现的TCP流控(在第三次传送ACK包的时候出现)
利用流控的攻击特性,造成攻击:攻击者将ACK包中的流控大小修改为0,然后促使ACK不停发向服务器,那么就会造成拒绝服务。在服务器看来就是客户端暂时没有空间来接受数据流量,所以服务器一直处于等待状态;但是攻击者只需要发完ACK包就行,不需要维持这么一个连接,所以对于攻击者就不会消耗巨量的CPU内存、带宽资源(以小搏大,放大)
当脚本对目标发起攻击时,主机是不会响应ACK包,操作系统内部如果不对其限制,默认是会由系统响应RST包表示连接可以断开,这样达不到一直建立连接的效果。
iptables -A OUTPUT -p TCP --tcp-flags rst rst -d 攻击机IP -j DROP #防火墙配置命令
直到今天sockstress攻击仍然是一种很有效的DOS攻击方式
由于建立完整的TCP三步握手,因此使用syn cookie防御无效
根本的防御方法是采用白名单(不实际)
折中对策限制单位时间内每IP建的TCP连接数
封杀每30秒与80端口建立连接超过10个的IP地址
iptables -I INPUT -p tcp -dport 80 -m state -state NEW -m recent -set
iptables -I INPUT -p tcp -dport 80 -m state-state NEW -m recent -update -seconds 30 -hitcount 10 j DROP