
Implante de Filtro de Senha DLL com Capacidades de Exfiltração
DLLPasswordFilterImplant é um DLL de filtro de senha personalizado que permite a captura das credenciais de um usuário. Cada evento de alteração de senha em um domínio acionará o DLL registrado para exfiltrar o nome de usuário e o valor da nova senha antes de alterá-lo com sucesso no Active Directory (AD).
Para mais informações sobre filtros de senha, consulte a documentação da Microsoft1.
Crie o DLL para a arquitetura alvo. Compile em 32 bits para um sistema de 32 bits e em 64 bits para um sistema de 64 bits.
Copie o DLL para o diretório de instalação do Windows. (Pasta padrão: \Windows\System32)
Registre o filtro de senha atualizando a seguinte chave do registro:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
Se a subchave Notification Packages existir, adicione o nome do DLL ("DLLPasswordFilterImplant" se não o renomeou) aos dados de valor existentes. Não sobrescreva os valores existentes.
Se a subchave não existir, crie-a e adicione o nome do DLL ("DLLPasswordFilterImplant" se não o renomeou) aos dados de valor.
NOTA: Não inclua a extensão .dll ao adicionar o nome do DLL na subchave Notification Packages.
Configure a chave pública para usar na criptografia das credenciais.
KEY=key.pem
# Generate an RSA key and dump its public key. Keep the private key around for decryption
openssl genrsa -out $KEY 2048
# Prepare the Windows registry key entry.
echo 'Windows Registry Editor Version 5.00' > addKey.reg
echo >> addKey.reg
echo '[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]' >> addKey.reg
# If python2 does not exist, use `python` instead.
echo "Key=hex:$(openssl rsa -in $KEY -pubout | sed -E '/^\-/d' | base64 -d | python2 -c 'import sys; print(",".join(["{:02x}".format(ord(b)) for b in sys.stdin.read()]))')" >> addKey.reg
Você pode então executar o arquivo addKey.reg para anexar a chave pública bruta ao registro.
Note que o uso de criptografia assimétrica aumenta significativamente o tamanho dos dados a serem exfiltrados devido ao preenchimento da mensagem. Existem possíveis melhorias a serem feitas para reduzir a sobrecarga de dados.
Reinicie o sistema Fonte
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
Os dados criptografados são preenchidos usando OAEP e podem ser descriptografados da seguinte forma:
# Convert the stitched hex string to raw bytes.
xxd -r -p exfiltrated.hex > raw.bin
# Decrypt using the private key.
openssl rsautl -decrypt -oaep -inkey $KEY -in raw.bin -out decrypted.txt
Para remover completamente o filtro de senha de um sistema:
Desregistre o filtro de senha atualizando a seguinte chave do registro:
HKEY_LOCAL_MACHINE SYSTEM\CurrentControlSet\Control\Lsa
Na subchave Notification Packages, remova o nome do DLL dos dados de valor existentes. Não remova outros valores existentes.
Reinicie o sistema
No diretório de instalação do Windows (Pasta padrão: \Windows\System32), encontre o DLL do filtro de senha ("DLLPasswordFilterImplant.DLL" se não o renomeou) e exclua o arquivo.
Um servidor DNS simples para receber os dados exfiltrados é fornecido em scripts/.
Execute pip install -r scripts/requirement.txt, de preferência em um ambiente virtual. Em seguida, forneça a ele uma chave privada codificada em .PEM e um arquivo de saída opcional (padrão creds.txt) para onde exportar as credenciais.
Atualmente, o servidor DNS não suporta alterações de senha simultâneas e serve apenas como prova de conceito. Pull requests que adicionem robustez ao servidor são mais que bem-vindos.
Funciona em:
O filtro de senha foi testado exclusivamente nos sistemas listados acima.
Aqui estão algumas ferramentas que podem ajudar a depurar o DLL (se necessário):