Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说常见的DoS攻击_防dos攻击,希望能够帮助你!!!。
本文收录于微信公众号「 LinuxOK 」,ID为:Linux_ok,关注公众号第一时间获取更多技术学习文章。
拒绝服务攻击DoS(Denial of Service):使系统过于忙碌而不能执行有用的业务并且占尽关键系统资源。它是基于这样的思想:用数据包淹没本地系统,以打扰或严重阻止捆绑本地的服务响应外来合法的请求,甚至使本地系统崩溃。实现Dos攻击,常见的方式有:TCP SYN泛洪(SYN Flood),ping泛洪(ping-Flood),UDP泛洪(UDP-Flood),分片炸弹(fragmentation bombs),缓冲区溢出(buffer overflow)和ICMP路由重定向炸弹(ICMP routeing redirect bomb)。
1、TCP SYN泛洪
TCP SYN泛洪是利用TCP建立连接时需要进行三次握手的过程,并结合IP源地址欺骗实现的。如下图:
攻击者将其自身的源地址伪装成一个私有地址向本地系统的TCP服务发起连接请求,本地TCP服务回复一个SYN-ACK作为响应,然而该响应发往的地址并非攻击者的地址(真实地址),而是攻击者伪装的私有地址。由于该私有地址是不存在的于本地服务器所在的网络的,所有本地系统将收不到RST消息(以结束这个半打开连接)。本地TCP服务接下来要等待接收一个ACK回应,但是该回应永远不会到来,该半打开连接会保持打开状态直至连接尝试超时,因此有限的连接资源被消耗了。攻击者连接请求的到来比TCP超时释放资源更快,利用一次又一次的连接请求淹没本地连接资源(如通过listen()创建的大小有限的连接队列等),以致本地服务无法接收更多的连接请求。
Linux操作系统中的SYN cookie模块能显著的延缓SYN泛洪造成的网络资源缺失现象:在TCP服务接收到TCP SYN包并返回SYN-ACK时,不分配一个专门的数据区,而是根据这个SYN包计算一个cookie值。cookie值是一个基于SYN中的原始序列号、源地址、目的地址、端口号、密值而产生的序列号。cookie作为将要返回的SYN-ACK的初始序列号,当客户返回一个ACK包,TCP服务在根据cookie值检查该ACK包的合法性,再分配专门的数据区进行处理接下来操作。cookie的超时时间很短暂,客户端必须在很短时间内进行应答。
echo 1 > /proc/sys/net/ipv4/tcp_syncookies 命令可以打开Linux内核的SYN cookie保护功能;需要注意一些发行版需要配置内核才能打开。
2、ping泛洪
攻击者通过ping发送的ICMP的echo请求消息也是常见的DoS攻击方式之一,其原理是强制让系统消耗大多数时间进行无用的应答,降低系统网络质量。主要实现的方法有:①将ping包的源地址伪装成受害者的地址并向整个主机所在的网络广播echo请求,这样的请求消息能够造成很多的响应发送的受害者机器;②通过互联网在受害者机器安装木马程序并在某时刻向某主机发送大量echo请求;③攻击者发送更多简单的ping泛洪来淹没数据连接。
一种更为古老的攻击方式叫做死亡之ping,攻击者会发送巨大的ping数据包给受害机器,易受攻击的系统可能因此崩溃,Linux等类UNIX系统并没有此漏洞。对于受害主机来说,丢弃ping请求并不是一个很好的解决方案,因为不论是对到来的ping包做什么反应,系统或者网络依旧会被淹没在检测/丢弃数据包的过程中。
3、UDP泛洪
不同于TCP,UDP是无状态的,没有任何信息被维护以指明下一个期望到来的数据包,所以UDP服务更易受这些类型攻击的影响,许多站点都禁止用所有非必要的UDP端口。
4、缓冲区溢出
缓冲区溢出攻击是无法通过过滤防火墙进行保护的,通过覆盖程序的数据空间或者运行时的堆栈导致系统或者服务崩溃,这需要专业技术以及对硬件、系统软件的了解。举个例子,早期有服务器程序使用了sprintf()函数而被攻击者攻击,因为缓冲区溢出而使得程序崩溃,所以更为妥当的做法是使用snprintf()代替sprintf()。
5、ICMP路由重定向炸弹
我们知道ICMP的消息类型中的类型5是告知目标系统改变内存中的路由表以获得更短的路由,以通知主机有更多的路径可用。重定向很少发源主机附近的路由器,对于连接到ISP(运营商)的住宅或商用站点来说,主机附近的路由器产生一个重定向的ICMP消息可能性非常小。如果我们主机使用静态路由且收到了重定向消息,这可能是有人在攻击我们系统,欺骗主机以转发所有流量到另一远处主机处。
6、分片炸弹
我们知道数据包从一个路由器沿路径(源计算机到目的计算机的路径)到下一个路由器时,网关路由器可能需要在它们进行传递到下一个网络前将数据包分切为更小的片段(超过MTU值会被分片),在这些片段里第一个分片会包含UDP或者TCP报头中的源端口号和目的端口号,接下来的分片并不包含。当数据包被分片时中间路由器不会重组数据包,数据包到达目的主机或邻近路由器时才会重新组装。
分片炸弹的实现是构造一种非常小的数据包导致系统或者程序崩溃的操作:比如构造一个最初的分片使得UDP或者TCP的源端口和目的端口被包含在第二个分片中。许多防火墙并不检查第一个分片之后的分片,然而第一个分片由于防火墙所要过滤的信息还未呈现,所以得以通过,那么最终所有分片都在主机中得以组装。
另外,因为中间进行分片基本上比发送更小的无需分片的数据包代价更高,所以一般会在发送在IP报头中设置了不分片标志,设置后系统会向目标主机发起连接前进行MTU发现,如果中间路由器必须对数据包进行分片那么它会丢弃数据包并赶回ICMP 3错误消息,即“需要分片”。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章