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

hace 3 meses

Archivo HOSTS de Windows: qué es, cómo detectar si ha sido manipulado y cómo protegerlo

Table of Contents

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

🔍 ¿Qué es el archivo HOSTS Windows y por qué es importante para la seguridad? 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 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?

📌 ¿Qué es el archivo HOSTS Windows?

🔍 ¿Qué es el archivo HOSTS en Windows y dónde se encuentra?

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
🔍 ¿Dónde se encuentra el archivo HOSTS en Windows 10 y Windows 11? En todas las versiones de Windows (XP, 7, 8, 10, 11 y Server) la ruta es la misma: 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 operativoRuta del fichero hostsPermisos para editarEncoding
Windows 10 / 11 / ServerC:\Windows\System32\drivers\etc\hostsAdministradorASCII / ANSI
Linux (Debian, Ubuntu, RHEL)/etc/hostsroot (sudo)UTF-8
macOS/etc/hosts (alias de /private/etc/hosts)Admin (sudo)UTF-8
Android (no rooted)/system/etc/hostsSolo lectura (no editable sin root)UTF-8
FreeBSD / OpenBSD/etc/hostsrootUTF-8

🔄 ¿Cómo funciona el archivo HOSTS Windows?

🔍 ¿Cómo funciona el archivo HOSTS en Windows y qué prioridad tiene?

Windows sigue este orden estricto de resolución DNS al acceder a cualquier dominio:

  1. Caché DNS local del sistema — máxima prioridad
  2. Archivo HOSTS Windows — muy alta prioridad, prevalece sobre todos los DNS externos
  3. Servidor DNS del router / ISP — prioridad media
  4. 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.

PasoMecanismoPrioridad
1Caché DNS local del sistemaMáxima
2Archivo HOSTS WindowsMuy alta
3Servidor DNS del router / ISPMedia
4DNS externo (Google, Cloudflare...)Baja
🚨 Dato crítico: Si aparece una entrada para 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íneaInterpretaciónVeredicto
127.0.0.1 localhostEntrada estándar de Microsoft🟢 Legítima
0.0.0.0 ads.doubleclick.netBloqueo de publicidad (lista StevenBlack)🟢 Legítima (si la añadiste tú)
185.220.101.45 www.bancosantander.esBanco redirigido a IP externa desconocida🔴 Pharming malicioso
127.0.0.1 update.microsoft.comWindows Update bloqueado🔴 Malicioso
127.0.0.1 definitionupdates.microsoft.comDefender bloqueado para no recibir firmas🔴 Malicioso
0.0.0.0 mfa.empresa.comMFA 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.1 sin 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.
Buena práctica: Para un bloqueo proactivo avanzado, usa listas como StevenBlack/hosts en GitHub para bloquear decenas de miles de dominios maliciosos conocidos de forma automática.

📋 Listas de bloqueo HOSTS recomendadas para 2026

ListaDominios bloqueadosCategoríaActualización
StevenBlack/hosts (Unified)~ 200.000Adware, malware, phishingDiaria
OISD Big~ 280.000Tracking, ads, phishingDiaria
1Hosts (Pro)~ 600.000Lista agresiva multipropósitoDiaria
Phishing Army~ 70.000Exclusivamente phishingCada 6 h

Riesgos: ¿Por qué el malware ataca el archivo HOSTS?

⚠️ Riesgos: ¿Por qué el malware ataca el archivo HOSTS?

🔍 ¿Por qué el malware modifica el archivo HOSTS Windows?

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.

🚨 Caso real documentado por la CISA: Actores maliciosos modificaron el archivo HOSTS Windows para redirigir las llamadas de autenticación multifactor (MFA) a localhost, deshabilitando el 2FA en todo el dominio corporativo sin que los usuarios lo notaran. Referencia: Alerta oficial AA21-048A de CISA.
Señal de alertaQué indicaTécnica MITREUrgencia
Redirección a webs falsasPhishing mediante HOSTS manipuladoT1565.001🔴 Urgente
Antivirus sin actualizacionesDominios de actualización bloqueadosT1562.001🔴 Urgente
Windows Update no funcionaMicrosoft.com redirigido a 127.0.0.1T1562.001🔴 Urgente
MFA que deja de funcionarServidor MFA redirigido a localhostT1565.001🔴 Crítico
Navegación anómala generalMúltiples entradas maliciosas en HOSTST1071🟠 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

