ssh 端口转发#
在横向移动的内网代理的过程中,如果控制的目标机器是 linux 服务器,那么就可以通过 ssh 实现内网代理操作,用的比较多的是动态转发。
ssh 的三种端口转发模式:
-
本地转发(-L 参数)
-
远程转发(-R 参数)
-
动态转发(-D 参数)
-
攻击机器:攻击者的机器
-
待登录机器:已被控制的 linux 服务器
-
目标机器:攻击机器需要访问的目标主机,无法直接访问
本地转发#
本地转发,顾名思义就是把本地主机端口通过待登录主机端口转发到远程主机端口上去。
本地转发通过参数 - L 指定,格式:ssh -L [攻击机器ip]
:<攻击机器端口号>:< 目标机器 ip>:< 目标机器端口号 > < 待登录机器的用户名 >@< 待登录主机的 ip>
假设如下场景:
攻击者通过攻击机器
控制了一台linux服务器(待登录机器)
并获取了账号密码,然后还有一台目标机器,这台机器位于内网,攻击机器
无法访问,但待登录机器
可以访问,类似如下拓扑图。
此时,host1
如果要访问host3
该怎么办呢?
只能通过host2
进行转发,host2
充当中间人的作用,传输host1
和host3
之间的加密数据。
假如 host3 有一个 web 服务端口为 80,host1 需要访问这个 web 服务,那么可以如下操作,在 host1 上通过 ssh 连接登录到 host2 上即可实现本地端口转发。
host1 上操作
ssh -L 0.0.0.0:8888:10.10.10.129:80 [email protected]
- 攻击机器 ip 可选,也可以写成如下
ssh -L 8888:10.10.10.129:80 [email protected]
这条命令将目标机器的 80 端口映射到攻击机器的 8888 端口,此时攻击者只要访问本地的 8888 端口就是访问目标机器的 80 端口。
远程端口转发#
假设如下场景,这种场景在渗透测试中不常见,host1 不允许直接访问 host3,host2 可以访问 host3,但是 host1 无法访问 host2,host2 可以访问 host1。此时就用到远程端口转发。
host2 上操作
ssh -R 0.0.0.0:8888:10.10.10.129:80 [email protected]
也可以写成
ssh -R 8888:10.10.10.129:80 [email protected]
这条命令将目标机器(host3)的 80 端口映射到待登录机器(host2)机器的 8888 端口,此时攻击者只要访问本地的 8888 端口就是访问目标机器(host3)的 80 端口。
动态端口转发#
动态转发通过参数 - D 指定
格式:-D [本地主机:]
本地主机端口
相对于前两个来说,动态转发无需再指定远程主机及其端口且通过 SOCKS 协议进行数据传输。
假设如下场景:
攻击者通过攻击机器
控制了一台linux服务器(待登录机器)
并获取了账号密码,然后还有一台目标机器,这台机器位于内网,攻击机器
无法访问,但待登录机器
可以访问,类似如下拓扑图。
攻击机器(host1)上操作
ssh -D 127.0.0.1:8888 [email protected]
也可以写成
ssh -D 8888 [email protected]
这条命令创建了一个 SOCKS 代理,所有通过该 SOCKS 代理发出的数据包将经过 host2 转发出去。
怎么使用?
- 用 firefox 浏览器,在浏览器里设置使用 socks5 代理 127.0.0.1:8888,然后浏览器就可以访问 host2 所在网络内的任何 IP 了。
- 如果是普通命令行应用,使用proxychains-ng,参考命令如下:
brew install proxychains-ng
编辑配置文件
vim /usr/local/etc/proxychains.conf # 在ProxyList配置段下添加配置 "socks5 127.0.0.1 8888"
访问目标网络
proxychains-ng wget http://10.10.10.129 # 在其它命令行前添加proxychains-ng即可
构建 ssh 隧道的常用参数:
-C 压缩传输,提高传输速度
-f 后台执行数据传输
-N 建立静默连接
-g 允许远程主机连接本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发,即 SOCKS 代理
-p 指定 ssh 连接端口
实验环境搭建#
环境配置#
1、攻击机器
- 17.1.26.131
2、待登录主机
- 17.1.26.133
- 10.10.10.130
3、目标主机
- 10.10.10.129
本地端口转发#
在攻击机器(host1)执行如下命令:
ssh -L 8888:10.10.10.129:80 [email protected]
在攻击机器(host1)查看端口情况,可以看到正在监听 8888 端口。
在本地主机打开浏览器,访问 8888 端口,查看是否能访问成功。访问http://127.0.0.1:8888/123.asp。
远程转发#
环境如上一致,命令参数如下,在待登录主机(host2)上输入如下命令:
ssh -R 8888:10.10.10.129:80 [email protected]
回到本地主机,查看端口是否打开,netstat -tnlp ,显示 8888 端口已打开。
同时打开浏览器访问http://127.0.0.1:8888/123.asp,访问成功。
动态转发#
环境和本地转发一致,命令参数如下,在攻击机器(host1)的命令行窗口执行并输入 ssh 登录密码:
ssh [email protected] -D 55555
攻击机器(host1)上查看端口情况
攻击机器(host1)设置浏览器 socks 代理
攻击机器(host1)浏览器直接访问http://10.10.10.129/123.asp
参考#
https://jeremyxu2010.github.io/2018/12/ssh 的三种端口转发 /
https://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
https://reznok.com/ssh-tunneling-magic/
图片来自