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

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
Escalación de privilegios en 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.
Este artículo documenta cómo PrintNightmare (CVE-2021-34527) convirtió un servicio activo sin uso real en una escalada directa a SYSTEM, y cómo siete medidas preventivas bloquean los vectores más comunes sin necesidad de herramientas adicionales. Según el marco MITRE ATT&CK T1068 sobre explotación para escalación de privilegios, esta técnica es una de las más documentadas y activamente explotadas. El detalle técnico sobre hardening del sistema, LSA Protection, Credential Guard, VBS, defensa contra Mimikatz, BYOVD y bypass UAC con LOLBins se encuentra en el ecosistema técnico de Windows seguro: hardening, escalación de privilegios, LSA y Credential Guard.
⚡ Respuesta rápida
Para prevenir la escalación de privilegios en Windows, usa una cuenta estándar para el día a día (reserva el administrador solo para tareas puntuales), mantén el UAC en el nivel máximo "Notificarme siempre", aplica los parches de seguridad sin demora y desactiva servicios que no uses como Print Spooler o Remote Registry. Refuerza esto activando LSA Protection (RunAsPPL) y deshabilitando WDigest para bloquear el volcado de credenciales con Mimikatz, y monitoriza los eventos 4672 y 4648 del registro de seguridad para detectar intentos de escalada. El script de esta guía aplica estas 7 medidas en un solo paso y las mantiene activas con tres tareas programadas.
💡 Definición rápida
Escalación de privilegios en Windows: tipo de ataque en el que un usuario o malware obtiene permisos más altos en un sistema, pasando de un nivel de acceso limitado (usuario estándar) a uno con control completo (administrador o SYSTEM), normalmente manipulando el token de acceso, explotando una vulnerabilidad sin parchear o aprovechando permisos mal configurados.
📋 Resumen rápido
⚡ Escalación de privilegios en 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.
- ✅ 5 técnicas: escalación vertical, horizontal, bypass UAC, DLL hijacking y token impersonation (MITRE T1068, T1078, T1548, T1574, T1134)
- ✅ 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
📅 Publicado: 22 de febrero de 2026 · 🕒 Tiempo de lectura: 24 minutos
La escalación de privilegios Windows 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 este ataque, qué técnicas usan los atacantes y cómo proteger tu sistema aplicando el principio de mínimo privilegio.
Esta guía sobre escalación de privilegios en Windows complementa el hardening de cuentas Windows: política de contraseñas, bloqueo y principio de mínimo privilegio con PowerShell y la monitorización de logins Windows con detección de eventos 4672 y 4648 en tiempo real para detectar estos ataques mediante un enfoque de defense in depth.
.ps1 en C:\Scripts y ejecútalo como administrador: aplica y mantiene activas 7 medidas preventivas mediante tres tareas programadas.
📌 ¿Qué es la escalación de privilegios en Windows?
La escalación de privilegios en Windows es el proceso por el que un atacante o malware eleva su token de acceso de usuario estándar a administrador o SYSTEM. Una vez escalados los privilegios, el atacante puede:
- Acceder a archivos protegidos por ACL y datos del sistema operativo
- Instalar malware, rootkits o ransomware con permisos máximos sin restricciones
- Desactivar el antivirus y el registro de eventos para operar sin ser detectado
- Establecer persistencia mediante cuentas de servicio o tareas programadas ocultas
- Moverse lateralmente hacia otros equipos de la red corporativa
- Desplegar Cobalt Strike beacons, rootkits en kernel mode y técnicas BYOVD
La escalación de privilegios en 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 este ataque 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 mediante cuentas de servicio o tareas programadas — desarrollado en la referencia técnica de backdoors: cómo funcionan y cómo detectarlos.
- ✔ Movimiento lateral hacia otros equipos de la red corporativa.
- ✔ Despliegue de Cobalt Strike beacons, rootkits en kernel mode y técnicas BYOVD (Bring Your Own Vulnerable Driver).
⚙️ Tipos de escalación de privilegios en Windows
Cinco tipos de escalación de privilegios Windows ordenados por frecuencia de uso:
- Escalación vertical (MITRE T1068): usuario estándar → Administrador → SYSTEM mediante explotación de vulnerabilidad o token manipulado (caso real: PrintNightmare CVE-2021-34527)
- Escalación horizontal (T1078): acceso a recursos de otra cuenta del mismo nivel sin elevar el token (caso real: pass-the-hash)
- Bypass UAC (T1548.002): elusión del Control de Cuentas de Usuario para ejecutar código elevado sin confirmación
- DLL hijacking (T1574.001): sustitución de una DLL legítima por una maliciosa en una ruta con permisos de escritura
- Token impersonation (T1134): suplantación del token de acceso de un proceso con privilegios elevados (herramientas: Incognito, Mimikatz)
| Tipo | Descripción | Ejemplo real | Técnica MITRE |
|---|---|---|---|
| Escalación vertical | Usuario estándar → Administrador → SYSTEM mediante explotación de vulnerabilidad o token 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 mediante pass-the-hash | T1078 |
| Bypass UAC | Elusión del Control de Cuentas de Usuario para ejecutar código elevado sin 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 |
🎯 Técnicas de bypass UAC más usadas mediante LOLBins
| LOLBin | Técnica | Cómo funciona | Mitigación |
|---|---|---|---|
| fodhelper.exe | Registry hijacking | Auto-eleva y ejecuta comando desde HKCU\Software\Classes\ms-settings | UAC máximo + monitorización registro |
| computerdefaults.exe | Registry hijacking | Similar a fodhelper, usa la misma clave de Settings | UAC máximo + AppLocker / WDAC |
| eventvwr.exe | Registry hijacking (MSC) | Auto-eleva mediante mmc.exe abusando HKCU\Software\Classes\mscfile | UAC máximo + Sysmon rule |
| sdclt.exe | Backup & Restore hijack | Auto-eleva y ejecuta comandos arbitrarios | UAC máximo + restricción de servicio |
| WSReset.exe | AppX hijack | Reset de Microsoft Store auto-elevado abusable | UAC máximo + AppLocker |
| cmstp.exe | INF abuse | Connection Manager Service ejecuta SCT remoto | WDAC + bloqueo de cmstp en AppLocker |