🔍 Cómo verificar si el archivo HOSTS ha sido comprometido

🔍 ¿Cómo comprobar si el archivo HOSTS de Windows está comprometido?

Tres métodos en PowerShell para verificar el archivo HOSTS en segundos:

  1. Ver todo el contenido: Get-Content C:\Windows\System32\drivers\etc\hosts
  2. Filtrar solo entradas activas (sin comentarios): Get-Content ... | Where-Object { $_ -notmatch '^\s*#' -and $_ -notmatch '^\s*$' }
  3. 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

🔧 Cómo restaurar el archivo HOSTS Windows a su estado original

🔍 ¿Cómo restaurar el archivo HOSTS de Windows a los valores predeterminados?

Dos opciones para restaurar el archivo HOSTS al estado oficial de Microsoft:

  1. PowerShell (recomendado): usar Set-Content con el contenido oficial de Microsoft y limpiar la caché DNS con ipconfig /flushdns — tarda menos de 30 segundos
  2. 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

  1. Abre el Bloc de notas como administrador (clic derecho → Ejecutar como administrador).
  2. Ve a Archivo → Abrir y navega a C:\Windows\System32\drivers\etc\.
  3. Cambia el filtro a Todos los archivos y abre hosts.
  4. Borra todo el contenido y pega el texto predeterminado del Método 1.
  5. Guarda con Ctrl+S, asegúrate de que no añade extensión .txt.
🚨 Error frecuente: El Bloc de notas puede guardar el archivo como hosts.txt si no seleccionas "Todos los archivos" al guardar. Windows solo lee el archivo sin extensión.
🧹 ¿Cómo limpiar la caché DNS de Windows tras modificar el HOSTS? Ejecuta en PowerShell como administrador: 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" $acl
Nota importante: En Windows en español los grupos se llaman Administradores y Usuarios, no "Administrators" ni "Users". Usar los nombres en inglés genera el error "No se pudieron convertir algunas o todas las referencias de identidad."

Paso 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

⚙️ Script completo: Proteger y restaurar el archivo HOSTS con 7 tareas programadas

🔍 ¿Cómo proteger el archivo HOSTS de Windows de forma permanente?

El script HOSTS-Guard aplica protección permanente mediante 7 tareas programadas y verificación por hash SHA256:

  1. Calcula el hash SHA256 del HOSTS al instalarse como referencia
  2. En cada ejecución compara el hash actual con la referencia
  3. Si detecta diferencia, restaura el contenido oficial de Microsoft automáticamente
  4. Aplica permisos ACL de solo lectura después de cada restauración
  5. Limpia la caché DNS con ipconfig /flushdns
  6. Registra cada verificación en un CSV histórico con fecha, disparador y resultado
  7. Crea 7 tareas programadas que cubren inicio, logon, cada hora, red nueva, desbloqueo, reanudación y auditoría mensual
⚠️ Antes de ejecutar: Este script sobrescribe el contenido actual del archivo HOSTS con el oficial de Microsoft. Si tienes entradas legítimas personalizadas (listas de StevenBlack, bloqueos de dominios, redirecciones de desarrollo local), haz una copia de seguridad antes. El script crea un backup automático en 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 tareaDisparadorFrecuenciaPropósito
1HOSTS-Guard-InicioAl iniciar Windows (-AtStartup)Cada arranqueVerifica el HOSTS nada más arrancar el equipo, antes de que el usuario inicie sesión
2HOSTS-Guard-LogonAl iniciar sesión (-AtLogOn)Cada login de usuarioCaptura instaladores silenciosos o malware que se ejecuta con permisos de usuario tras el arranque
3HOSTS-Guard-HoraCada hora (-RepetitionInterval 1h)24 veces al díaVigilancia continua: detecta y restaura cualquier modificación en menos de 60 minutos
4HOSTS-Guard-RedEvento 10000 de Microsoft-Windows-NetworkProfileCada cambio de redVerifica al conectar a WiFi pública, red corporativa o cualquier perfil nuevo
5HOSTS-Guard-DesbloqueoEvento 4801 del Security Log (desbloqueo)Cada vez que vuelves al PCVerifica al desbloquear la sesión tras el salvapantallas o bloqueo manual (Win+L)
6HOSTS-Guard-ReanudacionEvento 1 de Microsoft-Windows-Power-TroubleshooterCada reanudaciónVerifica al salir de suspensión o hibernación (especialmente útil en portátiles)
7HOSTS-Guard-AuditoriaCada 4 semanas, domingo 3:00 AMMensualAuditoría completa con recálculo de hash de referencia
Por qué 7 tareas en lugar de 1 cada hora: Una sola tarea horaria deja huecos críticos: si el malware modifica el HOSTS justo después de una verificación, podría tener hasta 59 minutos para redirigir tu tráfico bancario. Las tareas basadas en eventos (inicio, logon, red, desbloqueo, reanudación) cubren los momentos de mayor riesgo con latencia de segundos.

