SSH会话劫持实现端口转发

SSH会话劫持实现端口转发

在进行渗透测试时,我们有时候会碰到搭建的测试环境、产品服务器、DMZ或者其他类似的机器群的情况,这时我们完全可以把它们看作跳板。这些系统被设计成对外交互的接口,这时候我们考虑对其他域里的用户进行SSH会话劫持是个不错的选择。

那么如果你拥有了某一个跳板的控制权限,想要通过另一个域的用户对远程域进行访问会怎么办呢?当然,这时候你是没有密码、密钥的,你不能抛弃二进制手段,而且SSH登录使用的是双因子认证。这下怎么办?让我们撸起袖子,练练命令行的功夫吧。

这篇文章涵盖了SSH会话劫持的两个方法。我们不需要认证,就可以直接实现动态端口转发。当我们需要劫持会话时,需要完成以下两个条件:

1.创建会话
2.存在一个活跃的SSH会话

我们的最终目标是通过另一个用户的活跃会话,创建一个通道来获取远程SSH主机的访问权限。

建立SSH会话劫持

为了劫持一个新近创建的会话,我们可以利用一项叫SSH复用的技术。黑客可以利用它在某用户的原始socket里创建自己的会话,不用再次进行认证。这个名为ControlMaster的技术在OpenSSH4里面提出过,著名黑客H D Moore和Val Smith的文章里也曾提到。我本人在某次交流会中,也谈到过这种攻击手法–The Poor Man’s Rootkit。这篇文章里我讲展示两种强制建立master socket的方法,然后会演示如何将端口转发给它们,第一个方法与ControlMaster有关

SSH客户端上的ControlMaster配置:

打开ControlMaster之后,一个ssh连接在后台运行,创建一个本地套接字(controlpath就是这个套接字的名字),以后本地再有
ssh需要连接到远端同样的主机的时候,直接使用这个已经创建好的socket文件进行连接,不用再创建连接了,同理,也不需要再进行用户身份验证。

最常见的对ControlMaster的socket的利用方式,就是对计算机里SSH客户端的配置做特殊的调整。

SSH会话劫持实现端口转发

这些配置能让所有新的会话建立持久性的中间人master socket。我在控制socket的命令中,使用了%h代表目标主机,%h可以是任何字符串。

SSH会话劫持实现端口转发

连接socket:
这个socket可以被用来在以后创建会话。即使原主人退出了会话,我们再次创建会话时也不需要认证。

SSH会话劫持实现端口转发

增加一个动态通道:
你得知道,我们的最终目标是到达其他域。下面的命令能让我们在现有的master socket之上,建立一个动态的通道。

SSH会话劫持实现端口转发

结束后移除socket:
如果我们只是简单地退出复用的会话,是不会关闭master socket的。想要真正地关闭它,你需要发送一个退出请求。

SSH会话劫持实现端口转发

利用SHELL指令使用SSH ControlMaster

另一个利用这类劫持技术的方法,我以前并没有公布过:master socket可以通过SSH客户端选项的flag进行创建。因为这个原因,我们可以使用shell指令截获某用户的通过SSH客户端发出的指令,从而注入我们自己的ControlMaster参数。

ssh () 
{ 
    /usr/bin/ssh -o "ControlMaster=auto" -o "ControlPath=/tmp/%r@%h:%p" -o "ControlPersist=yes" "$@";
}

这个截获函数会创建相应的socket,与使用ssh_config创建的效果类似。

SSH会话劫持实现端口转发

本次攻击流程图:

SSH会话劫持实现端口转发

利用SSH ControlMaster的socket和相应的socket选项,我们可以劫持SSH会话,注入实现端口转发。这些都不需要任何认证,现在让我们继续看另一个方法

劫持活跃SSH会话

普通用户可以创建screen会话,使用screen非常简易.只需在SHELL键入screen命令,便可打开一个screen session。然而随便这样创建出来的screen会话,用来控制通往其他有权限的机器的SSH连接,这是不太符合安全逻辑的。大多数用户没有意识到这些会话可能会被劫持,然后被用于端口转发。
找出screen会话的方法:
寻找screen会话的方法,当然要在/var/run/screen目录下翻找。当然,你也可以使用不完整的screen -r命令进行枚举,猜出某个用户来。


SSH会话劫持实现端口转发

绕过screen pts/tty的限制:
取得另一个域用户的screen会话权限没有看起来那么简单,不是su命令就行了,许多黑客就困在这里。我们使用su切换到与screen会话对应的用户,可能会发现屏幕上出现以下的错误信息:

“Cannot open your terminal '/dev/pts/#' - please check.”
“Must be connected to a terminal.”

