端口复用技术
正值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隧道实现穿透。
项目地址
使用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
的作用是:
- 允许套接字绑定到已经使用过的本地地址和端口上,即使这个连接还没有完全关闭或者该端口仍处于 TIME_WAIT 状态。
- 在多个进程或线程之间共享端口,在某些情况下可以提高端口利用率和程序性能。
- 处理服务器程序在崩溃或异常退出时,由于内核没有正确清理套接字资源导致无法立即重新绑定端口的问题。
具体的实现方法如下:
首先解析命令行参数,包括本地监听的 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
,且目前端口复用打包后过免杀
谈谈端口复用和端口转发的区别
相同点:
- 二者都可以用于实现多个应用程序使用同一个端口号的目的。
- 二者都可以提高网络通信效率和可靠性,减少资源浪费。
不同点:
- 端口复用是指多个应用程序同时使用同一个端口号进行通信。这种机制可以通过操作系统内核来实现,如 Windows 中的 SO_REUSEADDR 选项。而端口转发是指将接收到的数据包重定向到另一个 IP 地址或端口上,通常需要使用专门的软件或硬件设备来实现。
- 端口复用通常会在内核中进行,由操作系统负责管理和调度。而端口转发通常需要特殊的中间件或代理,例如负载均衡器、反向代理等,来协调请求和响应之间的关系。
某厂商告警测试
基于某厂商全流量
设备探针位置,我测试了过探针进行流量转发的测试,事实上在流量过探针时间,未触发其内置告警规则
警报规则其实也不算多,尝试联系厂家之后确认其设备本身警报规则比较少,规则量也就1W多条
针对本次告警可定制规则
查看目的主机的网络连接状态,对于目的主机连接状态显示的连接端口也为8081,经由目的主机本机端口转发至3389
这种情况针对端口复用的告警规则须同时满足本地端口的转发规则以及复用端口的连接状态监测。但是对于探针而言,是无法监测到目的主机的回环地址的转发状态,所以在实现转发的时候,仅需保证自己的攻击源未被打标签即可规避唯一的风险,规避安全设备基于情报的告警。