
Um scanner rápido para a vulnerabilidade CVE-2019-0708 "BlueKeep".
Este é um scanner rápido e sujo para a vulnerabilidade CVE-2019-0708 no Remote Desktop da Microsoft. Neste momento, existem cerca de 900.000 máquinas na Internet pública vulneráveis a esta vulnerabilidade, portanto, é de se esperar que em breve surja um worm como WannaCry e notPetya. Portanto, escaneie suas redes e aplique patches (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 é totalmente baseada no patch rdesktop de https://github.com/zerosum0x0/CVE-2019-0708.
Eu 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 escaneando
toda a Internet (com a ajuda do masscan, então estou resolvendo muitos problemas
rapidamente. Você pode 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.255
Isso produz um dos 3 resultados para cada endereço:
Quando não existe nada em um endereço IP de destino, as versões antigas exibiam a mensagem "DESCONHECIDO - conexão expirou". Ao escanear redes grandes, isso produz uma sobrecarga de informações demais sobre sistemas pelos quais você não se importa. Portanto, a nova versão, por padrão, não produz essa informação a menos que você adicione -v (para verbose) na linha de comando.
Você pode aumentar a velocidade com que escaneia redes grandes aumentando o número de workers:
rdpscan --workers 10000 10.0.0.0/8
No entanto, no meu computador, ele só produz cerca de 1500 workers, devido a limitações do sistema, independentemente de quão alto eu configure este parâmetro.
Você pode aumentar ainda mais a velocidade usando isso em conjunto
com o masscan, conforme descrito na seção abaixo.
Existem três respostas gerais:
Existem três principais razões pelas quais acreditamos que um alvo é seguro:
Isso significa que confirmamos que o sistema está vulnerável ao bug.
Há uma infinidade de variações para desconhecido
Esta ferramenta rdpscan é relativamente lenta, escaneando apenas algumas centenas de alvos por segundo.
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:
masscan no rdpscan, para que ele apenas
tenha que escanear alvos que sabemos que estão 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 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 é obter as bibliotecas OpenSSL instaladas e não conflitar com outras versões no sistema. Alguns exemplos para versões do Linux que testei são os seguintes, mas eles mudam os nomes dos pacotes de uma distribuição para a próxima. Além disso, existem muitas opções para uma API compatível com OpenSSL, como BoringSSL e LibreSSL.
$ sudo apt install libssl-dev
$ sudo yum install openssl-devel
Depois de resolver esse problema, você compila 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 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ê tenha os arquivos de desenvolvimento instalados. Você precisa tanto dos cabeçalhos quanto das bibliotecas instalados.
Para instalar essas coisas no Debian, faça:
$ sudo apt install libssl-dev
Para corrigir o problema do 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 existem múltiplas versões do OpenSSL. Eu corrijo isso codificando os caminhos:
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
De acordo com comentários de outros, a seguinte linha de comando pode funcionar no macOS se você usou o Homebrew para instalar as coisas. Eu ainda recebo os erros de linkagem acima, no entanto, 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 de início rápido para executar o programa. Esta seção fornece ajuda mais aprofundada.
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 múltiplos 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ções IPv4 CIDR. 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 este número
com o parâmetro --workers. No entanto, não importa o quão alto você defina este
parâmetro, na prática você obterá no máximo cerca de 500 a 1500 workers rodando
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 cortados,
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 caracteres //.
A saída é enviada para stdout dando o status de VULNERÁVEL, SEGURO,
ou DESCONHECIDO. Pode haver razões adicionais para cada um. Essas razões
sã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 de máquinas vulneráveis:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
O parâmetro -dddd significa informação diagnóstica, onde quanto mais ds você
adicionar, mais detalhes sã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 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 diferentes
arquivos da maneira usual:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
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 "DESCONHECIDO".
Para lançar os binários Windows e macOS anexados como releases a este projeto, eu vinculo estaticamente o OpenSSL, para que não precise ser incluído separadamente, e os programas funcionem imediatamente. Esta seção descreve algumas notas sobre como fazer isso, especialmente porque a descrição na própria página do OpenSSL parece estar desatualizada.
Ambos os passos começam baixando o código-fonte do OpenSSL e colocando-o
ao lado do diretório rdpscan:
git clone https://github.com/openssl/openssl
Para Windows, você precisa primeiro instalar alguma versão do Perl. Eu uso a do ActiveState.
Em seguida, você precisará de um "assembler" especial. Eu uso o recomendado chamado NASM)
Em seguida, você precisará de um compilador. Eu uso o VisualStudio 2010. Você pode baixar a versão mais recente "Visual Studio Community Edition" (que é 2019) em vez disso, da Microsoft.
Agora você precisa construir o makefile. Isso é feito entrando no diretório do OpenSSL
e executando o programa Perl Configure:
perl Configure VC-WIN32
Eu escolhi 32 bits para Windows porque existem muitos sistemas Windows antigos por aí, e quero tornar o programa o mais compatível possível com versões antigas.
Eu quero uma compilação totalmente estática, incluindo o runtime C. Para fazer isso, abri
o makefile resultante em um editor e mudei a flag de compilação C de
/MD (significa usar DLLs) para /MT. Enquanto estava lá, adicionei o seguinte
ao CPPFLAGS -D_WIN32_WINNT=0x501, que restringe o OpenSSL a recursos que
funcionam de volta no Windows XP e Server 2003. Caso contrário, você obtém erros de que bcrypt.dll
não foi encontrado se você executar nesses sistemas mais antigos.
Agora você precisará garantir que tudo esteja no seu PATH. Copiei nasm.exe
para um diretório no PATH. Para o Visual Studio 2010, executei o programa
vcvars32.bat para configurar as variáveis de PATH para o compilador.
Neste ponto, na linha de comando, digitei:
nmake
Isso cria as bibliotecas. As estáticas são libssl_static.lib e libcrypto_static.lib,
que eu uso para vincular no rdpscan.
Primeiro de tudo, você precisa instalar um compilador. Eu uso as Developer Tools da Apple, instalando
XCode e o compilador. Acho que você pode usar o Homebrew para instalar gcc em vez disso.
Em seguida, vá para o diretório de código-fonte do OpenSSL e crie um makefile:
perl Configure darwin64-x86_64-cc
Agora simplesmente compile:
make depend
make
Neste ponto, ele criou bibliotecas dinâmicas (.dylib) e estáticas (.lib). Deletei
as bibliotecas dinâmicas para que ele pegue as estáticas por padrão.
Agora no rdpscan, basta compilar o makefile do macOS:
make -f Makefile.macos
Isso compilará todos os arquivos fonte do rdpscan e depois vinculará com as bibliotecas OpenSSL
no diretório ../openssl que você acabou de construir.
Isso deve produzir um executável de 3 megabytes. Se, em vez disso, você obteve apenas um executável de 200 kilobytes, então você cometeu um erro e vinculou com as bibliotecas dinâmicas.