绕过SSH服务器的端口转发限制
0x00 背景
在某些场景下SSH服务器会禁用掉端口转发的能力,以降低安全风险。这会导致很多依赖SSH端口转发的工具无法正常工作。
这里主要是修改了/etc/ssh/sshd_config文件中以下几项实现的:
1 | #AllowAgentForwarding yes |
此时,SSH服务器基本就变成了只能执行shell命令的工具,无法用于建立通信通道。
是否有办法可以绕过这一限制呢?答案是肯定的。
0x01 借尸还魂
SSH最常用的能力就是交互式命令行,所谓交互式命令行,就是允许用户进行实时输入,并将输出实时展示出来。也就是说:交互式命令行本身就是一个双向通信的通道。因此,可以编写一个程序,它会在初始化时与指定的服务器端口建立Socket连接,然后将所有stdin读到的数据实时发送给Socket,并将Socket接收到的数据写到stdout中,stderr则用于输出控制信息和日志等。
根据上面的分析,这个程序其实跟telnet命令非常相似,但又不完全相同。因此用GO写了下面这个程序:
1 | package main |
完整的代码可以参考:telnet-go。
0x02 暗度陈仓
要使用telnet-go提供的通信通道,需要与Paramiko或ASyncSSH之类的SSH库进行集成才行。下面是使用ASyncSSH进行集成的核心逻辑:
1 | class SSHProcessTunnel(SSHTunnel): |
完整的代码可以参考:turbo-tunnel。
turbo-tunnel中可以使用以下方法将流量转发给SSH服务器:
1 | turbo-tunnel -l http://:8080/ -t ssh+process://root:password@1.1.1.1:2222/usr/local/bin/telnet |
/usr/local/bin/telnet是telnet-go在服务器上的路径,需要设置好可执行权限。
然后,本地通过http://127.0.0.1:8080代理访问的流量都会转发到ssh服务器上,从而实现了通过ssh服务器进行端口转发的目的。
0x03 总结
利用进程的实时输入输出,可以解决SSH服务器不支持端口转发的问题,从而绕过服务器限制,建立通信通道。这种方式应用场景更广,也更加隐蔽,只是使用上需要提前将一个文件拷贝到SSH服务器上,这里可能少数场景会有些阻碍(例如删除了chmod命令),需要寻找绕过这些限制的方法。
不过总的来说,使用这种方法,大大提升了建立SSH隧道的成功率,具有较大的实际应用价值。