
Um scanner rápido para a vulnerabilidade CVE-2019-0708 "BlueKeep".
Este é um scanner rápido e improvisado para a vulnerabilidade CVE-2019-0708 no Microsoft Remote Desktop. Neste momento, há cerca de 900.000 máquinas na Internet pública vulneráveis a esta vulnerabilidade, então muitos esperam um worm em breve, como WannaCry e notPetya. Portanto, escaneie suas redes e aplique correções (ou, pelo menos, ative a NLA) nos sistemas vulneráveis.
Esta é uma ferramenta de linha de comando. Você pode baixar o código-fonte e compilá-lo você mesmo, ou pode baixar um dos binários pré-compilados para Windows ou macOS a partir do link acima.
Esta ferramenta é baseada inteiramente no patch rdesktop de https://github.com/zerosum0x0/CVE-2019-0708.
Simplesmente reduzi o código para poder compilar facilmente no macOS e no Windows,
além de adicionar a capacidade de escanear vários alvos.
Isso tem apenas alguns dias e é experimental. No entanto, estou testando-o ao escanear
toda a Internet (com a ajuda do masscan), então estou resolvendo muitos problemas
rapidamente. Você pode tentar entrar em contato comigo no twttier(@erratarob) para ajuda/comentários.
Para escanear uma rede, execute-o da seguinte forma:
rdpscan 192.168.1.1-192.168.1.255
Isso produz um de 3 resultados para cada endereço:
Quando não há nada em um endereço IP de destino, as versões antigas imprimiam a mensagem "UNKNOWN - connection timed out". Ao escanear redes grandes, isso produz uma sobrecarga de informações demais sobre sistemas com os quais você não se importa. Portanto, a nova versão, por padrão, não produz essas informações a menos que você adicione -v (para verbose) na linha de comando.
Você pode aumentar a velocidade com que ele escaneia redes grandes aumentando o número de workers:
rdpscan --workers 10000 10.0.0.0/8
No entanto, no meu computador, ele só atinge cerca de 1500 workers, por causa de limitações do sistema, não importa o quão alto eu configure esse parâmetro.
Você pode aumentar ainda mais a velocidade usando isso em conjunto
com masscan, descrito na seção abaixo.
Há três respostas gerais:
Há três principais razões pelas quais achamos que um alvo é seguro:
Isso significa que confirmamos que o sistema é vulnerável ao bug.
Há zilhões de variações para unknown.
Esta ferramenta rdpscan é bastante lenta, escaneando apenas algumas centenas de alvos por segundo.
Em vez disso, você pode usar o masscan para acelerar as coisas.
A ferramenta masscan é aproximadamente 1000 vezes mais rápida, mas fornece apenas informações limitadas
sobre o alvo.
Os passos são:
rdpscan com a saída do masscan, para que ele só tenha
que escanear alvos que sabemos estarem ativos.A maneira simples de executar isso é apenas combiná-los na linha de comando:
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
A maneira como eu faço é em duas etapas:
masscan 10.0.0.0/8 -p3389 > ips.txt
rdpscan --file ips.txt --workers 10000 >results.txt
A parte difícil é conseguir instalar as bibliotecas OpenSSL sem 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 simplesmente fazer:
$ make
O código é escrito em C, portanto precisa de um compilador C instalado, como fazer 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ê tem os arquivos 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
Eu recebo isso no macOS porque há múltiplas versões do OpenSSL. Eu 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, recebo os erros de linker acima, porque instalei outros componentes 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 de 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ê obterá 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 em branco extras são removidos,
linhas em branco são 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 razões adicionais para cada um. Essas razões
estão descritas acima.
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
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'-'
O parâmetro -dddd significa informações diagnósticas; quanto mais ds você
adicionar, mais detalhes serão impressos. Isso é enviado para stderr em vez de stdout
para que você possa separar os fluxos. Usando bash, isso é feito assim:
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
Adicionar o parâmetro -d despeja informações de diagnóstico sobre as conexões no 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".