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

hace 5 meses

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

Table of Contents

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.

🔍 ¿Qué es la escalación de privilegios Windows y cómo prevenirla? La escalación de privilegios Windows es el proceso por el que un malware o atacante eleva sus permisos de usuario estándar a administrador o SYSTEM, tomando el control total del sistema. La defensa más eficaz es el principio de mínimo privilegio: usa una cuenta estándar para el día a día (no la cuenta de administrador), mantén el UAC en nivel máximo y aplica parches de seguridad sin demora. Guarda un script de PowerShell como archivo .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 Windows?

📌 ¿Qué es la escalación de privilegios en Windows?

🔍 ¿Qué es la escalación de privilegios en Windows y qué permite hacer al atacante?

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).
🛡️ ¿Qué son VBS, HVCI y Credential Guard en la defensa contra escalación de privilegios en Windows? Virtualization-Based Security (VBS) crea un espacio de memoria aislado mediante el hipervisor Hyper-V, donde residen procesos críticos protegidos del kernel principal. Sobre VBS se construyen: HVCI (Hypervisor-protected Code Integrity), que impide la carga de código sin firmar en el kernel, y Credential Guard, que aísla los secretos de autenticación (hashes NTLM, tickets Kerberos) en un proceso virtualizado donde Mimikatz no puede acceder incluso con privilegios SYSTEM. Ambas vienen activadas por defecto en Windows 11 Enterprise con TPM 2.0 + UEFI Secure Boot.

⚙️ Tipos de escalación de privilegios en Windows

🔍 ¿Cuáles son los tipos de escalación de privilegios Windows?

Cinco tipos de escalación de privilegios Windows ordenados por frecuencia de uso:

  1. Escalación vertical (MITRE T1068): usuario estándar → Administrador → SYSTEM mediante explotación de vulnerabilidad o token manipulado (caso real: PrintNightmare CVE-2021-34527)
  2. Escalación horizontal (T1078): acceso a recursos de otra cuenta del mismo nivel sin elevar el token (caso real: pass-the-hash)
  3. Bypass UAC (T1548.002): elusión del Control de Cuentas de Usuario para ejecutar código elevado sin confirmación
  4. DLL hijacking (T1574.001): sustitución de una DLL legítima por una maliciosa en una ruta con permisos de escritura
  5. Token impersonation (T1134): suplantación del token de acceso de un proceso con privilegios elevados (herramientas: Incognito, Mimikatz)
TipoDescripciónEjemplo realTécnica MITRE
Escalación verticalUsuario estándar → Administrador → SYSTEM mediante explotación de vulnerabilidad o token manipuladoPrintNightmare (CVE-2021-34527)T1068
Escalación horizontalAcceso a recursos de otra cuenta del mismo nivel sin elevar el token de accesoRobo de credenciales mediante pass-the-hashT1078
Bypass UACElusión del Control de Cuentas de Usuario para ejecutar código elevado sin confirmaciónTécnicas usadas por grupos APT contra entornos corporativosT1548.002
DLL hijackingSustitución de una DLL legítima por una maliciosa en una ruta con permisos de escrituraExplotación de carpetas con ACL mal configuradasT1574.001
Token impersonationSuplantación del token de acceso de un proceso con privilegios elevadosIncognito, Mimikatz en entornos comprometidosT1134

🎯 Técnicas de bypass UAC más usadas mediante LOLBins

LOLBinTécnicaCómo funcionaMitigación
fodhelper.exeRegistry hijackingAuto-eleva y ejecuta comando desde HKCU\Software\Classes\ms-settingsUAC máximo + monitorización registro
computerdefaults.exeRegistry hijackingSimilar a fodhelper, usa la misma clave de SettingsUAC máximo + AppLocker / WDAC
eventvwr.exeRegistry hijacking (MSC)Auto-eleva mediante mmc.exe abusando HKCU\Software\Classes\mscfileUAC máximo + Sysmon rule
sdclt.exeBackup & Restore hijackAuto-eleva y ejecuta comandos arbitrariosUAC máximo + restricción de servicio
WSReset.exeAppX hijackReset de Microsoft Store auto-elevado abusableUAC máximo + AppLocker
cmstp.exeINF abuseConnection Manager Service ejecuta SCT remotoWDAC + bloqueo de cmstp en AppLocker

