> For the complete documentation index, see [llms.txt](https://docs.stoik.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.stoik.io/cyber-best-practices/es/guias-de-remediacion-de-vulnerabilidades/ad-scan-vulnerability-remediation-guide/stale-objects.md).

# Objetos obsoletos

## S-OldNtlm

#### Qué significa

Windows admite varios protocolos de autenticación, desde muy antiguos e inseguros (LM, NTLMv1) hasta modernos y seguros (NTLMv2, Kerberos). Los protocolos más antiguos tienen vulnerabilidades conocidas que los atacantes pueden explotar para capturar y descifrar contraseñas en la red.

El **nivel de autenticación de LAN Manager** controla qué protocolos se permiten. Debe configurarse en **nivel 5**, lo que significa "aceptar solo NTLMv2, rechazar todos los protocolos anteriores."

#### Qué comprueba el análisis

El análisis de AD lee Objetos de Directiva de Grupo (GPO) para verificar que el `LmCompatibilityLevel` esté configurado en **5**. Si ninguna GPO define esta configuración, Windows usa un valor predeterminado de **nivel 3**, que aún acepta algunos protocolos más débiles.

| Nivel | Qué permite                                      | ¿Seguro? |
| ----- | ------------------------------------------------ | -------- |
| 0-2   | LM y/o NTLMv1                                    | No       |
| 3     | NTLMv2 (pero no rechaza los protocolos antiguos) | No       |
| **5** | **Solo NTLMv2, rechaza LM y NTLMv1**             | **Sí**   |

#### Por qué puede persistir la alerta

1. **Cambió el registro directamente** en lugar de usar una GPO. El análisis de AD lee archivos GPO, no la configuración local del registro. Incluso si el DC tiene el valor correcto en el registro, la alerta persiste si no se estableció mediante Directiva de Grupo.
2. **GPO en conflicto:** Una GPO establece el nivel 5, pero otra GPO lo reemplaza con un nivel inferior.
3. **Ninguna GPO en absoluto:** Sin ninguna GPO, el valor predeterminado es el nivel 3 (inseguro).

#### Cómo diagnosticar

```powershell
# Compruebe la configuración efectiva en cada DC
Get-ADDomainController -Filter * | ForEach-Object {
  $level = Invoke-Command -ComputerName $_.HostName -ScriptBlock {
    (Get-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa" `
      -Name LmCompatibilityLevel -ErrorAction SilentlyContinue).LmCompatibilityLevel
  }
  Write-Host "$($_.HostName): LmCompatibilityLevel = $level"
}

# Compruebe qué GPO definen esta configuración
Import-Module GroupPolicy
Get-GPO -All | ForEach-Object {
  [xml]$r = Get-GPOReport -Guid $_.Id -ReportType Xml
  if ($r.InnerXml -match "LmCompatibilityLevel") {
    Write-Host "GPO: $($_.DisplayName)"
  }
}
```

#### Cómo corregirlo

**Mediante la Consola de administración de directivas de grupo (recomendado):**

1. Abra `gpmc.msc`
2. Edite la GPO vinculada a `OU=Domain Controllers`
3. Vaya a: `Computer Configuration > Policies > Windows Settings > Security Settings > Local Policies > Security Options`
4. Establezca **"Network security: LAN Manager authentication level"** en `Enviar solo respuesta NTLMv2. Rechazar LM y NTLM`
5. Establezca **"Seguridad de red: no almacenar el valor hash de LAN Manager en el siguiente cambio de contraseña"** en `Habilitado`
6. Ejecute `gpupdate /force` en todos los controladores de dominio

**Mediante PowerShell:**

```powershell
$gpoName = "DC - Enforce NTLMv2"
$gpo = Get-GPO -Name $gpoName -ErrorAction SilentlyContinue
if (-not $gpo) { $gpo = New-GPO -Name $gpoName }

Set-GPRegistryValue -Name $gpoName `
  -Key "HKLM\System\CurrentControlSet\Control\Lsa" `
  -ValueName "LmCompatibilityLevel" -Type DWord -Value 5

