題:
從理論上講,可以在高於65535的端口上部署後門嗎?
Jason
2017-01-14 23:14:33 UTC
view on stackexchange narkive permalink

假設您能夠修改操作系統/固件/設備以供服務器/客戶端在高於65535的端口上發送和偵聽,是否可以植入後門並使其偵聽端口70000? p p>

我想真正的問題是:

如果您在計算機上本地重建TCP / IP堆棧,由於 RFC 793-傳輸的方式,整體概念將無法正常工作控制協議標準的工作原理如下所示,在某些答案中?使得無法訪問高於65535的端口上運行的服務。

關於創建後門的硬件和設備的討論太多了,只有政府可以訪問以進行監視,我只是想知道是否這可能是他們這樣做並避免被發現的方法之一?

如果仍然要重建TCP / IP,則最好使後門攔截所構建的特殊數據包並發送到端口80。
我可以想像,如果您足夠聰明,可以將“端口70000”傳遞給某些實現,那麼他們最終會將其截斷為4464。
如果您可以修改客戶端以接受被入侵的TCP數據包,則您已經將其典當了。為什麼還需要後門?
從理論上講,只要您同時修改服務器和客戶端的TCP堆棧,就可以將後門放在端口0上。我覺得任何理智的防火牆都不會讓它過去
@user69874,端口0在許多套接字命令中都有特殊含義,意味著“使用[臨時端口](https://en.wikipedia.org/wiki/Ephemeral_port)”,因此我認為在沒有太多黑客攻擊的情況下,這種方法就無法正常工作標準庫。
最好使用帶有16個以上數據包序列的端口終止功能,除非有人分析了源代碼或捕獲了每個數據包,否則幾乎不可能檢測到後門。
@JPhi1618“假設您同時修改了服務器和客戶端的TCP堆棧”,則意味著甚至包括內核。從理論上講,如果您真的願意,可以將0填充到TCP數據包的端口字段中,它可能不再是有效的TCP,但是可以繞過不良的防火牆(實際上阻止了端口0?)並且很難猜測。
@user69874:出站防火牆傾向於讓它通過。端口0作為源端口,僅作為目標端口沒有問題。
您是否可能將IP端口與PID混淆了?在64位OS上,僅通過長時間保持主機啟動,PID就會變得非常大。奇怪的是,在具有64位內核的機器上看到1200萬的PID,並且正常運行時間長達數年。
當您可以僅將特殊的cookie用於後門之類時,這似乎是很多工作。
@Joshua如果出站防火牆允許它通過但入站防火牆沒有通過,則這不會建立TCP連接,因為端口0上的“ A-> B”有效,但是“ B-> A`(0作為目標端口)無效”t。這種奇怪的防火牆配置是什麼原因?
@user69874:端口0不可用,假定使用Berkeley套接字庫。如果接收系統確實在零端口上有服務,則其入站防火牆規則將使其通過。(實際上設置此功能的任何人都不足夠愚蠢,無法設置其防火牆規則來執行此操作。)出站規則的“反向”效果很好,因為0不是答复消息中的目標端口。我的檔案中有一個非BSD套接字庫,確實可以在端口0上監聽。
九 答案:
Arminius
2017-01-14 23:29:20 UTC
view on stackexchange narkive permalink

否,技術上,TCP標頭中的端口號字段限制為2個字節。 (為您提供 2 ^ 16 = 65536 個可能的端口)

如果您通過為更高的端口保留更多位來更改協議,則會違反 TCP段的規範,不會被客戶理解。換句話說,您不再講TCP,“ TCP源/目標端口”中的“端口”一詞將不再適用。 UDP端口也存在相同的限制。

也就是說,後門可以通過不同於TCP或UDP的協議進行通信,從而掩蓋其通信。例如, icmpsh 是僅使用ICMP的反向shell。最終,您還可以使用原始套接字來實現自己的自定義傳輸層協議,該協議可以具有自己的端口概念,範圍大於0-65535。

不僅客戶不會理解。同樣,從客戶端到服務器的路徑上的每個路由器都會將其視為亂碼數據包並丟棄。
@Tonny:不一定。路由器僅應在IP級別進行路由,甚至不能看到TCP / UDP標頭。當然,然後發生了NAT...。
@R ..我知道和您一樣,但是正如您所說:目前,幾乎所有路由器都在整個TCP / IP堆棧上運行,並且會阻止此類流量,因為它看起來太像普通的TCP。
-1
NAT在端口級別上工作,因此通過NAT轉發的每個協議都需要NAT支持。並非所有路由器都執行NAT,這在家庭路由器和SOHO路由器中很常見,但是您的ISP用於將網絡轉發到更大的Internet的運營商級路由器可能不會使用NAT(但運營商級NAT或CGN)。
-1
不,他們會更早敲響,因為他們不知道每個端口字段的長度都超過兩個字節,因此它們會擴展到鏈中每個路由器認為是序列號的位置,而其餘的報頭將是垃圾。最重要的是,“校驗和”幾乎肯定是錯誤的,並且數據包將被丟棄。
@Tonny實際上,在SOHO路由器中,如果它不是公認的協議,那麼您可能永遠都不會通過NAT來獲得它,因此整個問題尚無定論。曾幾何時,我嘗試設置6to4([protocol 41](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)),並且一直盯著一個端口轉發配置。
@Bob SOHO路由器應該能夠進行DNAT以及端口轉發。您想要使用源(您的6to4隧道提供程序)和目標(您的隧道發起方的內部IP)進行DNAT協議41。然而。您確實應該在SOHO路由器上執行6to4,並使用前綴廣告在局域網內部運行IPv6。
@Aron是的……這是在那些路由器了解IPv6之前回來的。如今,不建議整體使用6to4。
-1
J.A.K.
2017-01-14 23:30:30 UTC
view on stackexchange narkive permalink

否,這是數字,因為該字段的TCP字段只有16位長(65536,但從0開始),因此從根本上講,通信高於65535的端口是不可能的

這篇文章寫了一篇非常不錯的文章,內容涉及為什麼在IPv4中如此,在IPv6中如何相同以及如何重用常規使用的端口。

請注意,您的第二篇文章並沒有說明如何增加端口範圍,而是如何具有其他IP地址。端口號仍將保留在[0,65535]中。
實際上,@Arminius確實是一個環形交叉路口,擴展它們的唯一方法是它們之間的通用躍點不支持的方法,例如IP頭中的可選字段。
LSerni
2017-01-15 05:35:15 UTC
view on stackexchange narkive permalink

如果您在計算機上本地重建TCP / IP堆棧,那麼由於RFC 793-傳輸控制協議標準的工作方式如以下某些答案中所述,整個概念是否行不通?使得無法訪問高於65535的端口上運行的服務。

高於65535的端口上沒有沒有TCP / UDP服務。如果它支持端口大於2 16 sup> -1的數字,則它不再是TCP(或UDP)

您還能有其他東西嗎?那...?當然。並且它與TCP非常相似嗎?向後兼容?這兩個問題都是肯定的。

關於創建後門的硬件和設備的討論太多,以至只有政府也可以訪問以進行監視,我很好奇這是否可能是其中一種方法他們這樣做是為了避免被發現並被發現?

如果我開發了這樣的設備,它將依靠足夠普遍的協議而不會引起任何關注。未知/非法的協議數據包之後會產生一些額外的流量,這將是非常可疑的。

隱藏在(幾乎)清晰可見的視域中

這種設備可能會做什麼例如,檢查有效負載中的某些字節。它們通常是不相關的值;然後,我可以將數據包發送到目標,或者如果它是路由器,甚至沒有自己的IP地址,也可以將數據包發送到目標之外的一些隨機主機,甚至可能不存在,偽裝成(比如) HTTPS請求或SSH登錄嘗試。

如果看到不知道的數據包,則可能會感到可疑。但是,即使您在日誌中看到類似

  SSH:用戶維護失敗的嘗試SSH:用戶維護失敗的嘗試SSH:用戶維護失敗的嘗試 

如果您沒有沒有用戶“維護”,則不必擔心,特別是 。您可能會假設某人在某處發現了針對默認用戶“維護”的設備的攻擊(哎呀,如果我是政府,我可以銷售這樣的設備,使其容易受到攻擊,並且僅出於證明在完全不同的設備上建立這種連接的唯一目的而沒有解決它。看到這種嘗試,您將要做的第一件事是什麼都沒有(“無害的暴力破解。白痴”),google和聳聳肩(“哦,有人認為我有CheapRouter2000。笨蛋,可能寫了防火牆規則來阻止IP-只是數據包仍然到達網卡”)。

實際上發生的是路由器,網卡,主板或您所擁有的東西中不良的固件,識別出數據包,並發送回一個答案。通過偽造覆蓋“真實”響應包的響應包。

非常糟糕的事情的唯一症狀是,如果您比較例如來自邪惡路由器:

帶有SSH服務器的主機:

 -> SSH SYN --> ROUTER --> SSH SYN --> HOST<-- SSH S + A- -ROUTER <-- SSH S + A <--主機-> SSH ACK --> ROUTER --> SSH ACK --> HOST ...-- >登錄---- > ROUTER -->登錄- --- > HOST<-- FAIL2 ------ ROUTER <-- FAIL1 < ----主機數據包不同! 

沒有SSH服務器的主機:

 -> SSH SYN --> ROUTER --> SSH SYN --> HOST<-- SSH S + A --- ROUTER <-- SSH RST <--主機等待,WTF?-> SSH ACK --> ROUTER HOST ...-- >登錄---- > ROUTER HOST
<-- FAIL2 ------路由器主機 

如果您在受感染設備的左側或右側嗅探電纜,則不會立即發現任何故障。

然後,另一個可疑的事情是發件人顯然使用了 TCP快速打開擴展名。請注意,即使沒有TCP / FO,您也可以在SYN中發送額外的數據,而對於 非FO和不受威脅的設備,它們將被忽略。

您的路由器使我想起了https://www.teamten.com/lawrence/writings/coding-machines。
@user21820,謝謝,現在我要做噩夢。
@AndréBorie:如果您認真考慮一下,您將意識到這是不現實的。一次只針對一組目標需要大量的規劃和設計。什麼是“一組”?這只是情節中的細微缺陷之一。如果您想睡得更好,可以去找更多。但這是一個有趣的閱讀。=)
@user21820,感謝您的分享,我只看了整本書。很有意思!
@user8437812:也許有人可以根據當今的知識提出更現實的方案?= P
哦,我的那個令人毛骨悚然。我很久沒讀過一個好故事了。忘了我會變得多麼沉浸在他們之中。
Sauron
2017-01-15 14:42:51 UTC
view on stackexchange narkive permalink

如前所述,端口號用無符號的16位整數表示,並且不能超過65535。

但是有可能使用其他協議(不是TCP或UDP)。 IP標頭中有一個稱為“協議編號”的8位字段,表示該數據包內部使用了哪種傳輸協議。

您可以在此處查看傳輸協議表: http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml

此列表中的某些協議為用戶廣泛使用(例如TCP或UDP),而很少使用(DCCP或UDPLite)。某些協議號尚未使用,而某些協議號已棄用(ARGUS,EMCON)。

因此,後門可以使用未使用的協議號將數據發送到其服務器。當然,這種技術很難實現(需要訪問rawsocket或將後門實現為OS內核模塊)。

ChrisK
2017-01-15 04:45:15 UTC
view on stackexchange narkive permalink

這是可以實現的,但由於最大端口為65535,因此您將無法使用UDP和TCP等協議。

您需要在IP之上實現自己的協議協議。

使用原始套接字就可以實現。

關於創建後門的硬件和設備的討論太多,只有政府才能訪問以進行監視,並且我只是想知道這是否可能是他們執行此操作並避免檢測和發現的方法之一?

我認為這不會幫助使連接更隱秘,因為您仍然可以能夠看到通過網絡的數據包。

coteyr
2017-01-17 03:52:10 UTC
view on stackexchange narkive permalink

我考慮了幾天,我認為答案實際上可能是是,但是以一種奇怪的方式

所以還有很多其他答案已經指出,TCP表示端口號是16位。那是16個1和0。限制為65535個可重複端口。對於本示例的其餘部分,由於我很懶,因此將使用4位。

使用4位,我可以表示15個端口。

您的戲劇後門必須依靠其處理格式錯誤的TCP數據包的方式。因此(記住4位而不是16位)。讓我們在端口17上發送一些流量。

標頭的格式可能為10001。TCP堆棧可能會指出,如果標頭格式錯誤,則會沿著不同的邏輯路徑,將數據附加到端口17 “最正確的”四個位。在這種情況下,端口1或0001。真正的竅門是TCP僅使用位數。它不像xml中有[port] 10001 [/ port]的端口。因此,您將需要某種方法來檢測端口標頭溢出。 SYN就在端口旁邊,因此您可以這樣做,SYN恰好為“ 1073741823”意味著您的目標端口要大一個。

然後,此不同的邏輯路徑可以在端口1處於活動狀態的整個過程中保持活動狀態。

通過這種方式,您可以在某個接受格式錯誤的數據包的地方使用TCP後門對他們做了一些特別的事情。真正的問題是,只有您特殊的TCP堆棧才能理解它們。路由器,智能交換機,甚至從理論上講,某些NIC卡都會丟棄該數據包,因為該數據包格式不正確。

但是,如果您將兩個帶有不穩定TCP堆棧的設備連接到“啞”交換機或集線器,則幾乎沒有辦法判斷數據包是否會使用該格式的標頭將其發送到目的地。

從理論上講,您可以使它起作用,但是這不在TCP規範中。

“ SYN”標誌存儲在單個位中,沒有空間在其中放置魔術值。您可以使用標有SYN標誌的數據包的序列號。
我以為這是port:port:syn號,可能已經有一段時間了。無論哪種方式,使用端口爆震之類的方法都更加合理。
destport在seqnum旁邊,但是TCP使用seqnum值從一個隨機值(不為零)開始並按字節計數(相當快),因此您的“不同邏輯”將完全破壞所有正常連接的一半以上,也許每一個,用戶會注意到並進行調查。同樣,“戲劇性”在這裡沒有意義,您可能指的是“理論性”。
Peter Teoh
2017-01-18 22:03:43 UTC
view on stackexchange narkive permalink

每個人都用TCP / IP數據包來解釋它:端口字段只有16位長。

但是Linux內核源代碼及其如何處理端口呢?在Linux內核的任何地方,對於TCP / IP端口,始終將其強制轉換為“短”或16位。並且當將其編譯為x86程序集時,該指令的16位版本將用於處理16位數據。

如果您對IPv6感到疑惑,則它與os IPv4相同-有關TCP和UDP。

https://stackoverflow.com/questions/186829/how-do-ports-work-with-ipv6

但是您當然可以可以設置一個奇怪的通信,例如使用兩個服務器進行通信-每個通信都有單獨的16位端口,因此當您將它們組合在一起時,您就擁有一個虛擬的32位端口。但是,只有全世界,您才知道如何與兩台服務器通信-例如,將數據分成兩半並在兩台服務器之間進行劃分,然後再在客戶端重新構造。

這確實似乎超過16位幾乎是不可能的。

cybernard
2017-01-19 11:10:17 UTC
view on stackexchange narkive permalink

tcp headers

來源: https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#TCPIPREPETITION

這個真正廣泛的文檔清楚地表明瞭如何通過TCP在互聯網上分配位。它顯示了源端口和目標端口彼此相鄰。

那麼您做了一個32位源端口? NOPE只要它觸摸到源端口的Internet字節3 & 4(低位),就會在目標位置對其進行處理。

目標端口帶有擦除的序列號,所有內容將被推送

現在,由於序列號已被粉碎,因此目的地將不再期望該序列號,並且它將丟棄該序列號,就像它是一個欺騙包一樣。

即使它超過了這一點,確認號也將被序列號所破壞,並且由於該編號現在無效,就互聯網而言,它永遠不會被確認。

Nat
2017-01-15 01:03:52 UTC
view on stackexchange narkive permalink

是的,因為您指定了可以修改操作系統,但要注意的是,只有修改過的設備才能將其視為非標準端口號。

當前大多數實現都存儲該端口16位字段中的數字,因此所有可能的位組合都映射到0到65,535之間的整數。這些實現根本無法識別任何其他端口號,因為沒有位組合會映射到該端口號。

但是,如果您確實希望特定的客戶端將流量識別為不同的端口號,您可以重寫該客戶端如何在較低級別解釋數據包。您不僅可以使用16位端口號,還可以編寫OS來根據包的“選項”或“消息”部分中包含的數據識別對它的修改。這樣,系統就可以像可能存在的更大範圍的端口號一樣運行。

該技巧僅在重寫了其數據包解釋算法的設備上起作用。外部設備仍可以轉發這些數據包而不會受到損害,但它們會將這些數據包視為在標準端口號上。

評論不作進一步討論;此對話已[移至聊天](http://chat.stackexchange.com/rooms/51800/discussion-on-answer-by-chemical-engineer-is-it-theoretically-possible-to-plant)。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...