聊点硬核的——Linux环境下拒绝服务攻击(DoS/DDoS)的常见手段和原理。这类攻击的目标很明确:把目标系统的CPU、内存、带宽或者连接数耗个精光,让正经用户连不上服务。下面就来逐个拆解,看看攻击者常用的那些Exploit方法,以及怎么防。
1. SYN Flood攻击(传输层TCP漏洞利用)
这算是Linux系统上最常见的DoS招数之一,吃准了TCP三次握手的软肋。攻击者伪造一堆源IP,疯狂向目标发SYN包(建立连接的请求)。目标呢,每收到一个SYN包就得分配资源,然后老老实实回复SYN-ACK,等着对方回ACK。可源IP是假的,哪来的ACK?于是半连接(SYN_RCVD状态)越积越多,直到把TCP连接队列(比如net.ipv4.tcp_max_syn_backlog限制的容量)撑爆,合法用户彻底进不来。实际操作可以用hping3:sudo hping3 -S -p 80 --flood <目标IP>,或者Metasploit的auxiliary/dos/tcp/synflood模块。防御措施:调内核参数(加大tcp_max_syn_backlog、缩短tcp_synack_retries),开SYN Cookie(net.ipv4.tcp_syncookies=1),再用防火墙限制单个IP的连接速率。
2. UDP Flood攻击(传输层UDP漏洞利用)
UDP天生无连接,攻击者只管往目标猛砸UDP数据包,比如瞄着开放的DNS、NTP端口。目标收到就得处理,有服务就回响应,没服务也得回ICMP“端口不可达”——无论如何都在消耗CPU和带宽。实现工具一样是hping3:sudo hping3 -2 -d 120 --flood <目标IP>(-2表示UDP,-d设包大小)。防御思路:关掉不必要的UDP服务,用防火墙做速率限制,再配合QoS保证关键业务流量优先通过。
3. 缓冲区溢出DoS(应用层漏洞利用)
缓冲区溢出是Linux系统里杀伤力最猛的漏洞类型之一。攻击者往目标应用(比如Samba、Apache、OpenSSH)里塞超出缓冲区大小的数据,把相邻内存区域(返回地址、函数指针)给覆盖掉,轻则让应用崩溃,重则直接执行恶意代码。举个例子:Metasploit里的ms06_063_trans模块针对Windows SMB服务,能让XP蓝屏;Linux这边,旧版本Nginx的chunked编码漏洞也能导致服务崩溃。实现工具有Metasploit(use auxiliary/dos/<服务类型>/<漏洞名称>),或者自己写Python脚本构造畸形请求。防御建议:及时打补丁,编译时启用安全选项(比如-fstack-protector),再用ulimit限制进程最大内存。
4. TCP分割攻击(如CVE-2019-11479 Linux内核SACK漏洞)
这类攻击盯的是内核处理TCP分段时的资源消耗缺陷。拿CVE-2019-11479来说,Linux内核TCP/IP协议栈的SACK(选择性确认)功能存在漏洞,攻击者发送大量低MSS(最大分段大小,比如40字节)的TCP分段,迫使内核频繁重组,CPU和内存直接飙高,最终系统拒绝服务。工具还是hping3:sudo hping3 -S <目标IP> -p 443 --tcp-mss 40 -c 1000。防御方法:更新内核补丁(Red Hat的RHSA-2019:1854就是个例子),或者关掉SACK(net.ipv4.tcp_sack=0,但可能影响网络性能)。
5. Land攻击(TCP分割攻击变种)
Land攻击的玩法更“自残”——构造一个特殊的SYN包,源IP和目标IP都写成受害者自己的IP。结果受害者收到包后,开始给自己发SYN-ACK,再等着自己回ACK,活生生把连接资源耗光。现代Linux内核(4.9及以上)已经忽略这种包,但老版本系统依然有风险。工具:sudo hping3 -S <目标IP> -p 80 -a <目标IP> --flood。防御就是升级内核,或者用防火墙过滤源IP等于目标IP的SYN包:iptables -A INPUT -s <目标IP> -d <目标IP> -p tcp --syn -j DROP。
6. Ping洪流/ICMP Flood攻击(网络层漏洞利用)
发大量ICMP Echo Request(ping包)冲垮目标的网络带宽和CPU。处理ICMP请求本身就要耗CPU,流量一大合法数据包就被挤掉了。更狠的是用畸形ICMP包(比如超过64KB的大包),虽然Linux内核早修复了“Ping of Death”,但旧版Windows仍是重灾区。工具:ping -f <目标IP>(flood模式),或sudo hping3 -1 <目标IP> --flood。防御建议:防火墙限流,比如iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT,每秒只放一个ping包;或者干脆关掉ICMP响应:sysctl -w net.ipv4.icmp_echo_ignore_all=1。
7. 利用系统服务漏洞(如Samba、NTP、Redis)
很多Linux服务本身就带着DoS漏洞,攻击者发一个畸形请求就能让服务崩溃。比如:
- Samba漏洞:CVE-2017-0143到CVE-2017-0148(EternalBlue)能让Samba直接挂掉;
- NTP漏洞:CVE-2013-5211(Monlist漏洞),攻击者伪造源IP发MONLIST请求,NTP服务器就向大量客户端猛发响应,带宽瞬间被榨干;
- Redis漏洞:未授权访问时,攻击者可以写恶意键值(比如
flushall清空所有数据),或者执行fork冲击波(比如set x "\n*1000000 c\n"),让Redis内存爆掉。
实现工具可以是Metasploit(比如samba/trans2open模块),或者自己写Python脚本模拟畸形NTP MONLIST请求。防御三件套:赶紧打补丁(Samba 4.6.4之后的版本已修复EternalBlue),关掉不必要的服务(systemctl disable ntp),给Redis这类服务加上认证密码。
以上这些方法,是Linux环境下最常见的DoS Exploit手段。攻击者可以单枪匹马搞DoS,也可以操控一堆“肉鸡”搞DDoS,放大杀伤力。防御不能靠单一措施,得从内核加固、服务配置优化、流量监控多个层面下手,构建一套层层设防的安全体系。
