
ماسح سريع للثغرة CVE-2019-0708 'BlueKeep'.
هذه أداة مسح سريعة وغير متقنة لثغرة CVE-2019-0708 في سطح المكتب البعيد من مايكروسوفت. حاليًا، هناك حوالي 900,000 جهاز على الإنترنت العام معرض لهذه الثغرة، لذا من المتوقع ظهور دودة قريبًا مثل WannaCry و notPetya. لذلك، امسح شبكاتك وقم بتصحيح (أو على الأقل، تفعيل NLA) على الأنظمة المعرضة للخطر.
هذه أداة سطر أوامر. يمكنك تحميل المصدر وتجميعه بنفسك، أو تحميل أحد الملفات الثنائية المجمعة مسبقًا لـ ويندوز أو ماك من الرابط أعلاه.
هذه الأداة مبنية بالكامل على تصحيح rdesktop من https://github.com/zerosum0x0/CVE-2019-0708.
لقد قمت ببساطة بتقليص الكود حتى أتمكن من التجميع بسهولة على ماك وويندوز،
بالإضافة إلى إضافة القدرة على مسح أهداف متعددة.
هذه الأداة عمرها بضعة أيام فقط وهي تجريبية. ومع ذلك، فأنا أختبرها عن طريق مسح
الإنترنت بالكامل (بمساعدة 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، كما هو موصوف في القسم الثاني أدناه.
هناك ثلاثة استجابات عامة:
هناك ثلاثة أسباب رئيسية نعتقد أن الهدف آمن:
يعني هذا أننا أكدنا أن النظام معرض للثغرة.
هناك عدد لا يحصى من الاختلافات لـ UNKNOWN
أداة 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 المثبتة، وعدم تعارضها مع الإصدارات الأخرى على النظام. بعض الأمثلة لإصدارات لينكس التي اختبرتها عليها هي ما يلي، لكنها تستمر في تغيير أسماء الحزم من توزيعة إلى أخرى. أيضًا، هناك العديد من الخيارات لواجهة برمجة تطبيقات متوافقة مع OpenSSL، مثل 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
يعني هذا أنك إما لا تملك رؤوس OpensSSL المثبتة، أو أنها ليست في مسار ما. تذكر أنه حتى إذا كان لديك ملفات 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
وفقًا لتعليقات الآخرين، قد يعمل سطر الأوامر التالي على macOS إذا كنت قد استخدمت Homebrew لتثبيت الأشياء. ما زلت أحصل على أخطاء الربط أعلاه، مع ذلك، لأنني قمت بتثبيت مكونات 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
يمكنك أيضًا مسح نطاقات من العناوين، باستخدام عناوين IPv4 بداية-نهاية، أو مواصفات CIDR لـ IPv4. نطاقات 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
يمكنك معالجة هذا بأوامر unix إضافية مثل grep و cut.
للحصول على قائمة بالآلات المعرضة فقط:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
المعامل -dddd يعني معلومات تشخيصية، حيث كلما زاد عدد ds التي
تضيفها، زادت التفاصيل المطبوعة. يتم إرسال هذا إلى stderr بدلاً من stdout
حتى تتمكن من فصل التدفقات. باستخدام 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".
لإصدار الملفات الثنائية لويندوز وماك المرفقة كـ إصدارات لهذا المشروع أقوم بربط OpenSSL بشكل ثابت، بحيث لا يحتاج إلى تضمينه بشكل منفصل، وتعمل البرامج فقط. يصف هذا القسم بعض الملاحظات حول كيفية القيام بذلك، خاصة أن الوصف على صفحة OpenSSL الخاصة يبدو قديمًا.
تبدأ كلتا الخطوتين بتنزيل مصدر OpenSSL ووضعه
بجوار دليل rdpscan:
git clone https://github.com/openssl/openssl
للويندوز، تحتاج أولاً إلى تثبيت إصدار من Perl. أستخدم الإصدار من ActiveState.
بعد ذلك، ستحتاج إلى "مُجمّع" خاص. أستخدم الموصى به المسمى NASM)
بعد ذلك، ستحتاج إلى مترجم. أستخدم VisualStudio 2010. يمكنك تنزيل أحدث "Visual Studio Community Edition" (وهو 2019) بدلاً من ذلك من مايكروسوفت.
الآن أنت بحاجة لبناء ملف makefile. يتم ذلك بالذهاب إلى دليل OpenSSL
وتشغيل برنامج Perl Configure:
perl Configure VC-WIN32
اخترت 32 بت لويندوز لأن هناك الكثير من إصدارات ويندوز القديمة، وأريد جعل البرنامج متوافقًا قدر الإمكان مع الإصدارات القديمة.
أريد بناءًا ثابتًا تمامًا، بما في ذلك وقت تشغيل C. للقيام بذلك، قمت بفتح
ملف makefile الناتج في محرر، وقمت بتغيير علامة تجميع 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 والمترجم. أعتقد أنه يمكنك استخدام Homebrew لتثبيت gcc بدلاً من ذلك.
ثم اذهب إلى دليل المصدر لـ OpenSSL وأنشئ ملف makefile:
perl Configure darwin64-x86_64-cc
الآن فقط قم ببنائه:
make depend
make
عند هذه النقطة، قام بإنشاء كل من المكتبات الديناميكية (.dylib) والثابتة (.lib). حذفت
المكتبات الديناميكية بحيث يتم استخدام المكتبات الثابتة افتراضيًا.
الآن في rdpscan، فقط قم ببناء ملف makefile لـ macOS:
make -f Makefile.macos
سيقوم هذا بتجميع جميع ملفات مصدر rdpscan، ثم الربط بمكتبات OpenSSL
في الدليل ../openssl الذي قمت ببنائه للتو.
يجب أن ينتج هذا ملفًا تنفيذيًا بحجم 3 ميغابايت. إذا حصلت بدلاً من ذلك على ملف تنفيذي بحجم 200 كيلوبايت فقط، فقد أخطأت وربطت بالمكتبات الديناميكية بدلاً من ذلك.