> 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/fr/guides-de-remediation-des-vulnerabilites/ad-scan-vulnerability-remediation-guide/stale-objects.md).

# Objets obsolètes

## S-OldNtlm

#### Ce que cela signifie

Windows prend en charge plusieurs protocoles d’authentification, des plus anciens et les moins sûrs (LM, NTLMv1) aux plus modernes et sécurisés (NTLMv2, Kerberos). Les anciens protocoles présentent des vulnérabilités connues que des attaquants peuvent exploiter pour capturer et casser des mots de passe sur le réseau.

Le **niveau d’authentification de LAN Manager** contrôle quels protocoles sont autorisés. Il doit être défini sur le **niveau 5**, ce qui signifie « n’accepter que NTLMv2, refuser tous les anciens protocoles. »

#### Ce que l'analyse vérifie

L’analyse AD lit les objets de stratégie de groupe (GPO) pour vérifier que le `LmCompatibilityLevel` paramètre est défini sur le **5**. Si aucune GPO ne définit ce paramètre, Windows utilise la valeur par défaut du **niveau 3**, qui accepte encore certains protocoles plus faibles.

| Niveau | Ce qu’il autorise                                  | Sécurisé ? |
| ------ | -------------------------------------------------- | ---------- |
| 0-2    | LM et/ou NTLMv1                                    | Non        |
| 3      | NTLMv2 (mais ne refuse pas les anciens protocoles) | Non        |
| **5**  | **NTLMv2 uniquement, refuser LM et NTLMv1**        | **Oui**    |

#### Pourquoi l’alerte peut persister

1. **Vous avez modifié directement le registre** au lieu d’utiliser une GPO. L’analyse AD lit les fichiers GPO, pas les paramètres du registre local. Même si le contrôleur de domaine a la bonne valeur dans le registre, l’alerte persiste si elle n’a pas été définie via la stratégie de groupe.
2. **GPO en conflit :** Une GPO définit le niveau 5, mais une autre GPO le remplace avec un niveau inférieur.
3. **Aucune GPO :** Sans aucune GPO, la valeur par défaut est le niveau 3 (non sécurisé).

#### Comment diagnostiquer

```powershell
# Vérifier le paramètre effectif sur chaque contrôleur de domaine
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"
}

# Vérifier quelles GPO définissent ce paramètre
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)"
  }
}
```

#### Comment corriger

**Via la console de gestion des stratégies de groupe (recommandé) :**

1. Ouvrir `gpmc.msc`
2. Modifiez la GPO liée à `OU=Domain Controllers`
3. Accédez à : `Configuration ordinateur > Stratégies > Paramètres Windows > Paramètres de sécurité > Stratégies locales > Options de sécurité`
4. Définissez **"Sécurité réseau : niveau d’authentification de LAN Manager"** sur `Envoyer uniquement une réponse NTLMv2. Refuser LM et NTLM`
5. Définissez **"Sécurité réseau : ne pas stocker la valeur de hachage LAN Manager lors du prochain changement de mot de passe"** sur `Activé`
6. Exécutez `gpupdate /force` sur tous les contrôleurs de domaine

**Via PowerShell :**

```powershell
$gpoName = "DC - Forcer 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

#### Ce que cela signifie

Lorsque vous vous authentifiez dans Active Directory, votre mot de passe est utilisé pour chiffrer les communications à l’aide d’un algorithme spécifique. Les anciens algorithmes (**DES**, **RC4**) sont faibles et peuvent être cassés relativement facilement. Les algorithmes modernes (**AES-128**, **AES-256**) sont beaucoup plus robustes.

La prise en charge d’AES a été introduite avec Windows Server 2008. Cependant, les comptes qui existaient avant la mise à niveau, ou les comptes avec des configurations spécifiques, peuvent encore utiliser l’ancien chiffrement plus faible.

#### Ce que l'analyse vérifie

Un compte est signalé dans deux situations :

1. **Le mot de passe du compte a été défini avant la mise à niveau de votre domaine vers Server 2008.** Comme les clés de chiffrement AES ne sont générées que lorsqu’un mot de passe est défini sur un contrôleur de domaine moderne, ces anciens mots de passe ne disposent que de clés RC4/DES faibles.
2. **Le compte a un nom de principal de service (SPN)** et ses paramètres de chiffrement n’incluent pas AES (l’attribut `msDS-SupportedEncryptionTypes` est dépourvu des indicateurs AES).

#### Comment diagnostiquer

```powershell
# Trouver les comptes de service sans prise en charge d’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

# Même chose pour les comptes ordinateur
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"}}
```

#### Comment corriger

**Pour les comptes avec d’anciens mots de passe :** Réinitialisez simplement le mot de passe. Cela génère de nouvelles clés AES :

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

**Pour les comptes auxquels il manque les paramètres de chiffrement AES :** Activez AES dans les types de chiffrement du compte :

```powershell
# Activer AES pour un compte spécifique (24 = AES-128 + AES-256)
Set-ADUser -Identity "svc_account" -Replace @{"msDS-SupportedEncryptionTypes" = 24}

# Pour un compte ordinateur
Set-ADComputer -Identity "server01" -Replace @{"msDS-SupportedEncryptionTypes" = 24}

# Correctif en masse pour tous les comptes de service sans 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 "AES activé pour $($_.SamAccountName)"
  }
```

> **Remarque :** L’activation d’AES n’est pas destructive : l’authentification existante continue de fonctionner. Cependant, testez d’abord avec les services critiques avant d’appliquer en masse.


---

# 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/fr/guides-de-remediation-des-vulnerabilites/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.
