
Быстрый сканер для уязвимости 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
Это выдает один из трех результатов для каждого адреса:
Когда по целевому IP-адресу ничего нет, старые версии выводили сообщение "UNKNOWN - connection timed out". При сканировании больших сетей это создает перегрузку информацией о системах, которые вам безразличны. Поэтому новая версия по умолчанию не выводит эту информацию, если только вы не добавите -v (verbose) в командной строке.
Вы можете увеличить скорость сканирования больших сетей, увеличив количество рабочих потоков:
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
Это означает, что у вас либо не установлены заголовки 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. Диапазоны 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".