Cómo funciona la escalación de privilegios Windows

🚨 Cómo funciona la escalación de privilegios en Windows

🔍 ¿Cómo funciona la escalación de privilegios en Windows paso a paso?

Un ataque de escalación de privilegios en Windows se desarrolla en 5 fases:

  1. Acceso inicial: el atacante entra con permisos de usuario estándar (phishing, descarga maliciosa o explotación remota)
  2. Reconocimiento: enumera vulnerabilidades, servicios mal configurados, permisos excesivos en ACL y cuentas de servicio con privilegios elevados
  3. Explotación: aprovecha un fallo sin parchear, realiza DLL hijacking o aplica bypass UAC para elevar su token de acceso
  4. Escalación: obtiene privilegios de administrador o SYSTEM y puede desactivar el antivirus y el registro de eventos
  5. Control total y persistencia: instala una backdoor, despliega ransomware o stealers, roba credenciales e inicia movimiento lateral
  1. 🔓 Acceso inicial — el atacante entra con permisos de usuario estándar (por phishing, descarga maliciosa o explotación remota).
  2. 🔍 Reconocimiento — enumera vulnerabilidades, servicios mal configurados, permisos excesivos en ACL y cuentas de servicio con privilegios elevados.
  3. Explotación — aprovecha un fallo sin parchear, realiza DLL hijacking o aplica bypass UAC para elevar su token de acceso.
  4. 🔑 Escalación — obtiene privilegios de administrador o SYSTEM y puede desactivar el antivirus y el registro de eventos.
  5. 🎯 Control total y persistencia — instala una backdoor con permisos elevados, despliega ransomware o stealers, roba credenciales e inicia movimiento lateral.
Referencias MITRE ATT&CK: Las técnicas T1068 (Exploitation for Privilege Escalation), T1548 (Abuse Elevation Control Mechanism / Bypass UAC), T1574.001 (DLL hijacking) y T1134 (Token impersonation) documentan los vectores más comunes de escalación de privilegios Windows.

🧠 Causas más comunes de la escalación de privilegios en Windows

CausaEjemplo realConsecuenciaNivel de riesgo
Vulnerabilidades sin parchearCVE-2021-34527 PrintNightmareEscalación a SYSTEM desde usuario estándar vía inyección de DLL🔴 Crítico
UAC desactivado o mal configuradoSin prompt de confirmación en nivel bajoEjecución silenciosa de código con privilegios admin sin alerta🔴 Crítico
Cuenta de administrador como cuenta diariaUsuario con token de acceso máximo siempre activoCualquier malware hereda privilegios admin sin necesitar escalación🟠 Alto
Servicios mal configuradosPrint Spooler o Remote Registry activos sin necesidadVector de escalación explotable sin interacción del usuario🟠 Alto
ACL con permisos excesivosCarpeta con escritura para usuarios estándarDLL hijacking o sustitución de ejecutables legítimos🟠 Alto
Cuentas de servicio con privilegios excesivosServicio corriendo como SYSTEM sin necesidadComprometer 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)

🚨 Caso real documentado de escalación de privilegios en Windows: Print Spooler activo sin impresora en red fue suficiente para que un usuario estándar escalara a SYSTEM en segundos mediante inyección de DLL. CVSS 8.8. Afectó a millones de sistemas Windows con parche disponible pero no aplicado.
  1. El malware entra en el PC con permisos de usuario estándar (token de acceso limitado).
  2. Detecta que el servicio Print Spooler está activo mediante enumeración de servicios.
  3. Explota CVE-2021-34527 (CVSS 8.8) para inyectar una DLL maliciosa en el proceso del spooler.
  4. Obtiene privilegios de SYSTEM, el nivel máximo en Windows, heredando su token de acceso.
  5. 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

