
गैर-विनाशकारी डिटेक्टर BeyondTrust Remote Support और PRA में अनप्रमाणित RCE के लिए, तर्क इंजेक्शन और PostgreSQL एस्केप बाईपास को जोड़कर समय-आधारित विभेदन के माध्यम से शोषण-क्षमता की पुष्टि करता है।
नैतिक चेतावनी: केवल शोध, शैक्षिक और अधिकृत परीक्षण प्रयोजनों के लिए। कृपया बिना अनुमति के सिस्टम के विरुद्ध उपयोग न करें।
BeyondTrust रिमोट सपोर्ट (RS) और प्रिविलेज्ड रिमोट एक्सेस (PRA) ऐसे उपकरण हैं जो किसी संगठन के आंतरिक सिस्टम में प्रिविलेज्ड रिमोट सत्रों की मध्यस्थता करते हैं, इसलिए वे अक्सर इंटरनेट पर उजागर होते हैं और नेटवर्क पर एक विश्वसनीय स्थान रखते हैं।
एक अनप्रमाणित हमलावर जो उपकरण के WebSocket एंडपॉइंट तक पहुंच सकता है, दो दोषों को जोड़कर साइट उपयोगकर्ता के रूप में ऑपरेटिंग-सिस्टम कमांड निष्पादित कर सकता है: उपकरण की thin-scc-wrapper स्क्रिप्ट में एक आर्गुमेंट इंजेक्शन (CVE-2024-12356) और एक PostgreSQL स्ट्रिंग-एस्केप बायपास जो एक अमान्य UTF-8 बाइट को प्रारंभिक SQL-लिटरल ब्रेक में बदल देता है (CVE-2025-1094)। कमजोर पथ किसी भी प्रमाणीकरण से पहले पहुंचा जाता है।
इस रिपॉजिटरी में bt_rs_rce_check.py उस श्रृंखला के लिए एक गैर-विनाशकारी डिटेक्टर है। यह उस सटीक अनप्रमाणित कोड पथ को चलाता है जिसका वास्तविक एक्सप्लॉइट उपयोग करता है लेकिन पहुंच-क्षमता के प्रमाण पर रुक जाता है: यह लक्ष्य से केवल एक हानिरहित sleep (समय-आधारित अंतर) या आपके नियंत्रण वाले आउट-ऑफ-बैंड कलेक्टर के लिए एक हानिरहित होस्टनाम/HTTP लुकअप चलाने के लिए कहता है। यह कभी शेल नहीं खोलता, फाइलें नहीं लिखता, डेटा नहीं पढ़ता, स्थायित्व नहीं बनाता, या पार्श्व रूप से आगे नहीं बढ़ता।
psql अमान्य-UTF-8 SQL-इंजेक्शन दोष, RCE को पूरा करने के लिए जोड़ा गयाBT24-10-ONPREM1 / BT24-10-ONPREM2 स्व-होस्टेड उपकरणों के लिए; क्लाउड इंस्टेंस BeyondTrust द्वारा पैच किए गए थे)।CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:Hयह श्रृंखला एक ऐसे उपकरण पर साइट उपयोगकर्ता के रूप में अनप्रमाणित रिमोट कोड निष्पादन उत्पन्न करती है जिसका पूरा उद्देश्य आंतरिक सिस्टम में प्रिविलेज्ड एक्सेस की मध्यस्थता करना है, इसलिए एक एकल अनाम अनुरोध एक उजागर RS या PRA होस्ट को एक पैर जमाने और उपकरण द्वारा मध्यस्थता किए गए प्रत्येक डाउनस्ट्रीम सिस्टम की ओर एक पिवट में बदल देता है।
इसके लिए कोई क्रेडेंशियल, कोई उपयोगकर्ता इंटरैक्शन, और कोई पूर्व पहुंच की आवश्यकता नहीं है: हमलावर बाहरी और अनाम है, और एकमात्र पूर्वापेक्षा उपकरण के WebSocket एंडपॉइंट तक नेटवर्क पहुंच है।
कमजोरी का खुलासा जंगली में शोषित पाए जाने के बाद किया गया था, इसे 19 दिसंबर 2024 को CISA ज्ञात शोषित कमजोरियों कैटलॉग में जोड़ा गया था, और इसे सार्वजनिक रूप से दिसंबर 2024 में अमेरिकी वित्त विभाग के उल्लंघन से जोड़ा गया है जिसका श्रेय एक राज्य-प्रायोजित अभिनेता को दिया जाता है।
कमजोर तर्क उपकरण की thin-scc-wrapper शेल स्क्रिप्ट में रहता है, जो एक अनप्रमाणित WebSocket फ्रेम से हमलावर-नियंत्रित सत्र कुंजी (gskey) पढ़ता है और इसे डेटाबेस की ओर भेजता है। पूर्ण RCE तीन अलग-अलग समस्याओं की एक श्रृंखला है।
1. thin-scc-wrapper में आर्गुमेंट इंजेक्शन (CVE-2024-12356)। रैपर अविश्वसनीय gskey को एक हेल्पर को बिना उद्धरण के भेजता है, इसलिए शेल echo चलने से पहले इसे तर्कों में विभाजित कर देता है:
quoted=$(export PHPRC="$BG_app_root/config/php-cli.ini"; echo $gskey | $ingrediRoot/app/dbquote)
एक कुंजी जो -e से शुरू होती है, echo को echo -e में बदल देती है, जो बैकस्लैश एस्केप की व्याख्या करता है और हमलावर को अगले चरण में प्रवाहित डेटा में मनमाने कच्चे बाइट्स — सबसे महत्वपूर्ण रूप से \xC0 — उत्सर्जित करने देता है। हमलावर एक नया कमांड इंजेक्ट करने के बजाय एक मौजूदा कमांड के फ्लैग को नियंत्रित करता है, यही कारण है कि यह क्लासिक कमांड इंजेक्शन के बजाय आर्गुमेंट इंजेक्शन (CWE-88) है।
2. अमान्य UTF-8 के माध्यम से PostgreSQL एस्केप बायपास (CVE-2025-1094)। dbquote PHP के pg_escape_string() के साथ मान को एस्केप करता है, जो libpq के PQescapeStringInternal() को कॉल करता है। एक मल्टीबाइट वर्ण के लिए यह pg_encoding_mblen() द्वारा रिपोर्ट की गई लंबाई पर भरोसा करता है और वर्ण के बाइट्स को शब्दशः, बिना सत्यापन के कॉपी करता है:
len = pg_encoding_mblen(encoding, source);
for (i = 0; i < len; i++) /* copy the character */
*target++ = *source++;
0xC0 जैसा बाइट 2-बाइट वर्ण की घोषणा करता है, इसलिए एस्केपर अगले बाइट को अपने "निरंतरता" के रूप में निगल जाता है — तब भी जब वह बाइट एकल उद्धरण (0x27) हो। इसलिए अनुक्रम 0xC0 0x27 एक अनएस्केप्ड सिंगल-कोट बाइट के साथ "एस्केप्ड" स्ट्रिंग में एम्बेडेड रहते हुए गुजरता है।
3. psql लिटरल से बाहर निकलता है और \! चलाता है (CVE-2025-1094)। "एस्केप्ड" स्ट्रिंग को psql में पाइप किया जाता है, जो 0xC0 0x27 को एक वर्ण के रूप में नहीं मानता है, इसलिए 0x27 SQL स्ट्रिंग लिटरल को जल्दी बंद कर देता है और इसके बाद की हर चीज़ को नए इनपुट के रूप में पार्स किया जाता है। हमलावर इसका उपयोग psql के \! मेटा-कमांड तक पहुंचने के लिए करता है, जो साइट उपयोगकर्ता के रूप में एक शेल कमांड चलाता है:
<0xC0>'; \! <cmd> #
Rapid7 ने पाया कि व्यवहार में RCE हमेशा CVE-2025-1094 पर निर्भर करता है, और यह अपने आप में पर्याप्त है: एक बाइनरी WebSocket फ्रेम के अंदर कच्चा 0xC0 बाइट वितरित करना (एक टेक्स्ट फ्रेम के बजाय, जहां UTF-8 सत्यापन इसे हटा देगा) gskey तक अपरिवर्तित पहुंचता है और बिना किसी echo -e चरण के SQL ब्रेकआउट को ट्रिगर करता है। यह डिटेक्टर उस बाइनरी-फ्रेम दृष्टिकोण का उपयोग करता है।
पूरी श्रृंखला एक एकल WebSocket पर प्री-प्रमाणीकरण पहुंच योग्य है:
/nw के लिए एक अनप्रमाणित WebSocket (उपकरण पर एक Tornado हैंडलर)।Sec-WebSocket-Protocol: ingredi support desk customer thin हेडर के साथ चुना जाता है, जिसे URL-एन्कोडेड ingredi%20support%20desk%20customer%20thin के रूप में भेजा जाता है।Host हेडर (एक स्थापित कंपनी से मैप किया गया) या, फॉलबैक के रूप में, X-Ns-Company हेडर से हल किया जाता है। यदि कोई भी स्थापित कंपनी से मैप नहीं होता है तो उपकरण gskey संसाधित होने से पहले सॉकेट बंद कर देता है।1, एक thinMint UUID, authType 0 (gskey प्रमाणीकरण), फिर दुर्भावनापूर्ण gskey (संस्करण 1 का अर्थ है कोई locale_code लाइन नहीं):1
<thinMint UUID>
0
<0xC0>'; \! <cmd> #
BT24-10 एक इनपुट-सत्यापन गेट जोड़ता है जो किसी भी गैर-अल्फ़ान्यूमेरिक gskey को dbquote/psql तक पहुंचने से पहले अस्वीकार कर देता है:
elif [[ ! "$gskey" =~ ^[a-zA-Z0-9]{32}$ ]]; then
blog "bad session key given"
...
exit 1