通过挂载 vmdk 拿到产品 root

keeeee  742天前

作者:keeeee@白帽汇安全研究院

背景

最近在看 watchguard 的 CVE-2022-26318 ,想通过 上传 gdbserver 进行动态调试。

watchguard 官方提供了一个 ova 文件,但是利用 ssh 登录(直接通过 vmware 窗口登录,上划下划,复制粘贴等操作很不方便,找了官方文档,发现默认开启了 ssh 服务,可以通过 ssh 登录)进入只能进入 watchguard 的一个叫做cli 的 bash,并不是一个类似于 bash / sh 的 shell :

image.png

只能使用这个 shell 自带的一些命令:https://www.watchguard.com/help/docs/fireware/12/en-US/CLI/index.html,那么在这个 shell 环境下是大概率无法上传并且运行我们的 gdbserver 的。

所以想要能调起来的第一步,就要先获取这个设备的 root 权限,再上传并且运行我们的 gdbserver 。

现状

总结一下手头的信息:

现状:已有一个ova 文件,安装之后可以得到一个虚拟机,通过 https://attackerkb.com/topics/t8Nrnu99ZE/cve-2022-26318 中的方法可以拿到整个文件系统。可以 ssh 用 amdin:readwrite 登录进入,但是 ssh 连接进去之后只能是一个 cli 的 shell ,并不是 bash/sh 等这种类型的 shell 。而且当前用户也不是 root 用户,是一个低权限的 admin 用户。

目标:拿到 root ,上传并且运行我们的 gdbserver 。

思路

思路 1 :一开始想从 cli 入手,翻了翻 cli 的文档,发现可以执行 tcpdump 等命令

image.png

想着 cli 会不会存在一些命令注入之内的,如果有的话,后续再弹其他的 shell ,但是后来稍微看了看 /usr/bin/cli 觉得任务量比较大,而且心里也没谱。

思路 2 :后来想起 https://attackerkb.com/topics/t8Nrnu99ZE/cve-2022-26318 中提取文件系统的方式,是直接解压 vmdk ,然后再解压里面的 img 文件就直接得到了文件系统。也就是说在 vmdk 文件中存在整个文件系统。那么如果我能改这个文件系统(直接修改 ssh 允许 root 登录,并且登录的 shell 为 bash/sh 之内的不就行了),再重新打包进 vmdk 感觉就可以了。

一开始我对 vmware 一些关键的文件并不是很了解,翻了翻几篇文章: VMware虚拟机常用文件及文件夹介绍https://www.anquanke.com/post/id/183507 (里面提到了一个挂载 vmdk),于是乎查了查,发现 vmdk 可以直接挂载到一个虚拟机上,并且访问和修改里面的内容(正好就是我们的需求)。

步骤

1.挂载访问文件系统

先使用一个正常的 ubuntu 虚拟机挂载我们 vmdk 。

首先拷贝原来的 vmdk 文件到一个新目录下:

image.png

image.png

用一个正常的 ubuntu 虚拟机添加这个 vmdk :

image.png

mount 挂载:

image.png

这里如果之前没有添加其他硬盘的话,应该是 /dev/sdb 这个设备。至于为什么是 /dev/sdb2 ,这个我是因为看到 CVE-2022-26318 中作者解压 vmdk 中的是 1.img ,1.img 在 8 个 img 中位于第二个,所以盲猜是 /dev/sdb2 。

image.png

2.修改文件系统

先看了看一眼 etc/passwd 发现 root 那项的密码前面是 ! , 后面登录 shell 是 /bin/ash 。

image.png

2.1 修改密码:

我们直接修改 root 那一项为自己的已知的一个密码对应的密文(直接用自己虚拟机中的 /etc/shadow 的root 密码段就行)。

image.png

或者用:

 openssl passwd -6  # -6 表示使用链接文字 SHA-512 加密

image.png

2.2 添加一个 shell:

这里我采用的是 busybox ,先根据已有的文件,获取系统的一些信息,x86-64 位。

image.png

所以去 busybox 官网下载 x86-64 版本的二进制文件: https://busybox.net/downloads/binaries/1.21.1/ ,拷贝到 usr/bin/ 下面去,并且设置权限:

image.png

image.png

然后创建软链接:(这里有个坑,创建链接的时候需要 ash 和 busybox 是同一个目录,不然后面 watchguard 启动的时候会报错 file not found )

cd usr/bin/
ln -s ash busybox

image.png

2.3 修改 ssh 配置文件

原来的 etc/ssh/sshd.config 配置文件没有设置允许 root 登录。

image.png

我们添加上:

image.png

2.4 覆盖 watchguard 的 vmdk

首先我们解除挂载

image.png

将 watchguard 虚拟机关机。

然后用修改了的 vmdk 覆盖掉 watchguard 使用的 vmdk (这里最好养成一个备份的习惯,先将原来的 vmdk 备份一下)。

image.png

然后启动 watchguard 虚拟机,就可以以 root 登录了:

image.png

3.运行 gdbserver

当然可以在 修改文件系统 的时候直接放入 gdbserver 。

拿到 root 权限之后通过 wget 等上传,有些坑点,这里记录一下:

1.一开始直接放到 /tmp 目录下,发现会报错:

image.png

但明明这个文件权限是777 ,而且自己现在权限也是 root

image.png

后来在测试中,运行了如下命令,发现 chmod 有如下报错:

image.png

搜了搜这个报错,发现是 mount 的问题:https://www.linuxquestions.org/questions/linux-general-1/chmod-command-fails-with-read-only-file-system-648675/

再进一步看 mount 的文档的时候发现挂载的时候有一个 noexec 属性:

image.png

用 mount 命令看一下,发现 /tmp 目录确是 noexec ,难怪执行不了。

image.png

于是用 mount 重新挂载了一个 /tmp 目录,修改权限为 exec :


image.png

成功运行 gdbserver :

image.png

总结

现在回过头来,发现还是挺简单的。主要是一开始自己并不知道可以通过挂载 vmdk 来修改文件系统,从而来获得 root ,而且在网上搜的时候不知道怎么搜这个问题的关键字:怎么逃逸虚拟机获得 root ? 怎么虚拟机提取?哈哈哈哈。

不知道各位师傅在研究一些产品的时候,是否也遇到这种情况:在下载产品搭建的时候,突然发现厂商直接提供了 vmware 环境的而大喜(不用配这个配那个了),但又因为提供的 vmware 虚拟机没法拿到 root 调试而 “拔剑四顾心茫然 ”。

总之,将这篇文章分享出来,希望能帮助也遇到这个问题的师傅们。

4.15 更新:

早上正准备发的时候,同事发了我一篇国外的文章 https://blog.assetnote.io/2022/04/13/watchguard-firebox-rce/ ,发现国外有大佬已经写了对这个漏洞进行详细分析的文章(里面前期拿 root 进行调试的方法一样)。同事问我还要不要发,考虑了一下之后决定还是发出来,毕竟觉得这篇文章应该能帮助到那些一开始像我一样不知道这个方法的师傅们。


本文为白帽汇原创文章,如需转载请注明来源:https://nosec.org/home/detail/4990.html 

最新评论

大佬  :  虽然是基础**作,但还是谢谢分享
742天前 回复
小白  :  非常感谢,正在学习这个CVE,这文章对搭建**很有帮助
288天前 回复
昵称
邮箱
提交评论