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分区管理工具—fdisk

    一、关于为什么要分区       (1)为了数据的安全:当文件系统只有一个分区时,如果遇到分区需要格式化的情况,则硬盘里的数据无法保留,而如果提前对硬盘做了分区那么就可以很好地额解决这个问题;       (2)为了提升效率:硬盘(这里单指机械硬盘)分为外圈和…

    Linux干货 2016-03-12
  • Centos图形界面和命令界面模式切换

    大家都知道,centos有两种用户界面模式,一种是图形界面,也就是我们常说的Xwindows界面;另一种就是命令界面。有时因为方便需要在图形模式下安装一些程序,因图形界面占用的内存等资源较大,影响系统的运行,安装完后需要把系统切换到命令模式下运行,下面就两种模式如何进行切换做一下说明。 CentOS的启动模式共分为7级,分别是: 0-  停机 1-…

    系统运维 2015-07-19
  • linux软件包管理

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

    系统运维 2016-05-05
  • LNMP内网部署wiki

    需求:内部人员经常到查阅资料,考虑在内网搭建wiki站点。 实验拓扑: 实验环境:        Nginx,PHP:192.168.198.160,10.0.0.07        MySQL:10.0.0.8 软件包:  &n…

    Linux干货 2015-10-15
  • Ansible_variable

    Ansible变量        系统自动化让重复的工作变得更加容易,但是每个系统还是有一些细微的差别,变量就是如何处理系统之间的不同之处。这里将会列出变量的极大部分使用方法。   本文假设:你已经知道如何使用Ansible。知道inventory,facts等概念。   Ans…

    Linux干货 2015-11-26
  • TCP网络关闭的状态变换时序图

    TCP共有11个网路状态,其中涉及到关闭的状态有5个。 在我们编写网络相关程序的时候,这5个状态经常出现。因为这5个状态相互关联,相互纠缠,而且状态变化触发都是由应用触发,但是又涉及操作系统和网络,所以正确的理解TCP 在关闭时网络状态变化情况,为我们诊断网络中各种问题,快速定位故障有着非常重要的作用和意义。 下是是根据W.Richard Stevens的《…

    Linux干货 2015-04-03