🗂️ Archivo HOSTS de Windows: qué es, cómo detectar si ha sido manipulado y cómo protegerlo
hace 3 meses

Archivo HOSTS Windows: explicación detallada
El archivo HOSTS Windows es uno de los componentes más silenciosos y poderosos del sistema operativo: controla cómo tu PC realiza la resolución de nombres locales antes de consultar cualquier servidor externo.
Como manual de referencia en seguridad PC, vemos a diario cómo su modificación maliciosa redirige bancos a páginas falsas, bloquea antivirus y deshabilita Windows Update sin ningún aviso visible y sin que el usuario lo detecte hasta que el daño ya está hecho.
Comprender bien el archivo HOSTS Windows es esencial porque, a diferencia de otras configuraciones, una sola línea modificada puede comprometer toda tu navegación mediante técnicas de pharming, DNS hijacking o spoofing de dominio sin generar alertas en el navegador.
💡 Resumen rápido
🗂️ Archivo HOSTS Windows: Qué es, riesgos, cómo restaurarlo y protegerlo
El archivo HOSTS Windows es un fichero de texto en C:\Windows\System32\drivers\etc\hosts que asocia nombres de dominio con IPs de forma local, con prioridad sobre cualquier DNS externo. El malware lo modifica para redirigir bancos a páginas falsas, bloquear antivirus y deshabilitar Windows Update sin ningún aviso visible.
- ✅ Cómo verificar si ha sido comprometido con PowerShell
- ✅ 2 métodos para restaurarlo: PowerShell y Bloc de notas
- ✅ Cómo protegerlo con permisos ACL para que el malware no pueda modificarlo
- ✅ Script PowerShell con 7 tareas programadas: inicio, logon, cada hora, red nueva, desbloqueo de sesión y reanudación
- ✅ Ataques documentados por CISA: pharming, bypass de antivirus y deshabilitación de MFA
- ✅ Buenas prácticas para mantenerlo seguro a largo plazo
📅 2026 · 🕐 12 minutos de lectura
C:\Windows\System32\drivers\etc\hosts que asocia nombres de dominio con IPs de forma local, con prioridad absoluta sobre cualquier DNS externo. Una sola línea maliciosa basta para redirigir tu banco a una página falsa, bloquear tu antivirus o deshabilitar Windows Update sin ningún aviso visible. Se puede verificar con PowerShell en segundos, restaurar al estado oficial de Microsoft en menos de un minuto y proteger con permisos ACL para que ningún proceso pueda modificarlo sin intervención manual.¿Quieres proteger tu equipo? En el manual técnico de hardening de Windows: guía completa de endurecimiento del sistema en 2026 encontrarás las medidas paso a paso para blindar cada componente del sistema.
El archivo HOSTS Windows hereda su diseño de los sistemas Unix originales (donde se llama /etc/hosts), pero su exposición en entornos modernos lo convierte en un objetivo crítico manipulado por malware. Es un fichero de texto local que asocia nombres de dominio con direcciones IP sin consultar servidores DNS externos. Windows lo consulta antes que cualquier DNS configurado, por lo que su modificación maliciosa tiene efecto inmediato y total sobre la navegación del equipo.
Esta guía complementa la guía técnica de endurecimiento de Windows 11: 7 pasos para blindar tu PC y el análisis técnico de malware y virus informáticos: tipos, detección y eliminación en 2026.

