⚡ Escalada de privilegios en Windows: cómo un malware con permisos mínimos toma el control total

Escalación de privilegios en Windows: por qué usar tu PC como administrador cada día es el error que más aprovechan los atacantes
La escalación de privilegios Windows es uno de los ataques más peligrosos: un malware que entra con permisos de usuario estándar puede convertirse en administrador en segundos si el sistema no está bien configurado. En Seguridad en mi PC documentamos cómo PrintNightmare (CVE-2021-34527) convirtió un servicio activo sin uso real en una escalada directa a SYSTEM, y cómo seis medidas preventivas bloquean los vectores más comunes sin necesidad de herramientas adicionales. Todas las guías para proteger tu sistema están en nuestra sección de recursos de prevención y protección del sistema Windows, y puedes explorar también el archivo completo de guías técnicas de seguridad Windows disponibles en el sitio.
💡 Resumen rápido
⚡ Escalación de privilegios Windows: qué es, cómo funciona y cómo prevenirla
La escalación de privilegios Windows es el proceso por el que un atacante o malware eleva sus permisos de usuario estándar a administrador o SYSTEM. Un malware que entra con permisos limitados puede tomar el control total del sistema en segundos si este no está bien configurado.
- ✅ 3 tipos: escalación vertical, horizontal y bypass UAC (MITRE T1548, T1068, T1078)
- ✅ 5 causas comunes: vulnerabilidades sin parchear, UAC desactivado, cuenta admin diaria, servicios mal configurados y permisos excesivos en ACL
- ✅ Caso real: PrintNightmare (CVE-2021-34527), escalada a SYSTEM desde usuario estándar vía DLL hijacking
- ✅ Script PowerShell con 3 tareas programadas: aplica 7 medidas y vigila el estado en inicio, logon y cada hora
- ✅ Cómo detectarla: eventos 4672 y 4648 en el registro de seguridad de Windows con PowerShell
📅 2026 · 🕐 8 minutos de lectura
La escalación de privilegios es un tipo de ataque en el que un usuario o malware obtiene permisos más altos en un sistema, pasando de un nivel limitado a uno con acceso completo (administrador o SYSTEM). En esta guía aprenderás cómo funciona, qué técnicas usan los atacantes y cómo proteger tu sistema Windows aplicando el principio de mínimo privilegio.
Esta guía complementa nuestro artículo sobre hardening de cuentas Windows y la monitorización de logins Windows para detectar estos ataques a tiempo.
📌 ¿Qué es la escalación de privilegios Windows?
La escalación de privilegios Windows permite al atacante acceder a recursos restringidos, instalar malware con permisos máximos y tomar el control total del sistema. En Windows, cada proceso y cuenta de usuario lleva asociado un token de acceso que determina qué recursos puede utilizar. El objetivo de la escalación es manipular o suplantar ese token para operar con permisos superiores a los asignados legítimamente.
- ✔ Acceso a archivos y datos protegidos por ACL (listas de control de acceso)
- ✔ Control completo del sistema operativo y su registro
- ✔ Instalación de malware, rootkits o ransomware con permisos máximos
- ✔ Persistencia del atacante en el sistema mediante cuentas de servicio o tareas programadas
- ✔ Movimiento lateral hacia otros equipos de la red corporativa
💡 ¿Qué es el principio de mínimo privilegio?
El principio de mínimo privilegio establece que cada usuario, proceso o cuenta de servicio debe tener únicamente los permisos imprescindibles para realizar su función, y ninguno más. Es la defensa más eficaz contra la escalación de privilegios: si un malware compromete una cuenta estándar, no hereda permisos de administrador y su capacidad de daño queda contenida.
⚙️ Tipos de escalación de privilegios Windows
| Tipo | Descripción | Ejemplo real | Técnica MITRE |
|---|---|---|---|
| Escalación vertical | Usuario estándar → Administrador → SYSTEM mediante explotación de vulnerabilidad o token de acceso manipulado | PrintNightmare (CVE-2021-34527) | T1068 |
| Escalación horizontal | Acceso a recursos de otra cuenta del mismo nivel sin elevar el token de acceso | Robo de credenciales de otro usuario mediante pass-the-hash | T1078 |
| Bypass UAC | Elusión del Control de Cuentas de Usuario para ejecutar código elevado sin solicitud de confirmación | Técnicas usadas por grupos APT contra entornos corporativos | T1548.002 |
| DLL hijacking | Sustitución de una DLL legítima por una maliciosa en una ruta con permisos de escritura | Explotación de carpetas con ACL mal configuradas | T1574.001 |
| Token impersonation | Suplantación del token de acceso de un proceso con privilegios elevados | Incognito, Mimikatz en entornos comprometidos | T1134 |
🚨 Cómo funciona la escalación de privilegios Windows
- 🔓 Acceso inicial, el atacante o malware entra con permisos de usuario estándar (por phishing, descarga maliciosa o explotación remota)
- 🔍 Reconocimiento, enumera vulnerabilidades, servicios mal configurados, permisos excesivos en ACL y cuentas de servicio con privilegios elevados
- ⚡ Explotación, aprovecha un fallo sin parchear, realiza DLL hijacking o aplica bypass UAC para elevar su token de acceso
- 🔑 Escalación, obtiene privilegios de administrador o SYSTEM y puede desactivar el antivirus y el registro de eventos
- 🎯 Control total, instala malware con persistencia, roba credenciales, cifra archivos o inicia movimiento lateral
🧠 Causas más comunes de la escalación de privilegios Windows
| Causa | Ejemplo real | Consecuencia | Nivel de riesgo |
|---|---|---|---|
| Vulnerabilidades sin parchear | CVE-2021-34527 PrintNightmare | Escalación a SYSTEM desde usuario estándar vía inyección de DLL | 🔴 Crítico |
| UAC desactivado o mal configurado | Sin prompt de confirmación en nivel bajo | Ejecución silenciosa de código con privilegios admin sin alerta | 🔴 Crítico |
| Cuenta de administrador como cuenta diaria | Usuario con token de acceso máximo siempre activo | Cualquier malware hereda privilegios admin sin necesitar escalación | 🔴 Alto |
| Servicios mal configurados | Print Spooler o Remote Registry activos sin necesidad | Vector de escalación explotable sin interacción del usuario | 🟠 Alto |
| ACL con permisos excesivos en carpetas del sistema | Carpeta con escritura para usuarios estándar | DLL hijacking o sustitución de ejecutables legítimos | 🟠 Alto |
| Cuentas de servicio con privilegios excesivos | Servicio corriendo como SYSTEM sin necesidad | Comprometer el servicio equivale a comprometer SYSTEM | 🔴 Crítico |
| Credenciales almacenadas en texto claro | Contraseñas en scripts o el registro de Windows | Enumeración de credenciales robadas sin explotar ninguna CVE | 🟠 Alto |
🔎 Ejemplo práctico: PrintNightmare (CVE-2021-34527)
- El malware entra en el PC con permisos de usuario estándar (token de acceso limitado)
- Detecta que el servicio Print Spooler está activo mediante enumeración de servicios
- Explota CVE-2021-34527 (CVSS 8.8) para inyectar una DLL maliciosa en el proceso del spooler
- Obtiene privilegios de SYSTEM, el nivel máximo en Windows, heredando su token de acceso
- Instala ransomware, roba credenciales almacenadas o establece persistencia mediante cuentas de servicio ocultas
💡 ¿Qué es el DLL hijacking?
El DLL hijacking (o secuestro de DLL) es una técnica de escalación de privilegios que aprovecha que una aplicación con privilegios elevados carga una DLL desde una ruta en la que el atacante tiene permisos de escritura. Al colocar una DLL maliciosa en esa ruta, el proceso privilegiado la ejecuta automáticamente, transfiriendo su token de acceso al código del atacante. Las ACL mal configuradas en carpetas del sistema son el requisito previo más frecuente.
🛡️ Script completo: Hardening contra escalación de privilegios Windows con tareas programadas
A continuación encontrarás un script PowerShell completo y unificado que aplica las 7 medidas preventivas más eficaces contra la escalación de privilegios en un único paso: UAC en nivel máximo, desactivación de Print Spooler y Remote Registry, protección de SAM contra volcado de credenciales, verificación de cuentas admin sospechosas, ejecución LUA forzada y auditoría de eventos 4672/4648. Además, crea tres tareas programadas que reaplican y vigilan el hardening en cada inicio, en cada login y cada hora, de modo que si malware, tweakers o un usuario desactiva alguna de las protecciones, el script la restaura automáticamente en menos de una hora.
C:\Logs\antipriv-esc.log. Lee siempre el código antes de pegarlo en PowerShell.📅 Tareas programadas que crea este script
El script registra tres tareas independientes en el Programador de tareas de Windows. Cada una se ejecuta en un disparador distinto para garantizar la cobertura completa del hardening contra escalación de privilegios:
| Nombre de la tarea | Disparador | Frecuencia | Propósito |
|---|---|---|---|
AntiPrivEsc-Inicio | Al iniciar Windows (-AtStartup) | Cada arranque del equipo | Restablece UAC, servicios desactivados y configuración de LSA si una actualización o un malware ha revertido alguna protección |
AntiPrivEsc-Logon | Al iniciar sesión cualquier usuario (-AtLogOn) | Cada login (incluye reinicios desde sesión) | Reaplica el hardening cuando un usuario inicia sesión, detecta cuentas admin nuevas y verifica eventos 4672 recientes |
AntiPrivEsc-Horaria | Programado cada hora (-RepetitionInterval 1h) | 24 veces al día | Vigilancia continua: si malware o "tweakers" reactivan Spooler, bajan UAC o crean cuentas admin ocultas, el script las detecta y revierte en menos de una hora |
SYSTEM con privilegios elevados y en modo oculto (sin ventana visible). El script es idempotente: comprueba cada valor antes de modificarlo y solo actúa si detecta desviación. La carga sobre el sistema es mínima: cada ejecución consume unos pocos segundos de CPU. El CSV histórico en C:\Logs\antipriv-esc-historico.csv deja constancia de cada ejecución con los cambios detectados.📥 Pasos para instalar y activar el hardening automático
- Abre PowerShell como administrador: pulsa la tecla Windows, escribe
PowerShell, haz clic derecho sobre Windows PowerShell y selecciona Ejecutar como administrador. - Permite la ejecución de scripts en la sesión actual (no afecta a futuras sesiones):
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass - Crea la carpeta de scripts del sistema: el script se instalará en
C:\Scripts\para que las tareas programadas lo encuentren siempre en la misma ruta:New-Item -ItemType Directory -Path "C:\Scripts" -Force - Crea el archivo del script: abre el Bloc de notas, pega el código que verás más abajo y guárdalo como
AntiPrivEsc.ps1directamente enC:\Scripts\. Asegúrate de que el tipo de archivo sea Todos los archivos, no .txt. - Si tienes impresora en red, edita el script antes de ejecutarlo y comenta las líneas de Print Spooler (añade
#al principio de esas 2 líneas). - Ejecuta el script por primera vez desde PowerShell (esto aplicará las 7 medidas Y creará las tres tareas programadas):
C:\Scripts\AntiPrivEsc.ps1 - Verifica que las tres tareas programadas se crearon correctamente:
Get-ScheduledTask -TaskName "AntiPrivEsc-*" - Revisa el log y el CSV histórico:
C:\Logs\antipriv-esc.logcontiene los resultados detallados yC:\Logs\antipriv-esc-historico.csvel resumen de cada ejecución. - Reinicia el equipo: la tarea de inicio se ejecutará automáticamente y el hardening quedará reaplicado.
💻 Script unificado de hardening anti-escalación (copia y pega)
# ============================================================
# Script: Hardening anti-escalacion de privilegios Windows
# Autor: seguridadenmipc.com
# Compat: Windows 10 / 11 / Server 2019+
# Uso: Ejecutar como administrador (1a vez)
# Despues se reaplica solo: inicio, logon y cada hora
# Ruta: C:\Scripts\AntiPrivEsc.ps1
# Idempotente: solo actua si detecta desviacion
# ============================================================
# 1. Verificar privilegios de administrador
if (-not ([Security.Principal.WindowsPrincipal] `
[Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
[Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Host "[X] Ejecuta este script como Administrador." -ForegroundColor Red
exit
}
# 2. Preparar log y CSV historico
$logDir = "C:\Logs"
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir | Out-Null }
$log = "$logDir\antipriv-esc.log"
$csv = "$logDir\antipriv-esc-historico.csv"
Start-Transcript -Path $log -Append | Out-Null
$disparador = if ($args[0]) { $args[0] } else { "Manual" }
Write-Host "=== Hardening anti-escalacion de privilegios ===" -ForegroundColor Cyan
Write-Host "Fecha: $(Get-Date) | Disparador: $disparador" -ForegroundColor Gray
$cambios = 0
# 3. UAC EN NIVEL MAXIMO: "Notificarme siempre"
Write-Host "`n--- UAC en nivel maximo ---" -ForegroundColor Yellow
try {
$uacKey = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
$uacValues = @{
"EnableLUA" = 1 # UAC activo
"ConsentPromptBehaviorAdmin" = 2 # Notificar siempre admins
"PromptOnSecureDesktop" = 1 # Usar desktop seguro
}
foreach ($v in $uacValues.Keys) {
$actual = (Get-ItemProperty -Path $uacKey -Name $v -ErrorAction SilentlyContinue).$v
if ($actual -ne $uacValues[$v]) {
Set-ItemProperty -Path $uacKey -Name $v -Value $uacValues[$v] -Type DWord
Write-Host "[!] UAC: $v corregido a $($uacValues[$v])" -ForegroundColor Red
$cambios++
}
}
Write-Host "[OK] UAC en nivel maximo verificado." -ForegroundColor Green
} catch { Write-Host "[X] Error en UAC: $_" -ForegroundColor Red }
# 4. DESACTIVAR PRINT SPOOLER (PrintNightmare CVE-2021-34527)
# COMENTA estas 2 lineas si usas impresora en red:
Write-Host "`n--- Print Spooler (PrintNightmare) ---" -ForegroundColor Yellow
try {
$spooler = Get-Service -Name Spooler -ErrorAction SilentlyContinue
if ($spooler -and $spooler.StartType -ne "Disabled") {
Stop-Service -Name Spooler -Force -ErrorAction SilentlyContinue
Set-Service -Name Spooler -StartupType Disabled
Write-Host "[!] Print Spooler estaba activo. Desactivado." -ForegroundColor Red
$cambios++
} else {
Write-Host "[OK] Print Spooler ya desactivado." -ForegroundColor Green
}
} catch { Write-Host "[!] Spooler: $_" -ForegroundColor Yellow }
# 5. DESACTIVAR REMOTE REGISTRY (modificacion remota del registro)
Write-Host "`n--- Remote Registry ---" -ForegroundColor Yellow
try {
$rr = Get-Service -Name RemoteRegistry -ErrorAction SilentlyContinue
if ($rr -and $rr.StartType -ne "Disabled") {
Stop-Service -Name RemoteRegistry -Force -ErrorAction SilentlyContinue
Set-Service -Name RemoteRegistry -StartupType Disabled
Write-Host "[!] RemoteRegistry estaba activo. Desactivado." -ForegroundColor Red
$cambios++
} else {
Write-Host "[OK] RemoteRegistry ya desactivado." -ForegroundColor Green
}
} catch { Write-Host "[!] RemoteRegistry: $_" -ForegroundColor Yellow }
# 6. LSA PROTECTION (protege SAM contra Mimikatz y volcado de credenciales)
Write-Host "`n--- LSA Protection ---" -ForegroundColor Yellow
try {
$lsaKey = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa"
$lsaActual = (Get-ItemProperty -Path $lsaKey -Name RunAsPPL -ErrorAction SilentlyContinue).RunAsPPL
if ($lsaActual -ne 1) {
Set-ItemProperty -Path $lsaKey -Name RunAsPPL -Value 1 -Type DWord
Write-Host "[!] LSA Protection activada (RunAsPPL=1). Requiere reinicio." -ForegroundColor Red
$cambios++
} else {
Write-Host "[OK] LSA Protection ya activa." -ForegroundColor Green
}
} catch { Write-Host "[!] LSA: $_" -ForegroundColor Yellow }
# 7. RESTRINGIR CREDENCIALES EN MEMORIA (WDigest)
Write-Host "`n--- WDigest (credenciales en memoria) ---" -ForegroundColor Yellow
try {
$wdKey = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest"
if (-not (Test-Path $wdKey)) { New-Item -Path $wdKey -Force | Out-Null }
$wdActual = (Get-ItemProperty -Path $wdKey -Name UseLogonCredential -ErrorAction SilentlyContinue).UseLogonCredential
if ($wdActual -ne 0) {
Set-ItemProperty -Path $wdKey -Name UseLogonCredential -Value 0 -Type DWord
Write-Host "[!] WDigest corregido a 0 (sin credenciales en claro en memoria)." -ForegroundColor Red
$cambios++
} else {
Write-Host "[OK] WDigest ya seguro." -ForegroundColor Green
}
} catch { Write-Host "[!] WDigest: $_" -ForegroundColor Yellow }
# 8. AUDITORIA DE EVENTOS 4672 Y 4648
Write-Host "`n--- Auditoria de escalacion (4672, 4648) ---" -ForegroundColor Yellow
try {
auditpol /set /subcategory:"Special Logon" /success:enable /failure:enable | Out-Null
auditpol /set /subcategory:"Logon" /success:enable /failure:enable | Out-Null
auditpol /set /subcategory:"Sensitive Privilege Use" /success:enable /failure:enable | Out-Null
Write-Host "[OK] Auditoria de 4672/4648 activada." -ForegroundColor Green
} catch { Write-Host "[!] Auditpol: $_" -ForegroundColor Yellow }
# 9. DETECCION DE CUENTAS ADMINISTRADORAS SOSPECHOSAS
Write-Host "`n--- Cuentas administradoras activas ---" -ForegroundColor Yellow
$admins = @()
try {
$admins = (net localgroup administrators) |
Select-String -NotMatch "Alias|Name|Comment|command|completed|---" |
ForEach-Object { $_.ToString().Trim() } |
Where-Object { $_ -and $_ -notmatch "^$" }
Write-Host "[i] $($admins.Count) cuentas en el grupo administradores:" -ForegroundColor Cyan
foreach ($a in $admins) { Write-Host " - $a" -ForegroundColor Gray }
} catch {}
# 10. DETECCION DE EVENTOS 4672 RECIENTES (privilegios especiales)
Write-Host "`n--- Eventos 4672 recientes (24h) ---" -ForegroundColor Yellow
$priv4672 = 0
try {
$priv4672 = (Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4672
StartTime=(Get-Date).AddHours(-24)
} -ErrorAction SilentlyContinue).Count
if ($priv4672 -gt 100) {
Write-Host "[!] VOLUMEN ANOMALO: $priv4672 eventos 4672 en 24h." -ForegroundColor Red
} else {
Write-Host "[OK] $priv4672 eventos 4672 en 24h (normal)." -ForegroundColor Green
}
} catch {}
# 11. Anadir resumen al CSV historico
$resumen = [PSCustomObject]@{
Fecha = (Get-Date -Format "yyyy-MM-dd HH:mm:ss")
Disparador = $disparador
CambiosAplic = $cambios
CuentasAdmin = $admins.Count
Eventos4672 = $priv4672
}
$resumen | Export-Csv -Path $csv -Append -NoTypeInformation -Encoding UTF8
Write-Host "[OK] Resumen anadido al CSV historico. Cambios: $cambios" -ForegroundColor Green
# 12. CREAR LAS 3 TAREAS PROGRAMADAS (solo si no existen)
$scriptPath = "C:\Scripts\AntiPrivEsc.ps1"
# 12a. Tarea: al iniciar Windows
try {
if (-not (Get-ScheduledTask -TaskName "AntiPrivEsc-Inicio" -ErrorAction SilentlyContinue)) {
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" Inicio"
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries -StartWhenAvailable `
-ExecutionTimeLimit (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName "AntiPrivEsc-Inicio" `
-Action $action -Trigger $trigger -Principal $principal -Settings $settings `
-Description "Hardening anti-escalacion al arranque - seguridadenmipc.com" | Out-Null
Write-Host "[OK] Tarea 'AntiPrivEsc-Inicio' creada." -ForegroundColor Green
} else {
Write-Host "[i] Tarea 'AntiPrivEsc-Inicio' ya existe." -ForegroundColor Cyan
}
} catch { Write-Host "[X] Error en tarea Inicio: $_" -ForegroundColor Red }
# 12b. Tarea: al iniciar sesion (logon / reinicio desde sesion)
try {
if (-not (Get-ScheduledTask -TaskName "AntiPrivEsc-Logon" -ErrorAction SilentlyContinue)) {
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" Logon"
$trigger = New-ScheduledTaskTrigger -AtLogOn
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries -StartWhenAvailable `
-ExecutionTimeLimit (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName "AntiPrivEsc-Logon" `
-Action $action -Trigger $trigger -Principal $principal -Settings $settings `
-Description "Hardening anti-escalacion al iniciar sesion - seguridadenmipc.com" | Out-Null
Write-Host "[OK] Tarea 'AntiPrivEsc-Logon' creada." -ForegroundColor Green
} else {
Write-Host "[i] Tarea 'AntiPrivEsc-Logon' ya existe." -ForegroundColor Cyan
}
} catch { Write-Host "[X] Error en tarea Logon: $_" -ForegroundColor Red }
# 12c. Tarea: cada hora
try {
if (-not (Get-ScheduledTask -TaskName "AntiPrivEsc-Horaria" -ErrorAction SilentlyContinue)) {
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" Horaria"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(10) `
-RepetitionInterval (New-TimeSpan -Hours 1)
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries -StartWhenAvailable `
-ExecutionTimeLimit (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName "AntiPrivEsc-Horaria" `
-Action $action -Trigger $trigger -Principal $principal -Settings $settings `
-Description "Hardening anti-escalacion cada hora - seguridadenmipc.com" | Out-Null
Write-Host "[OK] Tarea 'AntiPrivEsc-Horaria' creada (cada 1h)." -ForegroundColor Green
} else {
Write-Host "[i] Tarea 'AntiPrivEsc-Horaria' ya existe." -ForegroundColor Cyan
}
} catch { Write-Host "[X] Error en tarea Horaria: $_" -ForegroundColor Red }
Write-Host "`n[OK] Hardening anti-escalacion activo. Disparador: $disparador" -ForegroundColor Green
Write-Host " Log: $log" -ForegroundColor Gray
Write-Host " CSV: $csv" -ForegroundColor Gray
Stop-Transcript | Out-Null↩️ Script de reversión (elimina las 3 tareas y restaura configuración por defecto)
Si necesitas revertir el hardening (por ejemplo, para reactivar la impresora en red, diagnosticar problemas de compatibilidad o aplicar una política corporativa distinta), ejecuta este script. Importante: elimina primero las tres tareas programadas, porque si no, el hardening volverá a aplicarse en menos de una hora.
# ============================================================
# Revertir hardening anti-escalacion de privilegios
# ============================================================
# 1. ELIMINAR PRIMERO las 3 tareas programadas
$tareas = @("AntiPrivEsc-Inicio", "AntiPrivEsc-Logon", "AntiPrivEsc-Horaria")
foreach ($t in $tareas) {
if (Get-ScheduledTask -TaskName $t -ErrorAction SilentlyContinue) {
Unregister-ScheduledTask -TaskName $t -Confirm:$false
Write-Host "[OK] Tarea $t eliminada." -ForegroundColor Green
}
}
# 2. Reactivar Print Spooler (solo si necesitas impresora en red)
# Set-Service -Name Spooler -StartupType Automatic
# Start-Service -Name Spooler
# 3. Reactivar Remote Registry (NO recomendado)
# Set-Service -Name RemoteRegistry -StartupType Manual
# 4. Desactivar LSA Protection (reduce proteccion contra Mimikatz)
Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" `
-Name RunAsPPL -ErrorAction SilentlyContinue
# NOTA: UAC y WDigest se mantienen seguros por defecto; no los desactivamos.
Write-Host ""
Write-Host "[OK] Tareas programadas eliminadas. Hardening principal revertido." -ForegroundColor Green
Write-Host " UAC y WDigest se mantienen seguros por defecto." -ForegroundColor Yellow
Write-Host " Logs preservados en C:\Logs\antipriv-esc.log" -ForegroundColor Cyan
Write-Host " Reinicia el equipo para que los cambios surtan efecto." -ForegroundColor Yellow⚠️ Riesgos y efectos reales del script
Antes de ejecutar este script conviene entender exactamente qué cambios aplica y qué funciones de Windows pueden verse afectadas. El script es intrusivo en la política de seguridad (toca UAC, LSA, WDigest y servicios), pero idempotente y completamente reversible. La parte más sensible es la desactivación de Print Spooler, que afecta directamente a la impresión.
| Función del sistema | ¿Se ve afectada? | Detalle técnico |
|---|---|---|
| Inicio de sesión local | 🟢 No | El script no toca cuentas ni políticas de contraseñas |
| Inicio de Windows | 🟢 No | La tarea de inicio se ejecuta en background tras el arranque, sin bloquearlo |
| Reinicio / apagado | 🟢 No | No modifica el subsistema de apagado ni BCD |
| UEFI / arranque seguro | 🟢 No | No afecta BCD, Secure Boot ni particiones EFI |
| Banca, Gmail y plataformas web | 🟢 No | El script no toca DNS, hosts, proxy ni la pila de red |
| Visualización de sitios web | 🟢 No | El script solo modifica política local, no el navegador ni su red |
| UAC (Control de cuentas de usuario) | 🔴 Sí (a propósito) | Se fuerza a nivel máximo "Notificarme siempre"; verás más prompts al ejecutar aplicaciones admin |
| Impresión local y en red | 🔴 Sí (configurable) | Print Spooler desactivado por defecto; comenta las líneas si necesitas imprimir |
| Administración remota del registro | 🔴 Sí (a propósito) | Remote Registry deshabilitado; afecta a herramientas de gestión remota |
| LSA / autenticación | 🟡 Sí (positivo, requiere reinicio) | LSA Protection activada (RunAsPPL=1); algunos controladores o plugins no firmados pueden dejar de cargar |
| Credenciales en memoria (WDigest) | 🟢 Sí (positivo) | WDigest deja de almacenar contraseñas en claro en memoria; imposibilita un vector clásico de Mimikatz |
| Auditoría de seguridad | 🟢 Sí (positivo) | Se activa la auditoría de eventos 4672 y 4648; el log de seguridad registrará más eventos |
- Si usas impresora local o en red, comenta las 2 líneas de Print Spooler antes de ejecutar (si no, no podrás imprimir)
- Si dependes de herramientas que modifican el registro remotamente desde otro equipo (gestión doméstica con PsExec, Group Policy, etc.)
- Si usas controladores de terceros sin firma WHQL: LSA Protection puede impedir que se carguen tras el reinicio (raro en 2026, pero posible con drivers antiguos)
- Si tu equipo es gestionado por el departamento de IT de una empresa (puede entrar en conflicto con GPO corporativas; consúltalo con tu administrador)
- Si tienes un EDR/XDR corporativo que ya aplica hardening similar (el script no hará daño, pero puede generar duplicación de alertas)
- Si dependes de software antiguo que exige UAC en nivel bajo para funcionar (el script no lo detecta; tendrás que elegir)
# las medidas que no puedas permitirte antes de ejecutarlo.RunAsPPL=1 requiere un reinicio para que LSA se proteja como proceso PPL. Hasta que reinicies, la protección no está activa aunque el valor esté escrito. Tras el primer reinicio posterior a la ejecución, verifica con Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RunAsPPL que el valor es 1, y con el registro de eventos (evento 12 en Microsoft-Windows-CodeIntegrity) que no hay controladores que fallaron al cargar.En equipos domésticos sin impresora en red y sin software antiguo que exija UAC bajo, este script es seguro y aplica el hardening anti-escalación más robusto posible sin instalar software adicional. Las tres tareas programadas garantizan que el endurecimiento persista frente a malware, "tweakers" que desactivan UAC por comodidad y actualizaciones de Windows que puedan revertir configuraciones.
🔎 ¿Cómo verificar que el hardening anti-escalación está activo?
💡 ¿Cómo comprobar si el hardening anti-escalación está aplicado?
Ejecuta estos comandos en PowerShell como administrador para verificar el estado de cada medida y de las tareas programadas:
# Verificar UAC en nivel maximo (debe ser 1, 2 y 1) Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" ` | Select EnableLUA, ConsentPromptBehaviorAdmin, PromptOnSecureDesktop # Verificar Spooler y RemoteRegistry (deben estar Stopped / Disabled) Get-Service Spooler, RemoteRegistry | Select Name, Status, StartType # Verificar LSA Protection (debe devolver 1, requiere reinicio previo) Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RunAsPPL # Verificar WDigest (debe ser 0) Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" -Name UseLogonCredential # Verificar auditoria de eventos 4672/4648 auditpol /get /subcategory:"Special Logon","Logon","Sensitive Privilege Use" # Verificar que las 3 tareas programadas existen y estan activas Get-ScheduledTask -TaskName "AntiPrivEsc-*" | ` Select TaskName, State, LastRunTime, LastTaskResult # Listar cuentas administradoras actuales net localgroup administrators
Las tres tareas deben aparecer en estado Ready con LastTaskResult = 0. Si EnableLUA=1, RunAsPPL=1, UseLogonCredential=0 y los servicios Spooler/RemoteRegistry están en Stopped/Disabled, el hardening está correctamente aplicado.
🔍 Cómo detectar intentos de escalación con PowerShell
El registro de eventos de Windows registra automáticamente los intentos de elevación de privilegios. Los dos eventos más relevantes para detectar escalación de privilegios son el 4672 (se asignaron privilegios especiales a un inicio de sesión) y el 4648 (inicio de sesión con credenciales explícitas). Este comando de PowerShell filtra ambos eventos en los últimos 7 días:
💡 ¿Cómo detectar escalación de privilegios con PowerShell?
Ejecuta este comando en PowerShell como administrador para consultar el registro de seguridad de Windows:
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4672,4648; StartTime=(Get-Date).AddDays(-7)} | Select-Object TimeCreated, Id, Message | Format-ListUn volumen inusual de eventos 4672 fuera del horario habitual es una señal de alerta de escalación de privilegios activa o de un intento de bypass UAC en curso. El script de vigilancia ya registra en el CSV histórico el conteo diario de eventos 4672 y avisa cuando supera el umbral de 100 en 24h.
✅ Checklist de prevención de escalación de privilegios en Windows
Verifica cada punto en tu sistema para cerrar los vectores de escalación más frecuentes:
- ☐ Uso cuentas estándar para el trabajo diario (no la cuenta de administrador)
- ☐ El UAC está en nivel máximo:
EnableLUA=1,ConsentPromptBehaviorAdmin=2,PromptOnSecureDesktop=1 - ☐ Las actualizaciones de Windows están al día sin CVEs pendientes
- ☐ Print Spooler está desactivado si no hay impresora en red
- ☐ Remote Registry está desactivado
- ☐ LSA Protection está activa (
RunAsPPL=1) y el equipo ha reiniciado desde su activación - ☐ WDigest está en modo seguro (
UseLogonCredential=0) - ☐ La auditoría de Special Logon y Sensitive Privilege Use está activa en
auditpol - ☐ Las tres tareas
AntiPrivEsc-*aparecen en estado Ready:Get-ScheduledTask -TaskName "AntiPrivEsc-*" - ☐ En el CSV histórico
CambiosAplices cero o bajo (si sube, algo está revirtiendo configuraciones) - ☐
CuentasAdminen el CSV se mantiene estable; cualquier incremento inesperado requiere investigación - ☐
Eventos4672en el CSV se mantiene por debajo de 100 en 24h - ☐ Tengo Windows Defender activo con protección en tiempo real en el host
🛡️ Cómo protegerte de la escalación de privilegios Windows
- 👤 Usa cuentas estándar para el uso diario, reserva el administrador solo para tareas que lo requieran; con una cuenta estándar, el malware no hereda privilegios elevados
- 🔔 Mantén el UAC activo en nivel máximo, el Control de Cuentas de Usuario de Microsoft bloquea la ejecución silenciosa de código elevado y obliga a confirmar cada elevación de privilegios
- 🔄 Aplica las actualizaciones de Windows sin demora, PrintNightmare llevaba parche disponible cuando fue explotado masivamente; cada CVE sin parchear es un vector activo de escalación
- 🛠️ Aplica el hardening de cuentas Windows, implementa el principio de mínimo privilegio en cada cuenta de usuario y cuenta de servicio
- 🔌 Desactiva servicios innecesarios, consulta nuestra guía sobre servicios de compartición Windows; cada servicio activo sin uso es una superficie de ataque potencial
- 📋 Revisa las ACL de carpetas del sistema, ninguna carpeta del sistema debe tener permisos de escritura para usuarios estándar; el DLL hijacking depende de encontrar exactamente esa configuración
- 🔒 Activa LSA Protection y deshabilita WDigest, el script los configura automáticamente; impide el volcado de credenciales clásico con Mimikatz
- 🔍 Monitoriza accesos con privilegios, eventos 4672 (privilegios especiales asignados) y 4648 (inicio de sesión con credenciales explícitas) en el registro de seguridad de Windows
🆚 Sistema vulnerable vs protegido frente a escalación de privilegios Windows
| Característica | Sin protección | Protegido frente a escalación de privilegios |
|---|---|---|
| Cuenta diaria | 🔴 Administrador siempre activo (token elevado permanente) | 🟢 Cuenta estándar + admin solo cuando se necesita |
| UAC | 🔴 Desactivado o nivel bajo (sin prompt de confirmación) | 🟢 Activo en nivel máximo "Notificarme siempre" |
| Parches de seguridad | 🔴 Sin aplicar (CVEs activos explotables) | 🟢 Actualizados mensualmente sin demora |
| Servicios innecesarios | 🔴 Print Spooler, Remote Registry activos sin uso | 🟢 Desactivados si no se usan, política de seguridad local revisada |
| LSA Protection | 🔴 Inactiva; Mimikatz puede volcar credenciales de LSASS | 🟢 RunAsPPL=1; LSASS protegido contra volcado de credenciales |
| WDigest | 🔴 Puede almacenar contraseñas en claro en memoria | 🟢 UseLogonCredential=0; vector clásico de Mimikatz eliminado |
| ACL de carpetas del sistema | 🔴 Permisos de escritura para usuarios estándar | 🟢 Solo administradores pueden escribir en rutas del sistema |
| Persistencia del hardening | 🔴 Un malware o "tweaker" puede revertir UAC y servicios | 🟢 Tres tareas programadas restauran configuración cada hora |
| Monitorización del registro de eventos | 🔴 Sin monitorizar (eventos 4672 y 4648 ignorados) | 🟢 Auditoría activa + CSV histórico con conteo de eventos 4672 |
| Recomendado | ❌ | ✅ |
🏁 Conclusión
La escalación de privilegios Windows es una de las amenazas más peligrosas porque convierte cualquier acceso limitado en control total del sistema. Prevenirla no requiere herramientas complejas: aplicar el principio de mínimo privilegio usando cuentas estándar para el uso diario, mantener el UAC activo en nivel máximo y aplicar parches de seguridad sin demora son las medidas con mayor impacto inmediato. Según la documentación oficial de Microsoft, el principio de mínimo privilegio es la defensa más eficaz contra este tipo de ataque, porque limita el daño incluso cuando el malware logra entrar.
Lo más valioso del enfoque de esta guía es la combinación de siete medidas aplicadas en un solo script y tres tareas programadas que garantizan su persistencia: si malware, un instalador agresivo o un "tweaker" de terceros desactivan UAC, reactivan Spooler o crean una cuenta admin oculta, el script las detecta y las revierte en menos de una hora. Encuentra más guías sobre hardening en nuestros contenidos de seguridad online y en todos los artículos etiquetados como ciberseguridad.
- 🔒 Cambia tu cuenta diaria a estándar ahora mismo: es la medida con mayor impacto y cero coste; cualquier malware que entre no hereda privilegios de administrador
- 🔒 Comprueba que el UAC está en nivel máximo: Panel de control → Cuentas de usuario → Cambiar configuración de UAC → "Notificarme siempre"
- 🔒 Desactiva Print Spooler si no tienes impresora en red: fue el vector de PrintNightmare, escalación a SYSTEM en segundos mediante inyección de DLL
- 🔒 Activa LSA Protection y deshabilita WDigest: bloqueas los dos vectores clásicos de Mimikatz para volcado de credenciales
- 🔒 Activa las tres tareas programadas de vigilancia: garantizan que el hardening persista frente a malware, actualizaciones y reversiones manuales
- 🔒 Monitoriza los eventos 4672 y 4648 con PowerShell: la monitorización de logins Windows automatiza esta detección
- 🔒 Aplica el hardening de cuentas Windows e implementa el principio de mínimo privilegio en cada cuenta de servicio
Comparte este artículo con quien use Windows con cuenta de administrador para el trabajo diario. Cualquier malware que entre hereda automáticamente el token de acceso con privilegios máximos, sin necesidad de explotar ninguna vulnerabilidad adicional.
❓ Preguntas frecuentes sobre escalación de privilegios Windows
¿Qué es la escalación de privilegios Windows en pocas palabras?
👉 Es el proceso por el que un atacante o malware eleva sus permisos dentro de Windows, pasando de usuario estándar a administrador o SYSTEM, para tomar el control total del sistema. Se consigue manipulando el token de acceso, explotando vulnerabilidades sin parchear o aprovechando ACL mal configuradas.
¿Es un ataque grave?
👉 Sí, es uno de los ataques más críticos. Una vez que un atacante logra la escalación de privilegios Windows, puede instalar malware con persistencia, robar credenciales almacenadas, cifrar archivos con ransomware y establecer movimiento lateral hacia otros equipos de la red sin que el usuario lo detecte.
¿Cómo evitar la escalación de privilegios Windows?
👉 Aplicando el principio de mínimo privilegio: usando cuentas estándar para el uso diario, manteniendo el UAC activo en nivel máximo, aplicando parches de seguridad sin demora, revisando las ACL de carpetas del sistema y desactivando servicios innecesarios. El script de esta guía aplica las 7 medidas preventivas más eficaces automáticamente y además las mantiene aplicadas mediante tres tareas programadas.
¿La escalación de privilegios solo afecta a Windows?
👉 No, puede afectar a cualquier sistema operativo. Sin embargo, Windows es el objetivo más frecuente por su cuota de mercado y la documentación de técnicas específicas como Bypass UAC (T1548.002), DLL hijacking (T1574.001) y token impersonation (T1134) en MITRE ATT&CK.
¿Qué es el UAC y por qué protege contra la escalación de privilegios?
👉 El Control de Cuentas de Usuario (UAC) es una función de Windows que solicita confirmación explícita antes de ejecutar acciones que requieren un token de acceso elevado. Bloquea la ejecución silenciosa de malware con permisos de administrador y es una de las defensas más eficaces contra la escalación de privilegios Windows. Desactivarlo o dejarlo en nivel bajo equivale a eliminar esta línea de defensa.
¿Cómo detecto un intento de escalación de privilegios Windows?
👉 Monitorizando los eventos de seguridad 4672 (privilegios especiales asignados al inicio de sesión) y 4648 (inicio de sesión con credenciales explícitas) en el registro de eventos de Windows. Nuestra guía de monitorización de logins Windows explica cómo automatizar esta detección con PowerShell y recibir alertas ante actividad anómala. El script de esta guía también registra el conteo de eventos 4672 en el CSV histórico.
¿Qué es el DLL hijacking y cómo se relaciona con la escalación de privilegios?
👉 El DLL hijacking es una técnica en la que el atacante coloca una DLL maliciosa en una carpeta con permisos de escritura para usuarios estándar. Cuando un proceso con privilegios elevados carga esa DLL, ejecuta el código malicioso con su token de acceso, logrando la escalación sin explotar ninguna vulnerabilidad de software. Revisar las ACL de carpetas del sistema es la medida preventiva específica para este vector.
¿Qué son LSA Protection y WDigest y por qué los configura el script?
👉 LSA Protection (RunAsPPL=1) protege el proceso LSASS de Windows como proceso ligero (PPL) para impedir que herramientas como Mimikatz vuelquen credenciales de memoria. WDigest es un proveedor de autenticación legado que, si no se configura con UseLogonCredential=0, puede almacenar contraseñas de usuario en claro en memoria, listas para extraerse. Configurar ambos bloquea los dos vectores clásicos de Mimikatz en una sola pasada. La activación de LSA Protection requiere un reinicio para surtir efecto.
¿Las tres tareas programadas ralentizan el equipo?
👉 No de forma perceptible. Cada ejecución dura menos de 5 segundos, se realiza en background como SYSTEM y en modo oculto (sin ventana visible). La carga combinada de las tres tareas (inicio + logon + 24 ejecuciones diarias cada hora) suma menos de 2 minutos de CPU al día. El script es idempotente: comprueba cada valor antes de modificarlo y solo actúa si detecta desviación, así que las ejecuciones repetidas casi siempre terminan en pocos segundos con cero cambios.
¿Cómo desactivo las tareas programadas si quiero parar el hardening?
👉 Tienes dos opciones. La rápida: ejecuta el script de reversión incluido en esta guía, que elimina las tres tareas (AntiPrivEsc-Inicio, AntiPrivEsc-Logon y AntiPrivEsc-Horaria) y desactiva LSA Protection en un solo paso. La manual: abre el Programador de tareas (Win+R → taskschd.msc), localiza las tres tareas en la Biblioteca y pulsa Eliminar en cada una. UAC, WDigest y la auditoría se mantienen en modo seguro por defecto.
¿Puedo cambiar la frecuencia de la tarea horaria si me parece excesiva?
👉 Sí. Abre el Programador de tareas, localiza AntiPrivEsc-Horaria, ve a la pestaña Desencadenadores, edita el desencadenador y cambia el campo "Repetir cada" a 2 horas, 6 horas o el intervalo que prefieras. Ten en cuenta que cuanto mayor sea el intervalo, más tiempo tendrá un malware o un "tweaker" de desactivar las protecciones antes de que el script las vuelva a aplicar. Cada hora es el equilibrio recomendado para este escenario.


Deja una respuesta