
CVE-2019-0708 bluekeep detecção de vulnerabilidade
Este é um scanner rápido e improvisado para a vulnerabilidade CVE-2019-0708 no Remote Desktop da Microsoft. No momento, há cerca de 700.000 máquinas na Internet pública vulneráveis a essa vulnerabilidade, em comparação com cerca de 2.000.000 de máquinas que têm o Remote Desktop exposto, mas estão corrigidas/seguras contra exploração. Muitos esperam que, nos próximos meses, surja um worm devastador na Internet, semelhante ao WannaCry e ao notPetya. Portanto, escaneie suas redes e corrija seus sistemas. Esta ferramenta facilita a verificação das suas redes para encontrar máquinas vulneráveis.
Para usar esta ferramenta, você pode baixar um "binário" para executar pela linha de comando, ou pode baixar o código-fonte e compilá-lo. Para Windows, há um binário pré-compilado disponível.
Esta ferramenta é baseada inteiramente no patch do rdesktop de https://github.com/zerosum0x0/CVE-2019-0708.
Simplesmente reduzi o código para que eu possa compilar facilmente no macOS e no Windows,
além de adicionar a capacidade de escanear vários alvos.
Isto tem apenas alguns dias de vida e é experimental. No entanto, estou testando-o escaneando
toda a Internet (com a ajuda do masscan), então estou resolvendo muitos problemas
rapidamente. Você pode tentar entrar em contato comigo no Twitter (@erratarob) para ajuda/comentários.
Para escanear uma rede, execute-o da seguinte forma:
rdpscan 192.168.1.1-192.168.1.1.255
Isto imprimirá um resultado por linha para cada endereço, indicando VULNERABLE se estiver vulnerável ao bug, SAFE se estiver (provavelmente) seguro, ou UNKNOWN se o programa não conseguir descobrir o status, como não obter resposta do alvo. Como a maioria dos alvos não responde, estatisticamente, a maioria será *UNKNOWN".
Ele é bastante lento. Você pode aumentar a velocidade adicionando o parâmetro de linha de comando
--workers 1000. Mas você pode aumentar a velocidade ainda mais colocando
o masscan na frente primeiro para encontrar rapidamente a porta 3389 disponível, e depois usar
apenas o rdpscan para escanear essas máquinas resultantes em busca da vulnerabilidade.
masscan 10.0.0.0/8 -p3389 --rate 1000000 >ips.txt
rdpscan --file ips.txt > results.txt
Ou, em uma única etapa, canalizando a saída de um para o outro:
masscan 10.0.0.0/8 -p3389 --rate 1000000 | rdpscan --file -
Você pode obter detalhes de diagnóstico mais detalhados usando o parâmetro -d, que é
impresso em sterr. É assim que normalmente executo o programa:
rdpscan --file ips.txt 2> diag.txt 1> results.txt
A parte difícil é instalar as bibliotecas OpenSSL e não conflitar com outras versões no sistema. No Debian Linux, eu faço:
$ sudo apt install libssl-dev
Depois de resolver esse problema, basta compilar todos os arquivos .c juntos
assim:
$ gcc *.c -lssl -lcrypto -o rdpscan
Coloquei um Makefile no diretório que faz isso, então você provavelmente pode fazer apenas:
$ make
O código é escrito em C, então é necessário ter um compilador C instalado, como fazendo o seguinte:
$ sudo apt install build-essential
Esta seção descreve os erros de compilação mais óbvios.
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
Isso significa que você não tem os cabeçalhos do OpenSSL instalados, ou eles não estão em algum caminho. Lembre-se de que, mesmo que você tenha os binários do OpenSSL instalados, isso não significa que você tenha os pacotes de desenvolvimento instalados. Você precisa ter tanto os cabeçalhos quanto as bibliotecas instalados.
Para instalar essas coisas no Debian, faça:
$ sudo apt install libssl-dev
Para corrigir o problema de caminho, adicione uma flag de compilação -I/usr/local/include, ou algo
semelhante.
Um exemplo de problema de linker é o seguinte:
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
Recebo isso no macOS porque há várias versões do OpenSSL. Corrijo isso codificando os caminhos manualmente:
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
De acordo com comentários de outras pessoas, a seguinte linha de comando pode funcionar no macOS se você usou o Homebrew para instalar as coisas. Ainda assim, continuo recebendo os erros de link acima, porque instalei outros componentes do OpenSSL que estão em conflito.
gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c
A seção acima fornece dicas rápidas para executar o programa. Esta seção fornece ajuda mais detalhada.
Para escanear um único alvo, basta passar o endereço do alvo:
./rdpscan 192.168.10.101
Você pode passar endereços IPv6 e nomes DNS. Você pode passar vários alvos. Um exemplo disso seria:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
Você também pode escanear faixas de endereços, usando endereços IPv4 início-fim, ou especificação CIDR IPv4. Faixas IPv6 não são suportadas porque são muito grandes.
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
Por padrão, ele escaneia apenas 100 alvos por vez. Você pode aumentar esse número
com o parâmetro --workers. No entanto, não importa o quão alto você defina esse
parâmetro, na prática você terá no máximo cerca de 500 a 1500 workers em execução
ao mesmo tempo, dependendo do seu sistema.
./rdpscan --workers 1000 10.0.0.0/24
Em vez de especificar alvos na linha de comando, você pode carregá-los
de um arquivo, usando o bem nomeado parâmetro --file:
./rdpscan --file ips.txt
O formato do arquivo é um endereço, nome ou faixa por linha. Ele também pode
consumir o texto gerado pelo masscan. Espaços extras são removidos,
linhas em branco ignoradas e quaisquer linhas de comentário são ignoradas. Um comentário é
uma linha que começa com o caractere # ou com os caracteres //.
A saída é enviada para stdout, dando o status de VULNERABLE, SAFE,
ou UNKNOWN. Pode haver motivos adicionais para cada um.
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
Você pode processar isso com comandos unix adicionais como grep e cut.
Para obter uma lista apenas das máquinas vulneráveis:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
Os marcados como "UNKNOWN" provavelmente valem a pena ser escaneados depois, especialmente
os com "FIN received", o que geralmente significa que o outro lado encerrou a conexão
cedo por causa de atraso na Internet. Salve-os em um arquivo e leia-os
novamente no próximo escaneamento com a opção --file.
Se "CredSSP required" (significando NLA obrigatório) é "SAFE" é discutível. Isso significa que é necessário um login com senha antes de podermos testar/acionar a vulnerabilidade. Pode estar sem correção e vulnerável a um usuário autenticado, só não é explorável por um worm ou usuário não autenticado.
Você deve sempre obter um único status no stdout para cada endereço IP
que escanear. Claro, se você especificar um endereço IP várias vezes, receberá vários
status para esse endereço.
No entanto, como este código é baseado no rdestkop, existem certos erros
de protocolo que não geram um status. Se você tiver um endereço IP público na Internet
que produza um desses erros, estou ansioso para corrigi-lo.
Adicionar o parâmetro -d despeja informações de diagnóstico sobre as conexões em 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
No macOS/Linux, você pode redirecionar stdout e stderr separadamente para arquivos
diferentes da maneira usual:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
Então ele inclui suporte a SOCKS5:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
Isso piora os problemas de conexão, então você obtém muito mais resultados "UNKNOWN".