
Vulnerability scanner for CVE-2020-0688
CVE-2020-0688 — критическая уязвимость в Microsoft Exchange, вызванная использованием статических ключей. Хотя для эксплуатации требуются действительные учётные данные (на уровне почтового пользователя) и риск массовой эксплуатации низок, эта уязвимость может быть очень полезна в целевых атаках, так как приводит к RCE на уровне SYSTEM.
Дополнительная информация:
Существует несколько источников известных ложноотрицательных результатов (уязвимые серверы Exchange, которые будут пропущены этим скриптом):
Потенциальные серверы Exchange предварительно отбираются путём идентификации хостов, у которых открыты оба порта — 25 и 443. Если в какой-либо конфигурации один из них заблокирован, такие серверы будут пропущены.
zmap оптимизирован на скорость и масштабируемость в ущерб точности. Обычно несколько последовательных запусков zmap дают немного разные результаты. Как следствие, несколько запусков этого скрипта также будут показывать немного разные результаты.
Неясно, вызвано ли это исключительно перегрузкой сети или багами в коде. Pull-реквесты с исправлениями/обходными решениями, безусловно, приветствуются!
Мы не пытаемся действовать скрытно, поэтому некоторые межсетевые экраны могут просто заблокировать нас как робота.
Поскольку мы не используем сложное снятие отпечатков и полагаемся только на версию, которую сообщает сам сервер Exchange, мы ограничены первыми тремя полями в номере версии.
Например, последнее кумулятивное обновление для Exchange Server 2019 — 15.2.529.5, выпущенное в декабре, является уязвимым. Последнее обновление, содержащее исправление, — 15.2.529.8. Оба они сообщают свою версию как 15.2.529, поэтому скрипт будет считать, что сервер исправлен, даже если на нём не установлено последнее обновление и он уязвим.
Однако на практике, похоже, есть либо администраторы Exchange, обновляющие свои системы сразу после выхода исправлений, либо те, кто живёт по принципу «работает — не трогай». Промежуточного варианта нет.
zmap, Python >= 3.5, модули:
Вы можете установить их глобально с помощью:
$ sudo dnf install zmap python3-gevent python3-dns python3-pyOpenSSL
или:
$ sudo apt install zmap python3-gevent python3-dns python3-openssl
Модули Python также можно установить локально, через virtualenv:
$ virtualenv -p python3 CVE-2020-0688
$ . ./CVE-2020-0688/bin/activate
$ pip install -r ./requirements.txt
Для базового сканирования вам нужен только файл с IP-адресами/подсетями (в формате CIDR) для сканирования:
$ ./scan.py ~/my_networks.txt output.csv
Результат будет записан в формате CSV со следующими столбцами:
| IP | Версия Exchange | Имя сервера | PTR | Common Name (из TLS-сертификата) |
|---|
Опционально можно запросить вывод информации обо всех найденных серверах Exchange:
$ ./scan.py -f ~/my_networks.txt output.csv
В этом случае будет добавлен ещё один столбец, указывающий, уязвим ли сервер:
| IP | Версия Exchange | Уязвим? | Имя сервера | PTR | Common Name (из TLS-сертификата) |
|---|
Вы также можете указать файл с IP-адресами/подсетями в чёрном списке (опция -b), изменить количество параллельных задач (-p) или длину таймаутов (-t):
$ # ./scan.py -h
usage: scan.py [-h] [-b BLACKLIST] [-f] [-p PARALLEL] [-t TIMEOUT]
input output
Определение серверов Exchange, уязвимых к CVE-2020-0688.
positional arguments:
input Входной файл, каждая строка содержит один IP/подсеть
output Файл для сохранения результатов (в формате CSV)
optional arguments:
-h, --help показать это справочное сообщение и выйти
-b BLACKLIST, --blacklist BLACKLIST
Файл с IP/подсетями, которые следует исключить
-f, --full Не отфильтровывать серверы Exchange, которые выглядят обновлёнными
-p PARALLEL, --parallel PARALLEL
Сколько запросов отправлять параллельно (по умолчанию: 1000)
-t TIMEOUT, --timeout TIMEOUT
Таймаут (в секундах) для сетевых подключений (по умолчанию: 5)