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 15:49
下一篇 2015-03-23 17:02

相关推荐

  • VMware12 Centos系统安装VMware-tools过程

    1、点击VMware菜单虚拟机选中安装VMware-tools:           注:虚拟机桌面会生成VMwaretools DVD安装光盘 2、查看虚拟机设置ISO映像文件是否是VMwaretoolsDVD带Linux.iso映像的文件: 3、在centos系统中 open term…

    Linux干货 2016-07-26
  • Linux文本处理工具之grep

    简介     grep:Global search regular expression and print out the line.     grep是一种文本搜索处理工具,根据用户指定的文本模式或搜索条件对目标文件进行逐行搜索,并显示能匹配到的行。   …

    Linux干货 2015-05-12
  • PHP高效率写法(详解原因)

    1.尽量静态化:    如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍。   当然了,这个测试方法需要在十万级以上次执行,效果才明显。   其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静…

    Linux干货 2015-05-28
  • 使用ssh比较慢的小结

    1)情况说明 a、ping ip,响应正常 b、telnet ip,响应正常 c、ssh ip,响应慢,但是等很大会后还是能打开 2)处理方法 方法1: 修改本地中的/etc/ssh/ssh_config,把参数改为GSSAPIAuthentication no 方法2: a、修改远程服务器端的/etc/ssh/sshd_config ,把参数改为GSSAP…

    系统运维 2016-12-05
  • bash功能特性一 变量

    一、什么是shell     shell是为了使用户能够操作应用程序的接口程序。如经常使用的图形界面及命令行界面都是shell。下面来介绍一下bash这个shell的功能。 二、变量的概念     被命名的内存空间即为变量,Linux中内置了许多变量,我们可以通过修改这些变量的值…

    Linux干货 2015-04-19
  • 源码包编译安装mariaDB

    前言     MySQL是一个关系型数据库管理系统,是最流行的关系型数据库管理系统,由于其体积小、速度快、总体拥有成本低,并且之前是完全开源,所以大受欢迎。但由于后面MySQL卖给了SUN,随后SUN被Oracle收购,虽然也有开源免费版本,但是很多功能都需要另外购买商业版本,导致现在MySQL使用份额逐渐减少。所以M…

    Linux干货 2016-02-28