Linux SSH隧道学习

又是学习的时间,本篇主要介绍一下Linux下在渗透实战过程中非常使用的隧道技术,通过使用不同的工具,结合不同的场景帮助理清不同网络条件下如何突破内网,建立稳定连接,为进一步的渗透测试奠定基础。在实战中,端口转发和端口复用技术能够帮助我们更好执行相关命令,本篇基于以上叙述,开始梳理相关技术。

SSH隧道

SSH参数

SSH命令支持的参数众多,详情可见SSH参数详解

挑选几个比较重要的着重展示一下:

当然上面的参数叙述还是不全,没有涉及到下面我们要提到的隧道。

根据相关资料,一般把SSH隧道分为3类:本地隧道、远程隧道、动态隧道,分别对应以下参数

-L port:host:hostport

将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. IPv6 地址用另一种格式说明: port/host/hostport

-R port:host:hostport

将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发 IPv6 地址用另一种格式说明: port/host/hostport

-D port

指定一个本地机器 `动态的`应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4/5 协议, 将充当 SOCKS4/5 服务器. 可以在配置文件中指定动态端口的转发.

不同隧道对应的场景和功能各不相同,下面我们以不同场景为例讲解一下SSH隧道

场景一

连接关系图如下:

所以攻击者想建立一条从B到C的SSH隧道,这样攻击者只需要连接C主机的特定端口即可完成对主机B连接

既然要SSH登录受害者主机B,首先我们需要在主机B上有一个可以登录的帐号,密码登录或密钥登录均可,根据/etc/ssh/sshd_config文件配置来。本例会分别介绍密码登录和密钥登录的情况。

与此同时,由于是打一条从B到C的隧道,那么也需要在主机C上有一个可以登录的帐号,一般使用密码登录简单一些,有一些心大的同学上来就是用C的root用户建立一条隧道,这个还是比较危险的,一旦B主机上有比较厉害的操作审计软件,C主机的root密码就泄漏了。所以安全起见,我们也在C主机上新建一个帐号。

OK,准备工作就绪,我们就开始打隧道了,我们计划把主机B的22端口转发到主机C的7777端口,相关防火墙策略已经开好,此处不赘述。

首先来到受害者主机B,执行以下命令

其它参数不提,主要参数在于R,建立远程隧道,将本机的22端口转发到47.89.185.120的7777端口,-p 22实际上是C主机的SSH端口,不要混淆,这里的关系一定要明晰

如果隧道建立成功,此时就相当于SSH登录主机C的testmg帐号了,回显应该和SSH登录新主机一样,确认公钥,输入密码,然后连接成功

当然俗话说的好“世间之事如棋局”,在第一次尝试的过程中发现,命令输入完以后直接无回显,什么反应都没有。

那就开始排查吧,首先主机C的7777端口访问策略已经开通,因此连接被拒绝的可能被排除。

由于上述命令里面,有-q参数,开始走静默模式,所以也没有回显,现在干脆只保留最重要的-R参数

出现回显,显示

问题比较明显:公-私钥认证的过程出错了,我们希望使用密码登录主机C的,C主机之前为了安全,设置了只支持密钥登录,解决方法也很多,ssh免密码登录Permission denied (publickey,gssapi-keyex,gssapi-with-mic) 的解决方案

所以来到主机C,root用户修改/etc/ssh/sshd_config文件,允许密码登录

然后保存并重启sshd

接着回到主机B,尝试建立隧道,此时显示需要输入testmg的密码,输入完成后无回显(截图时非首次登录,因此没有确认公钥的部分)

来到主机C,看一下隧道建立前后的端口变化

可以看到主机C已经建立7777端口的连接,且服务名称为sshd testmg

此时隧道已经建立成功了,主机B的22端口已经转发到主机C的7777端口上,我们在主机C上直接访问本机的7777端口就可以访问主机B的22端口

此时的test帐号为主机B上的帐号

输入对应的密码后,登录成功

执行相关命令可看到此时的IP为主机B的IP

此时在主机B上执行last或w命令,显示的登录IP为127.0.0.1,端口也无异样,比较隐蔽

那么我们此时能不能直接从主机A访问主机C的7777端口,实现访问主机B的22端口呢?

结果就是连接被拒绝,主机C上建立的连接是127.0.0.1的7777端口,自然不允许非本机登录,除非连接是(0.0.0.0:7777或:::7777),具体的详细原因,教程后面的远程隧道部分会详细叙述。

此为SSH远程隧道的特性,如果只建立这么一条隧道,那么只能在隧道的另一方登录。

好的,下面说一下从主机C密钥登录受害者主机B

建立隧道部分和上文一致,此时主要是生成密钥对和设置主机B允许密钥登录

还是在主机B上生成test用户的密钥对

切换到test用户登录的情况下使用ssh-keygen命令在/home/test/.ssh/目录下生成密钥对id_rsa和id_rsa.pub

然后将公钥id_rsa写入test用户的authorized_keys文件中,同时注意authorized_keys文件权限为600,/home/test/.ssh文件夹权限为700

还是需要设置/etc/ssh/sshd_config文件,设置允许密钥方式登录

保存并重启sshd服务

如果还是不清楚以上过程,参考这篇文章设置SSH通过密钥登录

以上完成后,我们把私钥文件id_rsa拷贝到主机C,准备开始尝试密钥登录

使用-i命令,指定私钥文件登录

结果显示报错:说私钥不受保护啊,权限不对

en.....

好吧,真是善于为他人着想,好吧,改一下私钥文件的权限为600,再试

OK,登录成功,密钥的权限不对也会影响本机的登录

看了上面的过程,可能有小伙伴会疑惑,这过程这么复杂,直接反弹shell不好吗?

其实反弹shell当然也是可以的,步骤比较简单,但是相对SSH,稳定性会差一些,且反弹shell的动作比较大,某些情况下也比较受限。

且SSH隧道所有流量均经过加密,安全性更高

总结一下,在帐号和sshd配置完成的情况下,其实需要的命令也只要两条:

受害者主机执行:

云端主机执行:

适用场景:

缺陷:

还是以上例说明,上午10点建立的7777端口隧道,在下午3点查看主机C端口情况,发现连接已经断开

这个问题就比较尴尬了,难道每次都要上B打一次隧道?

这个自然是有解决方法的:使用autossh,这个软件会在超时之后自动重新建立SSH 隧道,这样就解决了隧道的稳定性问题。

首先可以在受害者主机B上使用yum或者apt-get安装autossh

然后在B上执行

命令执行完,会让输入主机C上testmg用户密码,输入正确以后,就会卡在此处,实际上隧道已经打通了

我们在主机C上尝试使用主机B的test帐号登录一下本机7777端口

登录成功

查看一下受害者主机B的端口和进程情况

可以看到autossh本质上还是通过起ssh进程的方式实现了隧道的建立

再看一下主机C上的端口情况

可以看到除了原有的7777端口外,还增加了6777端口的连接,用于监听7777隧道的状态,实现自动重连

这样,除非受害主机杀死autossh进程,否则隧道是一直建立的,这样解决了隧道脆弱性的问题。

相关资料见:SSH反向隧道进行内网穿透

上面的案例主要介绍了如何利用SSH隧道进行内网穿透,其实SSH3大隧道各有适用的场景,本篇只是开了一个头,希望各位在今后的渗透中可以灵活运用。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180608G1G7TL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券