
CVE-2019-0708 bluekeep اكتشاف الثغرات
هذه أداة مسح سريعة (غير مكتملة التنظيف) لثغرة CVE-2019-0708 في سطح المكتب البعيد من مايكروسوفت. في الوقت الحالي، هناك حوالي 700,000 جهاز على الإنترنت العام معرض لهذه الثغرة، مقارنة بحوالي 2,000,000 جهاز لديه سطح المكتب البعيد مكشوفًا، لكنه محدث وآمن من الاستغلال. يتوقع الكثيرون أنه في الأشهر القادمة سيظهر دودة إنترنت مدمرة مشابهة لـ WannaCry و notPetya. لذا، امسح شبكاتك وقم بتحديث أنظمتك. هذه الأداة تجعل من السهل مسح شبكاتك للعثور على الأجهزة المعرضة للثغرة.
لاستخدام هذه الأداة، يمكنك تنزيل "ملف ثنائي" لتشغيله من سطر الأوامر، أو يمكنك تنزيل المصدر وترجمته. لنظام ويندوز، يوجد ملف ثنائي مترجم مسبقًا متاح.
هذه الأداة مبنية بالكامل على تصحيح rdesktop من https://github.com/zerosum0x0/CVE-2019-0708.
لقد قمت ببساطة بتقليص الكود بحيث يمكنني ترجمته بسهولة على macOS و Windows،
بالإضافة إلى إضافة القدرة على مسح أهداف متعددة.
هذه الأداة عمرها بضعة أيام فقط وتجريبية. ومع ذلك، فأنا أختبرها بمسح
الإنترنت بالكامل (بمساعدة masscan)، لذا أعمل على حل الكثير من المشكلات
بسرعة. يمكنك محاولة الاتصال بي على تويتر (@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
وفقًا لتعليقات الآخرين، قد يعمل سطر الأوامر التالي على 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. قد تكون هناك أسباب إضافية لكل منها.
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.
للحصول على قائمة بالأجهزة المعرضة فقط:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
تلك التي تحمل علامة "UNKNOWN" ربما تستحق المسح لاحقًا، خاصة
بتلك التي تحمل "FIN received"، والتي تعني عادةً أن الطرف الآخر أنهى الاتصال
مبكرًا بسبب التأخير على الإنترنت. احفظها في ملف، ثم أعد قراءتها
في المسح التالي باستخدام خيار --file.
ما إذا كان "CredSSP required" (أي NLA required) هو "SAFE" أمر قابل للنقاش. يعني أنه يتطلب تسجيل دخول بكلمة مرور قبل أن نتمكن من اختبار/تشغيل الثغرة. قد يكون غير محدث ومعرضًا لمستخدم مصادق عليه، لكنه غير قابل للاستغلال بواسطة دودة أو مستخدم غير مصادق.
يجب أن تحصل دائمًا على حالة واحدة فقط لكل عنوان IP تقوم بمسحه على stdout. بالطبع، إذا حددت عنوان IP عدة مرات، فستحصل على حالات متعددة لهذا العنوان.
ومع ذلك، لأن هذا الكود مبني على rdesktop، هناك بعض أخطاء البروتوكول التي لن تؤدي إلى حالة. إذا كان لديك عنوان 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".