Cómo detectar con Powershell un archivo Hosts modificado

En el vasto sector de las TI, el archivo hosts es como un centinela silencioso que garantiza la fluidez de las comunicaciones de red. Para los que no estén familiarizados, el archivo hosts es un archivo de texto que asigna nombres de host a direcciones IP. Lo utiliza el sistema operativo para resolver los nombres de host en direcciones IP cuando un ordenador intenta conectarse a un recurso de red. Pero, ¿qué ocurre cuando se manipula o se modifica el archivo hosts? ¿Cómo pueden los profesionales de TI y los proveedores de servicios gestionados (MSP) garantizar la integridad de este archivo crucial? Con el script en el que vamos a profundizar en unos instantes.

Entender el archivo Hosts

El archivo hosts, en su esencia, es la libreta de direcciones del sistema informático. Desempeña un papel fundamental a la hora de dirigir el tráfico de la red, garantizando que los usuarios aterricen en los sitios web y servicios correctos. Sin embargo, su importancia también la convierte en un objetivo prioritario para los actores maliciosos.

Los riesgos potenciales de las modificaciones no autorizadas

Un atacante con malas intenciones podría modificar el archivo hosts para redirigir el tráfico a un sitio web o servidor malicioso. Tales alteraciones pueden tener consecuencias nefastas:

  • Robo de información personal: al redirigir a los usuarios a sitios falsos, los atacantes pueden suplantar sus datos personales y robar su identidad.
  • Instalación de malware: se puede engañar a los usuarios para que descarguen programas maliciosos, pensando que están en un sitio legítimo.
  • Interrupción de las comunicaciones de red: los servicios esenciales pueden bloquearse, causando interrupciones operativas.

Ante estos riesgos, es primordial que los profesionales de TI y los MSP dispongan de herramientas capaces de detectar rápidamente cualquier cambio no autorizado. Aquí es donde entra en juego nuestro script.

El script

#Requires -Version 5.1

<#
.SYNOPSIS
    Checks if the hosts file was modified from last run.
.DESCRIPTION
    Checks if the hosts file was modified from last run.
    On first run this will not produce an error, but will create a cache file for later comparison.
.EXAMPLE
    No parameters needed.
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes:
    Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    # Path and file of the hosts file
    [string]
    $HostsPath = "C:WindowsSystem32driversetchosts",
    # Path and file where the cache file will be saved for comparison
    [string]
    $CachePath = "C:ProgramDataNinjaRMMAgentscriptingTest-HostsFile.clixml"
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }

    # Check if hosts file exists
    if ($(Test-Path -Path $HostsPath)) {
        # Get content and create hash of hosts file
        $HostsContent = Get-Content -Path $HostsPath
        $HostsHash = Get-FileHash -Path $HostsPath -Algorithm SHA256

        $Current = [PSCustomObject]@{
            Content = $HostsContent
            Hash    = $HostsHash
        }

        # Check if this is first run or not
        if ($(Test-Path -Path $CachePath)) {
            # Compare last content and hash
            $Cache = Import-Clixml -Path $CachePath
            $ContentDifference = Compare-Object -ReferenceObject $Cache.Content -DifferenceObject $Current.Content -CaseSensitive
            $HashDifference = $Cache.Hash -like $Current.Hash
            $Current | Export-Clixml -Path $CachePath -Force -Confirm:$false
            if (-not $HashDifference) {
                Write-Host "Hosts file has changed since last run!"
                Write-Host ""
                $ContentDifference | ForEach-Object {
                    if ($_.SideIndicator -like '=>') {
                        Write-Host "Added: $($_.InputObject)"
                    }
                    elseif ($_.SideIndicator -like '<=') {
                        Write-Host "Removed: $($_.InputObject)"
                    }
                }
                exit 1
            }
        }
        else {
            Write-Host "First run, saving comparison cache file."
            $Current | Export-Clixml -Path $CachePath -Force -Confirm:$false
        }
    }
    else {
        Write-Error "Hosts file is missing!"
        exit 1
    }
    exit 0
}
end {}

 

Accede a más de 300 scripts en el Dojo de NinjaOne

Obtén acceso

Una inmersión profunda en el script

El script PowerShell proporcionado está diseñado para comprobar si el archivo hosts ha sido modificado desde su última ejecución. Aquí tienes un análisis global de su funcionalidad:

  1. Control de la elevación de los permisos: el script comprueba primero si se está ejecutando con privilegios de administrador. Esto es crucial porque cualquier intento de leer o modificar archivos del sistema requiere permisos elevados.
  2. Verificación del archivo hosts: a continuación, verifica la existencia del archivo hosts. Si falta el archivo, el script indica un error.
  3. Comparación entre hash: el script calcula un hash (SHA256) del archivo hosts actual y lo compara con una versión en caché de la última ejecución. Si no coincide, indica que el archivo ha sido modificado.
  4. Comparación de contenidos: además de comprobar el hash, el script también compara el contenido línea por línea, resaltando cualquier adición o eliminación.

Ventajas para los profesionales de TI y los MSP

  • Supervisión proactiva: este script ofrece un enfoque proactivo para monitorizar el archivo hosts, asegurando su integridad y alertando a los administradores de cualquier cambio no autorizado.
  • Información detallada: al comparar las diferencias de contenido, los equipos de TI pueden identificar rápidamente lo que se ha añadido o eliminado, lo que ayuda a una rápida corrección.
  • Listo para la automatización: gracias a su estructura, el script puede integrarse en flujos de trabajo automatizados, lo que permite realizar comprobaciones periódicas sin intervención manual.

El poder de NinjaOne

NinjaOne es más que una solución de gestión de TI. Se trata de una plataforma integral que permite a los profesionales de TI y a los MSP adelantarse a las posibles amenazas. Integrando nuestro script de comprobación de archivos hosts en NinjaOne obtendrás

  • Alertas centralizadas: recibe alertas directamente en el panel de control de NinjaOne cada vez que se modifique el archivo hosts. Esta notificación inmediata garantiza que puedas actuar con rapidez, protegiendo tus sistemas de posibles ataques.
  • Controles programados: automatiza el script para que se ejecute a intervalos especificados, garantizando así una supervisión continua.
  • Generación de informes pormenorizada: combina la información del script con las funciones de generación de informes de NinjaOne para obtener una visión global de tu entorno de TI.

En conclusión, el archivo hosts, aunque a menudo se pasa por alto, es una piedra angular de las comunicaciones en red. Garantizar su integridad es primordial. Nuestro script, especialmente cuando se combina con la potencia de NinjaOne, proporciona a los equipos de TI las herramientas que necesitan para supervisar, detectar y actuar contra modificaciones no autorizadas, garantizando un entorno de TI seguro y sin problemas.

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón “Acepto” que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona “tal cual” y “según disponibilidad”, sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).