📌 ¿Qué es el archivo HOSTS Windows?
El archivo HOSTS Windows es un fichero de texto plano que actúa como DNS local del equipo. Sus características clave:
- Ubicación:
C:\Windows\System32\drivers\etc\hosts(igual en Windows XP, 7, 8, 10, 11 y Server) - Prioridad: se consulta antes que cualquier servidor DNS externo — su contenido prevalece siempre
- Afecta a: todos los navegadores y aplicaciones del sistema simultáneamente
- Permisos: requiere administrador para editarlo; sin extensión (no es .txt)
- Tamaño legítimo: entre 800 y 900 bytes en instalación limpia de Microsoft
- Riesgo: una sola línea maliciosa redirige dominios sin ningún aviso visible en el navegador
- 📍 Ubicación:
C:\Windows\System32\drivers\etc\hosts - 🔑 Prioridad: se consulta antes que cualquier servidor DNS configurado
- ⚠️ Riesgo: su modificación afecta a toda la navegación sin ningún aviso visible
- 🛠️ Requisito: necesitas permisos de administrador para editarlo
- 📦 Tamaño típico: entre 800 y 900 bytes en una instalación limpia
- 🌐 Encoding: ASCII / ANSI sin BOM, una entrada por línea
C:\Windows\System32\drivers\etc\hosts. No tiene extensión (no es .txt) y es accesible solo con privilegios de administrador. En Linux y macOS la ruta equivalente es /etc/hosts. Algunos malware crean copias falsas (hosts.txt, HOSTS.bak) que Windows ignora pero confunden al usuario.🌐 Equivalencias del archivo HOSTS en distintos sistemas
| Sistema operativo | Ruta del fichero hosts | Permisos para editar | Encoding |
|---|---|---|---|
| Windows 10 / 11 / Server | C:\Windows\System32\drivers\etc\hosts | Administrador | ASCII / ANSI |
| Linux (Debian, Ubuntu, RHEL) | /etc/hosts | root (sudo) | UTF-8 |
| macOS | /etc/hosts (alias de /private/etc/hosts) | Admin (sudo) | UTF-8 |
| Android (no rooted) | /system/etc/hosts | Solo lectura (no editable sin root) | UTF-8 |
| FreeBSD / OpenBSD | /etc/hosts | root | UTF-8 |
🔄 ¿Cómo funciona el archivo HOSTS Windows?
Windows sigue este orden estricto de resolución DNS al acceder a cualquier dominio:
- Caché DNS local del sistema — máxima prioridad
- Archivo HOSTS Windows — muy alta prioridad, prevalece sobre todos los DNS externos
- Servidor DNS del router / ISP — prioridad media
- DNS externo (Google 8.8.8.8, Cloudflare 1.1.1.1...) — prioridad baja
Una entrada maliciosa en HOSTS anula cualquier respuesta DNS oficial, sin ningún aviso visible en el navegador.
Cuando escribes una URL en tu navegador, Windows sigue un orden estricto de resolución de nombres. El archivo HOSTS ocupa el segundo lugar, justo después de la caché local y antes de cualquier DNS externo. Microsoft documenta el comportamiento y la ubicación de este archivo en su guía oficial de restablecimiento del archivo HOSTS.
| Paso | Mecanismo | Prioridad |
|---|---|---|
| 1 | Caché DNS local del sistema | Máxima |
| 2 | Archivo HOSTS Windows | Muy alta |
| 3 | Servidor DNS del router / ISP | Media |
| 4 | DNS externo (Google, Cloudflare...) | Baja |
www.tubanco.com apuntando a una IP maliciosa, tu navegador irá a esa IP aunque el DNS oficial diga otra cosa, sin ningún aviso visible en el navegador.📝 Sintaxis del fichero hosts: ejemplos legítimos vs maliciosos
| Ejemplo de línea | Interpretación | Veredicto |
|---|---|---|
127.0.0.1 localhost | Entrada estándar de Microsoft | 🟢 Legítima |
0.0.0.0 ads.doubleclick.net | Bloqueo de publicidad (lista StevenBlack) | 🟢 Legítima (si la añadiste tú) |
185.220.101.45 www.bancosantander.es | Banco redirigido a IP externa desconocida | 🔴 Pharming malicioso |
127.0.0.1 update.microsoft.com | Windows Update bloqueado | 🔴 Malicioso |
127.0.0.1 definitionupdates.microsoft.com | Defender bloqueado para no recibir firmas | 🔴 Malicioso |
0.0.0.0 mfa.empresa.com | MFA corporativo neutralizado | 🔴 Crítico (caso CISA) |
✅ Usos legítimos del archivo HOSTS
- 🔒 Bloquear dominios maliciosos: redirigir dominios de malware, adware o phishing conocidos a
0.0.0.0. - 🚫 Filtrar publicidad a nivel de sistema: afecta a todos los navegadores y apps simultáneamente.
- 🌐 Desarrollo web local: apuntar dominios de prueba a
127.0.0.1sin DNS real. - ⚡ Acelerar la resolución: definir IPs fijas para servidores internos de empresa.
- 🧪 Pruebas de migración: simular que un dominio apunta a un nuevo servidor antes de cambiar el DNS real.
- 🛡️ Sustituto ligero de Pi-hole: bloqueo a nivel de equipo sin necesidad de hardware adicional.
📋 Listas de bloqueo HOSTS recomendadas para 2026
| Lista | Dominios bloqueados | Categoría | Actualización |
|---|---|---|---|
| StevenBlack/hosts (Unified) | ~ 200.000 | Adware, malware, phishing | Diaria |
| OISD Big | ~ 280.000 | Tracking, ads, phishing | Diaria |
| 1Hosts (Pro) | ~ 600.000 | Lista agresiva multipropósito | Diaria |
| Phishing Army | ~ 70.000 | Exclusivamente phishing | Cada 6 h |

⚠️ Riesgos: ¿Por qué el malware ataca el archivo HOSTS?
El archivo HOSTS es el punto más eficiente para redirigir tráfico sin alertas. Con una sola línea el malware puede:
- Pharming bancario: redirigir dominios de bancos a páginas de phishing pixel-perfect
- Bloquear antivirus: impedir que el software de seguridad descargue actualizaciones de firmas
- Deshabilitar Windows Update: redirigir microsoft.com a 127.0.0.1
- Neutralizar MFA corporativo: redirigir servidores de doble factor a localhost (caso CISA AA21-048A)
- Evadir telemetría: bloquear dominios de detección de amenazas de fabricantes EDR
Todo ello sin generar ninguna alerta visible en el navegador ni en el antivirus.
| Señal de alerta | Qué indica | Técnica MITRE | Urgencia |
|---|---|---|---|
| Redirección a webs falsas | Phishing mediante HOSTS manipulado | T1565.001 | 🔴 Urgente |
| Antivirus sin actualizaciones | Dominios de actualización bloqueados | T1562.001 | 🔴 Urgente |
| Windows Update no funciona | Microsoft.com redirigido a 127.0.0.1 | T1562.001 | 🔴 Urgente |
| MFA que deja de funcionar | Servidor MFA redirigido a localhost | T1565.001 | 🔴 Crítico |
| Navegación anómala general | Múltiples entradas maliciosas en HOSTS | T1071 | 🟠 Alto |
🎭 Familias de malware históricas que abusaron del HOSTS
- 🦠 QHosts (2003): primer troyano masivo que modificaba el HOSTS para redirigir buscadores a páginas con publicidad fraudulenta.
- 🦠 TDSS/TDL-4 (2008-2011): rootkit avanzado que bloqueaba dominios de antivirus mediante entradas en el HOSTS.
- 🦠 ZeuS / Zbot (2007-2014): troyano bancario que redirigía dominios de banca para inyección web.
- 🦠 Conficker (2008): bloqueaba dominios de Microsoft Update y antivirus mediante manipulación del HOSTS.
- 🦠 Pharming MFA (2021, CISA AA21-048A): redirección de servidores MFA a localhost para neutralizar 2FA corporativo.
- 🦠 RedLine Stealer (2020-2025): moderno infostealer que verifica y manipula el HOSTS para evadir telemetría.
🎯 Checklist: síntomas de HOSTS comprometido
Si marcas 2 o más, tu archivo HOSTS probablemente ha sido manipulado:
- ☑ Windows Update no funciona o da errores extraños de conexión
- ☑ Tu antivirus no descarga firmas y marca errores de red
- ☑ El navegador te redirige a webs que no reconoces al escribir URLs habituales
- ☑ Certificados SSL inválidos al entrar a tu banca o correo corporativo
- ☑ MFA / 2FA corporativo falla sin motivo aparente
- ☑ Fecha de modificación reciente del archivo HOSTS sin que tú lo hayas tocado
- ☑ Entradas con 127.0.0.1 apuntando a dominios de Microsoft, Google, Symantec o Kaspersky
- ☑ Tamaño del archivo HOSTS mayor de 5 KB sin haber instalado listas de bloqueo
✔ 0-1 marcados = verificar preventivamente · ✔ 2 o más = HOSTS posiblemente comprometido, actúa hoy

