
गैर-विनाशकारी डिटेक्टर 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
0xC0, एक उद्धरण, या एक शेल मेटाकैरेक्टर वाली कोई भी कुंजी अस्वीकार कर दी जाती है और स्क्रिप्ट बाहर निकल जाती है, इसलिए एक पैच किया गया उपकरण कोई 1 failure उत्तर और कोई कमांड निष्पादन उत्पन्न नहीं करता है। डिटेक्टर उस व्यवहारिक अंतर को एक एग्रेस-स्वतंत्र समय-आधारित अंतर में बदल देता है जिसे लक्ष्य से किसी आउटबाउंड कनेक्टिविटी की आवश्यकता नहीं होती है:
A × 32)। पैच और अनपैच दोनों बिल्ड पर यह DB लुकअप तक पहुंचता है और ['2\n', '1 failure\n'] जल्दी लौटाता है।<0xC0>'; \! sleep <delay> #। एक कमजोर होस्ट पर psql इंजेक्टेड sleep चलाता है, इसलिए 1 failure उत्तर लगभग <delay> सेकंड से विलंबित होता है। एक पैच किए गए होस्ट पर gskey regex कुंजी को अस्वीकार कर देता है, स्क्रिप्ट बाहर निकल जाती है, और सॉकेट बिना किसी उत्तर के तेजी से बंद हो जाता है।क्योंकि निर्णय उपकरण के अपने उत्तर के समय पर निर्भर करता है, यह तब भी मान्य रहता है जब लक्ष्य आउटबाउंड DNS/HTTP को ब्लॉक करता है — एक ऐसा मामला जहां अकेले OAST कॉलबैक गलत-नकारात्मक परिणाम देगा। वैकल्पिक कॉलबैक मोड केवल पुष्टि के लिए है, उन होस्टों के लिए जो एग्रेस की अनुमति देते हैं।
एकमात्र निर्भरता स्थापित करें:
pip install -r requirements.txt
डिफरेंशियल मोड (अनुशंसित, एग्रेस-स्वतंत्र):
python3 bt_rs_rce_check.py --target rs.example.com --mode differential
OAST पुष्टि के साथ डिफरेंशियल:
python3 bt_rs_rce_check.py --target rs.example.com \
--oast <your-collector>.oast.pro --mode both
जब Host हेडर किसी टेनेंट से हल नहीं होता है, एक स्पष्ट स्लग प्रदान करें, या उम्मीदवार स्लग की एक फ़ाइल (प्रति पंक्ति एक) जो X-Ns-Company हेडर के माध्यम से क्रम में आज़माई जाती है:
python3 bt_rs_rce_check.py --target rs.example.com --company acme
python3 bt_rs_rce_check.py --target rs.example.com --company-list slugs.txt
मुख्य विकल्प:
| विकल्प | अर्थ |
|---|---|
--target <host> | उपकरण वर्चुअल होस्ट / FQDN (आवश्यक)। |
--company <slug> | स्पष्ट टेनेंट स्लग, X-Ns-Company के रूप में भेजा गया। |
--company-list <file> | उम्मीदवार स्लग की फ़ाइल, जब तक एक हल न हो जाए तब तक आज़माई जाती है। |
--oast <domain> | कॉलबैक पुष्टि के लिए आउट-ऑफ-बैंड कलेक्टर डोमेन। |
--mode {differential,callback,both} | पहचान रणनीति (डिफ़ॉल्ट differential)। |
--delay <seconds> | समय-आधारित परीक्षण के लिए sleep अवधि (डिफ़ॉल्ट 9)। |
--timeout <seconds> | प्रति-प्रोब सॉकेट टाइमआउट (डिफ़ॉल्ट 25)। |
--header 'H: v' | अतिरिक्त कच्चा अनुरोध हेडर; दोहराने योग्य। |
परिणाम पढ़ना:
VULNERABLE — इंजेक्टेड 1 failure उत्तर नियंत्रण के सापेक्ष लगभग --delay सेकंड से विलंबित था। sleep निष्पादित हुआ; अनप्रमाणित RCE श्रृंखला इस होस्ट पर शोषण योग्य है।PATCHED — नियंत्रण ने 1 failure तेजी से लौटाया, लेकिन इंजेक्शन बिना किसी उत्तर के अस्वीकार कर दिया गया। BT24-10 gskey regex मौजूद है और इंजेक्शन कभी भी psql सिंक तक नहीं पहुंचता है।UNRESOLVED ("company did not resolve") — कोई भी प्रोब 1 failure उत्पन्न नहीं करता, इसलिए नियंत्रण भी gskey हैंडलर तक नहीं पहुंचा। यह पैच किया गया परिणाम नहीं है; उपकरण ने सॉकेट बंद कर दिया क्योंकि Host/कंपनी किसी स्थापित कंपनी से मैप नहीं हुई। सही वर्चुअल होस्ट (--target) या एक वैध स्लग (--company / --company-list) के साथ पुनः प्रयास करें।BT24-10 (BT24-10-ONPREM1 / BT24-10-ONPREM2) लागू करें या 24.3.1 से आगे अपग्रेड करें। क्योंकि श्रृंखला PostgreSQL psql दोष (CVE-2025-1094) पर भी निर्भर करती है, PostgreSQL क्लाइंट टूलिंग को भी पैच रखें, और जहां संभव हो उपकरण के WebSocket एंडपॉइंट के नेटवर्क एक्सपोज़र को प्रतिबंधित करें।
psql अमान्य-UTF-8 / SQL-इंजेक्शन दोष, RCE को पूरा करने के लिए जोड़ा गया।rapid7/metasploit-framework PR #19877, BeyondTrust RS/PRA के विरुद्ध अनप्रमाणित RCE।यह सॉफ्टवेयर केवल अधिकृत सुरक्षा परीक्षण और रक्षात्मक शोध के लिए प्रदान किया गया है। इसे विशेष रूप से उन सिस्टमों के विरुद्ध चलाएं जिनके आप मालिक हैं या जिनके परीक्षण के लिए आपको लिखित रूप में स्पष्ट रूप से अधिकृत किया गया है। यह एक गैर-विनाशकारी डिटेक्टर है जो जानबूझकर हथियारबंद कमांड निष्पादन, डेटा एक्सेस और स्थायित्व से बचता है। सभी लागू कानूनों का पालन करने और उचित प्राधिकरण प्राप्त करने के लिए आप पूरी तरह से जिम्मेदार हैं; लेखक दुरुपयोग के लिए कोई दायित्व स्वीकार नहीं करते हैं।