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

相关推荐

  • mysql or条件可以使用索引而避免全表

    在某些情况下,or条件可以避免全表扫描的。 1 .where 语句里面如果带有or条件, myisam表能用到索引, innodb不行。 1)myisam表:  CREATE TABLE IF NOT EXISTS `a` (   `id` int(1)&nb…

    Linux干货 2015-04-13
  • linux grep manual

    名称    grep – 打印匹配的行语法:     grep [option] pattern [file…]     grep [option] [-e pattern]…

    Linux干货 2015-08-31
  • 硬链接与软链接的联系与区别

    硬链接与软链接的联系与区别     文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。元数据中的inode才是…

    Linux干货 2016-10-20
  • 推荐-LINUX磁盘管理

    Evernote Export LINUX磁盘管理 linux学习笔记 磁盘分区 文件系统 挂载 在操作系统中,磁盘管理属于设备管理的范畴。一块硬盘安装到主机之后称为裸设备,若要能够在Linux系统中使用必须对其进行如下步骤:分区=>格式化(创建文件系统)=>挂载 LINUX系统的设备类型 Linux沿袭Unix的风格,将所有设备认成是一个文件 …

    Linux干货 2016-04-05
  • 重构-改善既有代码的设计:重构原则(二)

    1.什么是重构 重构(Refactoring):在不改变软件的功能和外部可见性的情况下,为了改善软件的结构,提高清晰性、可扩展性和可重用性而对软件进行的改造,对代码内部的结构进行优化。 2.为何重构   1)改进软件设计(整理代码) 重构和设计是相辅相成的,它和设计彼此互补。有了重构,你仍然必须做预先的设计,但是不必是最优的设计,只需要一个合理的解…

    Linux干货 2015-04-07
  • SHELL网络爬虫实例剖析

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1552472        前天简单分享了用 shell 写网络爬虫的一些见解,今天特地把代码发出来与51博…

    Linux干货 2016-08-15