
CVE-2019-0708 bluekeep 漏洞检测
यह माइक्रोसॉफ्ट रिमोट डेस्कटॉप में CVE-2019-0708 भेद्यता के लिए एक त्वरित-और-गंदा स्कैनर है। अभी, सार्वजनिक इंटरनेट पर लगभग 700,000 मशीनें इस भेद्यता के प्रति संवेदनशील हैं, जबकि लगभग 2,000,000 मशीनों में रिमोट डेस्कटॉप खुला है, लेकिन पैच/शोषण से सुरक्षित हैं। कई लोग उम्मीद करते हैं कि अगले कुछ महीनों में WannaCry और notPetya जैसा एक विनाशकारी इंटरनेट वर्म दिखाई देगा। इसलिए, अपने नेटवर्क को स्कैन करें और अपने सिस्टम को पैच करें। यह उपकरण आपके नेटवर्क को स्कैन करना आसान बनाता है ताकि संवेदनशील मशीनों का पता लगाया जा सके।
इस उपकरण का उपयोग करने के लिए, आप कमांड लाइन से चलाने के लिए एक "बाइनरी" डाउनलोड कर सकते हैं, या आप स्रोत डाउनलोड करके उसे कंपाइल कर सकते हैं। विंडोज के लिए, एक पूर्व-संकलित बाइनरी उपलब्ध है।
यह उपकरण पूरी तरह से https://github.com/zerosum0x0/CVE-2019-0708 से rdesktop पैच पर आधारित है।
मैंने कोड को केवल इतना छोटा किया है कि इसे macOS और Windows पर आसानी से कंपाइल किया जा सके,
साथ ही कई लक्ष्यों को स्कैन करने की क्षमता भी जोड़ी है।
यह केवल कुछ दिन पुराना और प्रयोगात्मक है। हालाँकि, मैं पूरे इंटरनेट को स्कैन करके इसका परीक्षण कर रहा हूँ
(masscan की सहायता से), इसलिए मैं काफी तेजी से बहुत सी समस्याओं का समाधान कर रहा हूँ। आप मुझसे twttier(@erratarob) पर संपर्क कर सकते हैं।
किसी नेटवर्क को स्कैन करने के लिए, इसे निम्नानुसार चलाएँ:
rdpscan 192.168.1.1-192.168.1.1.255
यह प्रति पते पर एक-पंक्ति का परिणाम प्रिंट करेगा, जो VULNERABLE (संवेदनशील) इंगित करेगा यदि यह बग के प्रति संवेदनशील है, SAFE (सुरक्षित) यदि यह (संभवतः) सुरक्षित है, या UNKNOWN (अज्ञात) यदि प्रोग्राम स्थिति का पता नहीं लगा सका, जैसे कि लक्ष्य से कोई प्रतिक्रिया न मिलना। चूँकि अधिकांश लक्ष्य प्रतिक्रिया नहीं देंगे, सांख्यिकीय रूप से, अधिकांश UNKNOWN होंगे।
यह काफी धीमा है। आप कमांड-लाइन पैरामीटर --workers 1000 जोड़कर गति बढ़ा सकते हैं। लेकिन आप पहले
masscan का उपयोग करके जल्दी से पोर्ट 3389 उपलब्ध खोज सकते हैं, और फिर केवल उन परिणामी मशीनों को
भेद्यता के लिए स्कैन करने के लिए rdpscan का उपयोग कर सकते हैं।
masscan 10.0.0.0/8 -p3389 --rate 1000000 >ips.txt
rdpscan --file ips.txt > results.txt
या, एक चरण में, एक के आउटपुट को दूसरे में पाइप करें:
masscan 10.0.0.0/8 -p3389 --rate 1000000 | rdpscan --file -
आप -d पैरामीटर का उपयोग करके अधिक विस्तृत निदान विवरण प्राप्त कर सकते हैं, जो
stderr पर मुद्रित होता है। मैं आमतौर पर प्रोग्राम इस प्रकार चलाता हूँ:
rdpscan --file ips.txt 2> diag.txt 1> results.txt
कठिन भाग OpenSSL लाइब्रेरीज़ को स्थापित करना है, और सिस्टम पर अन्य संस्करणों के साथ विरोध नहीं करना है। Debian Linux पर, मैं करता हूँ:
$ sudo apt install libssl-dev
एक बार जब आप यह समस्या हल कर लेते हैं, तो आप सभी .c फ़ाइलों को इस प्रकार एक साथ कंपाइल करें:
$ gcc *.c -lssl -lcrypto -o rdpscan
मैंने निर्देशिका में एक Makefile रखा है जो ऐसा करता है, इसलिए आप संभवतः केवल:
$ make
कोड C में लिखा गया है, इसलिए C कंपाइलर स्थापित होना चाहिए, जैसे निम्नलिखित करना:
$ sudo apt install build-essential
यह खंड अधिक स्पष्ट निर्माण त्रुटियों का वर्णन करता है।
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
इसका अर्थ है कि आपके पास OpenSSL हेडर स्थापित नहीं हैं, या वे किसी पथ में नहीं हैं। याद रखें कि भले ही आपके पास OpenSSL बाइनरी स्थापित हों, इसका मतलब यह नहीं है कि आपके पास डेवलपमेंट सामग्री स्थापित है। आपको हेडर और लाइब्रेरी दोनों स्थापित करने की आवश्यकता है।
Debian पर ये चीजें स्थापित करने के लिए, करें:
$ sudo apt install libssl-dev
पथ समस्या को ठीक करने के लिए, एक कंपाइलेशन फ्लैग -I/usr/local/include, या कुछ इसी तरह जोड़ें।
एक लिंकर समस्या का उदाहरण निम्नलिखित है:
Undefined symbols for architecture x86_64:
"_OPENSSL_init_ssl", referenced from:
_tcp_tls_connect in tcp-fac73c.o
"_RSA_get0_key", referenced from:
_rdssl_rkey_get_exp_mod in ssl-d5fdf5.o
"_SSL_CTX_set_options", referenced from:
_tcp_tls_connect in tcp-fac73c.o
"_X509_get_X509_PUBKEY", referenced from:
_rdssl_cert_to_rkey in ssl-d5fdf5.o
मुझे यह macOS पर मिलता है क्योंकि OpenSSL के कई संस्करण हैं। मैं इसे पथों को हार्ड-कोड करके ठीक करता हूँ:
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
दूसरों की टिप्पणियों के अनुसार, यदि आपने Homebrew के माध्यम से चीजें स्थापित की हैं, तो निम्नलिखित कमांड-लाइन macOS पर काम कर सकती है। फिर भी, ऊपर दी गई लिंकिंग त्रुटियाँ मिलती हैं, क्योंकि मैंने अन्य OpenSSL घटक स्थापित किए हैं जो विरोध कर रहे हैं।
gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c
ऊपर दिया गया खंड प्रोग्राम चलाने के लिए त्वरित आरंभ सुझाव देता है। यह खंड अधिक गहन सहायता प्रदान करता है।
एकल लक्ष्य को स्कैन करने के लिए, बस लक्ष्य का पता पास करें:
./rdpscan 192.168.10.101
आप IPv6 पते और DNS नाम पास कर सकते हैं। आप एकाधिक लक्ष्य पास कर सकते हैं। इसका एक उदाहरण होगा:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
आप पतों की श्रेणियाँ भी स्कैन कर सकते हैं, या तो begin-end IPv4 पते, या IPv4 CIDR विनिर्देश का उपयोग करके। IPv6 श्रेणियाँ समर्थित नहीं हैं क्योंकि वे बहुत बड़ी हैं।
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
डिफ़ॉल्ट रूप से, यह एक बार में केवल 100 लक्ष्यों को स्कैन करता है। आप इस संख्या को
--workers पैरामीटर के साथ बढ़ा सकते हैं। हालाँकि, इस पैरामीटर को आप कितना भी ऊँचा सेट करें,
व्यवहार में आपको एक बार में अधिकतम लगभग 500 से 1500 कार्यकर्ता मिलेंगे, जो आपके सिस्टम पर निर्भर करता है।
./rdpscan --workers 1000 10.0.0.0/24
कमांड-लाइन पर लक्ष्य निर्दिष्ट करने के बजाय, आप उन्हें एक फ़ाइल से लोड कर सकते हैं,
अच्छी तरह से नामित --file पैरामीटर का उपयोग करके:
./rdpscan --file ips.txt
फ़ाइल का प्रारूप प्रति पंक्ति एक पता, नाम या श्रेणी है। यह masscan द्वारा उत्पन्न टेक्स्ट का
उपभोग भी कर सकता है। अतिरिक्त व्हाइटस्पेस ट्रिम किया जाता है,
खाली पंक्तियों को अनदेखा किया जाता है, और कोई भी टिप्पणी पंक्तियों को अनदेखा किया जाता है। एक टिप्पणी
# वर्ण, या // वर्णों से शुरू होने वाली पंक्ति है।
आउटपुट stdout पर भेजा जाता है जो VULNERABLE, SAFE,
या UNKNOWN की स्थिति देता है। प्रत्येक के लिए अतिरिक्त कारण हो सकते हैं।
149.129.120.24 - UNKNOWN - FIN received
45.60.213.160 - SAFE - not RDP but HTTP
208.43.229.89 - SAFE - CredSSP required
170.104.127.137 - UNKNOWN - FIN received
86.188.190.117 - UNKNOWN - connect timeout
62.15.34.157 - SAFE - Target appears patched
216.15.251.120 - VULNERABLE -- got appid
69.62.158.174 - VULNERABLE -- got appid
92.111.20.13 - SAFE - Target appears patched
आप इसे grep और cut जैसे अतिरिक्त unix कमांड के साथ संसाधित कर सकते हैं।
केवल संवेदनशील मशीनों की सूची प्राप्त करने के लिए:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
जो "UNKNOWN" चिह्नित हैं, वे संभवतः बाद में स्कैन करने योग्य हैं, विशेष रूप से
"FIN received" के लिए, जिसका आमतौर पर अर्थ है कि दूसरे पक्ष ने इंटरनेट पर देरी के कारण कनेक्शन जल्दी समाप्त कर दिया। उन्हें एक फ़ाइल में सहेजें, और फिर अगले स्कैन में --file विकल्प के साथ पुनः पढ़ें।
क्या "CredSSP required" (अर्थात NLA आवश्यक) "SAFE" है, यह बहस का विषय है। इसका अर्थ है कि भेद्यता का परीक्षण/ट्रिगर करने से पहले पासवर्ड लॉगिन आवश्यक है। यह अनपैच और प्रमाणित उपयोगकर्ता के प्रति संवेदनशील हो सकता है, यह केवल वर्म या अप्रमाणित उपयोगकर्ता द्वारा शोषण योग्य नहीं है।
आपको हमेशा प्रत्येक IP पते के लिए stdout पर एक-और-केवल-एक स्थिति मिलनी चाहिए
जिसे आप स्कैन करते हैं। बेशक, यदि आप एक IP पते को कई बार निर्दिष्ट करते हैं, तो आपको उस पते के लिए कई स्थितियाँ मिलेंगी।
हालाँकि, क्योंकि यह कोड rdestkop पर आधारित है, कुछ प्रोटोकॉल
त्रुटियाँ हैं जो स्थिति नहीं देंगी। यदि इंटरनेट पर आपके पास एक सार्वजनिक IP पता है जो इनमें से एक त्रुटि उत्पन्न करता है, तो मैं इसे ठीक करने के लिए उत्सुक हूँ।
-d पैरामीटर जोड़ने से कनेक्शनों पर निदान जानकारी stderr पर डंप होती है।
./rdpscan 62.15.34.157 -d
[+] [62.15.34.157]:3389 - connecting...
[+] [62.15.34.157]:3389 - connected from [10.1.10.133]:49211
[+] [62.15.34.157]:3389 - SSL connection
[+] [62.15.34.157]:3389 - version = v4.8
[+] [62.15.34.157]:3389 - Sending MS_T120 check packet
[-] [62.15.34.157]:3389 - Max sends reached, waiting...
62.15.34.157 - SAFE - Target appears patched
macOS/Linux पर, आप stdout और stderr को सामान्य तरीके से अलग-अलग फ़ाइलों में रीडायरेक्ट कर सकते हैं:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
तो इसमें SOCKS5 समर्थन शामिल है:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
यह कनेक्शन समस्याओं को और बदतर बनाता है, इसलिए आपको बहुत अधिक "UNKNOWN" परिणाम मिलते हैं।