Cómo configurar eficazmente el almacenamiento local de hashes LM con PowerShell

Configurar el almacenamiento local de hashes LM desempeña un papel fundamental en los sistemas basados en Windows. Para los profesionales de TI, la configuración de este almacenamiento puede afectar en gran medida a la seguridad del sistema. El script PowerShell proporcionado simplifica notablemente el proceso de activar o desactivar esta función. Profundicemos en su significado y su funcionamiento.

Antecedentes

El hash LM, o hash de administrador de LAN, existe desde hace algún tiempo y es conocido por sus vulnerabilidades. Con el tiempo, muchos profesionales de la seguridad han recomendado desactivar los hashes LM para reforzar la seguridad del sistema. Sin embargo, las configuraciones manuales pueden resultar tediosas, por lo que las herramientas y los scripts, como el que analizamos en este post, se convierten en activos de valor incalculable para los profesionales de TI y los proveedores de servicios gestionados (MSP).

El script para configurar el almacenamiento local de hashes LM

#Requires -Version 5.1

<#
.SYNOPSIS
    Disable or Enable Local LM Hash Storage
.DESCRIPTION
    Disable or Enable Local LM Hash Storage
.EXAMPLE
    -Enable
    Enable Local LM Hash Storage
.EXAMPLE
    -Disable
    Disable Local LM Hash Storage
.EXAMPLE
    PS C:> Disable-LMHash.ps1 -Disable
    Disable Local LM Hash Storage
.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).
.COMPONENT
    ProtocolSecurity
#>

[CmdletBinding(DefaultParameterSetName = "Disable")]
param (
    [Parameter(Mandatory, ParameterSetName = "Disable")]
    [switch]
    $Disable,
    [Parameter(Mandatory, ParameterSetName = "Enable")]
    [switch]
    $Enable
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
        { Write-Output $true }
        else
        { Write-Output $false }
    }
    function Set-ItemProp {
        param (
            $Path,
            $Name,
            $Value,
            [ValidateSet("DWord", "QWord", "String", "ExpandedString", "Binary", "MultiString", "Unknown")]
            $PropertyType = "DWord"
        )
        New-Item -Path $Path -Force -ErrorAction SilentlyContinue | Out-Null
        if ((Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue)) {
            Set-ItemProperty -Path $Path -Name $Name -Value $Value -Force -Confirm:$false | Out-Null
        }
        else {
            New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $PropertyType -Force -Confirm:$false | Out-Null
        }
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }
    $Path = "HKLM:SYSTEMCurrentControlSetControlLsa"
    $Name = "NoLMHash"
    $Value = if ($Enable) { 1 }elseif ($Disable) { 0 }else { throw "No Param used." }
    # Sets NoLMHash to 1
    try {
        Set-ItemProp -Path $Path -Name $Name -Value $Value
    }
    catch {
        Write-Error $_
        exit 1
    }
    Write-Host "Set $Path$Name to $Value"
}
end {}

 

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

Obtén acceso

Análisis detallado

El script comienza estableciendo los requisitos para la versión 5.1 de PowerShell. Aquí tienes un desglose paso a paso de su funcionamiento:

  • Cmdlet Binding: el script utiliza CmdletBinding, lo que le permite aceptar parámetros, concretamente -Enable o -Disable.
  • Función Test-IsElevated: esta función comprueba si el script se está ejecutando con privilegios elevados (como administrador). De no ser el caso, el script devolverá un error.
  • Función Set-ItemProp: esta función está diseñada para establecer una clave de registro especificada con un valor dado, creándola si no existe.
  • Bloque de proceso: aquí es donde reside la lógica principal.
  • Comprueba si tienes derechos de administrador.
  • Define la ruta y el nombre del registro.
  • En función del parámetro utilizado (Activar o Desactivar), asigna un valor.
  • A continuación, establece este valor en el registro.
  • Bloque final: concluye el script.

Posibles casos de uso

Imagina un MSP que supervisa la seguridad de varios clientes. Uno de sus nuevos procedimientos de incorporación es asegurarse de que el almacenamiento local de hashes LM está desactivado en todos los servidores. En lugar de actualizar manualmente la configuración de cada servidor, el MSP podría desplegar este script, realizando los cambios de forma eficiente y garantizando la coherencia.

Comparaciones

Navegar manualmente por el registro o utilizar la directiva de grupo son otros métodos para lograr este resultado. Sin embargo, el uso de PowerShell es más eficiente, especialmente cuando es necesario realizar cambios en numerosos sistemas. Además, los scripts son menos propensos al error humano en comparación con los métodos manuales.

FAQ

  • ¿Qué representa “NoLMHash”?
    “NoLMHash” es una clave de registro que determina si se almacenan los hashes LM. Un valor de ‘0’ significa que está activado, mientras que ‘1’ significa que está desactivado.
  • ¿Se puede ejecutar este script en cualquier sistema Windows?
    El script tiene un requisito mínimo: Windows 10 o Windows Server 2016 y superior.

Implicaciones

La configuración del almacenamiento local de hashes LM no es sólo una cuestión de eficiencia operativa, sino también una importante consideración de seguridad. Los hashes LM son notoriamente poco seguros. Disponer de un método para desactivar estos hashes de forma rápida y fiable puede reducir drásticamente las vulnerabilidades.

Recomendaciones

  • Haz siempre una copia de seguridad del registro antes de realizar cambios.
  • Revisa y audita periódicamente las configuraciones del sistema para garantizar el cumplimiento de las mejores prácticas de seguridad.
  • Ejecuta sólo scripts de fuentes fiables.

Reflexiones finales

Para los profesionales de TI que buscan simplificar sus tareas manteniendo un alto nivel de seguridad, resulta crucial utilizar herramientas potentes. Este script es una prueba de esa capacidad. Además, plataformas como NinjaOne pueden mejorar el proceso centralizando y automatizando las tareas relacionadas con la configuración y la seguridad del sistema. A medida que evoluciona el panorama digital, disponer de herramientas y plataformas fiables será la clave para mantener una postura de seguridad sólida.

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).