
Implante de filtro de contraseñas DLL con capacidades de exfiltración
DLLPasswordFilterImplant es un DLL personalizado de filtro de contraseñas que permite capturar las credenciales de un usuario. Cada evento de cambio de contraseña en un dominio activará el DLL registrado para exfiltrar el nombre de usuario y el nuevo valor de la contraseña antes de que se cambie exitosamente en Active Directory (AD).
Para más información sobre filtros de contraseñas consulta la documentación de Microsoft.
Cree el DLL para la arquitectura objetivo. Compile en 32 bits para un sistema de 32 bits y en 64 bits para un sistema de 64 bits.
Copie el DLL en el directorio de instalación de Windows. (Carpeta predeterminada: \Windows\System32)
Registre el filtro de contraseñas actualizando la siguiente clave del registro:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
Si la subclave Notification Packages existe, agregue el nombre del DLL ("DLLPasswordFilterImplant" si no lo renombró) a los datos del valor existente. No sobrescriba los valores existentes.
Si la subclave no existe, créela y agregue el nombre del DLL ("DLLPasswordFilterImplant" si no lo renombró) a los datos del valor.
NOTA: No incluya la extensión .dll al agregar el nombre del DLL en la subclave Notification Packages.
Configure la clave pública que se usará para cifrar las credenciales.
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
Luego puede ejecutar el archivo addKey.reg para agregar la clave pública en bruto al registro.
Tenga en cuenta que el uso de cifrado asimétrico aumenta significativamente el tamaño de los datos a exfiltrar debido al relleno del mensaje. Hay posibles mejoras que se pueden realizar para reducir la sobrecarga de datos.
Reinicie el sistema Fuente
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
Los datos cifrados se rellenan usando OAEP y se pueden descifrar de la siguiente manera:
# 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 eliminar completamente el filtro de contraseñas de un sistema:
Anule el registro del filtro de contraseñas actualizando la siguiente clave del registro:
HKEY_LOCAL_MACHINE SYSTEM\CurrentControlSet\Control\Lsa
En la subclave Notification Packages, elimine el nombre del DLL de los datos del valor existente. No elimine otros valores existentes.
Reinicie el sistema
En el directorio de instalación de Windows (carpeta predeterminada: \Windows\System32), busque el DLL del filtro de contraseñas ("DLLPasswordFilterImplant.DLL" si no lo renombró) y elimine el archivo.
Se proporciona un servidor DNS simple para recibir los datos exfiltrados en scripts/.
Ejecute pip install -r scripts/requirement.txt, preferiblemente en un entorno virtual, y luego proporciónele una clave privada codificada en .PEM y un archivo de salida opcional (por defecto es creds.txt) donde se escribirán las credenciales.
Actualmente, el servidor DNS no admite cambios de contraseña concurrentes y sirve solo como prueba de concepto. Las solicitudes de extracción que añadan robustez al servidor son más que bienvenidas.
Funciona en:
El filtro de contraseñas se probó exclusivamente en los sistemas listados anteriormente.
Aquí hay algunas herramientas que pueden ayudarle a depurar el DLL (si es necesario):