
ماسح سريع لثغرة CVE-2019-0708 "BlueKeep".
هذه أداة فحص سريعة وبسيطة لثغرة CVE-2019-0708 في سطح المكتب البعيد من مايكروسوفت. حاليًا، هناك حوالي 900,000 جهاز على الإنترنت العام معرّض لهذه الثغرة، لذا يتوقع الكثيرون ظهور دودة قريبًا مثل WannaCry وnotPetya. لذلك، افحص شبكاتك وطبّق التصحيحات (أو على الأقل فعّل NLA) على الأنظمة المعرّضة للخطر.
هذه أداة تعمل عبر سطر الأوامر. يمكنك تنزيل الكود المصدري وتجميعه بنفسك، أو تنزيل أحد الملفات الثنائية المجمّعة مسبقًا لنظامي Windows أو 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، كما هو موضح في القسم أدناه.
هناك ثلاثة استجابات عامة:
هناك ثلاثة أسباب رئيسية تجعلنا نعتقد أن الهدف آمن:
هذا يعني أننا أكدنا أن النظام معرّض لهذه الثغرة.
هناك عدد لا يُحصى من الاختلافات لحالة 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 دون تعارض مع الإصدارات الأخرى الموجودة على النظام. على 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
هذا يعني إما أن ملفات الرؤوس الخاصة بـ OpensSSL غير مثبتة لديك، أو أنها ليست في مسار ما. تذكر أنه حتى إذا كانت لديك ملفات OpenSSL الثنائية مثبتة، فهذا لا يعني أن لديك أدوات التطوير مثبتة. تحتاج إلى تثبيت كل من ملفات الرؤوس والمكتبات.
لتثبيت هذه الأشياء على Debian، قم بما يلي:
$ sudo apt install libssl-dev
لإصلاح مشكلة المسار، أضف خيار الترجمة -I/usr/local/include أو شيئًا مشابهًا.
مثال على مشكلة الربط (linker) هو التالي:
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. أقوم بإصلاح ذلك بتحديد المسارات يدويًا (hard-coding):
$ 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 تعني معلومات تشخيصية، وكلما زدت عدد حروف d، زادت التفاصيل المطبوعة. تُرسل هذه المعلومات إلى 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".