Lil Pwny: herramienta para comparar las contraseñas de un DA con la lista de Have I Been Pwned

Lil Pwny es una herramienta escrita en Python que permite comparar de forma offline las contraseñas de un Directorio Activo contra la lista de contraseñas recopiladas en Have I Been Pwned (en adelante HIBP), ya sabéis, la recopilación de contraseñas de muchos data breachs reales. 

Y es que hablamos de que actualmente esta recopilación tiene más de 550 millones de contraseñas, así que esta tarea debe hacerse con cierto "mimo". Para ello el autor de la herramienta Andrew Byford aka @_PaperMtn ha implementado multiproceso y opcionalmente permite trabajar en memoria para un indexado más rápido (mínimo 24GBs de RAM). También divide la lista de los hashes de los usuarios de DA en tantos trozos como número de cores -1, dejando ese core libre para manejar la lista compartida entre los procesos. Luego se crea un proceso para que cada uno de los cores busque su parte de la lista de hashes de usuarios en la lista hash de HIBP. 


Estas optimizaciones significan que cuanto más hardware se esté utilizando más rápido se ejecutará la auditoría. Por ejemplo, con un servidores de 80 núcleos y 80 GB de RAM se pueden comparar unos 6800 usuarios contra la lista HIBP en 48 minutos. 

Además Lil Pwny permite otras características adicionales bastante interesantes como: 

  • La posibilidad de proporcionar una lista adicional de contraseñas (las más relevantes de las que se sospecha que podrían estar usándose), más bien hashes, para comparar contra los del DA y la lista de HIBP.
  • Devuelve una lista de cuentas con las mismas contraseñas. Útil para encontrar usuarios que utilicen la misma contraseña para sus cuentas con privilegios y estándar. 

PREPARACIÓN 

Paso 1: Obtener un volcado IFM de la base de datos del Directorio Activo 

En un controlador de dominio, usar ntdsutil para generar un volcado IFM (Install From Media) del dominio. Ejecutar lo siguiente en una ventana de PowerShell elevada:

ntdsutil
activate instance ntds
ifm
create full **OUTPUT PATH**

Una vez que hayamos generado el snapshot tendremos una copia del ntds.dit. 

Paso 2: recuperar los hashes NTLM del output 

Para recuperar los hashes NTLM de los datos del fichero ntds.dit, se requiere el módulo DSInternals de Powershell. 

Install-Module DSInternals 

Una vez instalado, podremos usar la rama SYSTEM para recuperar los hashes en el formato username:hash y guardarlos en el archivo ad_ntlm_hashes.txt

$bootKey = Get-BootKey -SystemHivePath '.\registry\SYSTEM'
Get-ADDBAccount -All -DBPath '.\Active Directory\ntds.dit' -BootKey $bootKey | Format-Custom -View HashcatNT | Out-File ad_ntlm_hashes.txt -Encoding ASCII

La salida será como la siguiente: 

Paso 3: descargar el último archivo hash HIBP 

El archivo se puede descargar desde aquí 

INSTALACIÓN 

Ahora que tenemos todos los ingredientes vamos a proceder a usar la herramienta: 

pip install lil-pwny 

O también podemos obtenerlo del repo en Github: https://github.com/PaperMtn/lil-pwny/releases 

USO

usage: lil-pwny [-h] -hibp HIBP [-a A] -ad AD_HASHES [-d] [-m] [-o OUTPUT]

optional arguments:
  -hibp, --hibp-path    The HIBP .txt file of NTLM hashes
  -a, --a               .txt file containing additional passwords to check for
  -ad, --ad-hashes      The NTLM hashes from of AD users
  -d, --find-duplicates Output a list of duplicate password users
  -m, --memory          Load HIBP hash list into memory (over 24GB RAM
                        required)
  -o, --out-path        Set output path. Uses working dir when not set
Ejemplo:
lil-pwny -hibp ~/hibp_hashes.txt -ad ~/ad_ntlm_hashes.txt -a ~/additional_passwords.txt -o ~/Desktop/Output -m -d

Y finalmente, algunas salidas de ejemplo con resultados: 

Usuarios que matchean en HIBP: 

Usuarios que matchean contra una lista de passwords custom:

Usuarios que reutilizan la contraseña: 

Comentarios

  1. Hola, me ha parecido una idea interesante, pero o algo no entiendo o es muuuuy lento todo, y he hecho mi versión de la idea que evidentemente no require de 80 núcleos y 80 gigas, si no, un núcleo y la RAM que quieras (por defecto unos 400 MB).

    Acabo de publicarlo en GitHub por si alguien quiere hecharle un ojo: https://github.com/JoshyFun/ntlmpwnd

    ResponderEliminar

Publicar un comentario