🚨 Cómo funciona la escalación de privilegios en Windows
Un ataque de escalación de privilegios en Windows se desarrolla en 5 fases:
- Acceso inicial: el atacante entra con permisos de usuario estándar (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 y persistencia: instala una backdoor, despliega ransomware o stealers, roba credenciales e inicia movimiento lateral
- 🔓 Acceso inicial — el atacante 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 y persistencia — instala una backdoor con permisos elevados, despliega ransomware o stealers, roba credenciales e inicia movimiento lateral.
🧠 Causas más comunes de la escalación de privilegios en 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 | 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 |
Estas causas se enmarcan dentro de un recopilatorio de ciberseguridad centrado en la defensa contra el robo de credenciales y la escalada de privilegios que conviene revisar de forma conjunta.
🔎 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.

🛡️ Script completo: protección contra escalación de privilegios en Windows con 3 tareas programadas
C:\Logs\antipriv-esc.log y CSV en C:\Logs\antipriv-esc-historico.csv.📅 Tareas programadas que crea este script
| Nombre | Disparador | Frecuencia | Propósito |
|---|---|---|---|
AntiPrivEsc-Inicio | Al iniciar Windows | Cada arranque | Restablece UAC, servicios y LSA si una actualización o malware ha revertido alguna protección |
AntiPrivEsc-Logon | Al iniciar sesión | Cada login | Reaplica el hardening y verifica que nada se haya revertido durante el login |
AntiPrivEsc-Horaria | Cada hora | 24 veces al día | Vigilancia continua: revierte en menos de una hora cualquier reactivación de Spooler, bajada de UAC o cambio no autorizado |
📥 Cómo guardar y ejecutar el script paso a paso
C:\Scripts, una carpeta fija que no se mueve ni se borra por accidente.1. Cómo guardar el script como .ps1 en C:\Scripts
- Si no la tienes ya, crea la carpeta
C:\Scripts: abre el Explorador de archivos, ve aC:\, clic derecho → Nuevo → Carpeta, y ponle de nombreScripts. - Abre el Bloc de notas (tecla Windows → escribe "Bloc de notas" → Enter).
- Pega dentro el código del script completo (lo tienes al final de esta sección). Si tienes impresora en red, comenta el bloque del punto 3 (Print Spooler) antes de guardarlo.
- Ve a Archivo → Guardar como. Rellena estos tres campos:
- Dónde guardarlo: navega hasta
C:\Scripts(no el Escritorio). - Nombre de archivo: escribe
antipriv-esc.ps1(con el.ps1al final, escrito por ti). - Tipo: cambia el desplegable de "Documentos de texto (*.txt)" a "Todos los archivos (*.*)". Si no lo cambias, el archivo se guarda como
antipriv-esc.ps1.txtaunque hayas escrito ".ps1".
- Dónde guardarlo: navega hasta
- Pulsa Guardar.
- Comprueba que salió bien: en
C:\Scripts, el icono del archivo debe verse como una pantalla de consola azul, no como una hoja de papel.
2. Cómo se ejecuta
Nunca hagas doble clic sobre el archivo ni pegues el código directamente en la consola de PowerShell.
- Pulsa la tecla Windows, escribe
PowerShell. - Haz clic derecho sobre "Windows PowerShell" y elige "Ejecutar como administrador". Confirma si te lo pide.
- En la ventana azul que se abre, escribe estas tres líneas una a una, pulsando Enter después de cada una:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass cd C:\Scripts dir *.ps1
Condir *.ps1confirmas el nombre exacto del archivo tal como quedó guardado. - Ejecuta el script con este comando:
powershell -NoExit -ExecutionPolicy Bypass -File "antipriv-esc.ps1"
- Apenas verás texto en pantalla al principio, mientras se aplican las 7 medidas: el script usa
Start-Transcript, que captura esa salida enC:\Logs\antipriv-esc.log. Es normal, espera a que continúe. - Después sí verás en pantalla las 3 líneas de confirmación de las tareas programadas (
[OK] Tarea '...' creada). - Al terminar te pedirá pulsar Enter para cerrar.
3. Reiniciar el equipo (obligatorio)
Reinicia el equipo una vez tras la primera ejecución, por dos motivos: LSA Protection (RunAsPPL) no surte efecto hasta el reinicio, y el Programador de tareas de Windows tarda en sincronizar visualmente las tareas recién creadas — hasta que reinicias, es posible que Get-ScheduledTask y el Programador de tareas gráfico no muestren las 3 tareas nuevas, aunque ya existan y estén correctamente registradas.
Tras reiniciar, verifica con estos dos comandos, cada uno en su propia línea:
Get-ScheduledTask -TaskName "AntiPrivEsc-*" | Select-Object TaskName, TaskPath, State
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RunAsPPL
Deben aparecer las 3 tareas, todas con TaskPath = \SeguridadEnMiPC\AntiPrivEsc\ y State = Ready, y RunAsPPL debe valer 1.
Si algo falla
- El script no muestra nada en pantalla al principio: normal, esa parte se registra en el log. Revisa con
Get-Content C:\Logs\antipriv-esc.log -Tail 30. - Dice que la ejecución de scripts está deshabilitada: ejecuta primero
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass. - "El término 'finally' no se reconoce..." o errores de try/catch: pegaste el código directo en la consola en vez de guardarlo como archivo. Guárdalo como
.ps1(paso 1) y ejecútalo con-File(paso 2). - "El argumento '...' para el parámetro -File no existe": el nombre no coincide con el archivo guardado. Ejecuta
dir *.ps1enC:\Scriptsy usa el nombre exacto que aparece ahí. - "Select-Object: No se encuentra ningún parámetro de posición..." al verificar: pegaste dos comandos de verificación en una sola línea sin separador. Ejecuta cada comando de verificación en su propia línea, o sepáralos con
;. - La impresora deja de funcionar: el script desactiva Spooler por defecto. Reactívala con
Set-Service -Name Spooler -StartupType Automatic; Start-Service Spooler, y luego comenta el bloque de Spooler en el script antes de la próxima vez que se ejecute una tarea programada. - Las 3 tareas no aparecen en
Get-ScheduledTaskni en el Programador de tareas gráfico, aunque el log confirme que se crearon: problema de caché del Programador de tareas tras crear/recrear carpetas de tareas en la misma sesión. Reinicia el equipo (paso 3) — el servicio Schedule no se puede reiniciar manualmente, Windows lo bloquea por ser un servicio crítico. - Si al hacer clic derecho no aparece "Ejecutar como administrador": asegúrate de buscar "Windows PowerShell" (la app), no dentro de una carpeta. Prueba también "Terminal" en Windows 11.
# ============================================
# Hardening contra escalacion de privilegios Windows
# 7 medidas: UAC maximo, Spooler, RemoteRegistry,
# LSA Protection, WDigest, auditoria 4648/4672,
# AlwaysInstallElevated
# y mantenimiento con tres tareas programadas
# Requiere: PowerShell como Administrador
# Ruta fija: C:\Scripts\antipriv-esc.ps1
# ============================================
try {
# 0. 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
}
# 1. Asegurar que el script vive en C:\Scripts (ruta que usaran las tareas programadas)
$carpetaScripts = "C:\Scripts"
if (-not (Test-Path $carpetaScripts)) {
New-Item -ItemType Directory -Path $carpetaScripts -Force | Out-Null
}
$rutaFinal = "$carpetaScripts\antipriv-esc.ps1"
if ($PSCommandPath -and ($PSCommandPath -ne $rutaFinal)) {
Copy-Item -Path $PSCommandPath -Destination $rutaFinal -Force
Write-Host "[i] Copia del script guardada en $rutaFinal para uso de las tareas programadas." -ForegroundColor Cyan
}
$carpetaLogs = "C:\Logs"
if (-not (Test-Path $carpetaLogs)) {
New-Item -ItemType Directory -Path $carpetaLogs -Force | Out-Null
}
Start-Transcript -Path "$carpetaLogs\antipriv-esc.log" -Append | Out-Null
$cambiosAplicados = 0
# 2. UAC en modo estricto (T1548.002)
$regUac = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
Set-ItemProperty -Path $regUac -Name "EnableLUA" -Value 1 -Type DWord -Force
Set-ItemProperty -Path $regUac -Name "ConsentPromptBehaviorAdmin" -Value 2 -Type DWord -Force
Set-ItemProperty -Path $regUac -Name "PromptOnSecureDesktop" -Value 1 -Type DWord -Force
Write-Host "[OK] UAC configurado en modo estricto (Notificarme siempre)." -ForegroundColor Green
# 3. Desactivar Print Spooler (vector PrintNightmare CVE-2021-34527)
# Si tienes impresora en red, comenta este bloque antes de guardar el script
$spooler = Get-Service -Name "Spooler" -ErrorAction SilentlyContinue
if ($spooler -and $spooler.Status -ne "Stopped") {
Stop-Service -Name "Spooler" -Force -ErrorAction SilentlyContinue
$cambiosAplicados++
}
Set-Service -Name "Spooler" -StartupType Disabled -ErrorAction SilentlyContinue
Write-Host "[OK] Print Spooler detenido y deshabilitado (vector PrintNightmare)." -ForegroundColor Green
# 4. Desactivar Remote Registry
$remoteReg = Get-Service -Name "RemoteRegistry" -ErrorAction SilentlyContinue
if ($remoteReg -and $remoteReg.Status -ne "Stopped") {
Stop-Service -Name "RemoteRegistry" -Force -ErrorAction SilentlyContinue
$cambiosAplicados++
}
Set-Service -Name "RemoteRegistry" -StartupType Disabled -ErrorAction SilentlyContinue
Write-Host "[OK] Remote Registry detenido y deshabilitado." -ForegroundColor Green
# 5. Activar LSA Protection (RunAsPPL) contra volcado de credenciales con Mimikatz
# Requiere reinicio para surtir efecto
$regLsa = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa"
$valorActualLsa = (Get-ItemProperty -Path $regLsa -Name "RunAsPPL" -ErrorAction SilentlyContinue).RunAsPPL
if ($valorActualLsa -ne 1) { $cambiosAplicados++ }
Set-ItemProperty -Path $regLsa -Name "RunAsPPL" -Value 1 -Type DWord -Force
Write-Host "[OK] LSA Protection activada (RunAsPPL=1, requiere reinicio)." -ForegroundColor Green
# 6. Desactivar WDigest (evita credenciales en texto claro en memoria)
$regWdigest = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest"
if (-not (Test-Path $regWdigest)) { New-Item -Path $regWdigest -Force | Out-Null }
$valorActualWdigest = (Get-ItemProperty -Path $regWdigest -Name "UseLogonCredential" -ErrorAction SilentlyContinue).UseLogonCredential
if ($valorActualWdigest -ne 0) { $cambiosAplicados++ }
Set-ItemProperty -Path $regWdigest -Name "UseLogonCredential" -Value 0 -Type DWord -Force
Write-Host "[OK] WDigest deshabilitado (sin credenciales en texto plano en memoria)." -ForegroundColor Green
# 7. Auditoria de eventos 4648 (logon con credenciales explicitas) y 4672 (privilegios especiales)
# GUID en vez de nombre de subcategoria para que funcione en cualquier idioma de Windows
auditpol /set /subcategory:"{0CCE9215-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable | Out-Null
auditpol /set /subcategory:"{0CCE921B-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable | Out-Null
Write-Host "[OK] Auditoria de eventos 4648 y 4672 habilitada." -ForegroundColor Green
# 8. Desactivar AlwaysInstallElevated (vector de escalada via instaladores MSI)
$rutaInstallerHKLM = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer"
if (-not (Test-Path $rutaInstallerHKLM)) { New-Item -Path $rutaInstallerHKLM -Force | Out-Null }
$valorActualMsi = (Get-ItemProperty -Path $rutaInstallerHKLM -Name "AlwaysInstallElevated" -ErrorAction SilentlyContinue).AlwaysInstallElevated
if ($valorActualMsi -ne 0) { $cambiosAplicados++ }
Set-ItemProperty -Path $rutaInstallerHKLM -Name "AlwaysInstallElevated" -Value 0 -Type DWord -Force
Write-Host "[OK] AlwaysInstallElevated desactivado." -ForegroundColor Green
# 9. Registrar esta ejecucion en el CSV historico
# Export-Csv -Append crea el archivo con su fila de encabezado real si aun no existe,
# asi que no hace falta escribir a mano una fila-encabezado de relleno.
$csvHistorico = "$carpetaLogs\antipriv-esc-historico.csv"
[PSCustomObject]@{
Fecha = Get-Date
CambiosAplic = $cambiosAplicados
SpoolerActivo = (Get-Service -Name "Spooler").Status
RemoteRegistryActivo = (Get-Service -Name "RemoteRegistry").Status
RunAsPPL = (Get-ItemProperty -Path $regLsa -Name "RunAsPPL").RunAsPPL
UseLogonCredential = (Get-ItemProperty -Path $regWdigest -Name "UseLogonCredential").UseLogonCredential
} | Export-Csv -Path $csvHistorico -NoTypeInformation -Encoding UTF8 -Append
Write-Host "[OK] Ejecucion registrada en $csvHistorico" -ForegroundColor Green
# 10. Crear script auxiliar que reaplica el hardening (usado por Inicio/Logon/Horaria)
$carpetaAuxiliar = "C:\ProgramData\SeguridadEnMiPC\AntiPrivEsc"
if (-not (Test-Path $carpetaAuxiliar)) { New-Item -ItemType Directory -Path $carpetaAuxiliar -Force | Out-Null }
$scriptReaplicar = "$carpetaAuxiliar\reaplicar-antipriv-esc.ps1"
$contenidoReaplicar = @'
$cambiosAplicados = 0
$regUac = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
Set-ItemProperty -Path $regUac -Name "EnableLUA" -Value 1 -Type DWord -Force
Set-ItemProperty -Path $regUac -Name "ConsentPromptBehaviorAdmin" -Value 2 -Type DWord -Force
Set-ItemProperty -Path $regUac -Name "PromptOnSecureDesktop" -Value 1 -Type DWord -Force
$spooler = Get-Service -Name "Spooler" -ErrorAction SilentlyContinue
if ($spooler -and $spooler.Status -ne "Stopped") {
Stop-Service -Name "Spooler" -Force -ErrorAction SilentlyContinue
$cambiosAplicados++
}
Set-Service -Name "Spooler" -StartupType Disabled -ErrorAction SilentlyContinue
$remoteReg = Get-Service -Name "RemoteRegistry" -ErrorAction SilentlyContinue
if ($remoteReg -and $remoteReg.Status -ne "Stopped") {
Stop-Service -Name "RemoteRegistry" -Force -ErrorAction SilentlyContinue
$cambiosAplicados++
}
Set-Service -Name "RemoteRegistry" -StartupType Disabled -ErrorAction SilentlyContinue
$regLsa = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa"
$valorActualLsa = (Get-ItemProperty -Path $regLsa -Name "RunAsPPL" -ErrorAction SilentlyContinue).RunAsPPL
if ($valorActualLsa -ne 1) { $cambiosAplicados++ }
Set-ItemProperty -Path $regLsa -Name "RunAsPPL" -Value 1 -Type DWord -Force
$regWdigest = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest"
if (-not (Test-Path $regWdigest)) { New-Item -Path $regWdigest -Force | Out-Null }
$valorActualWdigest = (Get-ItemProperty -Path $regWdigest -Name "UseLogonCredential" -ErrorAction SilentlyContinue).UseLogonCredential
if ($valorActualWdigest -ne 0) { $cambiosAplicados++ }
Set-ItemProperty -Path $regWdigest -Name "UseLogonCredential" -Value 0 -Type DWord -Force
auditpol /set /subcategory:"{0CCE9215-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable | Out-Null
auditpol /set /subcategory:"{0CCE921B-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable | Out-Null
$rutaInstallerHKLM = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer"
if (-not (Test-Path $rutaInstallerHKLM)) { New-Item -Path $rutaInstallerHKLM -Force | Out-Null }
$valorActualMsi = (Get-ItemProperty -Path $rutaInstallerHKLM -Name "AlwaysInstallElevated" -ErrorAction SilentlyContinue).AlwaysInstallElevated
if ($valorActualMsi -ne 0) { $cambiosAplicados++ }
Set-ItemProperty -Path $rutaInstallerHKLM -Name "AlwaysInstallElevated" -Value 0 -Type DWord -Force
$csvHistorico = "C:\Logs\antipriv-esc-historico.csv"
[PSCustomObject]@{
Fecha = Get-Date
CambiosAplic = $cambiosAplicados
SpoolerActivo = (Get-Service -Name "Spooler").Status
RemoteRegistryActivo = (Get-Service -Name "RemoteRegistry").Status
RunAsPPL = (Get-ItemProperty -Path $regLsa -Name "RunAsPPL").RunAsPPL
UseLogonCredential = (Get-ItemProperty -Path $regWdigest -Name "UseLogonCredential").UseLogonCredential
} | Export-Csv -Path $csvHistorico -NoTypeInformation -Encoding UTF8 -Append
if ($cambiosAplicados -gt 0) {
Add-Content -Path "C:\Logs\antipriv-esc.log" -Value "$(Get-Date) - [ALERTA] Se revirtieron $cambiosAplicados cambios no autorizados (reactivacion de proteccion detectada)"
} else {
Add-Content -Path "C:\Logs\antipriv-esc.log" -Value "$(Get-Date) - [OK] Hardening anti-escalada verificado, sin desviaciones"
}
'@
Set-Content -Path $scriptReaplicar -Encoding UTF8 -Value $contenidoReaplicar
Write-Host "[OK] Script auxiliar creado en $scriptReaplicar" -ForegroundColor Green
# 11. Carpeta de tareas programadas
$carpetaTareas = "\SeguridadEnMiPC\AntiPrivEsc\"
# 12. Tarea: reaplicar en cada arranque
if (-not (Get-ScheduledTask -TaskName "AntiPrivEsc-Inicio" -TaskPath $carpetaTareas -ErrorAction SilentlyContinue)) {
$a1 = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptReaplicar`""
$t1 = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "AntiPrivEsc-Inicio" -TaskPath $carpetaTareas -Action $a1 -Trigger $t1 -RunLevel Highest -User "SYSTEM" -Force | Out-Null
Write-Host "[OK] Tarea 'AntiPrivEsc-Inicio' creada (al arrancar Windows)." -ForegroundColor Green
} else { Write-Host "[i] La tarea 'AntiPrivEsc-Inicio' ya existia." -ForegroundColor Yellow }
# 13. Tarea: reaplicar en cada inicio de sesion
if (-not (Get-ScheduledTask -TaskName "AntiPrivEsc-Logon" -TaskPath $carpetaTareas -ErrorAction SilentlyContinue)) {
$a2 = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptReaplicar`""
$t2 = New-ScheduledTaskTrigger -AtLogOn
Register-ScheduledTask -TaskName "AntiPrivEsc-Logon" -TaskPath $carpetaTareas -Action $a2 -Trigger $t2 -RunLevel Highest -User "SYSTEM" -Force | Out-Null
Write-Host "[OK] Tarea 'AntiPrivEsc-Logon' creada (al iniciar sesion)." -ForegroundColor Green
} else { Write-Host "[i] La tarea 'AntiPrivEsc-Logon' ya existia." -ForegroundColor Yellow }
# 14. Tarea: reaplicar cada hora
if (-not (Get-ScheduledTask -TaskName "AntiPrivEsc-Horaria" -TaskPath $carpetaTareas -ErrorAction SilentlyContinue)) {
$a3 = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptReaplicar`""
$t3 = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1) -RepetitionDuration (New-TimeSpan -Days 3650)
Register-ScheduledTask -TaskName "AntiPrivEsc-Horaria" -TaskPath $carpetaTareas -Action $a3 -Trigger $t3 -RunLevel Highest -User "SYSTEM" -Force | Out-Null
Write-Host "[OK] Tarea 'AntiPrivEsc-Horaria' creada (cada hora)." -ForegroundColor Green
} else { Write-Host "[i] La tarea 'AntiPrivEsc-Horaria' ya existia." -ForegroundColor Yellow }
# 15. Verificacion final (busqueda por nombre, mas fiable que por TaskPath si el cache no esta sincronizado)
Write-Host "`n=== Tareas programadas activas ===" -ForegroundColor Cyan
Get-ScheduledTask -TaskName "AntiPrivEsc-*" | Select-Object TaskName, TaskPath, State | Format-Table -AutoSize
Write-Host "[OK] Hardening contra escalada de privilegios aplicado y protegido con 3 tareas programadas." -ForegroundColor Green
Write-Host " Script principal: $rutaFinal" -ForegroundColor Gray
Write-Host " Script auxiliar: $scriptReaplicar" -ForegroundColor Gray
Write-Host " Log: C:\Logs\antipriv-esc.log" -ForegroundColor Gray
Write-Host " CSV historico: C:\Logs\antipriv-esc-historico.csv" -ForegroundColor Gray
Write-Host "`n[i] Reinicia el equipo para activar LSA Protection (RunAsPPL). Tras reiniciar, verifica con:" -ForegroundColor Yellow
Write-Host " Get-ScheduledTask -TaskName 'AntiPrivEsc-*' | Select-Object TaskName, TaskPath, State" -ForegroundColor Gray
}
catch {
Write-Host "`n[X] Error: $($_.Exception.Message)" -ForegroundColor Red
}
finally {
Stop-Transcript | Out-Null
Read-Host "`nPulsa Enter para salir"
}⚠️ Riesgos y efectos reales del script
| 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 |
| Banca online y plataformas web | 🟢 No | El script no toca DNS, hosts, proxy ni la pila de red |
| UAC | 🔴 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 |
| LSA / autenticación | 🟡 Sí (positivo, requiere reinicio) | LSA Protection activada (RunAsPPL=1); algunos controladores no firmados pueden dejar de cargar |
| Credenciales en memoria (WDigest) | 🟢 Sí (positivo) | WDigest deja de almacenar contraseñas en claro en memoria; bloquea vector clásico de Mimikatz |
| Auditoría de seguridad | 🟢 Sí (positivo) | Se activa la auditoría de eventos 4672 y 4648 |
💡 Comandos de verificación (PowerShell como administrador, uno por línea)
Get-ScheduledTask -TaskName "AntiPrivEsc-*" | Select-Object TaskName, TaskPath, StateGet-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name EnableLUA, ConsentPromptBehaviorAdminGet-Service Spooler, RemoteRegistry | Select-Object Name, Status, StartTypeGet-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RunAsPPLLas 3 tareas deben estar en Ready. Si CambiosAplic sube con frecuencia en el CSV histórico, el script está revirtiendo reactivaciones no autorizadas correctamente.
✅ Checklist post-instalación
Verifica estos 7 puntos para confirmar que el hardening está aplicado (después de reiniciar):
- ☑ 3 tareas en estado Ready, sin duplicados, en
taskschd.msc→ SeguridadEnMiPC → AntiPrivEsc - ☑
EnableLUA=1,ConsentPromptBehaviorAdmin=2,PromptOnSecureDesktop=1 - ☑ Spooler y RemoteRegistry en
Stopped / Disabled - ☑
RunAsPPL=1(tras reinicio) - ☑
UseLogonCredential=0 - ☑ Log en
C:\Logs\antipriv-esc.logsin errores críticos - ☑ CSV en
C:\Logs\antipriv-esc-historico.csvcon la primera entrada
✔ 7/7 = hardening completo y activo · ✘ menos de 5 = revisar instalación y reiniciar
🔍 Cómo detectar intentos de escalación de privilegios en Windows con PowerShell
💡 Detecta escalación de privilegios Windows con PowerShell:
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 Windows activa o de un intento de bypass UAC en curso.
🛡️ 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.
- 🔄 Aplica las actualizaciones de Windows sin demora — paso a paso en el manual técnico de actualizaciones de Windows: automatiza el ciclo de parcheo con PowerShell; PrintNightmare llevaba parche disponible cuando fue explotado masivamente.
- 🔌 Desactiva servicios innecesarios — paso a paso en el compendio técnico de servicios de compartición Windows: SMBv1, LLMNR, NetBIOS y Print Spooler; cada servicio activo sin uso es una superficie de ataque potencial.
- 🛡️ Monitoriza con Windows Defender — el manual técnico de Windows Defender: detección de malware y reglas ASR documenta cómo las reglas de reducción de superficie (ASR) bloquean los vectores de DLL hijacking y bypass UAC más comunes.
- 📋 Revisa las ACL de carpetas del sistema, ninguna carpeta del sistema debe tener permisos de escritura para usuarios estándar.
- 🔒 Activa LSA Protection y deshabilita WDigest, el script los configura automáticamente; impide el volcado de credenciales clásico con Mimikatz.
- 🔍 Monitoriza los eventos 4672 y 4648 en el registro de seguridad de Windows.
🆚 Sistema vulnerable vs protegido frente a escalación de privilegios en Windows
| Característica | Sin protección | Protegido |
|---|---|---|
| Cuenta diaria | 🔴 Administrador siempre activo | 🟢 Cuenta estándar + admin solo cuando se necesita |
| UAC | 🔴 Desactivado o nivel bajo | 🟢 Activo en nivel máximo "Notificarme siempre" |
| Parches de seguridad | 🔴 Sin aplicar (CVEs activos explotables) | 🟢 Actualizados mensualmente sin demora |
| Print Spooler / Remote Registry | 🔴 Activos sin uso | 🟢 Desactivados |
| LSA Protection | 🔴 Inactiva; Mimikatz puede volcar credenciales | 🟢 RunAsPPL=1; LSASS protegido |
| WDigest | 🔴 Puede almacenar contraseñas en claro | 🟢 UseLogonCredential=0 |
| Persistencia del hardening | 🔴 Un malware puede revertir UAC y servicios | 🟢 Tres tareas programadas restauran configuración cada hora |
| Monitorización de eventos | 🔴 Sin monitorizar (4672 y 4648 ignorados) | 🟢 Auditoría activa + CSV histórico con conteo de eventos |
🏁 Conclusión sobre la escalación de privilegios en Windows
La escalación de privilegios Windows es una de las amenazas más peligrosas porque convierte cualquier acceso limitado en control total del sistema. Prevenir este ataque 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.
🔐 Resumen de acciones recomendadas
- ✅ Guarda el script como
antipriv-esc.ps1enC:\Scriptsy ejecútalo como administrador con-File - ✅ Verifica con
Get-Content C:\Logs\antipriv-esc.log -Tail 30 - ✅ Confirma las 3 tareas con
Get-ScheduledTask -TaskName "AntiPrivEsc-*" - ✅ Reinicia el equipo para activar LSA Protection
- ✅ Cambia tu cuenta diaria a estándar desde Configuración → Cuentas
- ✅ Revisa el CSV histórico semanalmente
❓ 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.
¿Cómo evitar la escalación de privilegios Windows?
👉 Aplica el principio de mínimo privilegio: usa cuentas estándar para el uso diario, mantén el UAC activo en nivel máximo, aplica parches de seguridad sin demora y desactiva servicios innecesarios. El script de esta guía aplica las 7 medidas preventivas más eficaces automáticamente y las mantiene activas mediante tres tareas programadas.
¿Qué es el UAC y por qué protege contra la escalación de privilegios en Windows?
👉 El Control de Cuentas de Usuario (UAC) 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. Desactivarlo o dejarlo en nivel bajo equivale a eliminar esta línea de defensa.
¿Qué son LSA Protection y WDigest?
👉 LSA Protection (RunAsPPL=1) protege el proceso LSASS de Windows para impedir que Mimikatz vuelque credenciales de memoria. WDigest es un proveedor de autenticación legado que, si no se configura con UseLogonCredential=0, almacena contraseñas en claro en memoria. Configurar ambos bloquea los dos vectores clásicos de Mimikatz. La activación de LSA Protection requiere un reinicio.
¿Las tres tareas programadas ralentizan el equipo?
👉 No. Cada ejecución dura menos de 5 segundos en background como SYSTEM en modo oculto. El script es idempotente: 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?
👉 Guarda y 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. UAC y WDigest se mantienen en modo seguro por defecto.
Deja una respuesta