红蓝对抗| 基于某商全流量设备端口复用流量分析
嗯,用户让我帮忙总结一下这篇文章的内容,控制在100字以内,而且不需要用“文章内容总结”之类的开头,直接写描述。首先,我需要通读整篇文章,抓住主要信息。 文章主要讲的是端口复用的概念和实现。作者提到他们最近在护网行动中测试了一个新的项目,利用端口复用来绕过防火墙的限制。具体来说,他们使用了SO_REUSEADDR选项来允许端口重用,并通过socks隧道实现了穿透攻击。 文中还详细介绍了项目的实现方法,包括如何配置防火墙、服务器端和客户端的命令执行,以及流量分析的结果。作者还比较了端口复用和端口转发的不同之处,并讨论了如何利用厂商的全流量监测设备进行测试,发现未触发告警规则。 最后,文章提到了一些安全建议和免责声明,强调技术使用的谨慎性和遵守相关法律。 总结下来,这篇文章主要探讨了端口复用的技术细节、实现方法及其在安全测试中的应用效果。 </think> 文章探讨了端口复用技术在网络安全中的应用与实现。通过配置防火墙和使用SO_REUSEADDR选项,实现了将特定端口的流量转发至目标主机的其他端口。测试表明该技术可绕过安全设备告警,并成功穿透目标系统。文中详细介绍了技术实现方法及流量分析结果,并比较了端口复用与传统端口转发的区别。 2026-2-1 00:0:0 Author: www.freebuf.com(查看原文) 阅读量:0 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

正值HW,目前在防守,最近看到了一个新项目,端口复用的概念又被拿出来提了一遍,本来以为就是之前依托防火墙的端口转发,看来项目之后确实有点儿区别,无需依托于防火墙的端口复用,在使用效果上确实还错。近期在护网,正好有机会借助厂商全流量监测设备在利用过程中是否产生告警,结果出乎意料。

目标主机 10.10.128.16 目标端口8081 攻击机 192.168.0.100 首先防火墙配置仅8081端口放通

netsh advfirewall firewall add rule name="Allow Port 8081" dir=in action=allow protocol=TCP localport=8081

目标主机作为服务端起服务器

ReuseSocks_Server.exe 10.10.128.16 8081 dffa71977e9f0a0e6f0ea6d47e8a17bc

目标主机需执行命令

netsh interface portproxy add v4tov4 listenport=8081 listenaddress=10.10.128.16 connectport=3306 connectaddress=127.0.0.1

这里将来自防火墙的复用端口8081流量转发至目标主机监听端口3306上 攻击机执行命令

ReuseSocks_client.exe -remote 10.10.128.16:8081

攻击机即可通过socks隧道实现穿透。 项目地址

https://github.com/p1d3er/port_reuse 使用go环境自己编译

go mod init main  
go mod tidy  
go build -o port_reuse.exe port_reuse_windows.go
.\port_reuse.exe 10.10.128.16 8081 127.0.0.1 3389 0cbecb8e411599f7f7cd589ed5890293

因为我这里虚拟机使用的是nat模式,访问目标主机应用接收的为网关地址 使用用户名和密码成功登录

对于端口复用的流量分析,该程序在运行时调用了SO_REUSEADDR ,该套接字用于控制在关闭连接或者端口被占用时是否允许重用该端口。当设置 SO_REUSEADDR 选项为 1(true)时,表示可以允许重用端口。 SO_REUSEADDR 的作用是:

  1. 允许套接字绑定到已经使用过的本地地址和端口上,即使这个连接还没有完全关闭或者该端口仍处于 TIME_WAIT 状态。
  2. 在多个进程或线程之间共享端口,在某些情况下可以提高端口利用率和程序性能。
  3. 处理服务器程序在崩溃或异常退出时,由于内核没有正确清理套接字资源导致无法立即重新绑定端口的问题。

具体的实现方法如下:

  • 首先解析命令行参数,包括本地监听的 IP 地址和端口、目标主机的 IP 地址和端口,以及允许访问本地监听端口的来源 IP 地址的 MD5 值。
  • 使用 ListenConfig 对象创建一个监听器 l,并在其中使用 Control 函数设置 SO_REUSEADDR 选项,以便可以重用本地端口。然后在 l 上调用 Accept 函数,等待来自客户端的连接请求。
  • 当有新的客户端连接到本地监听端口时,启动一个新的 goroutine,并在其中调用 handleClient 函数,传入当前客户端连接、目标主机的 IP 地址和端口,以及需要限制访问来源 IP 地址的 MD5 值。
  • handleClient 函数中,首先连接到指定的目标主机和端口,并在得到目标服务端连接后,启动两个 goroutine,分别进行双向数据传输。
  • 在数据传输过程中,使用较大的缓冲区进行数据读写,并对发生的错误进行处理。如果任何一个 goroutine 完成了数据传输,则关闭另一个连接,从而终止整个转发流程。
  • 如果客户端连接的来源 IP 地址的 MD5 值与预期值不符,则转发到本地监听端口,否则转发到目标主机和端口。

由于虚拟机出现问题了,这边我分析流量更换了机器测试,使用RawCap.exe抓取本机流量,默认情况下虚拟机走nat模式是无法抓取回环地址的流量的 本机起WEB服务,启动监听模式 分析流量包,根据所有的攻击源和目标主机过滤流量,走的协议都是TCP和TLS协议,TCP的连接端口都为业务端口8081 根据监听状态回传数据可以看出当产生连接时,由目标主机的端口攻击源的流量进行了一个转发,转发到了本机的3389端口 接着对回环地址的流量转发进行重新抓包分析 检索端口tcp.dstport==52957或者tcp.dstport==3389 可以通过流量看到当进行RDP连接时,所有TCP协议的源和目的都为回环地址,在数据传输的时候走的协议都为TLS,且目前端口复用打包后过免杀

相同点:

  1. 二者都可以用于实现多个应用程序使用同一个端口号的目的。
  2. 二者都可以提高网络通信效率和可靠性,减少资源浪费。

不同点:

  1. 端口复用是指多个应用程序同时使用同一个端口号进行通信。这种机制可以通过操作系统内核来实现,如 Windows 中的 SO_REUSEADDR 选项。而端口转发是指将接收到的数据包重定向到另一个 IP 地址或端口上,通常需要使用专门的软件或硬件设备来实现。
  2. 端口复用通常会在内核中进行,由操作系统负责管理和调度。而端口转发通常需要特殊的中间件或代理,例如负载均衡器、反向代理等,来协调请求和响应之间的关系。

基于某厂商全流量设备探针位置,我测试了过探针进行流量转发的测试,事实上在流量过探针时间,未触发其内置告警规则 警报规则其实也不算多,尝试联系厂家之后确认其设备本身警报规则比较少,规则量也就1W多条 针对本次告警可定制规则 查看目的主机的网络连接状态,对于目的主机连接状态显示的连接端口也为8081,经由目的主机本机端口转发至3389 这种情况针对端口复用的告警规则须同时满足本地端口的转发规则以及复用端口的连接状态监测。但是对于探针而言,是无法监测到目的主机的回环地址的转发状态,所以在实现转发的时候,仅需保证自己的攻击源未被打标签即可规避唯一的风险,规避安全设备基于情报 的告警。

免责声明

1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。

2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。

3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/web/469328.html
如有侵权请联系:admin#unsafe.sh