> 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/nl/gidsen-voor-het-verhelpen-van-kwetsbaarheden/ad-scan-vulnerability-remediation-guide/stale-objects.md).

# Verouderde objecten

## S-OldNtlm

#### Wat het betekent

Windows ondersteunt meerdere authenticatieprotocollen, van zeer oude en onveilige (LM, NTLMv1) tot moderne en veilige (NTLMv2, Kerberos). De oudere protocollen hebben bekende kwetsbaarheden die aanvallers kunnen misbruiken om wachtwoorden op het netwerk vast te leggen en te kraken.

De **LAN Manager-authenticatieniveau** bepaalt welke protocollen zijn toegestaan. Het moet worden ingesteld op **niveau 5**, wat betekent "alleen NTLMv2 accepteren, alle oudere protocollen weigeren."

#### Wat de scan controleert

De AD-scan leest Group Policy Objects (GPO's) om te verifiëren dat de `LmCompatibilityLevel` instelling is ingesteld op **5**. Als geen enkele GPO deze instelling definieert, gebruikt Windows standaard **niveau 3**, wat nog steeds enkele zwakkere protocollen accepteert.

| Niveau | Wat het toestaat                            | Veilig? |
| ------ | ------------------------------------------- | ------- |
| 0-2    | LM en/of NTLMv1                             | Nee     |
| 3      | NTLMv2 (maar weigert oude protocollen niet) | Nee     |
| **5**  | **Alleen NTLMv2, LM & NTLMv1 weigeren**     | **Ja**  |

#### Waarom de waarschuwing kan blijven bestaan

1. **U hebt het register rechtstreeks gewijzigd** in plaats van een GPO te gebruiken. De AD-scan leest GPO-bestanden, niet lokale registerinstellingen. Zelfs als de DC de juiste waarde in het register heeft, blijft de waarschuwing bestaan als deze niet via Group Policy is ingesteld.
2. **Conflicterende GPO's:** Eén GPO stelt niveau 5 in, maar een andere GPO overschrijft dit met een lager niveau.
3. **Helemaal geen GPO:** Zonder enige GPO is de standaardwaarde niveau 3 (onveilig).

#### Hoe te diagnosticeren

```powershell
# Controleer de effectieve instelling op elke 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"
}

# Controleer welke GPO's deze instelling definiëren
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)"
  }
}
```

#### Hoe op te lossen

**Via Group Policy Management Console (aanbevolen):**

1. Open `gpmc.msc`
2. Bewerk de GPO die is gekoppeld aan `OU=Domain Controllers`
3. Navigeer naar: `Computer Configuration > Policies > Windows Settings > Security Settings > Local Policies > Security Options`
4. Stel **"Network security: LAN Manager authentication level"** in op `Alleen NTLMv2-reactie verzenden. LM & NTLM weigeren`
5. Stel **"Network security: Do not store LAN Manager hash value on next password change"** in op `Ingeschakeld`
6. Voer uit `gpupdate /force` op alle domeincontrollers

**Via 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

#### Wat het betekent

Wanneer u zich in Active Directory authenticeert, wordt uw wachtwoord gebruikt om communicatie te versleutelen met een specifiek algoritme. Oudere algoritmen (**DES**, **RC4**) zijn zwak en kunnen relatief gemakkelijk worden gekraakt. Moderne algoritmen (**AES-128**, **AES-256**) zijn veel sterker.

AES-ondersteuning werd geïntroduceerd met Windows Server 2008. Accounts die vóór de upgrade bestonden, of accounts met specifieke configuraties, kunnen nog steeds de oude, zwakkere versleuteling gebruiken.

#### Wat de scan controleert

Een account wordt gemarkeerd in twee situaties:

1. **Het wachtwoord van het account is ingesteld vóórdat uw domein werd opgewaardeerd naar Server 2008.** Omdat AES-versleutelingssleutels alleen worden gegenereerd wanneer een wachtwoord wordt ingesteld op een moderne DC, hebben deze oude wachtwoorden alleen zwakke RC4/DES-sleutels.
2. **Het account heeft een Service Principal Name (SPN)** en de versleutelingsinstellingen bevatten geen AES (het `msDS-SupportedEncryptionTypes` attribuut mist AES-vlaggen).

#### Hoe te diagnosticeren

```powershell
# Zoek serviceaccounts zonder AES-ondersteuning
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

# Idem voor computeraccounts
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"}}
```

#### Hoe op te lossen

**Voor accounts met oude wachtwoorden:** Reset eenvoudig het wachtwoord. Dit genereert nieuwe AES-sleutels:

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

**Voor accounts waarvoor AES-versleutelingsinstellingen ontbreken:** Schakel AES in bij de versleutelingstypen van het account:

```powershell
# Schakel AES in voor een specifiek account (24 = AES-128 + AES-256)
Set-ADUser -Identity "svc_account" -Replace @{"msDS-SupportedEncryptionTypes" = 24}

# Voor een computeraccount
Set-ADComputer -Identity "server01" -Replace @{"msDS-SupportedEncryptionTypes" = 24}

# Bulkfix voor alle serviceaccounts zonder 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)"
  }
```

> **Opmerking:** AES inschakelen is niet-destructief: bestaande authenticatie blijft werken. Test echter met kritieke services voordat u dit massaal toepast.


---

# 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/nl/gidsen-voor-het-verhelpen-van-kwetsbaarheden/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.