🔍 Cómo verificar si el archivo HOSTS ha sido comprometido
Tres métodos en PowerShell para verificar el archivo HOSTS en segundos:
- Ver todo el contenido:
Get-Content C:\Windows\System32\drivers\etc\hosts - Filtrar solo entradas activas (sin comentarios):
Get-Content ... | Where-Object { $_ -notmatch '^\s*#' -and $_ -notmatch '^\s*$' } - Buscar dominios sensibles (bancos, Microsoft, antivirus): busca con el patrón
microsoft|windowsupdate|defender|santander|bbva
Si ves líneas activas (sin # al inicio) que apuntan a dominios de bancos, antivirus o Microsoft, el archivo ha sido manipulado.
Método 1: Ver el contenido completo con PowerShell
Get-Content C:\Windows\System32\drivers\etc\hosts
Método 2: Filtrar solo las entradas activas
Get-Content C:\Windows\System32\drivers\etc\hosts |
Where-Object { $_ -notmatch '^\s*#' -and $_ -notmatch '^\s*$' }Método 3: Buscar dominios sensibles concretos
# Buscar entradas que afecten a Microsoft, antivirus o bancos
$patrones = "microsoft|windowsupdate|defender|symantec|kaspersky|eset|bitdefender|santander|bbva|caixa|sabadell|openbank"
Get-Content C:\Windows\System32\drivers\etc\hosts |
Where-Object { $_ -notmatch '^\s*#' -and $_ -match $patrones }
🔧 Cómo restaurar el archivo HOSTS Windows a su estado original
Dos opciones para restaurar el archivo HOSTS al estado oficial de Microsoft:
- PowerShell (recomendado): usar
Set-Contentcon el contenido oficial de Microsoft y limpiar la caché DNS conipconfig /flushdns— tarda menos de 30 segundos - Bloc de notas como administrador: abrir el archivo, borrar el contenido, pegar el texto predeterminado y guardar sin extensión .txt
Después de restaurar, aplica permisos ACL de solo lectura para evitar nuevas manipulaciones.
✅ Método 1: Restauración rápida con PowerShell
$hostsPath = "C:\Windows\System32\drivers\etc\hosts" # Quitar atributo solo lectura (si estaba protegido) Set-ItemProperty -Path $hostsPath -Name IsReadOnly -Value $false # Restaurar contenido minimo original $contenidoOriginal = "127.0.0.1`tlocalhost`n::1`t`tlocalhost" Set-Content -Path $hostsPath -Value $contenidoOriginal -Encoding ASCII # Limpiar cache DNS ipconfig /flushdns Write-Host "Archivo HOSTS restaurado." -ForegroundColor Green
✅ Método 2: Restauración manual con Bloc de notas
- Abre el Bloc de notas como administrador (clic derecho → Ejecutar como administrador).
- Ve a Archivo → Abrir y navega a
C:\Windows\System32\drivers\etc\. - Cambia el filtro a Todos los archivos y abre
hosts. - Borra todo el contenido y pega el texto predeterminado del Método 1.
- Guarda con Ctrl+S, asegúrate de que no añade extensión
.txt.
hosts.txt si no seleccionas "Todos los archivos" al guardar. Windows solo lee el archivo sin extensión.ipconfig /flushdns. Para complementarlo: Clear-DnsClientCache. Verifica el resultado con ipconfig /displaydns.🛡️ Cómo proteger el archivo HOSTS con permisos ACL
Restaurar el archivo no es suficiente si el malware sigue activo en el sistema. La solución definitiva es bloquear los permisos de escritura mediante ACL (Access Control List) para que ningún proceso pueda modificarlo sin intervención manual del administrador.
Paso 1: Configurar permisos de solo lectura con PowerShell
# Obtener la ACL actual
$acl = Get-Acl "C:\Windows\System32\drivers\etc\hosts"
# Deshabilitar la herencia y eliminar permisos heredados
$acl.SetAccessRuleProtection($true, $false)
# Anadir regla: SYSTEM solo lectura
$ruleSystem = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM","Read","Allow")
$acl.AddAccessRule($ruleSystem)
# Anadir regla: Administradores solo lectura (nombre en espanol)
$ruleAdmin = New-Object System.Security.AccessControl.FileSystemAccessRule("Administradores","Read","Allow")
$acl.AddAccessRule($ruleAdmin)
# Aplicar la ACL
Set-Acl "C:\Windows\System32\drivers\etc\hosts" $aclPaso 2: Recuperar permisos de escritura cuando necesites editarlo
$acl = Get-Acl "C:\Windows\System32\drivers\etc\hosts"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Administradores","FullControl","Allow")
$acl.AddAccessRule($rule)
Set-Acl "C:\Windows\System32\drivers\etc\hosts" $acl
⚙️ Script completo: Proteger y restaurar el archivo HOSTS con 7 tareas programadas
El script HOSTS-Guard aplica protección permanente mediante 7 tareas programadas y verificación por hash SHA256:
- Calcula el hash SHA256 del HOSTS al instalarse como referencia
- En cada ejecución compara el hash actual con la referencia
- Si detecta diferencia, restaura el contenido oficial de Microsoft automáticamente
- Aplica permisos ACL de solo lectura después de cada restauración
- Limpia la caché DNS con ipconfig /flushdns
- Registra cada verificación en un CSV histórico con fecha, disparador y resultado
- Crea 7 tareas programadas que cubren inicio, logon, cada hora, red nueva, desbloqueo, reanudación y auditoría mensual
C:\Logs\hosts.backup.txt, un log detallado en C:\Logs\hosts-guard.log y un CSV histórico en C:\Logs\hosts-guard-historico.csv.📅 Las 7 tareas programadas que crea este script
| # | Nombre de la tarea | Disparador | Frecuencia | Propósito |
|---|---|---|---|---|
| 1 | HOSTS-Guard-Inicio | Al iniciar Windows (-AtStartup) | Cada arranque | Verifica el HOSTS nada más arrancar el equipo, antes de que el usuario inicie sesión |
| 2 | HOSTS-Guard-Logon | Al iniciar sesión (-AtLogOn) | Cada login de usuario | Captura instaladores silenciosos o malware que se ejecuta con permisos de usuario tras el arranque |
| 3 | HOSTS-Guard-Hora | Cada hora (-RepetitionInterval 1h) | 24 veces al día | Vigilancia continua: detecta y restaura cualquier modificación en menos de 60 minutos |
| 4 | HOSTS-Guard-Red | Evento 10000 de Microsoft-Windows-NetworkProfile | Cada cambio de red | Verifica al conectar a WiFi pública, red corporativa o cualquier perfil nuevo |
| 5 | HOSTS-Guard-Desbloqueo | Evento 4801 del Security Log (desbloqueo) | Cada vez que vuelves al PC | Verifica al desbloquear la sesión tras el salvapantallas o bloqueo manual (Win+L) |
| 6 | HOSTS-Guard-Reanudacion | Evento 1 de Microsoft-Windows-Power-Troubleshooter | Cada reanudación | Verifica al salir de suspensión o hibernación (especialmente útil en portátiles) |
| 7 | HOSTS-Guard-Auditoria | Cada 4 semanas, domingo 3:00 AM | Mensual | Auditoría completa con recálculo de hash de referencia |
🧩 Cobertura temporal de las 7 tareas programadas
| Escenario de uso real | Tarea que lo cubre | Latencia de detección |
|---|---|---|
| 🖥️ Enciendes el PC por la mañana | HOSTS-Guard-Inicio + Logon | Segundos |
| 💻 El portátil vuelve de suspensión al abrir la tapa | HOSTS-Guard-Reanudacion | Segundos |
| ☕ Conectas a WiFi de una cafetería | HOSTS-Guard-Red | Segundos |
| 🔓 Vuelves al PC tras la comida (desbloqueas pantalla) | HOSTS-Guard-Desbloqueo | Segundos |
| 🕒 Sesión continua de trabajo de 8 horas | HOSTS-Guard-Hora | Máximo 60 minutos |
| 🔁 Reinicio tras actualización de Windows | HOSTS-Guard-Inicio + Logon | Segundos |
| 📊 Auditoría formal con limpieza de logs | HOSTS-Guard-Auditoria | Mensual (domingo 3:00 AM) |
📥 Pasos para instalar y ejecutar el script
- Abre PowerShell como administrador: pulsa la tecla Windows, escribe
PowerShell, haz clic derecho y selecciona Ejecutar como administrador. - Permite la ejecución de scripts:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass - Crea la carpeta de scripts:
New-Item -ItemType Directory -Path "C:\Scripts" -Force - Crea el archivo del script: abre el Bloc de notas, pega el código y guárdalo como
HOSTS-Guard.ps1enC:\Scripts\. Tipo de archivo: Todos los archivos. - Ejecuta el script por primera vez:
C:\Scripts\HOSTS-Guard.ps1 - Verifica las 7 tareas:
Get-ScheduledTask -TaskName "HOSTS-Guard-*" - Revisa el log y el CSV:
C:\Logs\hosts-guard.logyC:\Logs\hosts-guard-historico.csv - Reinicia el equipo para que la tarea de inicio se ejecute automáticamente.
💻 Script de protección del archivo HOSTS con 7 tareas programadas
# ============================================================
# Script: HOSTS-Guard - proteccion y restauracion del HOSTS
# Autor: seguridadenmipc.com
# Compat: Windows 10 / 11 / Server 2019+
# Uso: Ejecutar como administrador (1a vez)
# Ruta: C:\Scripts\HOSTS-Guard.ps1
# Idempotente: solo restaura si el hash SHA256 no coincide
# ============================================================
# 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 carpetas y rutas
$logDir = "C:\Logs"
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir | Out-Null }
$log = "$logDir\hosts-guard.log"
$csv = "$logDir\hosts-guard-historico.csv"
$backup = "$logDir\hosts.backup.txt"
$hashRefFile = "$logDir\hosts-hash-ref.txt"
$hostsPath = "C:\Windows\System32\drivers\etc\hosts"
$scriptPath = "C:\Scripts\HOSTS-Guard.ps1"
Start-Transcript -Path $log -Append | Out-Null
$disparador = if ($args[0]) { $args[0] } else { "Manual" }
Write-Host "=== HOSTS-Guard: verificacion del archivo HOSTS ===" -ForegroundColor Cyan
Write-Host "Fecha: $(Get-Date) | Disparador: $disparador" -ForegroundColor Gray
# 3. Contenido oficial de Microsoft (referencia)
$contenidoOriginal = @"
# Copyright (c) 1993-2009 Microsoft Corp.
#
# Este es un ejemplo de archivo HOSTS usado por Microsoft TCP/IP para Windows.
#
# Cada entrada debe permanecer en una linea individual. La direccion IP debe
# colocarse en la primera columna seguida del nombre de host correspondiente.
# La direccion IP y el nombre de host deben estar separados por al menos un
# espacio en blanco.
#
# Ademas, los comentarios (como estos) pueden insertarse en lineas individuales
# o a continuacion del nombre de equipo indicandolos con el simbolo '#'.
#
# Por ejemplo:
#
# 102.54.94.97 rhino.acme.com # servidor origen
# 38.25.63.10 x.acme.com # host cliente x
# La resolucion de nombres de localhost se realiza dentro del propio DNS.
# 127.0.0.1 localhost
# ::1 localhost
"@
# ============================================================
# FUNCIONES (deben definirse antes de llamarlas)
# ============================================================
function Crear-Tarea-Basica {
param(
[string]$Nombre,
[string]$Disparador,
$Trigger,
[string]$Descripcion
)
try {
if (-not (Get-ScheduledTask -TaskName $Nombre -ErrorAction SilentlyContinue)) {
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" $Disparador"
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries -StartWhenAvailable `
-ExecutionTimeLimit (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName $Nombre -Action $action -Trigger $Trigger `
-Principal $principal -Settings $settings -Description $Descripcion | Out-Null
Write-Host "[OK] Tarea '$Nombre' creada." -ForegroundColor Green
} else {
Write-Host "[i] Tarea '$Nombre' ya existe." -ForegroundColor Cyan
}
} catch {
Write-Host "[X] Error en tarea ${Nombre}: $_" -ForegroundColor Red
}
}
function Crear-Tarea-Evento {
param(
[string]$Nombre,
[string]$Disparador,
[string]$LogName,
[string]$Provider,
[int]$EventId,
[string]$Descripcion
)
try {
if (-not (Get-ScheduledTask -TaskName $Nombre -ErrorAction SilentlyContinue)) {
$cim = New-CimInstance -CimClass (Get-CimClass `
-ClassName MSFT_TaskEventTrigger `
-Namespace Root/Microsoft/Windows/TaskScheduler) -ClientOnly
$cim.Enabled = $true
$cim.Subscription = "<QueryList><Query Id='0' Path='$LogName'><Select Path='$LogName'>*[System[Provider[@Name='$Provider'] and EventID=$EventId]]</Select></Query></QueryList>"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" $Disparador"
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" `
-LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries -StartWhenAvailable `
-ExecutionTimeLimit (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName $Nombre -Action $action -Trigger $cim `
-Principal $principal -Settings $settings -Description $Descripcion | Out-Null
Write-Host "[OK] Tarea '$Nombre' creada (evento)." -ForegroundColor Green
} else {
Write-Host "[i] Tarea '$Nombre' ya existe." -ForegroundColor Cyan
}
} catch {
Write-Host "[X] Error en tarea ${Nombre}: $_" -ForegroundColor Red
}
}
# ============================================================
# LOGICA PRINCIPAL
# ============================================================
# 4. Calcular hash actual del HOSTS
$hashActual = (Get-FileHash -Path $hostsPath -Algorithm SHA256).Hash
Write-Host "Hash actual : $hashActual" -ForegroundColor Gray
# 5. Cargar hash de referencia (si existe)
$hashReferencia = $null
if (Test-Path $hashRefFile) {
$hashReferencia = (Get-Content $hashRefFile -Raw).Trim()
Write-Host "Hash referencia: $hashReferencia" -ForegroundColor Gray
}
$restaurado = $false
$aclAplicada = $false
# 6. Decidir si hay que restaurar
$debeRestaurar = $false
if (-not $hashReferencia) {
$debeRestaurar = $true
Write-Host "[i] Primera ejecucion: se establecera el HOSTS oficial." -ForegroundColor Cyan
} elseif ($hashActual -ne $hashReferencia) {
$debeRestaurar = $true
Write-Host "[!] Hash del HOSTS ha cambiado: se detecta modificacion." -ForegroundColor Red
} else {
Write-Host "[OK] Hash del HOSTS coincide con la referencia." -ForegroundColor Green
}
# 7. Si hay que restaurar: backup + restaurar + flushdns
if ($debeRestaurar) {
try {
Copy-Item -Path $hostsPath -Destination $backup -Force
Write-Host "[OK] Backup guardado en: $backup" -ForegroundColor Green
} catch { Write-Host "[!] No se pudo crear backup: $_" -ForegroundColor Yellow }
try {
$aclTmp = Get-Acl $hostsPath
$aclTmp.SetAccessRuleProtection($false, $true)
Set-Acl -Path $hostsPath -AclObject $aclTmp
Set-ItemProperty -Path $hostsPath -Name IsReadOnly -Value $false -ErrorAction Stop
} catch { Write-Host "[!] Aviso en permisos previos: $_" -ForegroundColor Yellow }
try {
Set-Content -Path $hostsPath -Value $contenidoOriginal -Encoding ASCII -Force
Write-Host "[OK] Contenido oficial restaurado." -ForegroundColor Green
$restaurado = $true
} catch { Write-Host "[X] Error restaurando: $_" -ForegroundColor Red }
try { ipconfig /flushdns | Out-Null; Write-Host "[OK] Cache DNS limpiada." -ForegroundColor Green } catch {}
$hashNuevo = (Get-FileHash -Path $hostsPath -Algorithm SHA256).Hash
Set-Content -Path $hashRefFile -Value $hashNuevo -Encoding ASCII -Force
Write-Host "[OK] Hash de referencia actualizado." -ForegroundColor Green
$hashReferencia = $hashNuevo
$hashActual = $hashNuevo
}
# 8. Aplicar proteccion ACL (solo lectura)
try {
$acl = Get-Acl $hostsPath
$acl.SetAccessRuleProtection($true, $false)
$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) | Out-Null }
$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM","Read","Allow")))
$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("Administradores","Read","Allow")))
$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("Usuarios","Read","Allow")))
Set-Acl -Path $hostsPath -AclObject $acl
Write-Host "[OK] Proteccion ACL aplicada (solo lectura)." -ForegroundColor Green
$aclAplicada = $true
} catch { Write-Host "[X] Error aplicando ACL: $_" -ForegroundColor Red }
# 9. Resumen al CSV historico
[PSCustomObject]@{
Fecha = (Get-Date -Format "yyyy-MM-dd HH:mm:ss")
Disparador = $disparador
HashActual = $hashActual
Restaurado = $restaurado
ACLaplicada = $aclAplicada
} | Export-Csv -Path $csv -Append -NoTypeInformation -Encoding UTF8
Write-Host "[OK] Resumen anadido al CSV. Restaurado: $restaurado" -ForegroundColor Green
# ============================================================
# 10. CREAR LAS 7 TAREAS PROGRAMADAS
# ============================================================
# 10a. Al iniciar Windows
Crear-Tarea-Basica -Nombre "HOSTS-Guard-Inicio" -Disparador "Inicio" `
-Trigger (New-ScheduledTaskTrigger -AtStartup) `
-Descripcion "HOSTS-Guard al arranque - seguridadenmipc.com"
# 10b. Al iniciar sesion
Crear-Tarea-Basica -Nombre "HOSTS-Guard-Logon" -Disparador "Logon" `
-Trigger (New-ScheduledTaskTrigger -AtLogOn) `
-Descripcion "HOSTS-Guard al iniciar sesion - seguridadenmipc.com"
# 10c. Cada hora
Crear-Tarea-Basica -Nombre "HOSTS-Guard-Hora" -Disparador "Hora" `
-Trigger (New-ScheduledTaskTrigger -Once `
-At (Get-Date).Date.AddHours((Get-Date).Hour + 1) `
-RepetitionInterval (New-TimeSpan -Hours 1)) `
-Descripcion "HOSTS-Guard cada hora - seguridadenmipc.com"
# 10d. Al conectar a red nueva (evento 10000)
Crear-Tarea-Evento -Nombre "HOSTS-Guard-Red" -Disparador "Red" `
-LogName "Microsoft-Windows-NetworkProfile/Operational" `
-Provider "Microsoft-Windows-NetworkProfile" -EventId 10000 `
-Descripcion "HOSTS-Guard al conectar a red - seguridadenmipc.com"
# 10e. Al desbloquear sesion (evento 4801)
Crear-Tarea-Evento -Nombre "HOSTS-Guard-Desbloqueo" -Disparador "Desbloqueo" `
-LogName "Security" `
-Provider "Microsoft-Windows-Security-Auditing" -EventId 4801 `
-Descripcion "HOSTS-Guard al desbloquear sesion - seguridadenmipc.com"
# 10f. Al reanudar tras suspension (evento 1)
Crear-Tarea-Evento -Nombre "HOSTS-Guard-Reanudacion" -Disparador "Reanudacion" `
-LogName "System" `
-Provider "Microsoft-Windows-Power-Troubleshooter" -EventId 1 `
-Descripcion "HOSTS-Guard al reanudar tras suspension - seguridadenmipc.com"
# 10g. Auditoria mensual (cada 4 semanas, domingo 3:00 AM)
try {
if (-not (Get-ScheduledTask -TaskName "HOSTS-Guard-Auditoria" -ErrorAction SilentlyContinue)) {
$trigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 4 -DaysOfWeek Sunday -At 3am
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$scriptPath`" Auditoria"
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries -StartWhenAvailable `
-ExecutionTimeLimit (New-TimeSpan -Minutes 10)
Register-ScheduledTask -TaskName "HOSTS-Guard-Auditoria" -Action $action `
-Trigger $trigger -Principal $principal -Settings $settings `
-Description "HOSTS-Guard auditoria mensual - seguridadenmipc.com" | Out-Null
Write-Host "[OK] Tarea 'HOSTS-Guard-Auditoria' creada (mensual)." -ForegroundColor Green
} else {
Write-Host "[i] Tarea 'HOSTS-Guard-Auditoria' ya existe." -ForegroundColor Cyan
}
} catch { Write-Host "[X] Error en tarea Auditoria: $_" -ForegroundColor Red }
Write-Host "`n[OK] HOSTS-Guard activo con 7 tareas programadas. Disparador: $disparador" -ForegroundColor Green
Write-Host " Log: $log" -ForegroundColor Gray
Write-Host " CSV: $csv" -ForegroundColor Gray
Write-Host " Backup: $backup" -ForegroundColor Gray
Stop-Transcript | Out-Null
↩️ Script de reversión (elimina las 7 tareas y desprotege el HOSTS)
# ============================================================
# Revertir HOSTS-Guard: elimina las 7 tareas y desprotege el HOSTS
# ============================================================
# 1. ELIMINAR PRIMERO las 7 tareas programadas
$tareas = @(
"HOSTS-Guard-Inicio",
"HOSTS-Guard-Logon",
"HOSTS-Guard-Hora",
"HOSTS-Guard-Red",
"HOSTS-Guard-Desbloqueo",
"HOSTS-Guard-Reanudacion",
"HOSTS-Guard-Auditoria"
)
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. Quitar la proteccion ACL del HOSTS
$hostsPath = "C:\Windows\System32\drivers\etc\hosts"
$acl = Get-Acl $hostsPath
$acl.SetAccessRuleProtection($false, $true)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"Administradores","FullControl","Allow")
$acl.AddAccessRule($rule)
Set-Acl -Path $hostsPath -AclObject $acl
Set-ItemProperty -Path $hostsPath -Name IsReadOnly -Value $false
Write-Host ""
Write-Host "[OK] HOSTS-Guard desactivado (7 tareas eliminadas)." -ForegroundColor Green
Write-Host " El HOSTS ya puede editarse manualmente." -ForegroundColor Yellow
Write-Host " Logs y backup preservados en C:\Logs\" -ForegroundColor Cyan⚠️ Riesgos y efectos reales del script
| Función del sistema | ¿Se ve afectada? | Detalle técnico |
|---|---|---|
| Inicio de sesión local | 🟢 No | No modifica LSASS, SAM ni políticas de cuenta |
| Inicio de Windows | 🟢 No | Las tareas se ejecutan tras el arranque, no lo bloquean |
| Banca, Gmail y plataformas web | 🟢 Sí (positivo) | Al limpiar el HOSTS, restaura la resolución DNS legítima |
| Conexión a WiFi pública | 🟢 Sí (positivo) | La tarea HOSTS-Guard-Red verifica el HOSTS al conectar a cualquier red nueva |
| Bloqueos HOSTS personalizados | 🔴 Sí (a propósito) | Se eliminan todas las entradas no oficiales (StevenBlack, Pi-hole local, dev...) |
| Edición posterior del HOSTS | 🟡 Requiere paso extra | La ACL bloquea la escritura hasta ejecutar el script de reversión |
| Carga de CPU / red (7 tareas) | 🟡 Mínima | Cada ejecución < 1 s; 7 tareas suman < 1 minuto de CPU al día |
- Si usas listas de bloqueo HOSTS tipo StevenBlack/hosts (perderás todas las entradas).
- Si tienes un entorno de desarrollo local con dominios personalizados apuntando a
127.0.0.1. - Si tu empresa mantiene redirecciones HOSTS por política interna (consulta con IT primero).
- Si tu equipo es gestionado por un EDR/XDR corporativo que ya monitoriza el HOSTS.
$contenidoOriginal del script.🔎 ¿Cómo verificar que la protección del HOSTS está activa?
💡 Comandos de verificación
# Verificar que las 7 tareas programadas existen y estan activas Get-ScheduledTask -TaskName "HOSTS-Guard-*" | Select TaskName, State, LastRunTime, LastTaskResult | Format-Table -AutoSize # Ver el hash actual del HOSTS Get-FileHash C:\Windows\System32\drivers\etc\hosts -Algorithm SHA256 # Ver el hash de referencia guardado Get-Content C:\Logs\hosts-hash-ref.txt # Ver la ACL del HOSTS (no debe permitir Write a nadie) Get-Acl C:\Windows\System32\drivers\etc\hosts | Format-List # Ver las ultimas 30 verificaciones del CSV historico Import-Csv C:\Logs\hosts-guard-historico.csv | Select -Last 30
Las siete tareas deben aparecer en estado Ready con LastTaskResult = 0. El hash actual y el de referencia deben ser idénticos. En el CSV histórico, la columna Restaurado normalmente será False: si cambia a True, el script ha detectado y revertido una manipulación.
📋 Checklist de verificación post-instalación
Tras ejecutar el script, verifica estos 12 puntos:
- ☑ 7 tareas programadas visibles en
taskschd.mscbajo el nombreHOSTS-Guard-* - ☑ Estado "Ready" en las 7 tareas
- ☑ LastTaskResult = 0 (0x0 = éxito) en las tareas ya ejecutadas
- ☑ Archivo HOSTS sin entradas activas salvo comentarios con
# - ☑ Hash SHA256 del HOSTS coincide con el de
C:\Logs\hosts-hash-ref.txt - ☑ ACL con solo permisos Read para SYSTEM, Administradores y Usuarios
- ☑ Backup del HOSTS anterior presente en
C:\Logs\hosts.backup.txt - ☑ Log detallado en
C:\Logs\hosts-guard.logsin errores críticos - ☑ CSV histórico en
C:\Logs\hosts-guard-historico.csvcon al menos 1 fila - ☑ Navegación web funcionando con normalidad en todos los navegadores
- ☑ Windows Update operativo
- ☑ Antivirus actualizando firmas sin problemas de conexión
✔ 12/12 = HOSTS protegido a nivel EDR · ✘ menos de 9 = revisar instalación del script
🧰 Buenas prácticas para mantener el archivo HOSTS seguro
| Práctica | Frecuencia | Herramienta / Tarea |
|---|---|---|
| Verificar en el arranque del equipo | Automática (cada boot) | HOSTS-Guard-Inicio |
| Verificar al iniciar sesión | Automática (cada login) | HOSTS-Guard-Logon |
| Vigilancia horaria continua | Automática (24 veces/día) | HOSTS-Guard-Hora |
| Verificación al conectar a red nueva | Automática (por evento) | HOSTS-Guard-Red |
| Verificación al desbloquear sesión | Automática (por evento) | HOSTS-Guard-Desbloqueo |
| Verificación al reanudar tras suspensión | Automática (por evento) | HOSTS-Guard-Reanudacion |
| Auditoría mensual completa | Automática (mensual) | HOSTS-Guard-Auditoria |
| Bloquear escritura con ACL | Permanente (aplicada por el script) | PowerShell |
| Escanear el sistema con antivirus | Semanal | Windows Defender / terceros |
| Revisar el CSV histórico | Mensual | Excel / PowerShell |
❓ Preguntas frecuentes sobre el archivo HOSTS Windows
¿Es peligroso modificar el archivo HOSTS?
👉 No si lo haces tú mismo con un propósito legítimo. El peligro real aparece cuando el malware lo modifica sin tu conocimiento. Por eso es fundamental verificarlo periódicamente y protegerlo con permisos ACL.
¿El archivo HOSTS afecta a todos los navegadores?
👉 Sí. Opera a nivel de sistema operativo y afecta simultáneamente a Chrome, Firefox, Edge, Opera y cualquier aplicación del sistema que realice resolución DNS.
¿Por qué el script usa 7 tareas programadas en lugar de solo una?
👉 Porque cada tarea cubre un escenario de ataque distinto y reduce la ventana de exposición al mínimo. Con siete tareas la latencia de detección es de segundos en prácticamente todos los escenarios reales de uso.
¿La tarea cada hora consume demasiados recursos?
👉 No. Cada verificación horaria se reduce a calcular un hash SHA256 de un archivo de pocos KB: menos de 1 segundo de CPU. En un día completo, las 24 ejecuciones suman menos de 30 segundos de CPU total.
¿Necesito reiniciar el PC después de modificar el archivo HOSTS?
👉 No. Los cambios se aplican casi de forma inmediata, aunque conviene limpiar la caché DNS: ipconfig /flushdns. El script HOSTS-Guard ejecuta este comando automáticamente cada vez que detecta un cambio y restaura el archivo.
¿El script funciona también en Windows Server?
👉 Sí, es compatible con Windows Server 2019 y 2022. En servidores es incluso más recomendable mantener el HOSTS blindado. Revisa antes si hay entradas legítimas definidas por GPO o por el rol del servidor.
🏁 Conclusión
El archivo HOSTS Windows es una pieza crítica de la infraestructura de red de tu equipo que pasa completamente desapercibida hasta que el daño ya está hecho. Protegerlo es sencillo y gratuito: verificarlo periódicamente, restaurarlo a su estado predeterminado, bloquearlo con permisos ACL y ejecutar el script HOSTS-Guard con sus siete tareas programadas son medidas que cualquier usuario o administrador puede implementar en menos de 15 minutos.
Con esta cobertura, la ventana de exposición del HOSTS tras una modificación maliciosa se reduce a segundos en prácticamente todos los escenarios reales de uso.
🔐 Resumen de acciones recomendadas
- ✅ Verifica el archivo HOSTS con PowerShell si sospechas de comportamiento anómalo
- ✅ Restaura al contenido predeterminado de Microsoft si encuentras entradas sospechosas
- ✅ Aplica permisos ACL con grupos en español: SYSTEM, Administradores (no "Administrators")
- ✅ Instala HOSTS-Guard con sus 7 tareas programadas (inicio, logon, cada hora, red, desbloqueo, reanudación y auditoría mensual)
- ✅ Complementa el blindaje con la guía de hardening de cuentas Windows: administrador local, UAC y políticas de contraseñas
- ✅ Revisa mensualmente el CSV histórico para detectar manipulaciones recurrentes
- ✅ Limpia la caché DNS con
ipconfig /flushdnstras cualquier cambio - ✅ Escanea el sistema con un antivirus actualizado para eliminar la amenaza de raíz
Deja una respuesta