
CVE-2019-0708 "BlueKeep" कमजोरी के लिए एक त्वरित स्कैनर।
यह माइक्रोसॉफ्ट रिमोट डेस्कटॉप में CVE-2019-0708 कमजोरी के लिए एक जल्दबाजी में बनाया गया स्कैनर है। अभी, सार्वजनिक इंटरनेट पर लगभग 900,000 मशीनें इस कमजोरी के प्रति संवेदनशील हैं, इसलिए उम्मीद है कि जल्द ही WannaCry और notPetya जैसा एक वर्म आएगा। इसलिए, अपने नेटवर्क को स्कैन करें और संवेदनशील सिस्टम पर पैच लगाएं (या कम से कम, NLA सक्षम करें)।
यह एक कमांड-लाइन उपकरण है। आप स्रोत डाउनलोड करके इसे स्वयं संकलित कर सकते हैं, या ऊपर दिए गए लिंक से विंडोज या macOS के लिए पूर्व-संकलित बाइनरी डाउनलोड कर सकते हैं।
यह उपकरण पूरी तरह से rdesktop पैच पर आधारित है https://github.com/zerosum0x0/CVE-2019-0708।
मैंने कोड को केवल इतना छोटा किया है कि मैं इसे आसानी से macOS और Windows पर संकलित कर सकूं,
साथ ही एकाधिक लक्ष्यों को स्कैन करने की क्षमता जोड़ी है।
यह केवल कुछ दिन पुराना और प्रयोगात्मक है। हालाँकि, मैं पूरे इंटरनेट को स्कैन करके इसका परीक्षण कर रहा हूँ
(masscan की सहायता से), इसलिए मैं बहुत सी समस्याओं से जल्दी निपट रहा हूँ। आप मुझसे ट्विटर (@erratarob) पर संपर्क कर सकते हैं।
किसी नेटवर्क को स्कैन करने के लिए, इसे इस प्रकार चलाएँ:
rdpscan 192.168.1.1-192.168.1.255
यह प्रत्येक पते के लिए 3 परिणामों में से एक उत्पन्न करता है:
जब लक्ष्य IP पते पर कुछ भी मौजूद नहीं होता है, पुराने संस्करण "UNKNOWN - connection timed out" संदेश प्रिंट करते थे। बड़े नेटवर्क को स्कैन करते समय, यह उन सिस्टमों के बारे में बहुत अधिक जानकारी उत्पन्न करता है जिनकी आपको परवाह नहीं है। इसलिए, नया संस्करण डिफ़ॉल्ट रूप से यह जानकारी नहीं देता है जब तक कि आप कमांड-लाइन पर -v (वर्बोज़) नहीं जोड़ते।
आप कार्यकर्ताओं की संख्या बढ़ाकर बड़े नेटवर्क को स्कैन करने की गति बढ़ा सकते हैं:
rdpscan --workers 10000 10.0.0.0/8
हालाँकि, मेरे कंप्यूटर पर, यह सिस्टम सीमाओं के कारण, इस पैरामीटर को कितना भी उच्च कॉन्फ़िगर करूँ, केवल लगभग 1500 वर्कर ही उत्पन्न करता है।
आप इसे masscan के साथ संयोजन में उपयोग करके और भी गति बढ़ा सकते हैं, जैसा कि नीचे दूसरे में वर्णित है।
तीन सामान्य प्रतिक्रियाएँ हैं:
हमारे विचार में तीन मुख्य कारण हैं कि लक्ष्य सुरक्षित है:
इसका मतलब है कि हमने पुष्टि की है कि सिस्टम इस बग के लिए संवेदनशील है।
अज्ञात के लिए अनगिनत विविधताएँ हैं
यह rdpscan उपकरण काफी धीमा है, प्रति सेकंड केवल कुछ सौ लक्ष्यों को स्कैन करता है।
आप इसके बजाय चीजों को गति देने के लिए masscan का उपयोग कर सकते हैं।
masscan उपकरण लगभग 1000 गुना तेज है, लेकिन लक्ष्य पर केवल सीमित जानकारी देता है।
चरण हैं:
masscan के आउटपुट को rdpscan में फीड करें, ताकि उसे केवल उन लक्ष्यों को स्कैन करना पड़े जिन्हें हम जानते हैं कि सक्रिय हैं।इसे चलाने का सरल तरीका उन्हें कमांड-लाइन पर संयोजित करना है:
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
जिस तरह से मैं इसे करता हूँ वह दो चरणों में है:
masscan 10.0.0.0/8 -p3389 > ips.txt
rdpscan --file ips.txt --workers 10000 >results.txt
कठिन हिस्सा OpenSSL लाइब्रेरीज़ को स्थापित करना है, और सिस्टम पर अन्य संस्करणों के साथ संघर्ष न करना है। कुछ उदाहरण Linux के उन संस्करणों के लिए जिन पर मैंने परीक्षण किया है, निम्नलिखित हैं, लेकिन वे एक वितरण से दूसरे में पैकेज नाम बदलते रहते हैं। साथ ही, OpenSSL-संगत API के लिए कई विकल्प हैं, जैसे BoringSSL और LibreSSL।
$ sudo apt install libssl-dev
$ sudo yum install openssl-devel
एक बार जब आप उस समस्या को हल कर लेते हैं, तो आप सभी .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 बाइनरी स्थापित हों, इसका मतलब यह नहीं है कि आपने डेवलपमेंट सामग्री स्थापित की है। आपको हेडर और लाइब्रेरी दोनों स्थापित करने की आवश्यकता है।
डेबियन पर इन चीजों को स्थापित करने के लिए, करें:
$ 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
दूसरों की टिप्पणियों के अनुसार, यदि आपने होमब्रे के माध्यम से चीजें स्थापित की हैं, तो निम्नलिखित कमांड-लाइन 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 की स्थिति देता है। प्रत्येक के अतिरिक्त कारण हो सकते हैं। इन कारणों का वर्णन ऊपर किया गया है।
211.101.37.250 - SAFE - CredSSP/NLA required
185.11.124.79 - SAFE - not RDP - SSH response seen
125.121.137.42 - UNKNOWN - no connection - refused (RST)
40.117.191.215 - SAFE - CredSSP/NLA required
121.204.186.182 - SAFE - CredSSP/NLA required
99.8.11.148 - SAFE - CredSSP/NLA required
121.204.186.114 - SAFE - CredSSP/NLA required
49.50.145.236 - SAFE - CredSSP/NLA required
106.12.74.155 - VULNERABLE - got appid
222.84.253.26 - SAFE - CredSSP/NLA required
144.35.133.109 - UNKNOWN - RDP protocol error - receive timeout
199.212.226.196 - UNKNOWN - RDP protocol error - receive timeout
183.134.58.152 - UNKNOWN - no connection - refused (RST)
83.162.246.149 - VULNERABLE - got appid
आप इसे grep और cut जैसे अतिरिक्त यूनिक्स कमांड के साथ संसाधित कर सकते हैं। केवल संवेदनशील मशीनों की सूची प्राप्त करने के लिए:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
पैरामीटर -dddd का अर्थ डायग्नोस्टिक जानकारी है, जहाँ जितने अधिक ds जोड़ेंगे, उतने अधिक विवरण मुद्रित होंगे। यह stdout के बजाय stderr पर भेजा जाता है ताकि आप स्ट्रीम को अलग कर सकें। bash का उपयोग करके यह इस प्रकार किया जाता है:
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
-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" परिणाम मिलते हैं।
इस परियोजना से जुड़े रिलीज़ के रूप में Windows और macOS बाइनरी जारी करने के लिए मैं OpenSSL को स्थिर रूप से लिंक करता हूँ, ताकि इसे अलग से शामिल करने की आवश्यकता न हो, और प्रोग्राम बस काम करें। यह खंड इसे करने के तरीके पर कुछ नोट्स का वर्णन करता है, विशेष रूप से जब OpenSSL के अपने पेज पर विवरण पुराना लगता है।
ये दोनों चरण OpenSSL स्रोत को डाउनलोड करने और इसे rdpscan निर्देशिका के बगल में रखने से शुरू होते हैं:
git clone https://github.com/openssl/openssl
Windows के लिए, आपको पहले Perl का कुछ संस्करण स्थापित करना होगा। मैं ActiveState वाले का उपयोग करता हूँ।
इसके बाद, आपको एक विशेष "असेंबलर" की आवश्यकता होगी। मैं अनुशंसित एक का उपयोग करता हूँ जिसे NASM कहा जाता है।
इसके बाद, आपको एक कंपाइलर की आवश्यकता होगी। मैं VisualStudio 2010 का उपयोग करता हूँ। आप इसके बजाय Microsoft से नवीनतम "Visual Studio Community Edition" (जो 2019 है) डाउनलोड कर सकते हैं।
अब आपको मेकफ़ाइल बनाने की आवश्यकता है। यह OpenSSL निर्देशिका में जाकर और Configure Perl प्रोग्राम चलाकर किया जाता है:
perl Configure VC-WIN32
मैंने Windows के लिए 32-बिट चुना क्योंकि बहुत से पुराने Windows मौजूद हैं, और मैं प्रोग्राम को पुराने संस्करणों के साथ यथासंभव संगत बनाना चाहता हूँ।
मैं पूरी तरह से स्थिर बिल्ड चाहता हूँ, जिसमें C रनटाइम भी शामिल है। ऐसा करने के लिए, मैंने परिणामी मेकफ़ाइल को एक संपादक में खोला, और C संकलन फ़्लैग को /MD (जिसका अर्थ है DLLs का उपयोग) से /MT में बदल दिया। वहाँ रहते हुए, मैंने CPPFLAGS में -D_WIN32_WINNT=0x501 जोड़ा, जो OpenSSL को उन सुविधाओं तक सीमित करता है जो Windows XP और Server 2003 पर काम करती हैं। अन्यथा, यदि आप उन पुराने सिस्टमों पर चलाते हैं तो आपको त्रुटियाँ मिलती हैं कि bcrypt.dll नहीं मिला।
अब आपको यह सुनिश्चित करना होगा कि सब कुछ आपके पथ में है। मैंने nasm.exe को PATH में एक निर्देशिका में कॉपी किया। Visual Studio 2010 के लिए, मैंने कंपाइलर के लिए पथ चर सेट करने के लिए प्रोग्राम vcvars32.bat चलाया।
इस बिंदु पर कमांड-लाइन पर, मैंने टाइप किया:
nmake
यह लाइब्रेरी बनाता है। स्थिर वाले libssl_static.lib और libcrypto_static.lib हैं, जिनका उपयोग मैं rdpscan में लिंक करने के लिए करता हूँ।
सबसे पहले, आपको एक कंपाइलर स्थापित करने की आवश्यकता है। मैं Apple से डेवलपर टूल का उपयोग करता हूँ, XCode और कंपाइलर स्थापित करता हूँ। मुझे लगता है कि आप इसके बजाय gcc स्थापित करने के लिए Homebrew का उपयोग कर सकते हैं।
फिर OpenSSL के लिए स्रोत निर्देशिका में जाएँ और एक मेकफ़ाइल बनाएँ:
perl Configure darwin64-x86_64-cc
अब बस इसे बनाएँ:
make depend
make
इस बिंदु पर, इसने डायनामिक (.dylib) और स्थिर (.lib) दोनों लाइब्रेरी बनाई हैं। मैंने डायनामिक लाइब्रेरी को हटा दिया ताकि यह डिफ़ॉल्ट रूप से स्थिर वालों को पकड़ ले।
अब rdpscan में, बस macOS मेकफ़ाइल बनाएँ:
make -f Makefile.macos
यह सभी rdpscan स्रोत फ़ाइलों को संकलित करेगा, फिर आपके द्वारा अभी बनाई गई निर्देशिका ../openssl में OpenSSL लाइब्रेरी से लिंक होगा।
इससे एक 3-मेगाबाइट का निष्पादन योग्य बनना चाहिए। यदि इसके बजाय आपको केवल 200-किलोबाइट का निष्पादन योग्य मिला, तो आपने गलती की है और डायनामिक लाइब्रेरी से लिंक किया है।