自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:如何在不殺掉進(jìn)程前提,關(guān)閉一個(gè) TCP 連接?

網(wǎng)絡(luò) 通信技術(shù)
如果 RST 報(bào)文的序列號(hào)不能落在對(duì)方的滑動(dòng)窗口內(nèi),這個(gè) RST 報(bào)文會(huì)被對(duì)方丟棄的,就達(dá)不到關(guān)閉的連接的效果。所以,要偽造一個(gè)能關(guān)閉 TCP 連接的 RST 報(bào)文,必須同時(shí)滿足「四元組相同」和「序列號(hào)正好落在對(duì)方的滑動(dòng)窗口內(nèi)」這兩個(gè)條件。

大家好,我是小林。

之前有位讀者在面試中,被問(wèn)到這么一個(gè)問(wèn)題。

「如何在不殺掉進(jìn)程前提,關(guān)閉一個(gè) TCP 連接?」

這個(gè)我之前的文章也提及過(guò)「處于 establish 狀態(tài)的連接,收到 SYN 報(bào)文會(huì)發(fā)生什么?」

我這里再把關(guān)鍵的點(diǎn),講一下。

正文

大家在關(guān)閉 TCP 連接第一反應(yīng)都是「殺掉進(jìn)程」。

是的,這個(gè)是最粗暴的方式,殺掉客戶端進(jìn)程和服務(wù)端進(jìn)程影響的范圍會(huì)有所不同:

  • 在客戶端殺掉進(jìn)程的話,就會(huì)發(fā)送 FIN 報(bào)文,來(lái)斷開(kāi)這個(gè)客戶端進(jìn)程與服務(wù)端建立的所有 TCP 連接,這種方式影響范圍只有這個(gè)客戶端進(jìn)程所建立的連接,而其他客戶端或進(jìn)程不會(huì)受影響。
  • 而在服務(wù)端殺掉進(jìn)程影響就大了,此時(shí)所有的 TCP 連接都會(huì)被關(guān)閉,服務(wù)端無(wú)法繼續(xù)提供訪問(wèn)服務(wù)。

所以,關(guān)閉進(jìn)程的方式并不可取,最好的方式要精細(xì)到關(guān)閉某一條 TCP 連接。

有的小伙伴可能會(huì)說(shuō),偽造一個(gè)四元組相同的 RST 報(bào)文不就行了?

這個(gè)思路很好,但是不要忘了還有個(gè)序列號(hào)的問(wèn)題,你偽造的 RST 報(bào)文的序列號(hào)一定能被對(duì)方接受嗎?

如果 RST 報(bào)文的序列號(hào)不能落在對(duì)方的滑動(dòng)窗口內(nèi),這個(gè) RST 報(bào)文會(huì)被對(duì)方丟棄的,就達(dá)不到關(guān)閉的連接的效果。

所以,要偽造一個(gè)能關(guān)閉 TCP 連接的 RST 報(bào)文,必須同時(shí)滿足「四元組相同」和「序列號(hào)正好落在對(duì)方的滑動(dòng)窗口內(nèi)」這兩個(gè)條件。

直接偽造符合預(yù)期的序列號(hào)是比較困難,因?yàn)槿绻粋€(gè)正在傳輸數(shù)據(jù)的 TCP 連接,滑動(dòng)窗口時(shí)刻都在變化,因此很難剛好偽造一個(gè)剛好落在對(duì)方滑動(dòng)窗口內(nèi)的序列號(hào)的 RST 報(bào)文。

辦法還是有的,我們可以偽造一個(gè)四元組相同的 SYN 報(bào)文,來(lái)拿到“合法”的序列號(hào)!

因?yàn)槿绻幱?establish 狀態(tài)的服務(wù)端,收到四元組相同的 SYN 報(bào)文后,會(huì)回復(fù)一個(gè) Challenge ACK,這個(gè) ACK 報(bào)文里的「確認(rèn)號(hào)」,正好是服務(wù)端下一次想要接收的序列號(hào),說(shuō)白了,就是可以通過(guò)這一步拿到服務(wù)端下一次預(yù)期接收的序列號(hào)。