SSH会话劫持实现端口转发

其中一个绕过该限制的方法,即用script的二进制流绕过su过的用户会话。

SSH会话劫持实现端口转发

增加一个通道:

SSH中有个很少被使用的特性,即转义sub-shell。如果你正在使用其他手段来控制通往跳板的权限,你可以利用转码序列向其他用户建立的会话中增加端口转发。按下ctrl+c回退到SSH的sub-shell,然后输入-D:<port>会增加一个动态端口转发。想要移除这个端口转发,可以在输入-KD:<port>后,再按下ctrl+c。

SSH会话劫持实现端口转发

如果你正在使用的是原始shell里的SSH,上面给的建议不会对你有用。这是因为你的SSH客户端在初始就会捕获转义字符。但是别担心,我会教你如何绕过它。
使用screen填充创建通道:
screen有一个特性,它允许你向输入队列里填充一个缓冲区的内容。这里填充的文本会被认为是screen内部输入的。所以我们可以通过它绕过外部SSH会话,输入转义字符。

SSH会话劫持实现端口转发

SSH会话劫持实现端口转发

在你小心进行填充的需要注意的是,填充的文本在screen会话回退时是可见的,但你可以通过改变回退的长度来阻止它出现。只要你把回退值改为0行,就可以清空screen,将其设置回原:

screen -S 18323.my_ssh_session -X scrollback 0
screen -S 18323.my_ssh_session -p 0 -X stuff $'~C'
screen -S 18323.my_ssh_session -p 0 -X stuff $'-D:9090\nclear\n'
screen -S 18323.my_ssh_session -X scrollback 15000

下面是一个screen会话劫持攻击的流程图:

SSH会话劫持实现端口转发

解决了SSH转义问题并利用screen的填充特性,我们才能劫持建立好的会话,并且注入产生新的通道!
通往远程域的通道:
最后一步是绑定一个本地端口,用来连接我们在hop_1注入的通道。现在我们就完全掌控了一个动态的通道,通往远程域不需要认证喔。

SSH会话劫持实现端口转发

[参考来源0xthem,由FreeBuf小编dawner翻译整理,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)]

原创文章,作者:stanley,如若转载,请注明出处:http://www.178linux.com/1362

(1)
stanleystanley
上一篇 2015-03-23
下一篇 2015-03-23

相关推荐

  • linux软件包管理

    linux软件包管理 简介     在Linux系统中,软件包的安装和管理是很重要的知识,而linux/unix一个麻烦的地方就是软件安装程序比较麻烦和复杂,尤其是当所安装的软件包要处理较多的包依赖关系,这就更让人头疼了,最常见linux软件安装方式有三种:     本文主要介绍Linux中RedHat或CentOS发…

    系统运维 2016-05-05
  • Linux ansible 服务

                      Linux ansible 服务 Ansible:    运维工具的分类: agent:基于专用的agent程序完成管理功能,puppet, func, zabbix, … agentless:基于ss…

    系统运维 2016-11-19
  • Linux进程管理

    一、程序与进程           1、程序         程序是为了达到特定的目的,可以被计算机运行并且由命令代码组成的语句序列。       &…

    Linux干货 2015-05-14
  • 【福利贴-招聘】- python运维开发工程师

    职位描述  岗位职责: 1、负责公司CMDB的建设,包括资产管理、dns、工单系统、ngnix自动化、监控等的开发 2、帮助运维团队和业务团队提高自动化效率 3、维护和开发持续化集成环境; 4、负责公司运维系统的规划、选型、部署上线和日常维护管理工作; 5、负责CMDB团队的建设、管理和人才培养机制…

    Linux干货 2015-04-03
  • 条件判断工具 test or [ ]

    概述         条件判断是学习shell脚本之前要掌握的重点基础。条件判断分为以下几类:文件判断、数值判断、字符判断。而文件判断还可以细分到:文件类型判断、文件权限判断、文件所属判断、文件之间属性判断;      &nbsp…

    Linux干货 2016-02-14
  • 优云云监控:先定一个运维小目标,比方监控它10000台主机

    “想做世界最好是对的,但是最好先定一个能达到的小目标,比方说我先挣它一个亿。”,王首富云淡风轻地给各行各业提供了一个很好的Roadmap,包括我们运维。的确,如今数据中心的规模增长速度也已像一匹脱缰的野马,各地都频频建设起超大型数据中心。按工信部的定义,超大型是指规模大于等于一万个标准机架的数据中心,考虑到虚拟化技术的使用,实际上需要运维的主机规模很容易超过…

    系统运维 2016-12-05