Privileged Access & Lateral Movement in Active Directory
Acceso privilegiado y movimiento lateral en un entorno de Active Directory.
Tras obtener un primer foothold en el dominio, el objetivo es avanzar lateral o verticalmente hasta comprometer hosts adicionales o tomar el dominio.
Para esto podemos usar técnicas como RDP, WinRM, Pass-the-Hash, SQLAdmin, etc.
🔍 ¿Qué pasa si NO tenemos derechos de administrador local?
Incluso sin privilegios elevados podemos movernos lateralmente usando derechos como:
-
CanRDP
-
CanPSRemote
-
SQLAdmin
Estas rutas pueden encontrarse con:
-
BloodHound
-
PowerView
-
Herramientas nativas de Windows
1️⃣ Remote Desktop Protocol (RDP)
Permite acceder a la GUI de un host y desde ahí lanzar ataques, robar credenciales o escalar privilegios.
🔎 Enumerar usuarios con derecho a usar RDP
Con PowerView:
Get-NetLocalGroupMember -ComputerName ACADEMY-EA-MS01 -GroupName "Remote Desktop Users"

Si aparece:
INLANEFREIGHT\Domain Users
➡️ Todos los usuarios del dominio pueden hacer RDP a ese host.
📊 BloodHound – Ver derechos RDP
-
Buscar el usuario comprometido.
-
Revisar Node Info → Execution Rights → CanRDP.
-
También puedes ejecutar las queries:
-
Find Workstations where Domain Users can RDP
-
Find Servers where Domain Users can RDP
-

Muchos entornos tienen RDP habilitado para Domain Users sin darse cuenta → esto es un hallazgo crítico tanto para pentesters como para blue team.
2️⃣ WinRM (PowerShell Remoting)
Protocolo que permite ejecutar comandos o iniciar una sesión interactiva en un host remoto usando PowerShell.

We can see that user forend is a member of this group and can use WinRM to remotely manage this host
🔎 Enumerar usuarios con derecho a WinRM
Con PowerView:
Get-NetLocalGroupMember -ComputerName ACADEMY-EA-MS01 -GroupName "Remote Management Users"
📊 BloodHound – Query personalizada (CanPSRemote)
Cypher para buscar usuarios con WinRM:
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:CanPSRemote*1..]->(c:Computer) RETURN p2

Bdavis canpsremote
▶️ Conectarse vía WinRM desde Windows
$password = ConvertTo-SecureString "Klmcargo2" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("INLANEFREIGHT\forend", $password)
Enter-PSSession -ComputerName ACADEMY-EA-MS01 -Credential $cred
🐧 Conectarse vía WinRM desde Linux con Evil-WinRM
Instalación:
gem install evil-winrm
Uso:
evil-winrm -i 10.129.201.234 -u forend
3️⃣ MSSQL Server – SQLAdmin → SYSTEM 😈
Si puedes ejecutar comandos desde SQL, normalmente tienes SeImpersonatePrivilege, lo cual permite escaladas como:
JuicyPotato, RoguePotato, PrintSpoofer…
📊 Enumerar SQLAdmin con BloodHound
Cypher:
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group))
MATCH p2=(u1)-[:SQLAdmin*1..]->(c:Computer)
RETURN p2

📡 Enumerar MSSQL instances con PowerUpSQL
Import-Module .\PowerUpSQL.ps1
Get-SQLInstanceDomain
Ejemplo de resultado:

▶️ Ejecutar consultas SQL
Get-SQLQuery -Instance "172.16.5.150,1433" `
-username "inlanefreight\damundsen" `
-password "SQL1234!" `
-query 'SELECT @@version'
🐧 Autenticarse vía MSSQL desde Linux (mssqlclient.py)
mssqlclient.py INLANEFREIGHT/DAMUNDSEN@172.16.5.150 -windows-auth
Luego:
enable_xp_cmdshell
xp_cmdshell whoami /priv

Si ves:
SeImpersonatePrivilege Enabled
➡️ Escalada a SYSTEM casi asegurada.
🧭 BloodHound – Visualización y rutas de ataque ACL
-
DACL → Qué usuarios/grupos tienen permisos
-
SACL → Qué acciones generan logs
-
ACE → Reglas individuales dentro de ACL
BloodHound detecta ACE mal configurados que permiten ataques como: -
ForceChangePassword
-
GenericAll
-
GenericWrite
-
AddMember
-
DCSync