🧩 Cobertura temporal de las 7 tareas programadas

Escenario de uso realTarea que lo cubreLatencia de detección
🖥️ Enciendes el PC por la mañanaHOSTS-Guard-Inicio + LogonSegundos
💻 El portátil vuelve de suspensión al abrir la tapaHOSTS-Guard-ReanudacionSegundos
☕ Conectas a WiFi de una cafeteríaHOSTS-Guard-RedSegundos
🔓 Vuelves al PC tras la comida (desbloqueas pantalla)HOSTS-Guard-DesbloqueoSegundos
🕒 Sesión continua de trabajo de 8 horasHOSTS-Guard-HoraMáximo 60 minutos
🔁 Reinicio tras actualización de WindowsHOSTS-Guard-Inicio + LogonSegundos
📊 Auditoría formal con limpieza de logsHOSTS-Guard-AuditoriaMensual (domingo 3:00 AM)

📥 Pasos para instalar y ejecutar el script

  1. Abre PowerShell como administrador: pulsa la tecla Windows, escribe PowerShell, haz clic derecho y selecciona Ejecutar como administrador.
  2. Permite la ejecución de scripts: Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
  3. Crea la carpeta de scripts: New-Item -ItemType Directory -Path "C:\Scripts" -Force
  4. Crea el archivo del script: abre el Bloc de notas, pega el código y guárdalo como HOSTS-Guard.ps1 en C:\Scripts\. Tipo de archivo: Todos los archivos.
  5. Ejecuta el script por primera vez: C:\Scripts\HOSTS-Guard.ps1
  6. Verifica las 7 tareas: Get-ScheduledTask -TaskName "HOSTS-Guard-*"
  7. Revisa el log y el CSV: C:\Logs\hosts-guard.log y C:\Logs\hosts-guard-historico.csv
  8. 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🟢 NoNo modifica LSASS, SAM ni políticas de cuenta
Inicio de Windows🟢 NoLas 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 extraLa ACL bloquea la escritura hasta ejecutar el script de reversión
Carga de CPU / red (7 tareas)🟡 MínimaCada ejecución < 1 s; 7 tareas suman < 1 minuto de CPU al día
🚨 Casos en los que NO debes ejecutar el script sin precauciones:
  • 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.
En todos estos casos, añade tus entradas legítimas dentro del bloque $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.msc bajo el nombre HOSTS-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.log sin errores críticos
  • CSV histórico en C:\Logs\hosts-guard-historico.csv con 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ácticaFrecuenciaHerramienta / Tarea
Verificar en el arranque del equipoAutomática (cada boot)HOSTS-Guard-Inicio
Verificar al iniciar sesiónAutomática (cada login)HOSTS-Guard-Logon
Vigilancia horaria continuaAutomática (24 veces/día)HOSTS-Guard-Hora
Verificación al conectar a red nuevaAutomática (por evento)HOSTS-Guard-Red
Verificación al desbloquear sesiónAutomática (por evento)HOSTS-Guard-Desbloqueo
Verificación al reanudar tras suspensiónAutomática (por evento)HOSTS-Guard-Reanudacion
Auditoría mensual completaAutomática (mensual)HOSTS-Guard-Auditoria
Bloquear escritura con ACLPermanente (aplicada por el script)PowerShell
Escanear el sistema con antivirusSemanalWindows Defender / terceros
Revisar el CSV históricoMensualExcel / 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 /flushdns tras cualquier cambio
  • Escanea el sistema con un antivirus actualizado para eliminar la amenaza de raíz

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