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