
Быстрый сканер уязвимости CVE-2019-0708 "BlueKeep".
Это быстрый и грязный сканер для уязвимости CVE-2019-0708 в Microsoft Remote Desktop. Прямо сейчас около 900 000 машин в общедоступном Интернете уязвимы для этой уязвимости, поэтому вскоре можно ожидать червя, похожего на WannaCry и notPetya. Поэтому сканируйте свои сети и исправляйте (или, по крайней мере, включайте NLA) на уязвимых системах.
Это инструмент командной строки. Вы можете скачать исходный код и скомпилировать его самостоятельно, или скачать один из предварительно скомпилированных бинарников для Windows или macOS по ссылке выше.
Этот инструмент полностью основан на патче rdesktop из https://github.com/zerosum0x0/CVE-2019-0708. Я просто обрезал код, чтобы его можно было легко скомпилировать на macOS и Windows, а также добавил возможность сканирования нескольких целей.
Этот инструмент появился всего несколько дней назад и является экспериментальным. Однако я тестирую его, сканируя весь Интернет (с помощью masscan), так что я довольно быстро решаю множество проблем. Вы можете связаться со мной в Twitter (@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 без конфликтов с другими версиями в системе. Вот несколько примеров для версий Linux, на которых я тестировал, но названия пакетов постоянно меняются от одного дистрибутива к другому. Также есть много опций для API, совместимого с 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
Это означает, что у вас либо не установлены заголовочные файлы 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-адреса begin-end или 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".
Для выпуска бинарников Windows и macOS, прикрепленных как релизы к этому проекту, я статически линкую OpenSSL, чтобы его не нужно было включать отдельно, и программы просто работали. В этом разделе описаны некоторые заметки о том, как это сделать, особенно потому, что описание на собственной странице OpenSSL кажется устаревшим.
Оба этих шага начинаются с загрузки исходного кода OpenSSL и размещения его рядом с каталогом rdpscan:
git clone https://github.com/openssl/openssl
Для Windows сначала нужно установить какую-нибудь версию Perl. Я использую версию от ActiveState.
Затем вам понадобится специальный «ассемблер». Я использую рекомендованный под названием NASM).
Затем вам понадобится компилятор. Я использую VisualStudio 2010. Вы можете скачать последнюю версию «Visual Studio Community Edition» (2019) вместо этого от Microsoft.
Теперь вам нужно построить make-файл. Для этого перейдите в каталог OpenSSL и запустите программу Perl Configure:
perl Configure VC-WIN32
Я выбрал 32-битную версию для Windows, потому что существует много старых версий Windows, и я хочу сделать программу максимально совместимой со старыми версиями.
Я хочу полностью статическую сборку, включая C runtime. Для этого я открыл полученный make-файл в редакторе и изменил флаг компиляции C с /MD (означает использование DLL) на /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.
Прежде всего, вам нужно установить компилятор. Я использую Developer Tools от Apple, устанавливая XCode и компилятор. Думаю, вы можете использовать Homebrew для установки gcc вместо этого.
Затем перейдите в исходный каталог OpenSSL и создайте make-файл:
perl Configure darwin64-x86_64-cc
Теперь просто соберите его:
make depend
make
На этом этапе создаются как динамические (.dylib), так и статические (.lib) библиотеки. Я удалил динамические библиотеки, чтобы по умолчанию использовались статические.
Теперь в rdpscan просто соберите make-файл для macOS:
make -f Makefile.macos
Это скомпилирует все исходные файлы rdpscan, а затем свяжет их с библиотеками OpenSSL в каталоге ../openssl, которые вы только что собрали.
Это должно создать исполняемый файл размером около 3 мегабайт. Если вместо этого вы получили только 200-килобайтный исполняемый файл, значит, вы ошиблись и связались с динамическими библиотеками.