然后用這個(gè)確認(rèn)號(hào)作為 RST 報(bào)文的序列號(hào),發(fā)送給服務(wù)端,此時(shí)服務(wù)端會(huì)認(rèn)為這個(gè) RST 報(bào)文里的序列號(hào)是合法的,于是就會(huì)釋放連接!

在 Linux 上有個(gè)叫 killcx 的工具,就是基于上面這樣的方式實(shí)現(xiàn)的,它會(huì)主動(dòng)發(fā)送 SYN 包獲取 SEQ/ACK 號(hào),然后利用 SEQ/ACK 號(hào)偽造兩個(gè) RST 報(bào)文分別發(fā)給客戶端和服務(wù)端,這樣雙方的 TCP 連接都會(huì)被釋放,這種方式活躍和非活躍的 TCP 連接都可以殺掉。

使用方式也很簡(jiǎn)單,只需指明客戶端的 IP 和端口號(hào)。

./killcx

killcx 工具的工作原理,如下圖

它偽造客戶端發(fā)送 SYN 報(bào)文,服務(wù)端收到后就會(huì)回復(fù)一個(gè)攜帶了正確「序列號(hào)和確認(rèn)號(hào)」的 ACK 報(bào)文(Challenge ACK),然后就可以利用這個(gè) ACK 報(bào)文里面的信息,偽造兩個(gè) RST 報(bào)文:

  • 用 Challenge ACK 里的確認(rèn)號(hào)偽造 RST 報(bào)文發(fā)送給服務(wù)端,服務(wù)端收到 RST 報(bào)文后就會(huì)釋放連接。
  • 用 Challenge ACK 里的序列號(hào)偽造 RST 報(bào)文發(fā)送給客戶端,客戶端收到 RST 也會(huì)釋放連接。

正是通過(guò)這樣的方式,成功將一個(gè) TCP 連接關(guān)閉了!

這里給大家貼一個(gè)使用 killcx 工具關(guān)閉連接的抓包圖,大家多看看序列號(hào)和確認(rèn)號(hào)的變化。

所以,以后抓包中,如果莫名奇妙出現(xiàn)一個(gè) SYN 包,有可能對(duì)方接下來(lái)想要對(duì)你發(fā)起的 RST 攻擊,直接將你的 TCP 連接斷開(kāi)!

 

怎么樣,很巧妙吧!

 

責(zé)任編輯:武曉燕 來(lái)源: 小林coding
相關(guān)推薦

2021-05-18 08:32:33

TCPIP協(xié)議

2021-05-19 08:17:35

秒殺場(chǎng)景高并發(fā)

2023-01-18 17:50:35

系統(tǒng)架構(gòu)Kafka

2022-04-08 08:26:03

JavaHTTP請(qǐng)求

2021-09-28 13:42:55

Chrome Devwebsocket網(wǎng)絡(luò)協(xié)議

2021-06-09 07:55:19

NodeEventEmitte驅(qū)動(dòng)

2020-06-22 11:50:38

TCPIP協(xié)議

2020-05-13 14:35:47

HashMap面試官Java

2023-07-31 08:26:09

2019-11-26 08:24:13

TCP擁塞控制網(wǎng)絡(luò)協(xié)議

2022-01-10 11:04:41

單鏈表面試編程

2020-06-22 07:47:46

提交面試官訂單

2022-08-18 20:02:04

JSLRU緩存

2015-08-13 10:29:12

面試面試官

2024-10-07 08:52:59

分布式系統(tǒng)分布式 IDID

2021-09-15 07:56:32

TypeScriptVue項(xiàng)目

2021-09-14 07:06:13

React項(xiàng)目TypeScript

2017-03-16 15:27:10

面試官測(cè)試技術(shù)

2023-02-16 08:10:40

死鎖線程

2021-05-14 08:34:32

UDP TCP場(chǎng)景
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)