
Scanner de vulnerabilidades para CVE-2020-0688
CVE-2020-0688 é uma vulnerabilidade crítica no Microsoft Exchange devido ao uso de chaves estáticas. Embora a exploração exija credenciais válidas (em nível de usuário de e-mail) e o risco de exploração em massa seja baixo, essa vulnerabilidade pode ser muito útil em ataques direcionados, pois leva a RCE no nível de SYSTEM.
Mais informações:
Existem várias fontes de falsos negativos conhecidos (servidores Exchange vulneráveis que não serão detectados por este script):
Servidores Exchange em potencial são pré-selecionados pela identificação de hosts que possuem as portas 25 e 443 abertas. Se houver alguma configuração que bloqueie uma delas, eles não serão detectados.
O zmap é otimizado para velocidade e escalabilidade em detrimento da precisão. Normalmente, várias execuções consecutivas do zmap fornecem resultados ligeiramente diferentes. Como resultado, várias execuções deste script também mostrarão resultados ligeiramente diferentes.
Não sei se isso é causado puramente por congestionamento de rede ou por código com bugs. Pull-requests com correções/soluções alternativas são certamente bem-vindos!
Não estamos tentando ser furtivos aqui, então alguns firewalls podem simplesmente nos bloquear como um robô.
Como não estamos fazendo nenhuma impressão digital sofisticada e confiamos apenas na versão que o servidor Exchange informa, estamos limitados aos três primeiros campos do número da versão.
Por exemplo, a atualização cumulativa mais recente para o Exchange Server 2019 é a 15.2.529.5, lançada em dezembro e vulnerável. A atualização mais recente que contém a correção é a 15.2.529.8. Ambos informam sua versão como 15.2.529, então o script presumirá que o servidor está corrigido, mesmo que não tenha o patch mais recente instalado e esteja vulnerável.
Na prática, porém, parece que existem administradores de Exchange que atualizam seus sistemas assim que os patches são lançados ou aqueles que seguem o princípio "se funciona, não mexa". Não há meio termo.
zmap, Python >= 3.5, módulos:
Você pode instalá-los globalmente com:
$ sudo dnf install zmap python3-gevent python3-dns python3-pyOpenSSL
ou:
$ sudo apt install zmap python3-gevent python3-dns python3-openssl
Os módulos Python também podem ser instalados localmente, por meio do virtualenv:
$ virtualenv -p python3 CVE-2020-0688
$ . ./CVE-2020-0688/bin/activate
$ pip install -r ./requirements.txt
Para uma varredura básica, tudo o que você precisa é de um arquivo com IPs/sub-redes (no formato CIDR) para escanear:
$ ./scan.py ~/my_networks.txt output.csv
A saída será gravada em formato CSV com as seguintes colunas:
| IP | Versão do Exchange | Nome do Servidor | PTR | Nome Comum (do certificado TLS) |
|---|
Opcionalmente, você pode pedir para exibir informações sobre todos os servidores Exchange encontrados:
$ ./scan.py -f ~/my_networks.txt output.csv
Nesse caso, haverá mais uma coluna para indicar se o servidor está vulnerável ou não:
| IP | Versão do Exchange | Vulnerável? | Nome do Servidor | PTR | Nome Comum (do certificado TLS) |
|---|
Você também pode fornecer um arquivo com IPs/sub-redes na lista negra (opção -b), alterar o número de tarefas paralelas (-p) ou o tempo limite (-t):
$ # ./scan.py -h
usage: scan.py [-h] [-b BLACKLIST] [-f] [-p PARALLEL] [-t TIMEOUT]
input output
Identify Exchange servers vulnerable to CVE-2020-0688.
positional arguments:
input Input file, each line contains one IP/subnet
output File to save the results (in CSV format)
optional arguments:
-h, --help show this help message and exit
-b BLACKLIST, --blacklist BLACKLIST
File containing IPs/subnets to avoid
-f, --full Don't filter seemingly up-to-date Exchange servers
-p PARALLEL, --parallel PARALLEL
How many requests to send in parallel (default: 1000)
-t TIMEOUT, --timeout TIMEOUT
Timeout (seconds) to use for network connections
(default: 5)