Set-GPRegistryValue -Name $gpoName `
  -Key "HKLM\System\CurrentControlSet\Control\Lsa" `
  -ValueName "NoLMHash" -Type DWord -Value 1

New-GPLink -Name $gpoName `
  -Target "OU=Domain Controllers,$($(Get-ADDomain).DistinguishedName)" `
  -LinkEnabled Yes
```

## S-AesNotEnabled

#### Qué significa

Cuando se autentica en Active Directory, su contraseña se usa para cifrar la comunicación mediante un algoritmo específico. Los algoritmos antiguos (**DES**, **RC4**) son débiles y pueden descifrarse con relativa facilidad. Los algoritmos modernos (**AES-128**, **AES-256**) son mucho más fuertes.

La compatibilidad con AES se introdujo con Windows Server 2008. Sin embargo, las cuentas que existían antes de la actualización, o las cuentas con configuraciones específicas, pueden seguir usando el cifrado antiguo y más débil.

#### Qué comprueba el análisis

Una cuenta se marca en dos situaciones:

1. **La contraseña de la cuenta se estableció antes de que su dominio se actualizara a Server 2008.** Como las claves de cifrado AES solo se generan cuando se establece una contraseña en un DC moderno, estas contraseñas antiguas solo tienen claves débiles RC4/DES.
2. **La cuenta tiene un Nombre Principal de Servicio (SPN)** y sus configuraciones de cifrado no incluyen AES (el `msDS-SupportedEncryptionTypes` atributo no tiene indicadores AES).

#### Cómo diagnosticar

```powershell
# Encuentre cuentas de servicio sin compatibilidad con AES
Get-ADUser -Filter 'ServicePrincipalName -like "*"' `
  -Properties ServicePrincipalName, "msDS-SupportedEncryptionTypes", PasswordLastSet |
  Where-Object { ([int]$_."msDS-SupportedEncryptionTypes" -band 24) -eq 0 } |
  Select-Object SamAccountName,
    @{N="EncryptionTypes"; E={$_."msDS-SupportedEncryptionTypes"}},
    PasswordLastSet

# Lo mismo para cuentas de equipo
Get-ADComputer -Filter 'ServicePrincipalName -like "*"' `
  -Properties "msDS-SupportedEncryptionTypes" |
  Where-Object { ([int]$_."msDS-SupportedEncryptionTypes" -band 24) -eq 0 } |
  Select-Object Name, @{N="EncryptionTypes"; E={$_."msDS-SupportedEncryptionTypes"}}
```

#### Cómo corregirlo

**Para cuentas con contraseñas antiguas:** Simplemente restablezca la contraseña. Esto genera nuevas claves AES:

```powershell
Set-ADAccountPassword -Identity "svc_account" `
  -NewPassword (ConvertTo-SecureString "YourNewStr0ngP@ssw0rd!" -AsPlainText -Force) -Reset
```

**Para cuentas sin configuraciones de cifrado AES:** Habilite AES en los tipos de cifrado de la cuenta:

```powershell
# Habilite AES para una cuenta específica (24 = AES-128 + AES-256)
Set-ADUser -Identity "svc_account" -Replace @{"msDS-SupportedEncryptionTypes" = 24}

# Para una cuenta de equipo
Set-ADComputer -Identity "server01" -Replace @{"msDS-SupportedEncryptionTypes" = 24}

# Corrección masiva para todas las cuentas de servicio sin AES
Get-ADUser -Filter 'ServicePrincipalName -like "*"' `
  -Properties "msDS-SupportedEncryptionTypes" |
  Where-Object { ([int]$_."msDS-SupportedEncryptionTypes" -band 24) -eq 0 } |
  ForEach-Object {
    Set-ADUser $_ -Replace @{"msDS-SupportedEncryptionTypes" = 24}
    Write-Host "Enabled AES for $($_.SamAccountName)"
  }
```

> **Nota:** Habilitar AES no es destructivo: la autenticación existente sigue funcionando. Sin embargo, pruebe con servicios críticos antes de aplicarlo en masa.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.stoik.io/cyber-best-practices/es/guias-de-remediacion-de-vulnerabilidades/ad-scan-vulnerability-remediation-guide/stale-objects.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