🛡️ Script completo: protección contra escalación de privilegios en Windows con 3 tareas programadas

⚠️ Antes de ejecutar: Este script aplica cambios en la política de seguridad local, en el registro y en los servicios. Es completamente reversible. Si tienes impresora en red, comenta la línea de Print Spooler antes de guardar el script. Genera log en C:\Logs\antipriv-esc.log y CSV en C:\Logs\antipriv-esc-historico.csv.

📅 Tareas programadas que crea este script

NombreDisparadorFrecuenciaPropósito
AntiPrivEsc-InicioAl iniciar WindowsCada arranqueRestablece UAC, servicios y LSA si una actualización o malware ha revertido alguna protección
AntiPrivEsc-LogonAl iniciar sesiónCada loginReaplica el hardening y verifica que nada se haya revertido durante el login
AntiPrivEsc-HorariaCada hora24 veces al díaVigilancia 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

📁 ¿Por qué este script va en C:\Scripts y no en el Escritorio? Este script crea tres tareas programadas que guardan, dentro de sí mismas, la ruta exacta desde la que se ejecuta un script auxiliar. Si ese script auxiliar no está siempre en el mismo sitio, las tareas dejan de encontrarlo y fallan en silencio. Por eso se guarda siempre en 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

  1. Si no la tienes ya, crea la carpeta C:\Scripts: abre el Explorador de archivos, ve a C:\, clic derecho → Nuevo → Carpeta, y ponle de nombre Scripts.
  2. Abre el Bloc de notas (tecla Windows → escribe "Bloc de notas" → Enter).
  3. 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.
  4. 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 .ps1 al 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.txt aunque hayas escrito ".ps1".
  5. Pulsa Guardar.
  6. 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.

  1. Pulsa la tecla Windows, escribe PowerShell.
  2. Haz clic derecho sobre "Windows PowerShell" y elige "Ejecutar como administrador". Confirma si te lo pide.
  3. 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
    Con dir *.ps1 confirmas el nombre exacto del archivo tal como quedó guardado.
  4. Ejecuta el script con este comando:
    powershell -NoExit -ExecutionPolicy Bypass -File "antipriv-esc.ps1"
  5. Apenas verás texto en pantalla al principio, mientras se aplican las 7 medidas: el script usa Start-Transcript, que captura esa salida en C:\Logs\antipriv-esc.log. Es normal, espera a que continúe.
  6. Después sí verás en pantalla las 3 líneas de confirmación de las tareas programadas ([OK] Tarea '...' creada).
  7. 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 *.ps1 en C:\Scripts y 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-ScheduledTask ni 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🟢 NoEl script no toca cuentas ni políticas de contraseñas
Inicio de Windows🟢 NoLa tarea de inicio se ejecuta en background tras el arranque
Banca online y plataformas web🟢 NoEl 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, State
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name EnableLUA, ConsentPromptBehaviorAdmin
Get-Service Spooler, RemoteRegistry | Select-Object Name, Status, StartType
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RunAsPPL

Las 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.log sin errores críticos
  • ☑ CSV en C:\Logs\antipriv-esc-historico.csv con 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-List

Un 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


🆚 Sistema vulnerable vs protegido frente a escalación de privilegios en Windows

CaracterísticaSin protecciónProtegido
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.ps1 en C:\Scripts y 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.

Autor

Entusiasta de la seguridad informática con años de experiencia en protección de sistemas Windows y defensa contra amenazas digitales. Apasionado por la tecnología y la privacidad, comparto en este blog consejos prácticos, análisis detallados y guías paso a paso para que cualquier usuario pueda fortalecer la seguridad de su PC y su vida digital

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir