我想真正的问题是:
如果您在计算机上本地重建TCP / IP堆栈,则由于
RFC 793 - Transmission Control Protocol Standard
的工作方式(如以下某些内容中所述),整体概念将无法工作答案?使得无法访问高于65535的端口上运行的服务。讨论了创建后门的硬件和设备的话题太多了,只有政府可以访问以进行监视,我只是好奇是否可能是他们这样做的一种方式,并且避免了被发现和发现?
#1 楼
否,TCP头中的端口号字段在技术上限制为2个字节。 (为2^16=65536
提供可能的端口)如果通过为更高的端口保留更多位来更改协议,则会违反TCP段的规范,并且客户端不会理解。换句话说,您不再讲TCP,“ TCP源/目标端口”中的“端口”一词将不再适用。 UDP端口存在相同的局限性。例如,
icmpsh
是仅使用ICMP的反向外壳。最终,您还可以使用原始套接字实现自己的自定义传输层协议,该原始套接字可以具有自己的端口概念,范围大于0-65535。评论
不仅客户不会理解。同样,从客户端到服务器的路径上的每个路由器都将其视为乱码数据包,并将其丢弃。
–Tonny
17年1月15日在11:31
@Tonny:不一定。路由器仅应在IP级别进行路由,甚至不能看到TCP / UDP标头。当然,然后发生了NAT...。
–R .. GitHub停止帮助ICE
17年1月15日在13:26
@Tonny:我不确定实际上有多少。当然,怪异的边界NAT路由器会损坏/丢弃它,但我不知道普通路由器的哪一部分。
–R .. GitHub停止帮助ICE
17年1月15日在14:26
NAT在端口级别工作,因此通过NAT转发的每个协议都需要NAT支持。并非所有路由器都执行NAT,这在家庭路由器和SOHO路由器中很常见,但是您的ISP用于将网络转发到更大的Internet的运营商级路由器可能不会使用NAT(但运营商级NAT或CGN)。
–LawrenceC
17年1月15日在19:49
@R ..现在,我要多想一想...只要IP数据包中的协议类型更改为TCP的正常值以外的其他值,我认为大多数路由器实际上都可以使用IP数据包。当说TCP时,诸如DPI,ip-tables等之类的东西将尝试分析该数据包,由于该数据包不符合TCP规范,因此被认为格式错误。错误处理错误的路由器可能会崩溃...(现在我考虑一下。可能的攻击媒介?)
–Tonny
17年1月16日13:50
#2 楼
不,这是数字,因为该字段的TCP字段只有16位长(65536,但从0开始),因此从根本上讲,无法通信比65535高的端口。关于为什么在IPv4中如此,在IPv6中如何相同以及如何重用常规使用的端口的不错的文章。
评论
请注意,您的第二篇文章并没有说明如何增加端口范围,而是如何具有其他IP地址。端口号仍将保留在[0,65535]中。
– Arminius
17年1月14日在21:23
@Arminius确实是一个非常的回旋处,扩展它们的唯一方法是它们之间的通用跃点不支持的方法,例如IP标头中的可选字段。
– J.A.K.
19年3月19日在17:41
#3 楼
如果您在计算机上本地重建TCP / IP堆栈,由于RFC 793-传输控制协议
协议标准的工作方式如下所述,整个概念是否行不通?答案?
使得无法访问高于65535的端口上运行的服务。
65535之上的端口上没有TCP / UDP服务。如果它支持216-1以上的端口号,那么它将不再是TCP(或UDP)。
您还能有其他东西吗?当然。并且它与TCP非常相似吗?向后兼容?这两个问题都是肯定的。
关于硬件和设备创建后门的讨论太多了,只有政府也可以访问进行监视,
只是好奇是否这可能是他们这样做的一种方式,并且避免了检测和发现?
如果我开发了这样的设备,它将依赖于协议足够普通,以至于不引人注目。未知/非法的协议数据包之后会产生一些额外的流量,这将是非常可疑的。 ,例如,检查有效负载中的某些字节。它们通常是不相关的值;然后,我可以将数据包发送到目标,或者如果它是路由器,甚至没有自己的IP地址,也可以将数据包发送到目标之外的某个随机的,甚至可能不存在的主机,伪装成HTTPS请求或SSH登录尝试。
如果看到不知道的数据包,可能会感到可疑。但是,即使您在日志中看到类似
SSH: failed attempt for user maintenance
SSH: failed attempt for user maintenance
SSH: failed attempt for user maintenance
您不必担心,特别是如果您没有用户“维护”。您可能会假设某人在某处发现了针对某台设备的攻击,并且默认用户具有“维护”权限(哎呀,如果我是政府,我可以推销此类设备,让它易受攻击,而不是对其进行修复)目的是在完全不同的设备上证明这种连接的正确性。看到这种尝试,您要做的第一件事是什么都没有(“无害的暴力破解。白痴”),google和耸耸肩(“哦,有人以为我有一个CheapRouter2000。白痴”) ,可能会编写防火墙规则来阻止IP-除非数据包仍然到达网卡。)
实际上发生的是路由器,网卡,母板中的恶意固件或什么?知道了数据包并发回了答案,可以通过伪造响应数据包来覆盖“真实”数据包来做到。
发生非常糟糕的事情的唯一症状是,如果您进行比较,比如说,来自邪恶路由器的入站和出站流量:
主机与SSH服务器:
--> SSH SYN --> ROUTER --> SSH SYN --> HOST
<-- SSH S+A --- ROUTER <-- SSH S+A <-- HOST
--> SSH ACK --> ROUTER --> SSH ACK --> HOST
...
--> LOGIN ----> ROUTER --> LOGIN ----> HOST
<-- FAIL2------ ROUTER <-- FAIL1 <---- HOST packets are different!
没有SSH服务器的主机:
--> SSH SYN --> ROUTER --> SSH SYN --> HOST
<-- SSH S+A --- ROUTER <-- SSH RST <-- HOST wait, WTF?
--> SSH ACK --> ROUTER HOST
...
--> LOGIN ----> ROUTER HOST
<-- FAIL2------ ROUTER HOST
如果嗅探电缆,则在受感染设备的左侧或右侧,您不会立即发现任何错误。
然后,另一个可疑的事情是发件人显然使用了TCP Fast Open扩展。请注意,即使没有TCP / FO,您也可以在SYN中发送额外的数据,这将同时被非FO和非妥协设备忽略。
评论
您的路由器使我想起了teamten.com/lawrence/writings/coding-machines。
–user21820
17年1月15日在2:06
@ user21820谢谢,现在我要做噩梦。
–AndréBorie
17年1月16日在16:53
@AndréBorie:如果您认真考虑一下,您会意识到这是不现实的。一次只针对一组目标需要大量的规划和设计。什么是“一组”?这仅仅是情节中的细微缺陷之一。如果您想睡得更好,可以去找更多。但这是一个有趣的阅读。 =)
–user21820
17年1月17日在4:54
@ user21820,感谢您的分享,我只看了整本书。很有意思!
–user8437812
17年1月19日在8:52
@ user8437812:也许有人可以根据今天的知识提出一个更现实的方案? = P
–user21820
17年1月19日在11:01
#4 楼
如前所述,端口号用无符号的16位整数表示,并且不能超过65535。但是有可能使用其他协议(不是TCP或UDP)。在IP标头中,有一个称为“协议编号”的8位字段,表示该数据包内部使用了哪种传输协议。
您可以在此处查看传输协议表:http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
某些协议此列表中的用户广泛使用(例如TCP或UDP),而很少使用(DCCP或UDPLite)。某些协议号尚未使用,而某些协议号已弃用(ARGUS,EMCON)。
因此,后门可以使用未使用的协议号将数据发送到其服务器。当然,这种技术很难实现(需要访问rawsocket或将后门实现为OS内核模块)。
#5 楼
这可能会实现,但由于最大端口为65535,因此您将无法使用UDP和TCP等协议。您需要在IP协议之上实现自己的协议。
使用原始套接字也可以实现此目的。
关于创建后门的硬件和设备的讨论非常多,只有政府才能访问以进行监视,我只是很好奇,这是否可能是他们这样做的一种方式,并且避免了被发现和发现?仍然能够看到通过网络的数据包。
#6 楼
我考虑了好几天,我认为答案实际上可能是肯定的,但是以一种奇怪的方式。因此,正如许多其他答案指出的那样,TCP表示端口号是16位。那是16 1s和0s。限制为65535个可重复端口。对于本示例的其余部分,由于我很懒,因此将使用4位。
所以用4位,我可以代表15个端口。
您的剧院后门必须依靠其处理格式错误的TCP数据包的方式。因此(记住4位而不是16位)。让我们在端口17上发送一些通信。 “最右边”的四位。在这种情况下,端口1或0001。真正的窍门是TCP仅使用位数。它与xml中不存在[port] 10001 [/ port]的情况类似。因此,您将需要某种方法来检测端口标头溢出。 SYN在端口旁边,因此您可以这样做,SYN恰好是“ 1073741823”,意味着您的目标端口要大一个。
然后,该不同的逻辑路径可以在端口1上的连接处于活动状态的整个过程中保持活动状态。
这样,您可以在已接受的某个位置周围放置一个TCP后门格式错误的数据包,并对其进行了特殊处理。真正的问题是,只有您特殊的TCP堆栈才能理解它们。路由器,智能交换机,甚至从理论上讲,某些NIC卡都会丢弃该数据包,因为该数据包格式不正确。
但是,如果将两个带有不稳定TCP堆栈的设备连接到一个“哑”交换机或集线器,几乎没有办法确定数据包是否会使用该格式不正确的报头到达目的地。 。从理论上讲,您可以使它起作用,但是这不在TCP规范中。
评论
SYN标志存储在单个位中,没有空间在其中放置魔术值。您可以使用标有SYN标志的数据包的序列号。
– Ben Voigt
17年1月18日在22:05
我以为这是port:port:syn号,可能已经有一段时间了。无论哪种方式,使用端口爆震之类的方法都更加合理。
–牛羚
17年1月18日在22:38
destport在seqnum旁边,但是TCP使用seqnum值从一个随机值(不为零)开始并按字节计数(相当快),因此您的“不同逻辑”将完全破坏所有正常连接的一半以上,也许每一个,用户会注意到并进行调查。同样,“戏剧性”在这里没有意义,您可能指的是“理论性”。
–dave_thompson_085
18-4-7在3:07
#7 楼
来源:https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#TCPIPREPETITION
该真正广泛的文档清楚地表明了位的分配方式通过TCP在互联网上。它显示了源端口和目标端口彼此相邻。
那么您创建了32位源端口吗? NOPE只要触碰到源端口的Internet字节3和4(较低顺序),就会在目标位置处理。
目标端口带有擦除的序列号,所有内容将被清除。
现在,由于序列号已被粉碎,目的地将不再期望该序列号,并且它将丢弃它,就像它是一个欺骗包一样。
即使超过了这一点,确认号也会被序列号破坏,并且由于该编号现在无效,就互联网而言,它永远不会被确认。
#8 楼
每个人都用TCP / IP数据包来解释它:端口字段只有16位长。Linux内核源代码如何处理端口呢?在Linux内核的任何地方,对于TCP / IP端口,始终将其强制转换为“短”或16位。当将其编译为x86程序集时,该指令的16位版本将用于处理16位数据。和UDP。
https://stackoverflow.com/questions/186829/how-do-ports-work-with-ipv6
但是您当然可以设置一个怪异的就像使用两个服务器进行通信一样进行通信-每个都有单独的16位端口,因此当您将它们组合在一起时,您将拥有一个虚拟的32位端口。但是,只有全世界,您才知道如何与两台服务器通信-例如,将数据分成两半并在两台服务器之间进行划分,然后再在客户端重新构造。
它看起来好像超过16位几乎是不可能的。
#9 楼
是的,因为您指定可以修改操作系统,但是要注意的是,只有修改过的设备才能将其视为非标准端口号。大多数当前实现将端口号存储在16位字段,因此所有可能的位组合都映射到0到65,535之间的整数。这些实现根本无法识别任何其他端口号,因为没有位组合会映射到该端口号。
但是,如果您确实希望特定的客户端将流量识别为与其他端口号相同,您可以重写该客户端如何在较低级别解释数据包。您不仅可以使用16位端口号,还可以编写OS来根据包的“选项”或“消息”部分中包含的数据来识别对其的修改。这样,系统就可以像可能存在的更大范围的端口号一样进行操作。外部设备仍可以转发这些数据包而不会受到损害,但是它们会将数据包视为在标准端口号上。
评论
评论不作进一步讨论;此对话已移至聊天。
–Rory Alsop♦
17年1月15日在0:00
评论
如果仍然要重建TCP / IP,则最好使后门拦截所构建的特殊数据包并发送到端口80。我可以想象,如果您足够聪明,可以将“端口70000”传递给某些实现,则它们最终会将其截断为4464。
如果您可以修改客户端以接受被入侵的TCP数据包,则您已经将其典当了。为什么还需要后门?
从理论上讲,您可以将后门放在端口0上,前提是您同时修改了服务器和客户端的TCP堆栈。我觉得任何理智的防火墙都不会让它通过
@ JPhi1618“假设您同时修改了服务器和客户端的TCP堆栈”,则意味着甚至包括内核。从理论上讲,如果您真的愿意,可以将0填充到TCP数据包的端口字段中,它可能不再是有效的TCP,但是可以绕过不良的防火墙(实际上阻止了端口0?)并且很难猜测。 >