This section focuses on the core security indicators.
Locate the sub-process determining the score and fix some rules in that area to get a score improvement.
Domain Risk Level: 100 / 100
It is the maximum score of the 4 indicators and one score cannot be higher than 100. The lower the better
Stale Object : 53 /100
It is about operations related to user or computer objects
14 rules matched
Trusts : 61 /100
It is about connections between two Active Directories
3 rules matched
Privileged Accounts : 100 /100
It is about administrators of the Active Directory
14 rules matched
Anomalies : 100 /100
It is about specific security control points
24 rules matched
Left-click on the headlines in the boxes for more details
| Stale Objects | Privileged accounts | Trusts | Anomalies | |
|---|---|---|---|---|
Inactive user or computer | Account take over | Old trust protocol | Audit | |
Network topography | ACL Check | SID Filtering | Backup | |
Object configuration | Admin control | SIDHistory | Certificate take over | |
Obsolete OS | Control paths | Trust impermeability | Golden ticket | |
Old authentication protocols | Delegation Check | Trust inactive | Local group vulnerability | |
Provisioning | Irreversible change | Trust with Entra | Network sniffing | |
Replication | Privilege control | Pass-the-credential | ||
Vulnerability management | Read-Only Domain Controllers | Password retrieval | ||
Reconnaissance | ||||
Temporary admins | ||||
Weak password |
This section represents the maturity score (inspired from ANSSI).
Maturity Level:
Maturity levels:
8 rule(s) matched
12 rule(s) matched
20 rule(s) matched
10 rule(s) matched
5 rule(s) matched
To reach Level 2 you need to fix the following rules:
P-ControlPathIndirectEveryone
Description:The purpose is to ensure that there is no control path involving everyone.
Technical explanation:
If you have access to a key server and the helpdesk can reset your password, then the helpdesk has access to the key server.
This is the kind of logic used by hackers to take control of the domain using key infrastructure objects (domain root, ...) or groups (domain administrators, ...).
Permissions are collected and analyzed to produce a control paths analysis.
Only write permissions (and specific ones) are used for this analysis.
Then the program identifies which users or computers, that are not members of known groups, can take control of this object.
To be fast, some tradeoffs have been selected. For example, logged on users on servers are ignored.
The program may also select paths which are not exploitable and ignore paths if it cannot read every permissions.
[Everyone] includes the user groups Anonymous, Everyone, Authenticated Users, Domain Users, Domain Computers and Builtin.
You should analyze the chart and determine which underlying object is involved and grants write permissions to everyone.
Then edit the permissions and locate the write permission involved.
Then delete it or replace it according to your delegation model.
25 points if present
Documentation:https://github.com/BloodHoundAD/BloodHound
https://github.com/ANSSI-FR/AD-control-paths
[MITRE]T1069.002 Permission Groups Discovery: Domain Groups
The detail can be found in Control Paths Analysis
| Group |
|---|
| Certificate Publishers |
| Domain Controllers |
| Read Only Domain Controllers |
A-DnsZoneUpdate1
Description:Critical DNS zones (domain zone and RootDNSServers) are configured to accept anonymous updates, allowing any device to modify DNS records without authentication.
Technical explanation:Active Directory-integrated DNS zones can be configured to accept three types of updates: no updates (static), secure updates only (authenticated), or nonsecure and secure updates. This rule examines your most critical DNS zones to determine if they allow nonsecure updates.
The zones checked by this rule are the foundation of Active Directory operations: your primary domain DNS zone (e.g., contoso.com), the RootDNSServers zone, and _msdcs zones. The _msdcs zones are particularly critical as they contain the global catalog and domain controller locator records used by the entire Active Directory forest for authentication and replication.
When nonsecure updates are enabled (ZONE_UPDATE_UNSECURE), any device on the network can create or modify DNS records without authentication. For these critical zones, this means an attacker could redirect domain controller lookups, hijack global catalog queries, or impersonate critical AD services. The impact extends beyond a single domain - compromising _msdcs affects forest-wide operations.
The rule searches across all DNS storage locations in Active Directory: the DomainDnsZones partition (replicated domain-wide), the ForestDnsZones partition (replicated forest-wide), and the legacy storage in the domain naming context. It automatically filters out replication conflicts (CNF objects) and in-progress replication objects to avoid false positives.
This rule (A-DnsZoneUpdate1) focuses on these critical infrastructure zones. Its companion rule (A-DnsZoneUpdate2) examines all other zones in your environment.
To fix this vulnerability, configure the zone for secure-only updates:
GUI Method:
1. Open DNS Manager (dnsmgmt.msc)
2. Navigate to the affected zone
3. Right-click the zone → Properties → General tab
4. Change "Dynamic updates" from "Nonsecure and secure" to "Secure only"
PowerShell Method:
# Find all zones with insecure updates
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"}
# Fix a specific zone
Set-DnsServerPrimaryZone -Name "contoso.com" -DynamicUpdate Secure -ComputerName DC01
# Fix all insecure zones
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"} | ForEach-Object {
Set-DnsServerPrimaryZone -Name $_.ZoneName -DynamicUpdate Secure -ComputerName DC01
}
Command Line Method:
# Local server
dnscmd /Config <ZoneName> /AllowUpdate 2
# Remote server
dnscmd <ServerName> /Config <ZoneName> /AllowUpdate 2
# Example
dnscmd DC01 /Config contoso.com /AllowUpdate 2
15 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/f97756c9-3783-428b-9451-b376f877319a
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/dnscmd
[FR]ANSSI - Misconfigured DNS zones (vuln1_dnszone_bad_prop)1
[MITRE]T1557 Man-in-the-Middle
| Zone | Domain | DN | Partition |
|---|---|---|---|
| domain.local | domain.local | DC=domain.local,CN=MicrosoftDNS,DC=DomainDnsZones,DC=domain,DC=local | DomainDnsZones |
| _msdcs.domain.local | domain.local | DC=_msdcs.domain.local,CN=MicrosoftDNS,DC=ForestDnsZones,DC=domain,DC=local | ForestDnsZones |
P-Kerberoasting
Description:The purpose is to ensure that the password of admin accounts cannot be retrieved using the Kerberoast attack.
Technical explanation:To access a service using Kerberos, a user requests a ticket (named TGS) to the DC specific to the service.
This ticket is encrypted using a derivative of the service password, but can be brute-forced to retrieve the original password.
Any account having the attribute SPN populated is considered as a service account.
Given that any user can request a ticket for a service account, these accounts can have their password retrieved.
In addition, services are known to have their password not changed at a regular basis and to use well-known words.
Please note that this program ignores service accounts that had their password changed in the last 40 days ago to support using password rotation as a mitigation.
If the account is a service account, the service should be removed from the privileged group or have a process to change its password at a regular basis.
If the user is a person, the SPN attribute of the account should be removed.
5 points per discovery
Documentation:https://adsecurity.org/?p=3466
[FR]ANSSI - Privileged accounts with SPN (vuln1_spn_priv)1
[MITRE]T1558.003 Steal or Forge Kerberos Tickets: Kerberoasting
The detail can be found in Admin Groups
| User | Groups | SPNs |
|---|---|---|
| Administrator | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/administrator |
| TestUser_DA | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/tda123 http/tda11 cifs/tda1 http/tda111 |
| TestUser_EA | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/ http/tea4.domain.local http/tea3 http/tea2 http/tea1 |
A-CertTempCustomSubject
Description:This check verifies if certificate templates in Active Directory Certificate Services (AD CS) allow user-controlled subject information and meet other common criteria associated with the ESC1 vulnerability.
Technical explanation:ESC1 is a vulnerability in Active Directory Certificate Services (AD CS) that occurs when certificate templates allow users to control the Subject Name as well as meet other criteria, such as:
To mitigate ESC1, use one or more of the options below:
Option 1: Modify Certificate Template Settings in ADCS
15 points if present
Documentation:Certified-PreOwned https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name | CA | EnrollmentPrincipals | LastModified |
|---|---|---|---|
| ESC1 | DC.domain.local\Enterprise CA | Authenticated Users | 21/07/2025 11:00:16 |
P-ServiceDomainAdmin
Description:The purpose is to check for accounts with non-expiring passwords in the "Domain Administrator" group
Technical explanation:PingCastle is checking accounts with never expiring password, that are mostly used as service accounts.
"Service Accounts" can imply a high security risk as their password are stored in clear text in the LSA database, which can then be easily exploited using Mimikatz or Cain&Abel for instance. In addition, their passwords don't change and can be used in Kerberoast attacks.
Accounts with never expiring passwords are mostly service accounts.
To mitigate the security risk, it is strongly advised to lower the privileges of the "Service Accounts", meaning that they should be removed from the "Domain Administrator" group, while ensuring that the password of each and every "Service Account" is longer than 20 characters
15 points if the occurence is greater than or equals than 2
Documentation:[US]STIG V-36432 - Membership to the Domain Admins group must be restricted to accounts used only to manage the Active Directory domain and domain controllers.
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R11 [subsection.2.5]
[FR]ANSSI - Privileged accounts with never-expiring passwords (vuln1_dont_expire_priv)1
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
[MITRE]T1003.004 OS Credential Dumping: LSA Secrets
The detail can be found in Admin Groups
| DN |
|---|
| CN=srv_AA,OU=Admin,DC=domain,DC=local |
| CN=srv_recover,OU=Admin,DC=domain,DC=local |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| CN=srv_sd,OU=Admin,DC=domain,DC=local |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| CN=DA,CN=Users,DC=domain,DC=local |
| CN=NestedDA,OU=People,DC=domain,DC=local |
A-CertTempAnyPurpose
Description:This check verifies whether certificate templates in Active Directory Certificate Services (AD CS) have the "Any Purpose" Enhanced Key Usage (EKU) or lack an EKU entirely, potentially enabling privilege escalation or misuse.
Technical explanation: Enhanced Key Usage (EKU) defines the intended purpose of a certificate. ESC2 arises when the following EKUs are defined along with other vulnerable criteria that enable low privileged users to request the certificate with no oversight.
There are multiple ways in which remediation of this issue can be completed. It involves restricting the template in one or more ways using the instructions below.
15 points if present
Documentation:https://posts.specterops.io/certified-pre-owned-d95910965cd2
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name | CA | EnrollmentPrincipals | LastModified |
|---|---|---|---|
| ESC2 | DC.domain.local\Enterprise CA | Authenticated Users | 11/09/2025 10:57:01 |
A-CertTempAgent
Description:The purpose of this rule is to ensure that there is no agent certificate that can be requested by anyone
Technical explanation:An Agent certificate is a special certificate used to request certificates on behalf of other users.
A template has been detected with the agent EKU and that can be enrolled by a large number of users.
Review the permissions that allow a wide enrollment of this certificate template
15 points if present
Documentation:https://posts.specterops.io/certified-pre-owned-d95910965cd2
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name |
|---|
| ESC3-Enrollment |
P-DisplaySpecifier
Description:The purpose is to ensure that scripts used for the customization of admin UI are stored safely
Technical explanation:DisplaySpecifier are Active Directory objects stored in the DisplaySpecifier container of the Configuration naming context.
They are used to customize the user interface.
Specifically the attribute adminContextMenu is used to customize administration actions, where COM objects or scripts can be called.
If the script is stored outside the SYSVOL directory, it can be used to execute custom actions and it is run under the administrator context.
The scripts identified by this rule should be moved to the SYSVOL and properly secured.
Points:10 points if present
Documentation:https://www.semperis.com/blog/active-directory-security-abusing-display-specifiers/
https://learn.microsoft.com/en-us/windows/win32/ad/display-specifiers
[FR]ANSSI - Dangerous Display Specifiers (vuln1_display_specifier)1
[MITRE]T1569 System Services
| DN | Path | Changed |
|---|---|---|
| CN=domainDNS-Display,CN=407,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=407,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=414,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=414,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=404,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=404,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40E,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40E,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=408,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=408,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=413,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=413,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=409,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=409,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=410,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=410,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41D,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41D,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=C0A,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=C0A,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=415,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=415,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=405,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=405,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=411,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=411,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41F,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41F,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40B,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40B,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=416,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=416,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=406,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=406,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=412,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=412,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=804,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=804,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40C,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40C,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=816,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=816,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
To reach Level 3 you need to fix the following rules:
S-OldNtlm
Description:The purpose is to check if NTLMv1 or LM can be used by DC
Technical explanation:NTLMv1 is an old protocol which is known to be vulnerable to cryptographic attacks.
It is typically used when a hacker sniffs the network and tries to retrieve NTLM hashes which can then be used to impersonate users.
This attack can be combined with coerced authentication attacks - a hacker forces the DC to connect to a controlled host.
In this case, NTLMv1 can be specified so the hacker can retrieve the NTLM hash of the DC, impersonates it and then take control of the domain.
This attack is still possible with NTLMv2 but this is more difficult.
Windows has default security settings regarding LM/NTLM. Windows XP: Send LM & NTLM responses, Windows Server 2003: Send NTLM response only, Vista/2008: Win7/2008 R2: Send NTLMv2 response only.
However Domain Controllers have relaxed default settings to accept the connection of older operating systems.
That means that by default, NTLMv1 is accepted on domain controllers.
If no GPO defines the LAN Manager Authentication Level, the DC fall back to the non secure default.
After an audit of NTLMv1 usage (see the links below), you need to raise the LAN Manager Authentication Level to "Send NTLMv2 response only. Refuse LM & NTLM".
This can be done by editing the policy "Network security: LAN Manager authentication level" which can be accessed in Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options
The policy will be applied after a computer reboot.
Beware that you may break software which is not compatible with Ntlmv2 such as very old Linux stacks or very old Windows before Windows Vista.
But please note that Ntlmv2 can be activited on all Windows starting Windows 95 and other operating systems.
15 points if present
Documentation:https://learn.microsoft.com/en-us/troubleshoot/windows-server/windows-security/audit-domain-controller-ntlmv1
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-restrict-ntlm-ntlm-authentication-in-this-domain
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-lan-manager-authentication-level
https://learn.microsoft.com/en-us/troubleshoot/windows-client/windows-security/enable-ntlm-2-authentication
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R37 [paragraph.3.6.2.1]
The detail can be found in Security settings
| GPO | Value |
|---|---|
| Windows default without an active GPO | 3 |
P-DelegationGPOData
Description:The purpose is to ensure that standard users cannot modify GPO
Technical explanation:When the group Authenticated Users, Everyone or any similar groups have permission to modify a GPO, it can be abused to take control of the accounts where this GPO applies. It can potentially lead to the compromise of the domain
Advised solution:Edit the Access Control List (ACL) of the GPO object or the directory where the items is located. Then remove any write permission given to the group.
Points:15 points per discovery
Documentation:[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R18 [subsubsection.3.3.2]
[US]STIG V-2370 - The access control permissions for the directory service site group policy must be configured to use the required access permissions.
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| GPO | Item | Account | Right |
|---|---|---|---|
| NTLM Block | \\DC2.domain.local\sysvol\domain.local\Policies\{E018745D-AF45-473D-B5F2-31169FA435C2} | Authenticated Users | FullControl |
P-UnconstrainedDelegation
Description:This rule identifies accounts configured with Kerberos unconstrained delegation, a high-risk setting that allows a compromised service to impersonate any domain user and potentially lead to full domain compromise.
Technical explanation:Kerberos unconstrained delegation allows a service to reuse a user’s Ticket Granting Ticket (TGT) to authenticate to any service in the domain. If the delegated account is compromised, cached TGTs can be extracted and used to impersonate any authenticating user.
If a privileged account or a Domain Controller authenticates to such a service, potentially via forced authentication techniques, the attacker can escalate privileges and compromise the entire domain. Disabling the account does not remove this risk, as delegation settings persist and become active again if the account is re-enabled.
Kerberos unconstrained delegation should be removed wherever it is configured. If delegation is required, it must be replaced with Kerberos constrained delegation.
Step 1: Remove Unconstrained Delegation
Remove the ability for the account to delegate credentials to any service.
Computer accounts
Set-ADComputer -Identity
User accounts
Set-ADUser -Identity
Step 2: Configure Constrained Delegation (Only If Required)
If an application requires delegation:
1. Open Active Directory Users and Computers
2. Open the account properties
3. Go to the Delegation tab
4. Select “Trust this computer for delegation to specified services only”
5. Select “Use Kerberos only”
6. Add only the specific services that are required for the application
Do not enable delegation if it is not strictly necessary.
5 points per discovery
Documentation:https://learn.microsoft.com/en-us/archive/blogs/389thoughts/get-rid-of-accounts-that-use-kerberos-unconstrained-delegation
https://adsecurity.org/?p=1667
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R18 [subsubsection.3.3.2]
[FR]ANSSI - Unconstrained authentication delegation (vuln2_delegation_t4d)2
[MITRE]T1187 Forced Authentication
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information and Computer information
| DN | Name |
|---|---|
| CN=kerbdeleg1,OU=Admin,DC=domain,DC=local | kerbdeleg1 |
| CN=kerbdeleg3,OU=Admin,DC=domain,DC=local | kerbdeleg3 |
T-SIDHistoryDangerous
Description:The purpose is to ensure that the dangerous SID are not stored in the SIDHistory attribute.
Technical explanation:SID History is an attribute used in migration to link with a former account.
This rule checks for SID not coming from a former domain (such as SYSTEM) or from a former domain but having a RID (the last part of the SID) lower than 1000.
Indeed, native privileged accounts have a SID lower than 1000.
A list of Well Known SID is referenced in the documentation below.
Identify the account, computer or group having these dangerous SID set in SID History, then clean it up by editing directly the SIDHistory attribute of the underlying AD object.
To remove the SIDHistory from a user account, run:
Get-ADUser USERNAME -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
For a group, run:
Get-ADGroup GROUPNAME -properties sidhistory | foreach {Set-ADGroup $_ -remove @{sidhistory=$_.sidhistory.value}}
For all users in a OU:
Get-ADUser -SearchBase "OU=Accounts,DC=mydomain,DC=com" -Filter {sidhistory -like '*'} -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
10 points if present
Documentation:https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/manage/understand-security-identifiers
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R15 [paragraph.3.3.1.5]
[FR]ANSSI - Accounts or groups with unexpected SID history (vuln2_sidhistory_dangerous)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
[MITRE]T1134.005 Access Token Manipulation: SID-History Injection
The SIDHistory detail can be found in User information and Computer information and a quick summary in SID History
| Domain |
|---|
| domain.local |
A-MinPwdLen
Description:The purpose is to verify if the password policy of the domain enforces users to have at least 8 characters in their password
Technical explanation:A check is performed to identify if the GPO regarding password policy allows less than 8 characters password. Short passwords represent a high risk because they can fairly easily be brute-forced or password sprayed. Most CERT and agencies advise for at least 8 characters (and often this number goes up to 12)
Advised solution:To solve the issue, the best way is to either remove the GPO enabling short password, or to modify it in order to increase the password length to at least 8 characters
Points:10 points if present
Documentation:https://www.microsoft.com/en-us/research/publication/password-guidance/
[FR]ANSSI - Privileged group members with weak password policy (vuln2_privileged_members_password)2
[MITRE]T1201 Password Policy Discovery
The detail can be found in Password policies
| GPO |
|---|
| Default Domain Policy |
A-DC-Spooler
Description:The purpose is to ensure that credentials cannot be extracted from the DC via its Print Spooler service
Technical explanation:When there's an account with unconstrained delegation configured (which is fairly common) and the Print Spooler service running on a computer, you can get that computers credentials sent to the system with unconstrained delegation as a user. With a domain controller, the TGT of the DC can be extracted allowing an attacker to reuse it with a DCSync attack and obtain all user hashes and impersonate them.
Advised solution:The Print Spooler service should be deactivated on domain controllers. Please note as a consequence that the Printer Pruning functionality (rarely used) will be unavailable.
Points:10 points if present
Documentation:https://adsecurity.org/?p=4056
https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory
[MITRE]T1187 Forced Authentication
The detail can be found in Domain controllers
| Domain controller |
|---|
| DC |
| DC2 |
| RODC |
S-OS-W10
Description:The purpose is to ensure that there is no use of non-supported version of Windows 10 or Windows 11 within the domain
Technical explanation:Some versions of Windows 10 and Windows 11 OS are no longer supported, and may be vulnerable to exploits that are not patched anymore.
Advised solution:In order to solve this security issue, you should upgrade all the Windows 10 or Windows 11 to a more recent version.
Use PingCastle.exe and select export on the main menu. Then choose to export computers. PingCastle will produce a list of all your computers with the OS version in a csv file. You can then use Excel to filter them.
Do note that you can get the full details regarding the OS used with the following PowerShell command: Get-ADComputer -Filter {(Enabled -eq $true) -and (OperatingSystem -Like "*Windows 10*")} -Property Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion | format-table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap -Auto
15 points if the occurence is greater than or equals than 15
then 10 points if the occurence is greater than or equals than 6
then 5 points if present
https://learn.microsoft.com/en-us/windows/release-health/release-information
[FR]ANSSI CERTFR-2005-INF-003
[MITRE]Mitre Att&ck - Mitigation - Update Software
The detail can be found in Operating Systems
| Version | Number | Active |
|---|---|---|
| Windows 10 22H2 | 1 | 0 |
| Windows 11 22H2 | 1 | 1 |
P-RODCAdminRevealed
Description:The purpose is to check if privileged users have already been revealed
Technical explanation:On Active Directory, all users revealed to a RODC are tracked by an attribute set on the computer object of the RODC named msDS-RevealedUsers.
The program checks on the list of revealed users if one of them is known as a privileged user.
Indeed, the RODC is caching the authentication secrets related of this user, which can then be used to impersonate it.
In addition to that, RODC are placed in general on more riskier environment.
The admin account should have its secrets change (a password reset) and be sure that the account will not be revealed anymore.
Points:5 points per discovery
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/8dfc81be-7461-48f2-8caf-07402bccb0ea
[FR]ANSSI - Privileged users revealed on RODC (vuln2_rodc_priv_revealed)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Domain controllers
| Domain controller | User |
|---|---|
| RODC | CN=DA,CN=Users,DC=domain,DC=local |
A-AnonymousAuthorizedGPO
Description:The purpose is to identify domains having a GPO which allows access to the domain without any account
Technical explanation:It is possible that domains are set to authorize connection without any account, which represents a security breach. It allows potential attackers to enumerate all the users and computers belonging to a domain, in order to identify very efficiently future weak targets.
It is possible to verify the results provided by the PingCastle solution by using a Kali Linux distribution. You should run [rpcclient -U '' -N target_ip_address] to finally type [enumdomusers].
In order to remove the anonymous access, we advise to identify the GPO indicated by the program and change the setting restrictanonymous and restrictanonymoussam
Points:5 points if present
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc963223%28v%3dtechnet.10%29
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/jj852184(v=ws.11%29
[US]STIG V-14798 - Directory data (outside the root DSE) of a non-public directory must be configured to prevent anonymous access.
[MITRE]T1110.003 Brute Force: Password Spraying
The detail can be found in Security settings
| GPO |
|---|
| Anonymous Stuff |
A-HardenedPaths
Description:The purpose is to ensure that there is no weakness related to hardened paths
Technical explanation:Two vulnerabilities have been reported in 2015 (MS15-011 and MS15-014) which allows a domain takeover via GPO modifications done with a man-in-the-middle attack.
To mitigate these vulnerabilites, Microsoft has designed a workaround named "Hardened Paths". It forces connection settings to enforce Integrity, Mutual Authentication or Privacy.
By default if this policy is empty, if will enforce Integrity and Mutual Authentication on the SYSVOL or NETLOGON shares.
This rule checks if there have been any overwrite to disable this protection.
You have to edit the Hardened Path section in the GPO.
This section is located in Computer Configuration/Policies/Administrative Templates/Network/Network Provider.
Check each value reported here and make sure that entries containing SYSVOL or NETLOGON have RequireIntegrity and RequireMutualAuthentication set to 1.
In addition to that, check entries having the pattern \\DCName\* and apply the same solution.
5 points if present
Documentation:
https://labs.withsecure.com/publications/how-to-own-any-windows-network-with-group-policy-hijacking-attacks
https://talubu.wordpress.com/2018/02/28/configuring-unc-hardened-access-through-group-policy/
https://adsecurity.org/?p=1405
https://support.microsoft.com/en-us/topic/ms15-011-vulnerability-in-group-policy-could-allow-remote-code-execution-february-10-2015-91b4bda2-945d-455b-ebbb-01d1ec191328
[US]STIG V-63577 - Hardened UNC Paths must be defined to require mutual authentication and integrity for at least the \\*\SYSVOL and \\*\NETLOGON shares.
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
The detail can be found in the Hardened Paths configuration section.
| GPO | Key | RequireIntegrity | RequireMutualAuthentication | RequirePrivacy |
|---|---|---|---|---|
| No GPO Found | NETLOGON | Not Set | Not Set | Not Set |
| No GPO Found | SYSVOL | Not Set | Not Set | Not Set |
S-OS-2012
Description:The purpose is to ensure that there is no use of the obsolete and vulnerable OS Windows Server 2012 for the workstations within the domain
Technical explanation:The Windows Server 2012 OS is no longer supported, as it is vulnerable to many publicly known exploits: Administrator's credentials can be captured, security protocols are weak, etc.
Advised solution:In order to solve this security issue, you should upgrade all the servers to a more recent version of Windows, starting from Windows Server 2012.
Use PingCastle.exe and select export on the main menu. Then choose to export computers. PingCastle will produce a list of all your computers with the OS version in a csv file. You can then use Excel to filter them.
Do note that you can get the full details regarding the OS used with the following PowerShell command: Get-ADComputer -Filter {(Enabled -eq $true) -and (OperatingSystem -Like "*Server 2012*")} -Property Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion | format-table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap -Auto
10 points if the occurence is greater than or equals than 15
then 5 points if the occurence is greater than or equals than 6
then 2 points if present
https://learn.microsoft.com/en-US/lifecycle/products/windows-server-2012-r2
[FR]ANSSI CERTFR-2005-INF-003
[MITRE]Mitre Att&ck - Mitigation - Update Software
The detail can be found in Operating Systems
S-PwdNeverExpires
Description:The purpose is to ensure that every account has a password which is compliant with password expiration policies
Technical explanation:Some accounts have passwords which never expire. Should an attacker compromise one of these accounts, he would be able to maintain long-term access to the Active Directory domain.
We have noted that some Linux servers, domain joined, are configured with a password which never expires.
This is a misconfiguration because a password change can be configured. It was however not the default on some plateform.
See one of the link below for more information.
In order to make Active Directory enforce periodic password change, accounts must not have the "Password never expires" flag set in the "Account" tab of the user properties. Their passwords should then be rolled immediately.
For service accounts, Windows provides the "managed service accounts" and "group managed service accounts" features to facilitate the automatic change of passwords.
Please note that there is a document in the section below which references solutions for service accounts of well known products.
Also Linux servers should be configured with automatic machine account change.
1 points if present
Documentation:https://adsecurity.org/?p=4115
https://access.redhat.com/discussions/1283873
[FR]ANSSI - Accounts with never-expiring passwords (vuln2_dont_expire)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information
| DN |
|---|
| CN=DA,CN=Users,DC=domain,DC=local |
| CN=NestedUser1,OU=Admin,DC=domain,DC=local |
| CN=TestUser1,OU=Admin,DC=domain,DC=local |
| CN=TestUser2,OU=Test1,OU=Testing,DC=domain,DC=local |
| CN=ShouldNotShow,OU=Test1,OU=Testing,DC=domain,DC=local |
| CN=TestUser3,OU=Testing,DC=domain,DC=local |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=TestUser1_BadSuc,OU=TestSubjects,OU=VulnerableTest-20250619-160707,OU=Testing,DC=domain,DC=local |
| CN=TestUser1_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser2_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser3_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser4_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser5_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser6_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser7_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser8_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser9_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser10_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser11_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser12_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser13_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser14_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser15_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser16_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser_NEA,OU=Testing,DC=domain,DC=local |
| CN=TestUser17_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser18_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| CN=MSOL_c92a2de74d9c,OU=Admin,DC=domain,DC=local |
| CN=Entra1,OU=Users,OU=Entra,DC=domain,DC=local |
| CN=PermTest1,OU=Admin,DC=domain,DC=local |
| CN=srv_si,OU=Admin,DC=domain,DC=local |
| CN=srv_sd,OU=Admin,DC=domain,DC=local |
| CN=srv_certsvc,OU=Admin,DC=domain,DC=local |
| CN=KerbRoast1,OU=Admin,DC=domain,DC=local |
| CN=AdminEmail,OU=Admin,DC=domain,DC=local |
| CN=Demo NoPriv,OU=Admin,DC=domain,DC=local |
| CN=domain user,OU=Admin,DC=domain,DC=local |
| CN=srv_na,OU=Admin,DC=domain,DC=local |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| CN=kerbdeleg3,OU=Admin,DC=domain,DC=local |
| CN=srv_recover,OU=Admin,DC=domain,DC=local |
| CN=NestedDA,OU=People,DC=domain,DC=local |
| CN=srv_AA,OU=Admin,DC=domain,DC=local |
| CN=AdminKerb1,OU=Admin,DC=domain,DC=local |
To reach Level 4 you need to fix the following rules:
T-SIDHistorySameDomain
Description:The purpose is to ensure that accounts are not linked for more privileged accounts in the same domain
Technical explanation:SID History is an attribute used in migration to link with a former account. It is not possible to have an account linked with an account belonging to the same domain. This can be analyzed by comparing the domain part of the SID History with the domain SID.
Advised solution:It is not possible to have this occurrence except if a user from domain A has been migrated to domain B and then migrated again to domain A. This should be strongly investigated as it may be linked to a compromise of the domain.
To remove the SIDHistory from a user account, run:
Get-ADUser USERNAME -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
For a group, run:
Get-ADGroup GROUPNAME -properties sidhistory | foreach {Set-ADGroup $_ -remove @{sidhistory=$_.sidhistory.value}}
For all users in a OU:
Get-ADUser -SearchBase "OU=Accounts,DC=mydomain,DC=com" -Filter {sidhistory -like '*'} -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
50 points if present
Documentation:[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R15 [paragraph.3.3.1.5]
[FR]ANSSI - Accounts or groups with SID history set (vuln3_sidhistory_present)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
[MITRE]T1134.005 Access Token Manipulation: SID-History Injection
The SIDHistory detail can be found in User information and Computer information and a quick summary in SID History
P-Delegated
Description:The purpose is to ensure that all Administrator Accounts have the configuration flag "this account is sensitive and cannot be delegated" (or are members of the built-in group "Protected Users" when your domain functional level is at least Windows Server 2012 R2).
Technical explanation:Without the flag "This account is sensitive and cannot be delegated" any account can be impersonated by some service account. It is a best practice to enforce this flag on administrators accounts.
Advised solution:To correct the situation, you should make sure that all your Administrator Accounts have the check-box "This account is sensitive and cannot be delegated" active or add your Administrator Accounts to the built-in group "Protected Users" if your domain functional level is at least Windows Server 2012 R2 (some functionalities may not work properly afterwards, you should check the official documentation).
If you want to enable the check-box "This account is sensitive and cannot be delegated" but this is not possible because the box is not present (typically for GMSA accounts), you can add the flag manually by adding the number 1048576 to the attribute useraccountcontrol of the account.
Please note that there is a section below in this report named "Admin Groups" which gives more information.
20 points if present
Documentation:[US]STIG V-36435 - Delegation of privileged accounts must be prohibited.
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Admin Groups
| DN | Reason |
|---|---|
| CN=srv_certsvc,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=Administrator,CN=Users,DC=domain,DC=local | Not a protected user |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=DA,CN=Users,DC=domain,DC=local | Not a protected user |
| CN=AdminKerb1,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_AA,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_recover,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_sd,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=ED_MERRILL,OU=People,DC=domain,DC=local | Not a protected user |
| CN=TestUser_NEA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=NestedDA,OU=People,DC=domain,DC=local | Not a protected user |
| CN=RUPERT_COMPTON,OU=ESM,OU=People,DC=domain,DC=local | Not a protected user |
S-PrimaryGroup
Description:The purpose is to check for unusual values in the primarygroupid attribute used to store group memberships
Technical explanation:In Active Directory, group membership is stored on the "members" attribute and on the "primarygroupid" attribute. The default primary group value is "Domain Users" for the users, "Domain Computers" for the computers and "Domain Controllers" for the domain controllers. The primarygroupid contains the RID (last digits of a SID) of the group targeted. It can be used to store hidden membership as this attribute is not often analyzed.
Advised solution:Unless strongly justified, change the primary group id to its default: 513 or 514 for users, 516 or 521 for domain controllers, 514 or 515 for computers. The primary group can be edited in a friendly manner by editing the account with the "Active Directory Users and Computers" and after selecting the "Member Of" tab, "set primary group".
You can use the following script to list Users with a primary group id different from domain users:
$DomainUsersSid = New-Object System.Security.Principal.SecurityIdentifier ([System.Security.Principal.WellKnownSidType]::AccountDomainUsersSid,(Get-ADDomain).DomainSID)
Get-ADUser -Filter * -Properties PrimaryGroup | Where-Object { $_.PrimaryGroup -ne (Get-ADGroup -Filter {SID -eq $DomainUsersSid} ).DistinguishedName } | Select-Object UserPrincipalName,PrimaryGroup
15 points if present
Documentation:[FR]ANSSI - Accounts with modified PrimaryGroupID (vuln3_primary_group_id_nochange)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information and Computer information
| DN |
|---|
| CN=CLARK_PEREZ,OU=GOO,OU=People,DC=domain,DC=local |
| CN=JANELL_ODONNELL,OU=Admin,DC=domain,DC=local |
A-BackupMetadata
Description:The purpose is to check if the backups are actually up to date in case they are needed. The alert can be triggered when a domain is backed up using non-recommended methods
Technical explanation:A verification is done on the backups, ensuring that the backup is performed according to Microsoft standards. Indeed, at each backup the DIT Database Partition Backup Signature is updated. If for any reasons, backups are needed to perform a rollback (rebuild a domain) or to track past changes, the backups will actually be up to date. This check is equivalent to a REPADMIN /showbackup *.
Advised solution:Plan AD backups based on Microsoft standards. These standards depend on the Operating System. For example with the wbadmin utility: wbadmin start systemstatebackup -backuptarget:d:
Points:15 points if the occurence is greater than or equals than 7
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/jj130668(v=ws.10)
[US]STIG V-25385 - Active Directory data must be backed up daily for systems with a Risk Management Framework categorization for Availability of moderate or high. Systems with a categorization of low must be backed up weekly.
[MITRE]Mitre Att&ck - Mitigation - Data Backup
The detail can be found in Backup
A-AuditDC
Description:The purpose is to ensure that the audit policy on domain controllers collects the right set of events.
Technical explanation:To detect and mitigate an attack, the right set of events need to be collected.
The audit policy is a compromise between too much and too few events to collect.
To solve this problem, the suggested audit policy from adsecurity.org is checked against the audit policy in place.
Identify the Audit settings to apply and fix them.
Be aware that there are two places for audit settings.
For "Simple" audit configuration:
in Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Audit Policies
For "Advanced" audit configuration:
in Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration
Also be sure that the audit GPO is applied to all domain controllers, as the underlying object may be in a OU where the GPO is not applied.
10 points if present
Documentation:https://adsecurity.org/?p=3299
https://adsecurity.org/?p=3377
[MITRE]Mitre Att&ck - Mitigation - Audit
The detail can be found in Audit settings
The table below shows the settings that were not found as configured in a GPO for a given domain controller.
| Type | Audit | Problem | Rationale | Domain controller |
|---|---|---|---|---|
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | DC |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | DC |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | DC |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | DC |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | DC |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | DC |
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | DC2 |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | DC2 |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | DC2 |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | DC2 |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | DC2 |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | DC2 |
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | RODC |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | RODC |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | RODC |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | RODC |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | RODC |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | RODC |
A-DC-Coerce
Description:The objective is to assess the vulnerability of the Domain Controller (DC) to Coerce attacks.
Technical explanation:Coerce attacks are a category of attacks which aims to forcing domain controllers to authenticate to a device controlled by the attacker for the purpose to relay this authentication to gain privileges.
This category of attacks is usually mitigated by applying patch (PetitPotam), disabling services (Spooler), added RPC filter (EDR or firewall) or ensuring integrity (SMB integrity).
Because each of these protections can be individually bypassed (NTLM integrity is disabled on LDAPS), the aim of this scan is to detect proactively if vulnerable RPC services are exposed.
PingCastle estimates that Coerceable interfaces are protected if:
- the GPO "Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers" is applied through a GPO to DC
- or if RPC interfaces are not reachable
Because these interfaces need to be tested from a computer controlled by the attacker, PingCastle cannot do this test with reliability.
Instead, it sends a malformed RPC packet to try to trigger an error such as "Permission denied" or "RPC interface unavailable".
If the error RPC_X_BAD_STUB_DATA (1783) is triggered, PingCastle considers that the interface is available.
A report that a vulnerable interface is online may not be accurate because its full exploitation is not tested.
Also to avoid EDR alerts or to not perform the scan, you can run PingCastle with the flag --skip-dc-rpc
To effectively mitigate the vulnerability, consider one of the following approaches:
1. Apply Group Policy Object (GPO) - "Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers":
Apply this GPO specifically to the Organizational Unit (OU) "Domain Controllers".
Caution: Enabling this GPO might impact services dependent on NTLM such as files copy Backups.
Consider setting the GPO in "Audit mode" initially to identify and assess the impact on affected services.
2. Enable RPC Filters in Windows Firewall:
Configure Windows Firewall to block specific Interface IDs associated with vulnerable RPC interfaces.
This is done using the netsh command. See the documentation links for more information.
Exercise caution: This method filters the entire interface, not specific Operation Numbers (OpNum).
Adjust exceptions for necessary services to ensure critical functionality.
3. Implement External Filters (e.g., EDR, Firewalls):
Leverage third-party solutions, such as Endpoint Detection and Response (EDR) tools or firewalls.
Notable project: rpcfirewall https://github.com/zeronetworks/rpcfirewall, offering logical filtering at the OpNum level.
Be cautious of potential impact and ensure compatibility with existing infrastructure.
10 points if present
Documentation:https://github.com/p0dalirius/Coercer
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-restrict-ntlm-outgoing-ntlm-traffic-to-remote-servers
https://blog.nviso.eu/2023/12/08/rpc-or-not-here-we-log-preventing-exploitation-and-abuse-with-rpc-firewall/
[MITRE]T1187 Forced Authentication
The detail can be found in Domain controllers
| DCName | IP | Interface | Function | OpNum |
|---|---|---|---|---|
| DC | 10.0.0.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 10.0.0.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC | 10.0.1.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 10.0.1.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC | 192.168.1.145 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 192.168.1.145 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC2 | 10.0.0.11 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC2 | 10.0.0.11 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| RODC | 10.0.0.56 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| RODC | 10.0.0.56 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
P-ProtectedUsers
Description:The purpose is to ensure that all privileged accounts are in the Protected User security group
Technical explanation:The Protected User group is a special security group which automatically applies protections to minimize credential exposure. Starting with Windows 8.1. Older Operating System must be updated to take this protection in account such as the Windows 7 KB2871997 patch.
For admins, it:
- Disables NTLM authentication
- Reduces Kerberos ticket lifetime
- Mandates strong encryption algorithms, such as AES
- Prevents password caching on workstations
- Prevents any type of Kerberos delegation
Please also note that a few links (see below) recommends that at least one account is kept outside of the group Protected Users in case there is a permission problem.
That's why this rule is not triggered if only one account is not protected.
After having reviewed the potential impact on adding users to this group, add the missing privileged accounts to this group.
Points:10 points if the occurence is greater than or equals than 2
Documentation:https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group
https://blog.netwrix.com/2015/02/20/add-sensitive-user-accounts-to-active-directory-protected-users-group/
https://dirteam.com/sander/2014/11/25/ten-things-you-need-to-be-aware-of-before-using-the-protected-users-group/
https://blog.andreas-schreiner.de/2018/09/07/active-directory-sicherheit-teil-1-privilegierte-benutzer/
[US]STIG V-78131 - Accounts with domain level administrative privileges must be members of the Protected Users group in domains with a domain functional level of Windows 2012 R2 or higher.
[FR]ANSSI CERTFR-2017-ALE-012
[FR]ANSSI - Privileged accounts outside of the Protected Users group (vuln3_protected_users)3
[MITRE]Mitre Att&ck - Mitigation - Privileged Process Integrity
The detail can be found in Admin Groups
| User |
|---|
| srv_certsvc |
| Administrator |
| srv_na_col |
| TestUser_DA |
| TestUser_EA |
| DA |
| AdminKerb1 |
| srv_AA |
| srv_recover |
| srv_sd |
| srv_1secure |
| ED_MERRILL |
| TestUser_NEA |
| NestedDA |
| RUPERT_COMPTON |
P-SchemaAdmin
Description:The purpose is to ensure that no account can make unexpected modifications to the schema
Technical explanation:The group "Schema Admins" is used to give permissions to alter the schema. Once a modification is performed on the schema such as new objects, it cannot be undone. This can result in a rebuild of the domain. The best practice is to have this group empty and to add an administrator when a schema update is required, then remove this group membership.
Advised solution:Remove the accounts or groups belonging to the "schema administrators" group.
Points:10 points if present
Documentation:[US]STIG V-72835 - Membership to the Schema Admins group must be limited
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R13 [subsection.3.2]
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
The detail can be found in Admin Groups
P-RODCAllowedGroup
Description:The purpose is to ensure that the Allowed RODC Password Replication Group group is empty.
Technical explanation:Accounts belonging to the Allowed RODC Password Replication Group group have their password hashes revealed on all RODCs.
Advised solution:This group should be emptied, and dedicated groups should only be added to the Password Replication Policy of each relevant RODC.
Points:5 points if present
Documentation:[FR]ANSSI - Dangerous configuration of replication groups for read-only domain controllers (RODCs) (allow) (vuln3_rodc_allowed_group)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| Member |
|---|
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=Admins,OU=Admin,DC=domain,DC=local |
| CN=DA,CN=Users,DC=domain,DC=local |
P-RODCNeverReveal
Description:The purpose is to ensure that the protection against revealing privileged group is active
Technical explanation:In addition to the group Denied RODC Password Replication Group there is a custom setting set for RODC in an attribute named msDS-NeverRevealGroup.
This rule checks the current value against the default one.
Check the value of the attribute msDS-NeverRevealGroup and the presence of the following expected groups:
- Administrators;
- Server Operators;
- Account Operators;
- Backup Operators;
- Denied RODC Password Replication Group
This can be managed in the Password Replication Policy tab of the computer object in the Active Directory Users and Computers console.
5 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/8dfc81be-7461-48f2-8caf-07402bccb0ea
[FR]ANSSI - Dangerous configuration of read-only domain controllers (RODC) (neverReveal) (vuln3_rodc_never_reveal)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Domain controllers
| Domain controller | Group |
|---|---|
| RODC | Administrators |
| RODC | Server Operators |
| RODC | Account Operators |
| RODC | Backup Operators |
| RODC | Denied RODC Password Replication Group |
A-DCLdapSign
Description:The purpose is to check if signing is really required for LDAP
Technical explanation:If the the request for signing of each LDAP request is not enforced, a man in the middle can be performed on an LDAP connection.
For example to add a user to the admin group.
This test is made by ignoring the local computer security policies.
Signature enforcement is done by setting the flag ISC_REQ_INTEGRITY when initializig the Negotiate / NTLM / Kerberos authentication.
The opposite test is made with the flag ISC_REQ_NO_INTEGRITY set.
PingCastle is testing if this setting is in place by performing a LDAP authentication with and without signature enforcement.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on a DC, the DC will not be tested.
You have to make sure that ALL LDAP clients are compatible with LDAP signature.
All versions of Windows since XP support this and also most of the Unix clients.
You have to follow the Microsoft article quoted in reference to enable LDAP signing.
This includes auditing the clients which are not compatible and instructions on how to enforce this policy.
5 points if present
Documentation:https://learn.microsoft.com/en-US/troubleshoot/windows-server/identity/enable-ldap-signing-in-windows-server
https://support.microsoft.com/en-us/topic/2020-2023-and-2024-ldap-channel-binding-and-ldap-signing-requirements-for-windows-kb4520412-ef185fb8-00f7-167d-744c-f299a66fc00a
https://github.com/zyn3rgy/LdapRelayScan
[MITRE]T1557 Man-in-the-Middle
| Domain controller |
|---|
| DC |
| DC2 |
| RODC |
S-DC-SubnetMissing
Description:The purpose is to ensure that the minimum set of subnet(s) has been configured in the domain
Technical explanation:When multiple sites are created in a domain, networks should be declared in the domain in order to optimize processes such as DC attribution. In addition, PingCastle can collect the information to be able to build a network map. This rule has been triggered because at least one domain controller has an IP address which was not found in subnet declaration. These IP addresses have been collected by querying the DC FQDN IP address in both IPv6 and IPv4 format.
Advised solution:Locate the IP address which was found as not being part of declared subnet, then add this subnet to the "Active Directory Sites" tool. If you have found IPv6 addresses and it was not expected, you should disable the IPv6 protocol on the network card.
Points:5 points if present
Documentation:[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
Details:The detail can be found in Domain controllers
| Domain controller | ip |
|---|---|
| DC | 192.168.1.145 |
A-CertEnrollHttp
Description:The purpose is to check if HTTP can be used to access the certificate enrollment interface
Technical explanation:The Windows PKI, also named Active Directory Certificate Services (ADCS), can be used to request certificates.
Two services can be used: Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
The certificates provided by these services can be used with Kerberos to login.
Because this service can deliver certificates for Domain Controllers, it can be considered as part of Tier 0.
As a legacy service, the mechanisms to prohibit credential relay are not enforced by default.
If an attacker is able to relay privileged credentials (for example with the PetitPotam attack), it can be used to take control of the domain.
PingCastle is looking for enrollment servers registered in the Active Directory (pKIEnrollmentService objects).
It then connects to the special page http://xxx/certsrv/certrqxt.asp and http://xxx/yyy_CES_Kerberos/services.svc and tries to access the page with authentication.
If the authentication succeed and no error is returned,the program considers the interface accessible.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on the server, the server will not be tested.
The access to certificate enrollment with HTTP should be disabled.
This can be achieved by opening the IIS console on the enrollment server.
If the service quoted in detail is WebEnrollment, the url is certsrv, else it is ending by CES_Keberos.
In the Binding setting (link at the right), keep the HTTPS binding and remove the HTTP binding.
See the link to KB5005413 in references for more information.
Note: By default, the CES service is not accessible by HTTP.
5 points if present
Documentation:https://support.microsoft.com/en-us/topic/kb5005413-mitigating-ntlm-relay-attacks-on-active-directory-certificate-services-ad-cs-3612b773-4043-4aa9-b23d-b87910cd3429
https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
https://www.vkernel.ro/blog/installing-and-configuring-cep-and-ces-for-certificate-enrolling-on-non-domain-joined-computers
[MITRE]T1557 Man-in-the-Middle
| Server | Service |
|---|---|
| DC.domain.local | WebEnrollment |
A-CertEnrollChannelBinding
Description:The purpose is to check if the Extended protection for HTTPS access to the certificate enrollment interface is in place
Technical explanation:The Windows PKI, also named Active Directory Certificate Services (ADCS), can be used to request certificates.
Two services can be used: Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
The certificates provided by these services can be used with Kerberos to login.
Because this service can deliver certificates for Domain Controller, it can be considered as part of Tier 0.
As a legacy service, the mechanisms to prohibit credential relay are not enforced by default.
If an attacker is able to relay privileged credentials (for example with the PetitPotam attack), it can be used to take control of the domain.
To avoid this attack with HTTPS, a feature named Channel Binding exists. It consists of passing to the authentication layer a property of the TLS channel (typically a hash of the server certificate) to bind the outer channel (TLS) and the inner channel (HTTP).
This protection is also called "Extended Protection". See rfc5929 for more details.
PingCastle is looking for enrollment servers registered in the Active Directory.
It then connect to the special page https://xxx/certsrv/certrqxt.asp and https://xxx/yyy_CES_Kerberos/service.svc
An authentication is attempted with and without Channel Binding.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on the server, the server will not be tested.
The Extended Protection for Authentication (EPA, also called Channel Binding) should be activated on the enrollment server.
This can be achieved by opening the IIS console on the enrollment server.
In the Authentcation settings, open the Advanced Settings for the Windows Authentication.
Set "Extended Protection" to "Required".
Do this operation for the Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
See the link to KB5005413 below for more information. This KB also suggest to restrict the authentication to Kerberos only.
5 points if present
Documentation:https://support.microsoft.com/en-us/topic/kb5005413-mitigating-ntlm-relay-attacks-on-active-directory-certificate-services-ad-cs-3612b773-4043-4aa9-b23d-b87910cd3429
https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[MITRE]T1557 Man-in-the-Middle
| Server | Service |
|---|---|
| DC.domain.local | WebEnrollment |
A-PreWin2000Other
Description:The purpose is checking that no additional account has been added to the "Pre-Windows 2000 Compatible Access" group
Technical explanation:The pre-Windows 2000 compatible access group grants access to some RPC calls which should not be available to users or computers.
Advised solution:Remove the members from the PreWin2000 group while making sure that the group "Authenticated Users" is present. Then reboot each DC.
Points:2 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/7a76a403-ed8d-4c39-adb7-a3255cab82c5
[FR]ANSSI - Use of the "Pre-Windows 2000 Compatible Access" group (vuln3_compatible_2000_not_default)3
[MITRE]T1110.003 Brute Force: Password Spraying
| DN |
|---|
| CN=DEVELOPMENT2026,CN=Computers,DC=domain,DC=local |
| CN=PC,CN=Computers,DC=domain,DC=local |
| CN=DC,OU=Domain Controllers,DC=domain,DC=local |
A-DnsZoneUpdate2
Description:DNS zones other than the primary domain zone are configured to accept anonymous updates, allowing any device to modify DNS records without authentication.
Technical explanation:Beyond the critical infrastructure zones checked by A-DnsZoneUpdate1, Active Directory typically hosts numerous additional DNS zones including reverse lookup zones (like 10.0.0.in-addr.arpa), application-specific zones, and subdomain zones. This rule examines all these secondary zones to identify those configured to accept nonsecure updates.
While these zones might seem less critical than your domain and _msdcs zones, they still present significant security risks when configured for nonsecure updates. Reverse lookup zones can be manipulated to bypass security controls that rely on PTR record validation. Application zones often contain service endpoints that, if hijacked, could redirect users to malicious services. Subdomain zones may host departmental or regional services that attackers could compromise.
The vulnerability exists when these zones are set to accept "nonsecure and secure" updates, meaning any network-connected device can modify records without proving its identity. This opens the door to DNS poisoning attacks, service hijacking, and reconnaissance activities that help attackers map your infrastructure.
Like its companion rule A-DnsZoneUpdate1, this check examines zones across all Active Directory partitions and filters out replication artifacts. Together, these two rules ensure complete coverage of your DNS security posture - with A-DnsZoneUpdate1 covering critical AD infrastructure and A-DnsZoneUpdate2 covering everything else.
To fix this vulnerability, configure all zones for secure-only updates:
GUI Method:
1. Open DNS Manager (dnsmgmt.msc)
2. Navigate to the affected zone
3. Right-click the zone → Properties → General tab
4. Change "Dynamic updates" from "Nonsecure and secure" to "Secure only"
PowerShell Method:
# Find all zones with insecure updates
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"}
# Fix a specific zone
Set-DnsServerPrimaryZone -Name "10.0.0.in-addr.arpa" -DynamicUpdate Secure -ComputerName DC01
# Fix all insecure zones
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"} | ForEach-Object {
Set-DnsServerPrimaryZone -Name $_.ZoneName -DynamicUpdate Secure -ComputerName DC01
}
Command Line Method:
# Local server
dnscmd /Config <ZoneName> /AllowUpdate 2
# Remote server
dnscmd <ServerName> /Config <ZoneName> /AllowUpdate 2
# Example
dnscmd DC01 /Config contoso.com /AllowUpdate 2
Note: Some zones may require nonsecure updates for DHCP or legacy systems. Document any exceptions.
1 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/f97756c9-3783-428b-9451-b376f877319a
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/dnscmd
[FR]ANSSI - Misconfigured DNS zones (vuln3_dnszone_bad_prop)3
[MITRE]T1557 Man-in-the-Middle
| Zone | Domain | DN | Partition |
|---|---|---|---|
| 0.0.10.in-addr.arpa | domain.local | DC=0.0.10.in-addr.arpa,CN=MicrosoftDNS,DC=DomainDnsZones,DC=domain,DC=local | DomainDnsZones |
| Forest-Test.local | domain.local | DC=Forest-Test.local,CN=MicrosoftDNS,DC=ForestDnsZones,DC=domain,DC=local | ForestDnsZones |
| test3.local | domain.local | DC=test3.local,CN=MicrosoftDNS,CN=System,DC=domain,DC=local | DefaultNamingContext |
A-AuditPowershell
Description:The purpose is to ensure that PowerShell logging is enabled.
Technical explanation:PowerShell is a powerful language, also used by hackers because of this quality. Hackers are able to run programs such as mimikatz in memory using obfuscated commands such as Invoke-Mimikatz.
Because there is no artefact on the disk, the incident response task is difficult for the forensic analysts.
For this reason, we recommend to enable PowerShell logging via a group policy, despite the fact that these security settings may be part of the workstation or server images.
Go to Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell
And enable "Turn on Module logging" and "Turn on PowerShell Script Block logging"
We recommend to set "*" as the module list.
Informative rule (0 point)
Documentation:https://adsecurity.org/?p=2604
https://learn.microsoft.com/en-us/powershell/scripting/wmf/whats-new/script-logging?view=powershell-6
[US]STIG V-68819 - PowerShell script block logging must be enabled
[MITRE]Mitre Att&ck - Mitigation - Audit
The detail can be found in Security settings
A-DsHeuristicsLDAPSecurity
Description:The purpose is to identify domains having mitigation for CVE-2021-42291 not set to enabled
Technical explanation:The way an Active Directory behaves can be controlled via the attribute DsHeuristics of CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration.
A parameter stored in its attribute and whose value is LDAPAddAutZVerifications and LDAPOwnerModify can be set to modify the mitigatation of CVE-2021-42291.
The KB5008383 has introduced changes to default security descriptor of Computer containers to add audit and limit computer creation without being admin.
Indeed, it is recommended to not let anyone create computer accounts as they can be used to abuse Kerberos or to perform relay attacks.
Mitigations in CVE-2021-42291 consist of 3 choices to be set on 2 settings.
They are named LDAPAddAutZVerifications and LDAPOwnerModify and are respectively the 28th and 29th character of this string.
For the expected values:
- With the value 0 (the default), it enables an additional audit mechanism
- With the value 1 (recommended), it enforces new security permissions, especially to require an action of the domain admin when unusual actions are performed
- With the value 2 (not recommended), it disables the audit mechanism that has been added by default and do not enable the new security permissions
The easiest and fastest way to correct this issue is to replace the 28th and 29th character of the DsHeuristics attribute.
The value of LDAPAddAutZVerifications and LDAPOwnerModify should be set to 1.
Open the procedure embedded into the KB5008383 to apply this mitigation and change the DsHeuristics value.
Note: You have to pay attention that there are control characters at the 10th and 20th position to avoid undesired changes of the DsHeuristics attribute.
Typically if the DsHeuristics is empty, the expected new value is 00000000010000000002000000011
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/e5899be4-862e-496f-9a38-33950617d2c5
https://support.microsoft.com/en-au/topic/kb5008383-active-directory-permissions-updates-cve-2021-42291-536d5555-ffba-4248-a60e-d6cbc849cde1
[FR]ANSSI - Dangerous dsHeuristics settings (vuln3_dsheuristics_bad)3
[MITRE]T1187 Forced Authentication
| Setting | Position | Value |
|---|---|---|
| LDAPAddAuthZVerifications | 28th | Not Set |
| LDAPOwnerModify | 29th | Not Set |
S-AesNotEnabled
Description:The purpose is to verify that AES is enabled for service accounts.
Technical explanation:The default encryption algorithm used by Kerberos is RC4, which directly utilizes the NTLM hash of the user’s password.
However, due to the rapid advancements in computing power, it’s recommended to transition from RC4 to the more secure AES algorithm.
Before disabling RC4, the first step is to enable AES.
It’s important to note that service accounts and user accounts with the ‘serviceprincipalname’ attribute (also known as SPN) need to be configured to support AES.
Without this configuration, AES will not be fully operational.
Accounts are listed if :
1) no password changed occured after the first DC Win 2008 install to initate AES secrets or
2) they have a SPN and the account is not flaged to use AES for encryption with msDS-SupportedEncryptionTypes
Also be advised that other checks must be performed before disabling RC4 (such as trust accounts, ...). A dedicated section in this report explores AES compatibility.
It is recommended to enable AES as an encryption algorithm in the user configuration dialog or in the "msDSSupportedEncryptionTypes" attribute at LDAP level.
It has to be enabled in the property of an account by checking all the boxes "This account supports Keberos AES XXX encryption".
For GMSA account, you have to manually edit the property msDS-SupportedEncryptionTypes
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/archive/blogs/openspecification/msds-supportedencryptiontypes-episode-1-computer-accounts
[FR]ANSSI - Service accounts supported encryption algorithms (vuln3_kerberos_properties_encryption)3
[MITRE]T1558.004 Steal or Forge Kerberos Tickets: AS-REP Roasting
The detail can be found in User information and Computer information
A-NoGPOLLMNR
Description:The purpose is to ensure that local name resolution protocol (LLMNR) cannot be used to collect credentials by performing a network attack
Technical explanation:LLMNR is a protocol which translates names such as foo.bar.com into an ip address. LLMNR has been designed to translate name locally in case the default protocol DNS is not available.
Regarding Active Directory, DNS is mandatory which makes LLMNR useless.
LLMNR exploits typo mistakes or faster response time to redirect users to a specially designed share, server or website.
Being trusted, this service will trigger the single sign on procedure which can be abused to retrieve the user credentials.
LLMNR is enabled by default on all OS except starting from Windows 10 v1903 and Windows Server v1903 where it is disabled.
Enable the GPO Turn off multicast name resolution and check that no GPO overrides this setting.
(if it is the case, the policy involved will be displayed below)
Informative rule (0 point)
Documentation:https://youtu.be/Fg2gvk0qgjM
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
The detail can be found in Security settings
To reach Level 5 you need to fix the following rules:
S-ADRegistration
Description:The purpose is to ensure that basic users cannot register extra computers in the domain
Technical explanation:By default, a basic user can register up to 10 computers within the domain. This default configuration represents a security issue as basic users shouldn't be able to create such accounts and this task should be handled by administrators.
If the value of the attribute ms-DS-MachineAccountQuota is not set (the program see this as "Infinite"), there is no limit to computer addition.
Note: this program checks also the GPO for SeMachineAccountPrivilege assignment. This assignment can be used to restrict the impact of the key ms-DS-MachineAccountQuota.
To solve the issue, limit the number of extra computers that can be registered by a basic user. It can be reduced by modifying the value of ms-DS-MachineAccountQuota to zero (0). Another solution can be to remove the "Authenticated Users" group in the domain controllers policy altogether. Do note, that if you need to set delegation to an account, so it can add computers to the domain, it can be done through 2 methods: Delegation in the OU or by assigning the SeMachineAccountPrivilege to a special group
Points:10 points if present
Documentation:https://learn.microsoft.com/troubleshoot/windows-server/identity/default-workstation-numbers-join-domain
http://prajwaldesai.com/allow-domain-user-to-add-computer-to-domain/
http://blog.backslasher.net/preventing-users-from-adding-computers-to-a-domain.html
[MITRE]Mitre Att&ck - Mitigation - User Account Management
[FR]ANSSI - Unrestricted domain join (vuln4_user_accounts_machineaccountquota)4
P-LogonDenied
Description:The purpose is to ensure that there is a tier isolation.
Technical explanation:A way to collect an administrator credential is to take control of a workstation or server in the unsecured tiers and expect that an administrator will connect to it.
An attack such as credential theft or Kerberos delegation is then performed.
To reduce the impact of such compromise, the best practice is to isolate components (such as admins, DC) in tiers.
Typically, a domain admin should not be allowed to connect to any workstation or lower tier server but login only to perform highly privileged operations on tier 0 systems.
To check for this policy, PingCastle looks at all GPOs and checks, if there is a GPO denying logon (SeDenyRemoteInteractiveLogonRight, SeDenyInteractiveLogonRight) of admins (Domain Admins or Administrators) to a specific scope.
False positives can occurs for this rule:
* if the expected GPO is hidden due to ACL checks
* if the targeted group is not "checked" when saving the GPO. Indeed, the group will be saved as is without a conversion to its technical name and it will prohibit a match if there are groups internationalized, aka renamed given a specific language.
As a consequence, only one deny policy on one group will fulfill this requirements. The program also does not check if the GPO is applied on an Organizational Unit or a Container.
Also this rule is enforced only if there are more than 200 users and 200 computers.
You should add a GPO to prohibit the logon of specific groups Domain Admins and Administrators.
The setting is located in Computer Policy -> Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment.
Then "Deny" logon locally and "Deny" logon through Remote Desktop Services.
1 points if present
Documentation:https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/plan/security-best-practices/appendix-f--securing-domain-admins-groups-in-active-directory
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
The detail can be found in GPO Login
T-AlgsAES
Description:The purpose is to check if AES can be used with Kerberos on trusts
Technical explanation:By default, RC4 is used as the signature algorithm on Kerberos tickets.
If AES is enabled on a domain and AES is not enabled on trust, AES tickets will not be usable on the trust. The Kerberos tickets sent to the trust will fail or the trusted domain will fallback to NTLM.
The encryption algorithms allowed for a trust are stored in an attribute named msDS-SupportedEncryptionTypes.
If this attribute is not set (or has a value of zero), RC4 will be applied by default.
Else, it defines the algorithm to use for Kerberos signature.
Enable AES on the domain.
Beware: there is a checkbox in the trust properties named "The other domain supports Kerberos AES Encryption".
If you enable this setting, AES will be enabled but RC4 will also be disabled.
The recommended way is to enable both RC4 and AES as a transition. It can be done by running the command:
ksetup /setenctypeattr mytrust.com RC4-HMAC-MD5 AES128-CTS-HMAC-SHA1-96 AES256-CTS-HMAC-SHA1-96
This way, the attribute msDS-SupportedEncryptionTypes of the trust will be modified to support both RC4 and AES.
1 points if present
Documentation:https://techcommunity.microsoft.com/t5/itops-talk-blog/tough-questions-answered-can-i-disable-rc4-etype-for-kerberos-on/ba-p/382718
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/6cfc7b50-11ed-4b4d-846d-6f08f0812919
https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/decrypting-the-selection-of-supported-kerberos-encryption-types/ba-p/1628797
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| Trust | Reason |
|---|---|
| child.domain.local | Not Configured |
S-DefaultOUChanged
Description:The purpose is to ensure that the default location of computers and user OU has not been changed.
Technical explanation:Default OU such as CN=Computers or CN=Users are stored within the wellKnownObjects attribute of the Domain object.
There are 12 default locations officialy defined.
They can be changed using the program redircmp.
Changing these default can alter the behavior of programs (such as security audit programs) as they may not check the modified objects.
You have to use redircmp to set the value back to normal. See documentation for more details
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/5a00c890-6be5-4575-93c4-8bf8be0ca8d8
https://rickardnobel.se/verify-redirected-computers-container-in-active-directory/
[MITRE]Mitre Att&ck - Mitigation - User Account Management
| Expected | Found |
|---|---|
| CN=Users,DC=domain,DC=local | OU=Admin,DC=domain,DC=local |
A-DnsZoneAUCreateChild
Description:The purpose is to check if Authenticated Users has the right to create DNS records
Technical explanation:When a computer is joined to a domain, a DNS record is created in the DnsZone to allow the computer to update its DNS settings.
By design, Microsoft choose to grant to the group Authenticated Users (aka every computers and users) the right to create DNS records.
Once created, only the owner keeps the right to edit the new object.
The vulnerability is that specific DNS records can be created to perform man-in-the-middle attacks.
One example is to create a wildcard record (a record with the name "*"), a failover DNS record or anticipating the creation of a DNS record with the right permissions.
As of today, this rule is considered "informative" because the default configuration where Authenticated Users can create DNS records is considered safe.
The reason for this classification is that no exploitation of that vulnerability has been reported.
The proposed enhancement is to replace the identity who has been granted the right to create DNS Records (permission CreateChild) from Authenticated Users to Domain Computers.
To perform this change, you have to edit the permission of the DNSZone whose object is located in the container CN=MicrosoftDNS,DC=DomainDnsZones.
It should be noticed that if there is a privilege escalation on a computer, an attacker can impersonate the computer account and bypass this mitigation.
The best mitigation is to create the DNS records manually as part as the domain join process and to revoke the permission granted to Authenticated Users.
Informative rule (0 point)
Documentation:https://www.ws-its.de/gegenmassnahme-zum-angriff-dns-wildcard/
https://www.netspi.com/blog/technical/network-penetration-testing/exploiting-adidns/
[MITRE]T1557 Man-in-the-Middle
| DNSZone |
|---|
| domain.local |
| 0.0.10.in-addr.arpa |
| _msdcs.domain.local |
| Forest-Test.local |
| test3.local |
P-UnprotectedOU
Description:The purpose is to ensure that Organizational Units (OUs) and Containers in Active Directory are protected to prevent accidental deletion, which could lead to data loss and disruptions in the network infrastructure.
Technical explanation:In Active Directory, Organizational Units can be protected from accidental deletion (reads: using the del key in the wrong place at the wrong time).
This way these objects cannot be deleted, unless the protection is removed. This Active Directory feature was first introduced in Windows Server 2008.
This protection consists of a Deny ACE added to the NTSecurityDescriptor attribute applied to Everyone with the flag set to Delete and DeleteTree.
To safeguard against accidental deletions, it is essential to enable the "Protect object from accidental deletion" option for critical OUs and Containers.
When this option is enabled, it adds an additional layer of security, preventing unintended deletions.
To implement this protection:
* Open the Active Directory Users and Computers management console.
* Locate the OU or Container that requires protection.
* Right-click on the OU or Container, select "Properties."
* In the "Object" tab, check the "Protect object from accidental deletion" option.
* Click "Apply" and then "OK" to save the changes.
You can list unprotected OU using the PowerShell command:
Get-ADOrganizationalUnit -filter {name -like "*"} -Properties ProtectedFromAccidentalDeletion | format-table Name,ProtectedFromAccidentalDeletion
and protect them using the command:
Get-ADOrganizationalUnit -filter {name -like "*"} -Properties ProtectedFromAccidentalDeletion | where {$_.ProtectedFromAccidentalDeletion -eq $false} | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion $true
Note: only 10 will be listed below. Checkout the Delegations section for the complete list.
Informative rule (0 point)
Documentation:https://dirteam.com/sander/2011/07/13/preventing-ous-and-containers-from-accidental-deletion/
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Delegations
| OU |
|---|
| OU=Domain Controllers,DC=domain,DC=local |
| OU=GPOTest,DC=domain,DC=local |
| OU=Systems,DC=domain,DC=local |
| OU=Clients,OU=Systems,DC=domain,DC=local |
| OU=Servers,OU=Systems,DC=domain,DC=local |
S-TerminalServicesGPO
Description:This rule verifies the recommended configuration for Terminal Services.
Technical explanation:It is a common practice for hackers to look for open sessions on remote servers.
This can be done by attempting to open the user registry and checking if there is an access denied error or if the registry hive is not available at all.
If found, the hacker can exploit this information by targeting this computer, or if the session is still active, hijack it and impact the client computer.
Indeed, you can access the local drive by default and push a malicious file such as a login script in the start menu of the remote user.
Another alternative is if the session is not secure, to capture the credentials in memory.
The printer redirection has no known attack pattern.
However due to past vulnerabilites with the Printer spooler, the complexity of the underlying protocol, the relative absence of need to this feature, we recommend to block it.
It can also be a bypass for copy / paste restriction and it is recommended to deny it in most admin bastion.
The Terminal Services configuration can be found in Policies / Administrative Templates / Windows Components / Remote Desktop Services / Remote Desktop Session Host
The details of this rule is located in Printer Redirection and Session Time Limits.
PingCastle recommends to set the following Policy:
Set time limit for disconnected sessions: 2h (aka MaxDisconnectionTime)
Set time limit for active but idle Remote Desktop Services sessions: 8h (aka MaxIdleTime)
Do not allow client printer redirection: Enabled (aka fDisableCpm)
This rule is active if nothing is set or if the time limit is set to NEVER.
Informative rule (0 point)
Documentation:https://woshub.com/remote-desktop-session-time-limit/
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-tsts/ce70794f-2138-43e8-bf6c-2c147887d6a2
https://community.spiceworks.com/t/are-redirected-printers-a-security-risk/826344/27
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| GPO | Reason |
|---|---|
| Windows default without an active GPO | MaxIdleTime is not set |
| Windows default without an active GPO | MaxDisconnectionTime is not set |
| Windows default without an active GPO | fDisableCpm is not set |
S-KerberosArmoringDC
Description:The purpose is to ensure that DC supports Kerberos armoring when functional level is at least Windows Server 2012
Technical explanation:Kerberos Armoring is an optimization of the Kerberos protocol. It avoids the pre-authentication steps and thereby prevents pre-authentication attacks.
It is supported only starting Windows Server 2012 DC and Windows 8 workstations.
If Kerberos Armoring is requested for other operating systems (such as Windows 7 or Linux), the Kerberos authentication protocol may refuse to work.
To enable Kerberos armoring for domain controllers, edit the GPO and go to Computer Configuration > Administrative Templates > System > KDC
then enable the policy "KDC support for claims, compound authentication and Kerberos armoring".
The policy should be set to at least "Supported".
The safest settings is "Fail authentication requests when Kerberos armoring is not available" but it should be enabled only if the clients support Kerberos armoring.
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831747(v=ws.11)
https://pupuweb.com/solved-how-enable-kerberos-armoring-eap-fast-ad/
[MITRE]T1558 Steal or Forge Kerberos Tickets
If activated, the detail can be found in Security settings
A-NoNetSessionHardening
Description:The purpose is to ensure that mitigations are in place against the Bloodhound tool
Technical explanation:By default, Windows computers allow any authenticated user to enumerate network sessions to it.
This means an attacker could enumerate network sessions to a file share hosting home directories or a Domain Controller to see who's connected to SYSVOL (to apply Group Policy) and determine which workstations each user and admin account is logged into.
Bloodhound uses this capability extensively to map out credentials in the network.
Disabling Net Session Enumeration removes the capability for any user to enumerate net session info (Recon).
If this mitigation is not part of the computer image, apply the following recommendations:
Run the NetCease PowerShell script (referenced below) on a reference workstation.
Open the Group Policy Management Console. Right-click the Group Policy object (GPO) that should contain the new preference item, and then click Edit .
In the console tree under Computer Configuration, expand the Preferences folder, and then expand the Windows Settings folder.
Right-click the Registry node, point to New, and select Registry Wizard.
Select the reference workstation on which the desired registry settings exist, then click Next .
Browse to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity\
and select the check box for “SrvsvcSessionInfo” from which you want to create a Registry preference item. Select the check box for a key only if you want to create a Registry item for the key rather than for a value within the key.
Click Finish.
The settings that you selected appear as preference items in the Registry Wizard Values collection
Informative rule (0 point)
Documentation:https://github.com/p0w3rsh3ll/NetCease
https://adsecurity.org/?p=3299
[MITRE]T1087.001 Account Discovery: Local Account
The detail can be found in Security settings
A-NoServicePolicy
Description:The purpose is to give information regarding a best practice for the Service Account password policy. Indeed, having a 20+ characters password for this account greatly helps reducing the risk of Kerberoasting attacks (offline cracking of the TGS tickets)
Note: PSO (Password Settings Objects) will be visible only if the user, which collected the information, has the permission to view it.
The rule is purely informative, as it gives insights regarding a best practice. It verifies if there is a GPO or PSO enforcing a 20+ characters password for the Service Accounts.
Advised solution: The recommended way to handle service accounts is to use "Managed service accounts" introduced since Windows Server 2008 R2 (search for "msDS-ManagedServiceAccount").
To solve the anomaly, you should implement a PSO or GPO password guarantying a 20+ length password.
Informative rule (0 point)
Documentation:https://www.microsoft.com/en-us/research/publication/password-guidance/
[MITRE]T1201 Password Policy Discovery
The detail can be found in Password Policies
To reach the maximum level you need to fix the following rules:
S-FirewallScript
Description:This rule verifies whether programs, such as script engines, are allowed to connect to the internet by default.
Technical explanation:Malicious scripts, often distributed via phishing emails, frequently attempt to connect to the internet to propagate their infection.
To mitigate this risk, we recommend implementing a set of firewall rules through Group Policy Objects (GPOs).
These rules will prohibit direct internet connections for specific programs.
The current list of programs to restrict includes: wscript.exe, mshta.exe, cscript.exe, conhost.exe, and runScriptHelper.exe.
1) Create Firewall Rules via GPO
Configure the firewall rules under Computer Configuration / Policies / Windows Settings / Security Settings / Windows Defender Firewall with Advanced Security.
Ensure the rules are applied on the Outbound side.
Activate the rules.
2) Network Restrictions:
We recommend setting the rules as active for the following IP address ranges to allow local network access:
0.0.0.0 to 9.255.255.255
11.0.0.0 to 126.255.255.255
128.0.0.1 to 172.15.255.255
172.32.0.0 to 192.167.255.255
192.169.0.0 to 255.255.255.255
Alternatively, you can choose to apply the rules to ALL IP addresses or add your internal proxy IP.
Informative rule (0 point)
Documentation:https://medium.com/@cryps1s/endpoint-isolation-with-the-windows-firewall-462a795f4cfb
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Firewall configuration
| Program | Reason |
|---|---|
| wscript.exe | No Firewall rules found |
| mshta.exe | No Firewall rules found |
| cscript.exe | No Firewall rules found |
| conhost.exe | No Firewall rules found |
| runScriptHelper.exe | No Firewall rules found |
S-DefenderASR
Description:This rule confirms the activation of Defender ASR (Attack Surface Reduction) mitigations within a Group Policy Object (GPO).
Technical explanation:Microsoft Defender, the default antivirus included with Windows, activates automatically on systems without a pre-installed alternative.
Defender’s ASR features, designed to minimize vulnerability to attacks, are available even in the standard version.
These protections have been part of Windows since the release of Windows 10 version 1710 and are also applicable to Windows Server 2012 R2.
Note: Windows 11 may enable in some conditions those 3 ASR rules: Block abuse of exploited vulnerable signed drivers, Block credential stealing from the Windows local security authority subsystem (lsass.exe), Block persistence through WMI event subscription
To apply an ASR mitigation, navigate to the GPO setting "Configure Attack Surface Reduction rules" found under Computer Configuration > Policies > Administrative Templates > Windows Components > Microsoft Defender Antivirus (formerly Windows Defender Antivirus) > Microsoft (Windows) Defender Exploit Guard > Attack Surface Reduction.
Upon enabling this setting, select "Set the state for each ASR rule".
Then, input the mitigation’s GUID as the Value name and assign 1 as the Value to enforce the rule in Block mode.
Other configurable values include 2 for Audit mode and 6 for Warn mode.
For instance, to block JavaScript or VBScript from executing downloaded executable content, use the GUID: d3e037e1-3eb8-44c8-a917-57927947596d.
It is recommended to set Defender ASR rules as recommended in the article below.
Prior to implementation, conduct an impact analysis to anticipate any potential disruptions, and utilize Audit mode to identify possible issues.
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/defender-endpoint/attack-surface-reduction-rules-reference?view=o365-worldwide#per-asr-rule-alert-and-notification-details
https://blog.palantir.com/microsoft-defender-attack-surface-reduction-recommendations-a5c7d41c3cf8
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Defender ASR
| Guid | Label | Reason |
|---|---|---|
| 7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c | Block Adobe Reader from creating child processes | Not found - Block or Warn recommended |
| 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2 | Block credential stealing from the Windows local security authority subsystem (lsass.exe) | Not found - Block or Warn recommended |
| be9ba2d9-53ea-4cdc-84e5-9b1eeee46550 | Block executable content from email client and webmail | Not found - Block or Warn recommended |
| d3e037e1-3eb8-44c8-a917-57927947596d | Block JavaScript or VBScript from launching downloaded executable content | Not found - Block or Warn recommended |
| 3b576869-a4ec-4529-8536-b80a7769e899 | Block Office applications from creating executable content | Not found - Block or Warn recommended |
| e6db77e5-3df2-4cf1-b95a-636979351e5b | Block persistence through WMI event subscription | Not found - Block or Warn recommended |
| b2b3f03d-6a65-4f7b-a9c7-1c7ef74a9ba4 | Block untrusted and unsigned processes that run from USB | Not found - Block or Warn recommended |
| 56a863a9-875e-4185-98a7-b882c64b5ce5 | Block abuse of exploited vulnerable signed drivers | Not found - Block or Warn recommended |
| 75668c1f-73b5-4cf0-bb93-3ecf5cb7cc84 | Block Office applications from injecting code into other processes | Not found - Audit recommended |
| 92e97fa1-2edf-4476-bdd6-9dd0b4dddc7b | Block Win32 API calls from Office macros | Not found - Audit recommended |
| d4f940ab-401b-4efc-aadc-ad5f3c50688a | Block all Office applications from creating child processes | Not found - Audit recommended |
| 5beb7efe-fd9a-4556-801d-275e5ffc04cc | Block execution of potentially obfuscated scripts | Not found - Audit recommended |
| 01443614-cd74-433a-b99e-2ecdc07bfc25 | Block executable files from running unless they meet a prevalence, age, or trusted list criterion | Not found - Audit recommended |
| c1db55ab-c21a-4637-bb3f-a12568109d35 | Use advanced protection against ransomware | Not found - Audit recommended |
| d1e49aac-8f56-4280-b9ba-993a6d77406c | Block process creations originating from PSExec and WMI commands | Not found - Audit recommended |
| 26190899-1602-49e8-8b27-eb1d0a1ce869 | Block Office communication application from creating child processes | Not found - Audit recommended |
| 33ddedf1-c6e0-47cb-833e-de6133960387 | Block rebooting machine in Safe Mode (preview) | Not found - Audit recommended |
| c0033c00-d16d-4114-a5a0-dc9b3a7d2ceb | Block use of copied or impersonated system tools (preview) | Not found - Audit recommended |
S-FolderOptions
Description:The objective is to ensure scripts do not automatically execute upon opening by default.
Technical explanation:By default, PowerShell scripts (.ps1) open in Notepad, which blocks these extensions from being exploited in phishing attacks that evade email filters through multi-layered archives.
However, several legacy script extensions (.js, .jse, .vbs, .vbe, .vb, .wsh, .wsf) still execute with their respective engines.
While .js and .jse files are commonly associated with web content and handled by browsers, it’s crucial to recognize their potential for harm when executed directly in Windows.
Redirecting these files to open in Notepad safeguards against inadvertent execution without affecting web browsing.
The browser navigation is not impacted by this recommendation.
Review is recommended for other script files before implementing this security measure.
Note: Javascript execution can be mitigated by an "Attack surface reduction rule" named "Impede JavaScript and VBScript to launch executables" available since Windows 10, version 1709.
But we still recommend to apply the folder options mitigation as it is more effective.
Navigate to Computer Configuration > Preferences > Control Panel Settings > Folder Options.
Create a new File Type with the "Replace" action for the extension you wish to secure.
In "Configure class settings", add a new "open" action with Notepad as the default application: C:\Windows\System32\notepad.exe.
Informative rule (0 point)
Documentation:https://isc.sans.edu/diary/Controlling+JavaScript+Malware+Before+it+Runs/21171
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Folder Options
| Extension | Reason |
|---|---|
| js | Not found in Folder Options |
| vbs | Not found in Folder Options |
| vbe | Not found in Folder Options |
| vb | Not found in Folder Options |
| wsh | Not found in Folder Options |
| wsf | Not found in Folder Options |
A-DCLdapsProtocolAdvanced
Description:The purpose is to ensure that all DC are using the most advanced protocols when acting as server.
Technical explanation:TLS 1.0 and TLS 1.1 are no longer recommended to use, even if there is no pratical attack to could lead to an immediate compromise of the DC.
The SChannel component needs to be tuned in order to not propose these protocols. Many guidelines to handle this problem issued by Microsoft do not talk about SChannel but rather IIS. These guidlines are quoted in the documentation section below.
PingCastle is able to check the SSL version if LDAPS is exposed. LDAPS is automatically exposed once a certificate is available for the DC and the service restarted.
Please note that PingCastle is using the native .Net SSL stack to perform this test. .Net begins to ignore these weak protocols starting the version 4.7 of the framework and as a consequence, PingCasle may miss some weak protocol detection.
To test for these protocols, you can use a version of openssl with the deprecated protocols still compiled in, e.g. openssl-unsafe from Kali Linux, with the following commands:
openssl-unsafe s_client -connect dc.domain.local:636 -tls1
openssl-unsafe s_client -connect dc.domain.local:636 -tls1_1
Apply Windows updates and registry tweaks described in the documentation section to use Tls 1.2 and later.
Informative rule (0 point)
Documentation:https://support.microsoft.com/en-us/topic/kb5017811-manage-transport-layer-security-tls-1-0-and-1-1-after-default-behavior-change-on-september-20-2022-e95b1b47-9c7c-4d64-9baf-610604a64c3e
https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls#configuring-schannel-protocols-in-the-windows-registry
[MITRE]T1600.001 Weaken Encryption: Reduce Key Space
The detail can be found in Domain controllers
| DC | Protocol |
|---|---|
| DC | Tls |
| DC | Tls11 |
| DC2 | Tls |
| RODC | Tls |
| RODC | Tls11 |
A-RootDseAnonBinding
Description:The purpose is to ensure that Anonymous Binding on RootDse is not enabled
Technical explanation:The rootDse is a special object that enables clients to discover the functionalities of the server, such as LDAP version or support for special processing.
On Windows, it can be accessed by default without binding, which allows everyone to access this data.
There is no confidential data in this attribute, only the Operating System version and the name of the domain.
Since Windows 2019, the rootDse access can be set to require authentication.
You can test the anonymous access of the rootDse object by launching ldp.exe and selecting 'Connect' on the Connection menu.
You should receive the error "The server has been configured to deny unauthenticated simple binds."
Edit the attribute msDS-Other-Settings of the object CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration.
Add a new line with the content: DenyUnauthenticatedBind=1
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/3f0137a1-63df-400c-bf97-e1040f055a99
https://blog.lithnet.io/2018/12/disabling-unauthenticated-binds-in.html
[MITRE]T1018 Remote System Discovery
This section represents an evaluation of the techniques available in the MITRE ATT&CK®
No technique matched
1 technique(s) matched
1 technique(s) matched
1 technique(s) matched
8 technique(s) matched
4 technique(s) matched
No technique matched
No technique matched
Execution
P-DisplaySpecifier
Description:The purpose is to ensure that scripts used for the customization of admin UI are stored safely
Technical explanation:DisplaySpecifier are Active Directory objects stored in the DisplaySpecifier container of the Configuration naming context.
They are used to customize the user interface.
Specifically the attribute adminContextMenu is used to customize administration actions, where COM objects or scripts can be called.
If the script is stored outside the SYSVOL directory, it can be used to execute custom actions and it is run under the administrator context.
The scripts identified by this rule should be moved to the SYSVOL and properly secured.
Points:10 points if present
Documentation:https://www.semperis.com/blog/active-directory-security-abusing-display-specifiers/
https://learn.microsoft.com/en-us/windows/win32/ad/display-specifiers
[FR]ANSSI - Dangerous Display Specifiers (vuln1_display_specifier)1
[MITRE]T1569 System Services
| DN | Path | Changed |
|---|---|---|
| CN=domainDNS-Display,CN=407,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=407,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=414,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=414,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=404,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=404,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40E,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40E,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=408,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=408,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=413,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=413,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=409,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=409,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=410,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=410,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41D,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41D,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=C0A,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=C0A,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=415,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=415,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=405,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=405,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=411,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=411,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41F,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41F,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40B,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40B,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=416,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=416,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=406,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=406,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=412,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=412,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=804,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=804,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40C,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40C,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=816,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=816,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
Privilege Escalation
T1134.005 Access Token Manipulation: SID-History Injection [2]
T-SIDHistorySameDomain
Description:The purpose is to ensure that accounts are not linked for more privileged accounts in the same domain
Technical explanation:SID History is an attribute used in migration to link with a former account. It is not possible to have an account linked with an account belonging to the same domain. This can be analyzed by comparing the domain part of the SID History with the domain SID.
Advised solution:It is not possible to have this occurrence except if a user from domain A has been migrated to domain B and then migrated again to domain A. This should be strongly investigated as it may be linked to a compromise of the domain.
To remove the SIDHistory from a user account, run:
Get-ADUser USERNAME -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
For a group, run:
Get-ADGroup GROUPNAME -properties sidhistory | foreach {Set-ADGroup $_ -remove @{sidhistory=$_.sidhistory.value}}
For all users in a OU:
Get-ADUser -SearchBase "OU=Accounts,DC=mydomain,DC=com" -Filter {sidhistory -like '*'} -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
50 points if present
Documentation:[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R15 [paragraph.3.3.1.5]
[FR]ANSSI - Accounts or groups with SID history set (vuln3_sidhistory_present)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
[MITRE]T1134.005 Access Token Manipulation: SID-History Injection
The SIDHistory detail can be found in User information and Computer information and a quick summary in SID History
T-SIDHistoryDangerous
Description:The purpose is to ensure that the dangerous SID are not stored in the SIDHistory attribute.
Technical explanation:SID History is an attribute used in migration to link with a former account.
This rule checks for SID not coming from a former domain (such as SYSTEM) or from a former domain but having a RID (the last part of the SID) lower than 1000.
Indeed, native privileged accounts have a SID lower than 1000.
A list of Well Known SID is referenced in the documentation below.
Identify the account, computer or group having these dangerous SID set in SID History, then clean it up by editing directly the SIDHistory attribute of the underlying AD object.
To remove the SIDHistory from a user account, run:
Get-ADUser USERNAME -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
For a group, run:
Get-ADGroup GROUPNAME -properties sidhistory | foreach {Set-ADGroup $_ -remove @{sidhistory=$_.sidhistory.value}}
For all users in a OU:
Get-ADUser -SearchBase "OU=Accounts,DC=mydomain,DC=com" -Filter {sidhistory -like '*'} -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
10 points if present
Documentation:https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/manage/understand-security-identifiers
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R15 [paragraph.3.3.1.5]
[FR]ANSSI - Accounts or groups with unexpected SID history (vuln2_sidhistory_dangerous)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
[MITRE]T1134.005 Access Token Manipulation: SID-History Injection
The SIDHistory detail can be found in User information and Computer information and a quick summary in SID History
| Domain |
|---|
| domain.local |
Defense Evasion
T1600.001 Weaken Encryption: Reduce Key Space [1]
A-DCLdapsProtocolAdvanced
Description:The purpose is to ensure that all DC are using the most advanced protocols when acting as server.
Technical explanation:TLS 1.0 and TLS 1.1 are no longer recommended to use, even if there is no pratical attack to could lead to an immediate compromise of the DC.
The SChannel component needs to be tuned in order to not propose these protocols. Many guidelines to handle this problem issued by Microsoft do not talk about SChannel but rather IIS. These guidlines are quoted in the documentation section below.
PingCastle is able to check the SSL version if LDAPS is exposed. LDAPS is automatically exposed once a certificate is available for the DC and the service restarted.
Please note that PingCastle is using the native .Net SSL stack to perform this test. .Net begins to ignore these weak protocols starting the version 4.7 of the framework and as a consequence, PingCasle may miss some weak protocol detection.
To test for these protocols, you can use a version of openssl with the deprecated protocols still compiled in, e.g. openssl-unsafe from Kali Linux, with the following commands:
openssl-unsafe s_client -connect dc.domain.local:636 -tls1
openssl-unsafe s_client -connect dc.domain.local:636 -tls1_1
Apply Windows updates and registry tweaks described in the documentation section to use Tls 1.2 and later.
Informative rule (0 point)
Documentation:https://support.microsoft.com/en-us/topic/kb5017811-manage-transport-layer-security-tls-1-0-and-1-1-after-default-behavior-change-on-september-20-2022-e95b1b47-9c7c-4d64-9baf-610604a64c3e
https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls#configuring-schannel-protocols-in-the-windows-registry
[MITRE]T1600.001 Weaken Encryption: Reduce Key Space
The detail can be found in Domain controllers
| DC | Protocol |
|---|---|
| DC | Tls |
| DC | Tls11 |
| DC2 | Tls |
| RODC | Tls |
| RODC | Tls11 |
Credential Access
T1003.004 OS Credential Dumping: LSA Secrets [1]
P-ServiceDomainAdmin
Description:The purpose is to check for accounts with non-expiring passwords in the "Domain Administrator" group
Technical explanation:PingCastle is checking accounts with never expiring password, that are mostly used as service accounts.
"Service Accounts" can imply a high security risk as their password are stored in clear text in the LSA database, which can then be easily exploited using Mimikatz or Cain&Abel for instance. In addition, their passwords don't change and can be used in Kerberoast attacks.
Accounts with never expiring passwords are mostly service accounts.
To mitigate the security risk, it is strongly advised to lower the privileges of the "Service Accounts", meaning that they should be removed from the "Domain Administrator" group, while ensuring that the password of each and every "Service Account" is longer than 20 characters
15 points if the occurence is greater than or equals than 2
Documentation:[US]STIG V-36432 - Membership to the Domain Admins group must be restricted to accounts used only to manage the Active Directory domain and domain controllers.
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R11 [subsection.2.5]
[FR]ANSSI - Privileged accounts with never-expiring passwords (vuln1_dont_expire_priv)1
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
[MITRE]T1003.004 OS Credential Dumping: LSA Secrets
The detail can be found in Admin Groups
| DN |
|---|
| CN=srv_AA,OU=Admin,DC=domain,DC=local |
| CN=srv_recover,OU=Admin,DC=domain,DC=local |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| CN=srv_sd,OU=Admin,DC=domain,DC=local |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| CN=DA,CN=Users,DC=domain,DC=local |
| CN=NestedDA,OU=People,DC=domain,DC=local |
T1110.003 Brute Force: Password Spraying [2]
A-AnonymousAuthorizedGPO
Description:The purpose is to identify domains having a GPO which allows access to the domain without any account
Technical explanation:It is possible that domains are set to authorize connection without any account, which represents a security breach. It allows potential attackers to enumerate all the users and computers belonging to a domain, in order to identify very efficiently future weak targets.
It is possible to verify the results provided by the PingCastle solution by using a Kali Linux distribution. You should run [rpcclient -U '' -N target_ip_address] to finally type [enumdomusers].
In order to remove the anonymous access, we advise to identify the GPO indicated by the program and change the setting restrictanonymous and restrictanonymoussam
Points:5 points if present
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc963223%28v%3dtechnet.10%29
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/jj852184(v=ws.11%29
[US]STIG V-14798 - Directory data (outside the root DSE) of a non-public directory must be configured to prevent anonymous access.
[MITRE]T1110.003 Brute Force: Password Spraying
The detail can be found in Security settings
| GPO |
|---|
| Anonymous Stuff |
A-PreWin2000Other
Description:The purpose is checking that no additional account has been added to the "Pre-Windows 2000 Compatible Access" group
Technical explanation:The pre-Windows 2000 compatible access group grants access to some RPC calls which should not be available to users or computers.
Advised solution:Remove the members from the PreWin2000 group while making sure that the group "Authenticated Users" is present. Then reboot each DC.
Points:2 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/7a76a403-ed8d-4c39-adb7-a3255cab82c5
[FR]ANSSI - Use of the "Pre-Windows 2000 Compatible Access" group (vuln3_compatible_2000_not_default)3
[MITRE]T1110.003 Brute Force: Password Spraying
| DN |
|---|
| CN=DEVELOPMENT2026,CN=Computers,DC=domain,DC=local |
| CN=PC,CN=Computers,DC=domain,DC=local |
| CN=DC,OU=Domain Controllers,DC=domain,DC=local |
T1187 Forced Authentication [4]
A-DC-Spooler
Description:The purpose is to ensure that credentials cannot be extracted from the DC via its Print Spooler service
Technical explanation:When there's an account with unconstrained delegation configured (which is fairly common) and the Print Spooler service running on a computer, you can get that computers credentials sent to the system with unconstrained delegation as a user. With a domain controller, the TGT of the DC can be extracted allowing an attacker to reuse it with a DCSync attack and obtain all user hashes and impersonate them.
Advised solution:The Print Spooler service should be deactivated on domain controllers. Please note as a consequence that the Printer Pruning functionality (rarely used) will be unavailable.
Points:10 points if present
Documentation:https://adsecurity.org/?p=4056
https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory
[MITRE]T1187 Forced Authentication
The detail can be found in Domain controllers
| Domain controller |
|---|
| DC |
| DC2 |
| RODC |
A-DC-Coerce
Description:The objective is to assess the vulnerability of the Domain Controller (DC) to Coerce attacks.
Technical explanation:Coerce attacks are a category of attacks which aims to forcing domain controllers to authenticate to a device controlled by the attacker for the purpose to relay this authentication to gain privileges.
This category of attacks is usually mitigated by applying patch (PetitPotam), disabling services (Spooler), added RPC filter (EDR or firewall) or ensuring integrity (SMB integrity).
Because each of these protections can be individually bypassed (NTLM integrity is disabled on LDAPS), the aim of this scan is to detect proactively if vulnerable RPC services are exposed.
PingCastle estimates that Coerceable interfaces are protected if:
- the GPO "Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers" is applied through a GPO to DC
- or if RPC interfaces are not reachable
Because these interfaces need to be tested from a computer controlled by the attacker, PingCastle cannot do this test with reliability.
Instead, it sends a malformed RPC packet to try to trigger an error such as "Permission denied" or "RPC interface unavailable".
If the error RPC_X_BAD_STUB_DATA (1783) is triggered, PingCastle considers that the interface is available.
A report that a vulnerable interface is online may not be accurate because its full exploitation is not tested.
Also to avoid EDR alerts or to not perform the scan, you can run PingCastle with the flag --skip-dc-rpc
To effectively mitigate the vulnerability, consider one of the following approaches:
1. Apply Group Policy Object (GPO) - "Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers":
Apply this GPO specifically to the Organizational Unit (OU) "Domain Controllers".
Caution: Enabling this GPO might impact services dependent on NTLM such as files copy Backups.
Consider setting the GPO in "Audit mode" initially to identify and assess the impact on affected services.
2. Enable RPC Filters in Windows Firewall:
Configure Windows Firewall to block specific Interface IDs associated with vulnerable RPC interfaces.
This is done using the netsh command. See the documentation links for more information.
Exercise caution: This method filters the entire interface, not specific Operation Numbers (OpNum).
Adjust exceptions for necessary services to ensure critical functionality.
3. Implement External Filters (e.g., EDR, Firewalls):
Leverage third-party solutions, such as Endpoint Detection and Response (EDR) tools or firewalls.
Notable project: rpcfirewall https://github.com/zeronetworks/rpcfirewall, offering logical filtering at the OpNum level.
Be cautious of potential impact and ensure compatibility with existing infrastructure.
10 points if present
Documentation:https://github.com/p0dalirius/Coercer
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-restrict-ntlm-outgoing-ntlm-traffic-to-remote-servers
https://blog.nviso.eu/2023/12/08/rpc-or-not-here-we-log-preventing-exploitation-and-abuse-with-rpc-firewall/
[MITRE]T1187 Forced Authentication
The detail can be found in Domain controllers
| DCName | IP | Interface | Function | OpNum |
|---|---|---|---|---|
| DC | 10.0.0.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 10.0.0.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC | 10.0.1.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 10.0.1.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC | 192.168.1.145 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 192.168.1.145 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC2 | 10.0.0.11 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC2 | 10.0.0.11 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| RODC | 10.0.0.56 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| RODC | 10.0.0.56 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
P-UnconstrainedDelegation
Description:This rule identifies accounts configured with Kerberos unconstrained delegation, a high-risk setting that allows a compromised service to impersonate any domain user and potentially lead to full domain compromise.
Technical explanation:Kerberos unconstrained delegation allows a service to reuse a user’s Ticket Granting Ticket (TGT) to authenticate to any service in the domain. If the delegated account is compromised, cached TGTs can be extracted and used to impersonate any authenticating user.
If a privileged account or a Domain Controller authenticates to such a service, potentially via forced authentication techniques, the attacker can escalate privileges and compromise the entire domain. Disabling the account does not remove this risk, as delegation settings persist and become active again if the account is re-enabled.
Kerberos unconstrained delegation should be removed wherever it is configured. If delegation is required, it must be replaced with Kerberos constrained delegation.
Step 1: Remove Unconstrained Delegation
Remove the ability for the account to delegate credentials to any service.
Computer accounts
Set-ADComputer -Identity
User accounts
Set-ADUser -Identity
Step 2: Configure Constrained Delegation (Only If Required)
If an application requires delegation:
1. Open Active Directory Users and Computers
2. Open the account properties
3. Go to the Delegation tab
4. Select “Trust this computer for delegation to specified services only”
5. Select “Use Kerberos only”
6. Add only the specific services that are required for the application
Do not enable delegation if it is not strictly necessary.
5 points per discovery
Documentation:https://learn.microsoft.com/en-us/archive/blogs/389thoughts/get-rid-of-accounts-that-use-kerberos-unconstrained-delegation
https://adsecurity.org/?p=1667
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R18 [subsubsection.3.3.2]
[FR]ANSSI - Unconstrained authentication delegation (vuln2_delegation_t4d)2
[MITRE]T1187 Forced Authentication
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information and Computer information
| DN | Name |
|---|---|
| CN=kerbdeleg1,OU=Admin,DC=domain,DC=local | kerbdeleg1 |
| CN=kerbdeleg3,OU=Admin,DC=domain,DC=local | kerbdeleg3 |
A-DsHeuristicsLDAPSecurity
Description:The purpose is to identify domains having mitigation for CVE-2021-42291 not set to enabled
Technical explanation:The way an Active Directory behaves can be controlled via the attribute DsHeuristics of CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration.
A parameter stored in its attribute and whose value is LDAPAddAutZVerifications and LDAPOwnerModify can be set to modify the mitigatation of CVE-2021-42291.
The KB5008383 has introduced changes to default security descriptor of Computer containers to add audit and limit computer creation without being admin.
Indeed, it is recommended to not let anyone create computer accounts as they can be used to abuse Kerberos or to perform relay attacks.
Mitigations in CVE-2021-42291 consist of 3 choices to be set on 2 settings.
They are named LDAPAddAutZVerifications and LDAPOwnerModify and are respectively the 28th and 29th character of this string.
For the expected values:
- With the value 0 (the default), it enables an additional audit mechanism
- With the value 1 (recommended), it enforces new security permissions, especially to require an action of the domain admin when unusual actions are performed
- With the value 2 (not recommended), it disables the audit mechanism that has been added by default and do not enable the new security permissions
The easiest and fastest way to correct this issue is to replace the 28th and 29th character of the DsHeuristics attribute.
The value of LDAPAddAutZVerifications and LDAPOwnerModify should be set to 1.
Open the procedure embedded into the KB5008383 to apply this mitigation and change the DsHeuristics value.
Note: You have to pay attention that there are control characters at the 10th and 20th position to avoid undesired changes of the DsHeuristics attribute.
Typically if the DsHeuristics is empty, the expected new value is 00000000010000000002000000011
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/e5899be4-862e-496f-9a38-33950617d2c5
https://support.microsoft.com/en-au/topic/kb5008383-active-directory-permissions-updates-cve-2021-42291-536d5555-ffba-4248-a60e-d6cbc849cde1
[FR]ANSSI - Dangerous dsHeuristics settings (vuln3_dsheuristics_bad)3
[MITRE]T1187 Forced Authentication
| Setting | Position | Value |
|---|---|---|
| LDAPAddAuthZVerifications | 28th | Not Set |
| LDAPOwnerModify | 29th | Not Set |
A-DnsZoneUpdate1
Description:Critical DNS zones (domain zone and RootDNSServers) are configured to accept anonymous updates, allowing any device to modify DNS records without authentication.
Technical explanation:Active Directory-integrated DNS zones can be configured to accept three types of updates: no updates (static), secure updates only (authenticated), or nonsecure and secure updates. This rule examines your most critical DNS zones to determine if they allow nonsecure updates.
The zones checked by this rule are the foundation of Active Directory operations: your primary domain DNS zone (e.g., contoso.com), the RootDNSServers zone, and _msdcs zones. The _msdcs zones are particularly critical as they contain the global catalog and domain controller locator records used by the entire Active Directory forest for authentication and replication.
When nonsecure updates are enabled (ZONE_UPDATE_UNSECURE), any device on the network can create or modify DNS records without authentication. For these critical zones, this means an attacker could redirect domain controller lookups, hijack global catalog queries, or impersonate critical AD services. The impact extends beyond a single domain - compromising _msdcs affects forest-wide operations.
The rule searches across all DNS storage locations in Active Directory: the DomainDnsZones partition (replicated domain-wide), the ForestDnsZones partition (replicated forest-wide), and the legacy storage in the domain naming context. It automatically filters out replication conflicts (CNF objects) and in-progress replication objects to avoid false positives.
This rule (A-DnsZoneUpdate1) focuses on these critical infrastructure zones. Its companion rule (A-DnsZoneUpdate2) examines all other zones in your environment.
To fix this vulnerability, configure the zone for secure-only updates:
GUI Method:
1. Open DNS Manager (dnsmgmt.msc)
2. Navigate to the affected zone
3. Right-click the zone → Properties → General tab
4. Change "Dynamic updates" from "Nonsecure and secure" to "Secure only"
PowerShell Method:
# Find all zones with insecure updates
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"}
# Fix a specific zone
Set-DnsServerPrimaryZone -Name "contoso.com" -DynamicUpdate Secure -ComputerName DC01
# Fix all insecure zones
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"} | ForEach-Object {
Set-DnsServerPrimaryZone -Name $_.ZoneName -DynamicUpdate Secure -ComputerName DC01
}
Command Line Method:
# Local server
dnscmd /Config <ZoneName> /AllowUpdate 2
# Remote server
dnscmd <ServerName> /Config <ZoneName> /AllowUpdate 2
# Example
dnscmd DC01 /Config contoso.com /AllowUpdate 2
15 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/f97756c9-3783-428b-9451-b376f877319a
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/dnscmd
[FR]ANSSI - Misconfigured DNS zones (vuln1_dnszone_bad_prop)1
[MITRE]T1557 Man-in-the-Middle
| Zone | Domain | DN | Partition |
|---|---|---|---|
| domain.local | domain.local | DC=domain.local,CN=MicrosoftDNS,DC=DomainDnsZones,DC=domain,DC=local | DomainDnsZones |
| _msdcs.domain.local | domain.local | DC=_msdcs.domain.local,CN=MicrosoftDNS,DC=ForestDnsZones,DC=domain,DC=local | ForestDnsZones |
A-DCLdapSign
Description:The purpose is to check if signing is really required for LDAP
Technical explanation:If the the request for signing of each LDAP request is not enforced, a man in the middle can be performed on an LDAP connection.
For example to add a user to the admin group.
This test is made by ignoring the local computer security policies.
Signature enforcement is done by setting the flag ISC_REQ_INTEGRITY when initializig the Negotiate / NTLM / Kerberos authentication.
The opposite test is made with the flag ISC_REQ_NO_INTEGRITY set.
PingCastle is testing if this setting is in place by performing a LDAP authentication with and without signature enforcement.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on a DC, the DC will not be tested.
You have to make sure that ALL LDAP clients are compatible with LDAP signature.
All versions of Windows since XP support this and also most of the Unix clients.
You have to follow the Microsoft article quoted in reference to enable LDAP signing.
This includes auditing the clients which are not compatible and instructions on how to enforce this policy.
5 points if present
Documentation:https://learn.microsoft.com/en-US/troubleshoot/windows-server/identity/enable-ldap-signing-in-windows-server
https://support.microsoft.com/en-us/topic/2020-2023-and-2024-ldap-channel-binding-and-ldap-signing-requirements-for-windows-kb4520412-ef185fb8-00f7-167d-744c-f299a66fc00a
https://github.com/zyn3rgy/LdapRelayScan
[MITRE]T1557 Man-in-the-Middle
| Domain controller |
|---|
| DC |
| DC2 |
| RODC |
A-CertEnrollHttp
Description:The purpose is to check if HTTP can be used to access the certificate enrollment interface
Technical explanation:The Windows PKI, also named Active Directory Certificate Services (ADCS), can be used to request certificates.
Two services can be used: Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
The certificates provided by these services can be used with Kerberos to login.
Because this service can deliver certificates for Domain Controllers, it can be considered as part of Tier 0.
As a legacy service, the mechanisms to prohibit credential relay are not enforced by default.
If an attacker is able to relay privileged credentials (for example with the PetitPotam attack), it can be used to take control of the domain.
PingCastle is looking for enrollment servers registered in the Active Directory (pKIEnrollmentService objects).
It then connects to the special page http://xxx/certsrv/certrqxt.asp and http://xxx/yyy_CES_Kerberos/services.svc and tries to access the page with authentication.
If the authentication succeed and no error is returned,the program considers the interface accessible.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on the server, the server will not be tested.
The access to certificate enrollment with HTTP should be disabled.
This can be achieved by opening the IIS console on the enrollment server.
If the service quoted in detail is WebEnrollment, the url is certsrv, else it is ending by CES_Keberos.
In the Binding setting (link at the right), keep the HTTPS binding and remove the HTTP binding.
See the link to KB5005413 in references for more information.
Note: By default, the CES service is not accessible by HTTP.
5 points if present
Documentation:https://support.microsoft.com/en-us/topic/kb5005413-mitigating-ntlm-relay-attacks-on-active-directory-certificate-services-ad-cs-3612b773-4043-4aa9-b23d-b87910cd3429
https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
https://www.vkernel.ro/blog/installing-and-configuring-cep-and-ces-for-certificate-enrolling-on-non-domain-joined-computers
[MITRE]T1557 Man-in-the-Middle
| Server | Service |
|---|---|
| DC.domain.local | WebEnrollment |
A-CertEnrollChannelBinding
Description:The purpose is to check if the Extended protection for HTTPS access to the certificate enrollment interface is in place
Technical explanation:The Windows PKI, also named Active Directory Certificate Services (ADCS), can be used to request certificates.
Two services can be used: Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
The certificates provided by these services can be used with Kerberos to login.
Because this service can deliver certificates for Domain Controller, it can be considered as part of Tier 0.
As a legacy service, the mechanisms to prohibit credential relay are not enforced by default.
If an attacker is able to relay privileged credentials (for example with the PetitPotam attack), it can be used to take control of the domain.
To avoid this attack with HTTPS, a feature named Channel Binding exists. It consists of passing to the authentication layer a property of the TLS channel (typically a hash of the server certificate) to bind the outer channel (TLS) and the inner channel (HTTP).
This protection is also called "Extended Protection". See rfc5929 for more details.
PingCastle is looking for enrollment servers registered in the Active Directory.
It then connect to the special page https://xxx/certsrv/certrqxt.asp and https://xxx/yyy_CES_Kerberos/service.svc
An authentication is attempted with and without Channel Binding.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on the server, the server will not be tested.
The Extended Protection for Authentication (EPA, also called Channel Binding) should be activated on the enrollment server.
This can be achieved by opening the IIS console on the enrollment server.
In the Authentcation settings, open the Advanced Settings for the Windows Authentication.
Set "Extended Protection" to "Required".
Do this operation for the Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
See the link to KB5005413 below for more information. This KB also suggest to restrict the authentication to Kerberos only.
5 points if present
Documentation:https://support.microsoft.com/en-us/topic/kb5005413-mitigating-ntlm-relay-attacks-on-active-directory-certificate-services-ad-cs-3612b773-4043-4aa9-b23d-b87910cd3429
https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[MITRE]T1557 Man-in-the-Middle
| Server | Service |
|---|---|
| DC.domain.local | WebEnrollment |
A-DnsZoneUpdate2
Description:DNS zones other than the primary domain zone are configured to accept anonymous updates, allowing any device to modify DNS records without authentication.
Technical explanation:Beyond the critical infrastructure zones checked by A-DnsZoneUpdate1, Active Directory typically hosts numerous additional DNS zones including reverse lookup zones (like 10.0.0.in-addr.arpa), application-specific zones, and subdomain zones. This rule examines all these secondary zones to identify those configured to accept nonsecure updates.
While these zones might seem less critical than your domain and _msdcs zones, they still present significant security risks when configured for nonsecure updates. Reverse lookup zones can be manipulated to bypass security controls that rely on PTR record validation. Application zones often contain service endpoints that, if hijacked, could redirect users to malicious services. Subdomain zones may host departmental or regional services that attackers could compromise.
The vulnerability exists when these zones are set to accept "nonsecure and secure" updates, meaning any network-connected device can modify records without proving its identity. This opens the door to DNS poisoning attacks, service hijacking, and reconnaissance activities that help attackers map your infrastructure.
Like its companion rule A-DnsZoneUpdate1, this check examines zones across all Active Directory partitions and filters out replication artifacts. Together, these two rules ensure complete coverage of your DNS security posture - with A-DnsZoneUpdate1 covering critical AD infrastructure and A-DnsZoneUpdate2 covering everything else.
To fix this vulnerability, configure all zones for secure-only updates:
GUI Method:
1. Open DNS Manager (dnsmgmt.msc)
2. Navigate to the affected zone
3. Right-click the zone → Properties → General tab
4. Change "Dynamic updates" from "Nonsecure and secure" to "Secure only"
PowerShell Method:
# Find all zones with insecure updates
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"}
# Fix a specific zone
Set-DnsServerPrimaryZone -Name "10.0.0.in-addr.arpa" -DynamicUpdate Secure -ComputerName DC01
# Fix all insecure zones
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"} | ForEach-Object {
Set-DnsServerPrimaryZone -Name $_.ZoneName -DynamicUpdate Secure -ComputerName DC01
}
Command Line Method:
# Local server
dnscmd /Config <ZoneName> /AllowUpdate 2
# Remote server
dnscmd <ServerName> /Config <ZoneName> /AllowUpdate 2
# Example
dnscmd DC01 /Config contoso.com /AllowUpdate 2
Note: Some zones may require nonsecure updates for DHCP or legacy systems. Document any exceptions.
1 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/f97756c9-3783-428b-9451-b376f877319a
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/dnscmd
[FR]ANSSI - Misconfigured DNS zones (vuln3_dnszone_bad_prop)3
[MITRE]T1557 Man-in-the-Middle
| Zone | Domain | DN | Partition |
|---|---|---|---|
| 0.0.10.in-addr.arpa | domain.local | DC=0.0.10.in-addr.arpa,CN=MicrosoftDNS,DC=DomainDnsZones,DC=domain,DC=local | DomainDnsZones |
| Forest-Test.local | domain.local | DC=Forest-Test.local,CN=MicrosoftDNS,DC=ForestDnsZones,DC=domain,DC=local | ForestDnsZones |
| test3.local | domain.local | DC=test3.local,CN=MicrosoftDNS,CN=System,DC=domain,DC=local | DefaultNamingContext |
A-DnsZoneAUCreateChild
Description:The purpose is to check if Authenticated Users has the right to create DNS records
Technical explanation:When a computer is joined to a domain, a DNS record is created in the DnsZone to allow the computer to update its DNS settings.
By design, Microsoft choose to grant to the group Authenticated Users (aka every computers and users) the right to create DNS records.
Once created, only the owner keeps the right to edit the new object.
The vulnerability is that specific DNS records can be created to perform man-in-the-middle attacks.
One example is to create a wildcard record (a record with the name "*"), a failover DNS record or anticipating the creation of a DNS record with the right permissions.
As of today, this rule is considered "informative" because the default configuration where Authenticated Users can create DNS records is considered safe.
The reason for this classification is that no exploitation of that vulnerability has been reported.
The proposed enhancement is to replace the identity who has been granted the right to create DNS Records (permission CreateChild) from Authenticated Users to Domain Computers.
To perform this change, you have to edit the permission of the DNSZone whose object is located in the container CN=MicrosoftDNS,DC=DomainDnsZones.
It should be noticed that if there is a privilege escalation on a computer, an attacker can impersonate the computer account and bypass this mitigation.
The best mitigation is to create the DNS records manually as part as the domain join process and to revoke the permission granted to Authenticated Users.
Informative rule (0 point)
Documentation:https://www.ws-its.de/gegenmassnahme-zum-angriff-dns-wildcard/
https://www.netspi.com/blog/technical/network-penetration-testing/exploiting-adidns/
[MITRE]T1557 Man-in-the-Middle
| DNSZone |
|---|
| domain.local |
| 0.0.10.in-addr.arpa |
| _msdcs.domain.local |
| Forest-Test.local |
| test3.local |
T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay [3]
S-OldNtlm
Description:The purpose is to check if NTLMv1 or LM can be used by DC
Technical explanation:NTLMv1 is an old protocol which is known to be vulnerable to cryptographic attacks.
It is typically used when a hacker sniffs the network and tries to retrieve NTLM hashes which can then be used to impersonate users.
This attack can be combined with coerced authentication attacks - a hacker forces the DC to connect to a controlled host.
In this case, NTLMv1 can be specified so the hacker can retrieve the NTLM hash of the DC, impersonates it and then take control of the domain.
This attack is still possible with NTLMv2 but this is more difficult.
Windows has default security settings regarding LM/NTLM. Windows XP: Send LM & NTLM responses, Windows Server 2003: Send NTLM response only, Vista/2008: Win7/2008 R2: Send NTLMv2 response only.
However Domain Controllers have relaxed default settings to accept the connection of older operating systems.
That means that by default, NTLMv1 is accepted on domain controllers.
If no GPO defines the LAN Manager Authentication Level, the DC fall back to the non secure default.
After an audit of NTLMv1 usage (see the links below), you need to raise the LAN Manager Authentication Level to "Send NTLMv2 response only. Refuse LM & NTLM".
This can be done by editing the policy "Network security: LAN Manager authentication level" which can be accessed in Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options
The policy will be applied after a computer reboot.
Beware that you may break software which is not compatible with Ntlmv2 such as very old Linux stacks or very old Windows before Windows Vista.
But please note that Ntlmv2 can be activited on all Windows starting Windows 95 and other operating systems.
15 points if present
Documentation:https://learn.microsoft.com/en-us/troubleshoot/windows-server/windows-security/audit-domain-controller-ntlmv1
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-restrict-ntlm-ntlm-authentication-in-this-domain
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-lan-manager-authentication-level
https://learn.microsoft.com/en-us/troubleshoot/windows-client/windows-security/enable-ntlm-2-authentication
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R37 [paragraph.3.6.2.1]
The detail can be found in Security settings
| GPO | Value |
|---|---|
| Windows default without an active GPO | 3 |
A-HardenedPaths
Description:The purpose is to ensure that there is no weakness related to hardened paths
Technical explanation:Two vulnerabilities have been reported in 2015 (MS15-011 and MS15-014) which allows a domain takeover via GPO modifications done with a man-in-the-middle attack.
To mitigate these vulnerabilites, Microsoft has designed a workaround named "Hardened Paths". It forces connection settings to enforce Integrity, Mutual Authentication or Privacy.
By default if this policy is empty, if will enforce Integrity and Mutual Authentication on the SYSVOL or NETLOGON shares.
This rule checks if there have been any overwrite to disable this protection.
You have to edit the Hardened Path section in the GPO.
This section is located in Computer Configuration/Policies/Administrative Templates/Network/Network Provider.
Check each value reported here and make sure that entries containing SYSVOL or NETLOGON have RequireIntegrity and RequireMutualAuthentication set to 1.
In addition to that, check entries having the pattern \\DCName\* and apply the same solution.
5 points if present
Documentation:
https://labs.withsecure.com/publications/how-to-own-any-windows-network-with-group-policy-hijacking-attacks
https://talubu.wordpress.com/2018/02/28/configuring-unc-hardened-access-through-group-policy/
https://adsecurity.org/?p=1405
https://support.microsoft.com/en-us/topic/ms15-011-vulnerability-in-group-policy-could-allow-remote-code-execution-february-10-2015-91b4bda2-945d-455b-ebbb-01d1ec191328
[US]STIG V-63577 - Hardened UNC Paths must be defined to require mutual authentication and integrity for at least the \\*\SYSVOL and \\*\NETLOGON shares.
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
The detail can be found in the Hardened Paths configuration section.
| GPO | Key | RequireIntegrity | RequireMutualAuthentication | RequirePrivacy |
|---|---|---|---|---|
| No GPO Found | NETLOGON | Not Set | Not Set | Not Set |
| No GPO Found | SYSVOL | Not Set | Not Set | Not Set |
A-NoGPOLLMNR
Description:The purpose is to ensure that local name resolution protocol (LLMNR) cannot be used to collect credentials by performing a network attack
Technical explanation:LLMNR is a protocol which translates names such as foo.bar.com into an ip address. LLMNR has been designed to translate name locally in case the default protocol DNS is not available.
Regarding Active Directory, DNS is mandatory which makes LLMNR useless.
LLMNR exploits typo mistakes or faster response time to redirect users to a specially designed share, server or website.
Being trusted, this service will trigger the single sign on procedure which can be abused to retrieve the user credentials.
LLMNR is enabled by default on all OS except starting from Windows 10 v1903 and Windows Server v1903 where it is disabled.
Enable the GPO Turn off multicast name resolution and check that no GPO overrides this setting.
(if it is the case, the policy involved will be displayed below)
Informative rule (0 point)
Documentation:https://youtu.be/Fg2gvk0qgjM
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
The detail can be found in Security settings
T1558 Steal or Forge Kerberos Tickets [4]
A-CertTempCustomSubject
Description:This check verifies if certificate templates in Active Directory Certificate Services (AD CS) allow user-controlled subject information and meet other common criteria associated with the ESC1 vulnerability.
Technical explanation:ESC1 is a vulnerability in Active Directory Certificate Services (AD CS) that occurs when certificate templates allow users to control the Subject Name as well as meet other criteria, such as:
To mitigate ESC1, use one or more of the options below:
Option 1: Modify Certificate Template Settings in ADCS
15 points if present
Documentation:Certified-PreOwned https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name | CA | EnrollmentPrincipals | LastModified |
|---|---|---|---|
| ESC1 | DC.domain.local\Enterprise CA | Authenticated Users | 21/07/2025 11:00:16 |
A-CertTempAgent
Description:The purpose of this rule is to ensure that there is no agent certificate that can be requested by anyone
Technical explanation:An Agent certificate is a special certificate used to request certificates on behalf of other users.
A template has been detected with the agent EKU and that can be enrolled by a large number of users.
Review the permissions that allow a wide enrollment of this certificate template
15 points if present
Documentation:https://posts.specterops.io/certified-pre-owned-d95910965cd2
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name |
|---|
| ESC3-Enrollment |
A-CertTempAnyPurpose
Description:This check verifies whether certificate templates in Active Directory Certificate Services (AD CS) have the "Any Purpose" Enhanced Key Usage (EKU) or lack an EKU entirely, potentially enabling privilege escalation or misuse.
Technical explanation: Enhanced Key Usage (EKU) defines the intended purpose of a certificate. ESC2 arises when the following EKUs are defined along with other vulnerable criteria that enable low privileged users to request the certificate with no oversight.
There are multiple ways in which remediation of this issue can be completed. It involves restricting the template in one or more ways using the instructions below.
15 points if present
Documentation:https://posts.specterops.io/certified-pre-owned-d95910965cd2
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name | CA | EnrollmentPrincipals | LastModified |
|---|---|---|---|
| ESC2 | DC.domain.local\Enterprise CA | Authenticated Users | 11/09/2025 10:57:01 |
S-KerberosArmoringDC
Description:The purpose is to ensure that DC supports Kerberos armoring when functional level is at least Windows Server 2012
Technical explanation:Kerberos Armoring is an optimization of the Kerberos protocol. It avoids the pre-authentication steps and thereby prevents pre-authentication attacks.
It is supported only starting Windows Server 2012 DC and Windows 8 workstations.
If Kerberos Armoring is requested for other operating systems (such as Windows 7 or Linux), the Kerberos authentication protocol may refuse to work.
To enable Kerberos armoring for domain controllers, edit the GPO and go to Computer Configuration > Administrative Templates > System > KDC
then enable the policy "KDC support for claims, compound authentication and Kerberos armoring".
The policy should be set to at least "Supported".
The safest settings is "Fail authentication requests when Kerberos armoring is not available" but it should be enabled only if the clients support Kerberos armoring.
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831747(v=ws.11)
https://pupuweb.com/solved-how-enable-kerberos-armoring-eap-fast-ad/
[MITRE]T1558 Steal or Forge Kerberos Tickets
If activated, the detail can be found in Security settings
T1558.003 Steal or Forge Kerberos Tickets: Kerberoasting [1]
P-Kerberoasting
Description:The purpose is to ensure that the password of admin accounts cannot be retrieved using the Kerberoast attack.
Technical explanation:To access a service using Kerberos, a user requests a ticket (named TGS) to the DC specific to the service.
This ticket is encrypted using a derivative of the service password, but can be brute-forced to retrieve the original password.
Any account having the attribute SPN populated is considered as a service account.
Given that any user can request a ticket for a service account, these accounts can have their password retrieved.
In addition, services are known to have their password not changed at a regular basis and to use well-known words.
Please note that this program ignores service accounts that had their password changed in the last 40 days ago to support using password rotation as a mitigation.
If the account is a service account, the service should be removed from the privileged group or have a process to change its password at a regular basis.
If the user is a person, the SPN attribute of the account should be removed.
5 points per discovery
Documentation:https://adsecurity.org/?p=3466
[FR]ANSSI - Privileged accounts with SPN (vuln1_spn_priv)1
[MITRE]T1558.003 Steal or Forge Kerberos Tickets: Kerberoasting
The detail can be found in Admin Groups
| User | Groups | SPNs |
|---|---|---|
| Administrator | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/administrator |
| TestUser_DA | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/tda123 http/tda11 cifs/tda1 http/tda111 |
| TestUser_EA | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/ http/tea4.domain.local http/tea3 http/tea2 http/tea1 |
T1558.004 Steal or Forge Kerberos Tickets: AS-REP Roasting [1]
S-AesNotEnabled
Description:The purpose is to verify that AES is enabled for service accounts.
Technical explanation:The default encryption algorithm used by Kerberos is RC4, which directly utilizes the NTLM hash of the user’s password.
However, due to the rapid advancements in computing power, it’s recommended to transition from RC4 to the more secure AES algorithm.
Before disabling RC4, the first step is to enable AES.
It’s important to note that service accounts and user accounts with the ‘serviceprincipalname’ attribute (also known as SPN) need to be configured to support AES.
Without this configuration, AES will not be fully operational.
Accounts are listed if :
1) no password changed occured after the first DC Win 2008 install to initate AES secrets or
2) they have a SPN and the account is not flaged to use AES for encryption with msDS-SupportedEncryptionTypes
Also be advised that other checks must be performed before disabling RC4 (such as trust accounts, ...). A dedicated section in this report explores AES compatibility.
It is recommended to enable AES as an encryption algorithm in the user configuration dialog or in the "msDSSupportedEncryptionTypes" attribute at LDAP level.
It has to be enabled in the property of an account by checking all the boxes "This account supports Keberos AES XXX encryption".
For GMSA account, you have to manually edit the property msDS-SupportedEncryptionTypes
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/archive/blogs/openspecification/msds-supportedencryptiontypes-episode-1-computer-accounts
[FR]ANSSI - Service accounts supported encryption algorithms (vuln3_kerberos_properties_encryption)3
[MITRE]T1558.004 Steal or Forge Kerberos Tickets: AS-REP Roasting
The detail can be found in User information and Computer information
Discovery
T1018 Remote System Discovery [1]
A-RootDseAnonBinding
Description:The purpose is to ensure that Anonymous Binding on RootDse is not enabled
Technical explanation:The rootDse is a special object that enables clients to discover the functionalities of the server, such as LDAP version or support for special processing.
On Windows, it can be accessed by default without binding, which allows everyone to access this data.
There is no confidential data in this attribute, only the Operating System version and the name of the domain.
Since Windows 2019, the rootDse access can be set to require authentication.
You can test the anonymous access of the rootDse object by launching ldp.exe and selecting 'Connect' on the Connection menu.
You should receive the error "The server has been configured to deny unauthenticated simple binds."
Edit the attribute msDS-Other-Settings of the object CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration.
Add a new line with the content: DenyUnauthenticatedBind=1
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/3f0137a1-63df-400c-bf97-e1040f055a99
https://blog.lithnet.io/2018/12/disabling-unauthenticated-binds-in.html
[MITRE]T1018 Remote System Discovery
T1069.002 Permission Groups Discovery: Domain Groups [1]
P-ControlPathIndirectEveryone
Description:The purpose is to ensure that there is no control path involving everyone.
Technical explanation:
If you have access to a key server and the helpdesk can reset your password, then the helpdesk has access to the key server.
This is the kind of logic used by hackers to take control of the domain using key infrastructure objects (domain root, ...) or groups (domain administrators, ...).
Permissions are collected and analyzed to produce a control paths analysis.
Only write permissions (and specific ones) are used for this analysis.
Then the program identifies which users or computers, that are not members of known groups, can take control of this object.
To be fast, some tradeoffs have been selected. For example, logged on users on servers are ignored.
The program may also select paths which are not exploitable and ignore paths if it cannot read every permissions.
[Everyone] includes the user groups Anonymous, Everyone, Authenticated Users, Domain Users, Domain Computers and Builtin.
You should analyze the chart and determine which underlying object is involved and grants write permissions to everyone.
Then edit the permissions and locate the write permission involved.
Then delete it or replace it according to your delegation model.
25 points if present
Documentation:https://github.com/BloodHoundAD/BloodHound
https://github.com/ANSSI-FR/AD-control-paths
[MITRE]T1069.002 Permission Groups Discovery: Domain Groups
The detail can be found in Control Paths Analysis
| Group |
|---|
| Certificate Publishers |
| Domain Controllers |
| Read Only Domain Controllers |
T1087.001 Account Discovery: Local Account [1]
A-NoNetSessionHardening
Description:The purpose is to ensure that mitigations are in place against the Bloodhound tool
Technical explanation:By default, Windows computers allow any authenticated user to enumerate network sessions to it.
This means an attacker could enumerate network sessions to a file share hosting home directories or a Domain Controller to see who's connected to SYSVOL (to apply Group Policy) and determine which workstations each user and admin account is logged into.
Bloodhound uses this capability extensively to map out credentials in the network.
Disabling Net Session Enumeration removes the capability for any user to enumerate net session info (Recon).
If this mitigation is not part of the computer image, apply the following recommendations:
Run the NetCease PowerShell script (referenced below) on a reference workstation.
Open the Group Policy Management Console. Right-click the Group Policy object (GPO) that should contain the new preference item, and then click Edit .
In the console tree under Computer Configuration, expand the Preferences folder, and then expand the Windows Settings folder.
Right-click the Registry node, point to New, and select Registry Wizard.
Select the reference workstation on which the desired registry settings exist, then click Next .
Browse to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity\
and select the check box for “SrvsvcSessionInfo” from which you want to create a Registry preference item. Select the check box for a key only if you want to create a Registry item for the key rather than for a value within the key.
Click Finish.
The settings that you selected appear as preference items in the Registry Wizard Values collection
Informative rule (0 point)
Documentation:https://github.com/p0w3rsh3ll/NetCease
https://adsecurity.org/?p=3299
[MITRE]T1087.001 Account Discovery: Local Account
The detail can be found in Security settings
T1201 Password Policy Discovery [2]
A-MinPwdLen
Description:The purpose is to verify if the password policy of the domain enforces users to have at least 8 characters in their password
Technical explanation:A check is performed to identify if the GPO regarding password policy allows less than 8 characters password. Short passwords represent a high risk because they can fairly easily be brute-forced or password sprayed. Most CERT and agencies advise for at least 8 characters (and often this number goes up to 12)
Advised solution:To solve the issue, the best way is to either remove the GPO enabling short password, or to modify it in order to increase the password length to at least 8 characters
Points:10 points if present
Documentation:https://www.microsoft.com/en-us/research/publication/password-guidance/
[FR]ANSSI - Privileged group members with weak password policy (vuln2_privileged_members_password)2
[MITRE]T1201 Password Policy Discovery
The detail can be found in Password policies
| GPO |
|---|
| Default Domain Policy |
A-NoServicePolicy
Description:The purpose is to give information regarding a best practice for the Service Account password policy. Indeed, having a 20+ characters password for this account greatly helps reducing the risk of Kerberoasting attacks (offline cracking of the TGS tickets)
Note: PSO (Password Settings Objects) will be visible only if the user, which collected the information, has the permission to view it.
The rule is purely informative, as it gives insights regarding a best practice. It verifies if there is a GPO or PSO enforcing a 20+ characters password for the Service Accounts.
Advised solution: The recommended way to handle service accounts is to use "Managed service accounts" introduced since Windows Server 2008 R2 (search for "msDS-ManagedServiceAccount").
To solve the anomaly, you should implement a PSO or GPO password guarantying a 20+ length password.
Informative rule (0 point)
Documentation:https://www.microsoft.com/en-us/research/publication/password-guidance/
[MITRE]T1201 Password Policy Discovery
The detail can be found in Password Policies
Mitigation did matched
Mitigation did matched
Mitigation did matched
Mitigation did matched
Mitigation did matched
Mitigation did matched
Mitigation did matched
Audit
Mitre Att&ck - Mitigation - Audit [2]
A-AuditDC
Description:The purpose is to ensure that the audit policy on domain controllers collects the right set of events.
Technical explanation:To detect and mitigate an attack, the right set of events need to be collected.
The audit policy is a compromise between too much and too few events to collect.
To solve this problem, the suggested audit policy from adsecurity.org is checked against the audit policy in place.
Identify the Audit settings to apply and fix them.
Be aware that there are two places for audit settings.
For "Simple" audit configuration:
in Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Audit Policies
For "Advanced" audit configuration:
in Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration
Also be sure that the audit GPO is applied to all domain controllers, as the underlying object may be in a OU where the GPO is not applied.
10 points if present
Documentation:https://adsecurity.org/?p=3299
https://adsecurity.org/?p=3377
[MITRE]Mitre Att&ck - Mitigation - Audit
The detail can be found in Audit settings
The table below shows the settings that were not found as configured in a GPO for a given domain controller.
| Type | Audit | Problem | Rationale | Domain controller |
|---|---|---|---|---|
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | DC |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | DC |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | DC |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | DC |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | DC |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | DC |
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | DC2 |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | DC2 |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | DC2 |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | DC2 |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | DC2 |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | DC2 |
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | RODC |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | RODC |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | RODC |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | RODC |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | RODC |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | RODC |
A-AuditPowershell
Description:The purpose is to ensure that PowerShell logging is enabled.
Technical explanation:PowerShell is a powerful language, also used by hackers because of this quality. Hackers are able to run programs such as mimikatz in memory using obfuscated commands such as Invoke-Mimikatz.
Because there is no artefact on the disk, the incident response task is difficult for the forensic analysts.
For this reason, we recommend to enable PowerShell logging via a group policy, despite the fact that these security settings may be part of the workstation or server images.
Go to Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell
And enable "Turn on Module logging" and "Turn on PowerShell Script Block logging"
We recommend to set "*" as the module list.
Informative rule (0 point)
Documentation:https://adsecurity.org/?p=2604
https://learn.microsoft.com/en-us/powershell/scripting/wmf/whats-new/script-logging?view=powershell-6
[US]STIG V-68819 - PowerShell script block logging must be enabled
[MITRE]Mitre Att&ck - Mitigation - Audit
The detail can be found in Security settings
Active Directory Configuration
Mitre Att&ck - Mitigation - Active Directory Configuration [17]
T-SIDHistorySameDomain
Description:The purpose is to ensure that accounts are not linked for more privileged accounts in the same domain
Technical explanation:SID History is an attribute used in migration to link with a former account. It is not possible to have an account linked with an account belonging to the same domain. This can be analyzed by comparing the domain part of the SID History with the domain SID.
Advised solution:It is not possible to have this occurrence except if a user from domain A has been migrated to domain B and then migrated again to domain A. This should be strongly investigated as it may be linked to a compromise of the domain.
To remove the SIDHistory from a user account, run:
Get-ADUser USERNAME -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
For a group, run:
Get-ADGroup GROUPNAME -properties sidhistory | foreach {Set-ADGroup $_ -remove @{sidhistory=$_.sidhistory.value}}
For all users in a OU:
Get-ADUser -SearchBase "OU=Accounts,DC=mydomain,DC=com" -Filter {sidhistory -like '*'} -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
50 points if present
Documentation:[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R15 [paragraph.3.3.1.5]
[FR]ANSSI - Accounts or groups with SID history set (vuln3_sidhistory_present)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
[MITRE]T1134.005 Access Token Manipulation: SID-History Injection
The SIDHistory detail can be found in User information and Computer information and a quick summary in SID History
P-Delegated
Description:The purpose is to ensure that all Administrator Accounts have the configuration flag "this account is sensitive and cannot be delegated" (or are members of the built-in group "Protected Users" when your domain functional level is at least Windows Server 2012 R2).
Technical explanation:Without the flag "This account is sensitive and cannot be delegated" any account can be impersonated by some service account. It is a best practice to enforce this flag on administrators accounts.
Advised solution:To correct the situation, you should make sure that all your Administrator Accounts have the check-box "This account is sensitive and cannot be delegated" active or add your Administrator Accounts to the built-in group "Protected Users" if your domain functional level is at least Windows Server 2012 R2 (some functionalities may not work properly afterwards, you should check the official documentation).
If you want to enable the check-box "This account is sensitive and cannot be delegated" but this is not possible because the box is not present (typically for GMSA accounts), you can add the flag manually by adding the number 1048576 to the attribute useraccountcontrol of the account.
Please note that there is a section below in this report named "Admin Groups" which gives more information.
20 points if present
Documentation:[US]STIG V-36435 - Delegation of privileged accounts must be prohibited.
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Admin Groups
| DN | Reason |
|---|---|
| CN=srv_certsvc,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=Administrator,CN=Users,DC=domain,DC=local | Not a protected user |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=DA,CN=Users,DC=domain,DC=local | Not a protected user |
| CN=AdminKerb1,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_AA,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_recover,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_sd,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=ED_MERRILL,OU=People,DC=domain,DC=local | Not a protected user |
| CN=TestUser_NEA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=NestedDA,OU=People,DC=domain,DC=local | Not a protected user |
| CN=RUPERT_COMPTON,OU=ESM,OU=People,DC=domain,DC=local | Not a protected user |
S-PrimaryGroup
Description:The purpose is to check for unusual values in the primarygroupid attribute used to store group memberships
Technical explanation:In Active Directory, group membership is stored on the "members" attribute and on the "primarygroupid" attribute. The default primary group value is "Domain Users" for the users, "Domain Computers" for the computers and "Domain Controllers" for the domain controllers. The primarygroupid contains the RID (last digits of a SID) of the group targeted. It can be used to store hidden membership as this attribute is not often analyzed.
Advised solution:Unless strongly justified, change the primary group id to its default: 513 or 514 for users, 516 or 521 for domain controllers, 514 or 515 for computers. The primary group can be edited in a friendly manner by editing the account with the "Active Directory Users and Computers" and after selecting the "Member Of" tab, "set primary group".
You can use the following script to list Users with a primary group id different from domain users:
$DomainUsersSid = New-Object System.Security.Principal.SecurityIdentifier ([System.Security.Principal.WellKnownSidType]::AccountDomainUsersSid,(Get-ADDomain).DomainSID)
Get-ADUser -Filter * -Properties PrimaryGroup | Where-Object { $_.PrimaryGroup -ne (Get-ADGroup -Filter {SID -eq $DomainUsersSid} ).DistinguishedName } | Select-Object UserPrincipalName,PrimaryGroup
15 points if present
Documentation:[FR]ANSSI - Accounts with modified PrimaryGroupID (vuln3_primary_group_id_nochange)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information and Computer information
| DN |
|---|
| CN=CLARK_PEREZ,OU=GOO,OU=People,DC=domain,DC=local |
| CN=JANELL_ODONNELL,OU=Admin,DC=domain,DC=local |
P-DelegationGPOData
Description:The purpose is to ensure that standard users cannot modify GPO
Technical explanation:When the group Authenticated Users, Everyone or any similar groups have permission to modify a GPO, it can be abused to take control of the accounts where this GPO applies. It can potentially lead to the compromise of the domain
Advised solution:Edit the Access Control List (ACL) of the GPO object or the directory where the items is located. Then remove any write permission given to the group.
Points:15 points per discovery
Documentation:[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R18 [subsubsection.3.3.2]
[US]STIG V-2370 - The access control permissions for the directory service site group policy must be configured to use the required access permissions.
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| GPO | Item | Account | Right |
|---|---|---|---|
| NTLM Block | \\DC2.domain.local\sysvol\domain.local\Policies\{E018745D-AF45-473D-B5F2-31169FA435C2} | Authenticated Users | FullControl |
P-UnconstrainedDelegation
Description:This rule identifies accounts configured with Kerberos unconstrained delegation, a high-risk setting that allows a compromised service to impersonate any domain user and potentially lead to full domain compromise.
Technical explanation:Kerberos unconstrained delegation allows a service to reuse a user’s Ticket Granting Ticket (TGT) to authenticate to any service in the domain. If the delegated account is compromised, cached TGTs can be extracted and used to impersonate any authenticating user.
If a privileged account or a Domain Controller authenticates to such a service, potentially via forced authentication techniques, the attacker can escalate privileges and compromise the entire domain. Disabling the account does not remove this risk, as delegation settings persist and become active again if the account is re-enabled.
Kerberos unconstrained delegation should be removed wherever it is configured. If delegation is required, it must be replaced with Kerberos constrained delegation.
Step 1: Remove Unconstrained Delegation
Remove the ability for the account to delegate credentials to any service.
Computer accounts
Set-ADComputer -Identity
User accounts
Set-ADUser -Identity
Step 2: Configure Constrained Delegation (Only If Required)
If an application requires delegation:
1. Open Active Directory Users and Computers
2. Open the account properties
3. Go to the Delegation tab
4. Select “Trust this computer for delegation to specified services only”
5. Select “Use Kerberos only”
6. Add only the specific services that are required for the application
Do not enable delegation if it is not strictly necessary.
5 points per discovery
Documentation:https://learn.microsoft.com/en-us/archive/blogs/389thoughts/get-rid-of-accounts-that-use-kerberos-unconstrained-delegation
https://adsecurity.org/?p=1667
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R18 [subsubsection.3.3.2]
[FR]ANSSI - Unconstrained authentication delegation (vuln2_delegation_t4d)2
[MITRE]T1187 Forced Authentication
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information and Computer information
| DN | Name |
|---|---|
| CN=kerbdeleg1,OU=Admin,DC=domain,DC=local | kerbdeleg1 |
| CN=kerbdeleg3,OU=Admin,DC=domain,DC=local | kerbdeleg3 |
T-SIDHistoryDangerous
Description:The purpose is to ensure that the dangerous SID are not stored in the SIDHistory attribute.
Technical explanation:SID History is an attribute used in migration to link with a former account.
This rule checks for SID not coming from a former domain (such as SYSTEM) or from a former domain but having a RID (the last part of the SID) lower than 1000.
Indeed, native privileged accounts have a SID lower than 1000.
A list of Well Known SID is referenced in the documentation below.
Identify the account, computer or group having these dangerous SID set in SID History, then clean it up by editing directly the SIDHistory attribute of the underlying AD object.
To remove the SIDHistory from a user account, run:
Get-ADUser USERNAME -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
For a group, run:
Get-ADGroup GROUPNAME -properties sidhistory | foreach {Set-ADGroup $_ -remove @{sidhistory=$_.sidhistory.value}}
For all users in a OU:
Get-ADUser -SearchBase "OU=Accounts,DC=mydomain,DC=com" -Filter {sidhistory -like '*'} -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
10 points if present
Documentation:https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/manage/understand-security-identifiers
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R15 [paragraph.3.3.1.5]
[FR]ANSSI - Accounts or groups with unexpected SID history (vuln2_sidhistory_dangerous)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
[MITRE]T1134.005 Access Token Manipulation: SID-History Injection
The SIDHistory detail can be found in User information and Computer information and a quick summary in SID History
| Domain |
|---|
| domain.local |
S-DC-SubnetMissing
Description:The purpose is to ensure that the minimum set of subnet(s) has been configured in the domain
Technical explanation:When multiple sites are created in a domain, networks should be declared in the domain in order to optimize processes such as DC attribution. In addition, PingCastle can collect the information to be able to build a network map. This rule has been triggered because at least one domain controller has an IP address which was not found in subnet declaration. These IP addresses have been collected by querying the DC FQDN IP address in both IPv6 and IPv4 format.
Advised solution:Locate the IP address which was found as not being part of declared subnet, then add this subnet to the "Active Directory Sites" tool. If you have found IPv6 addresses and it was not expected, you should disable the IPv6 protocol on the network card.
Points:5 points if present
Documentation:[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
Details:The detail can be found in Domain controllers
| Domain controller | ip |
|---|---|
| DC | 192.168.1.145 |
P-RODCNeverReveal
Description:The purpose is to ensure that the protection against revealing privileged group is active
Technical explanation:In addition to the group Denied RODC Password Replication Group there is a custom setting set for RODC in an attribute named msDS-NeverRevealGroup.
This rule checks the current value against the default one.
Check the value of the attribute msDS-NeverRevealGroup and the presence of the following expected groups:
- Administrators;
- Server Operators;
- Account Operators;
- Backup Operators;
- Denied RODC Password Replication Group
This can be managed in the Password Replication Policy tab of the computer object in the Active Directory Users and Computers console.
5 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/8dfc81be-7461-48f2-8caf-07402bccb0ea
[FR]ANSSI - Dangerous configuration of read-only domain controllers (RODC) (neverReveal) (vuln3_rodc_never_reveal)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Domain controllers
| Domain controller | Group |
|---|---|
| RODC | Administrators |
| RODC | Server Operators |
| RODC | Account Operators |
| RODC | Backup Operators |
| RODC | Denied RODC Password Replication Group |
P-RODCAdminRevealed
Description:The purpose is to check if privileged users have already been revealed
Technical explanation:On Active Directory, all users revealed to a RODC are tracked by an attribute set on the computer object of the RODC named msDS-RevealedUsers.
The program checks on the list of revealed users if one of them is known as a privileged user.
Indeed, the RODC is caching the authentication secrets related of this user, which can then be used to impersonate it.
In addition to that, RODC are placed in general on more riskier environment.
The admin account should have its secrets change (a password reset) and be sure that the account will not be revealed anymore.
Points:5 points per discovery
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/8dfc81be-7461-48f2-8caf-07402bccb0ea
[FR]ANSSI - Privileged users revealed on RODC (vuln2_rodc_priv_revealed)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Domain controllers
| Domain controller | User |
|---|---|
| RODC | CN=DA,CN=Users,DC=domain,DC=local |
P-RODCAllowedGroup
Description:The purpose is to ensure that the Allowed RODC Password Replication Group group is empty.
Technical explanation:Accounts belonging to the Allowed RODC Password Replication Group group have their password hashes revealed on all RODCs.
Advised solution:This group should be emptied, and dedicated groups should only be added to the Password Replication Policy of each relevant RODC.
Points:5 points if present
Documentation:[FR]ANSSI - Dangerous configuration of replication groups for read-only domain controllers (RODCs) (allow) (vuln3_rodc_allowed_group)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| Member |
|---|
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=Admins,OU=Admin,DC=domain,DC=local |
| CN=DA,CN=Users,DC=domain,DC=local |
S-PwdNeverExpires
Description:The purpose is to ensure that every account has a password which is compliant with password expiration policies
Technical explanation:Some accounts have passwords which never expire. Should an attacker compromise one of these accounts, he would be able to maintain long-term access to the Active Directory domain.
We have noted that some Linux servers, domain joined, are configured with a password which never expires.
This is a misconfiguration because a password change can be configured. It was however not the default on some plateform.
See one of the link below for more information.
In order to make Active Directory enforce periodic password change, accounts must not have the "Password never expires" flag set in the "Account" tab of the user properties. Their passwords should then be rolled immediately.
For service accounts, Windows provides the "managed service accounts" and "group managed service accounts" features to facilitate the automatic change of passwords.
Please note that there is a document in the section below which references solutions for service accounts of well known products.
Also Linux servers should be configured with automatic machine account change.
1 points if present
Documentation:https://adsecurity.org/?p=4115
https://access.redhat.com/discussions/1283873
[FR]ANSSI - Accounts with never-expiring passwords (vuln2_dont_expire)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information
| DN |
|---|
| CN=DA,CN=Users,DC=domain,DC=local |
| CN=NestedUser1,OU=Admin,DC=domain,DC=local |
| CN=TestUser1,OU=Admin,DC=domain,DC=local |
| CN=TestUser2,OU=Test1,OU=Testing,DC=domain,DC=local |
| CN=ShouldNotShow,OU=Test1,OU=Testing,DC=domain,DC=local |
| CN=TestUser3,OU=Testing,DC=domain,DC=local |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=TestUser1_BadSuc,OU=TestSubjects,OU=VulnerableTest-20250619-160707,OU=Testing,DC=domain,DC=local |
| CN=TestUser1_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser2_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser3_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser4_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser5_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser6_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser7_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser8_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser9_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser10_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser11_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser12_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser13_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser14_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser15_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser16_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser_NEA,OU=Testing,DC=domain,DC=local |
| CN=TestUser17_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser18_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| CN=MSOL_c92a2de74d9c,OU=Admin,DC=domain,DC=local |
| CN=Entra1,OU=Users,OU=Entra,DC=domain,DC=local |
| CN=PermTest1,OU=Admin,DC=domain,DC=local |
| CN=srv_si,OU=Admin,DC=domain,DC=local |
| CN=srv_sd,OU=Admin,DC=domain,DC=local |
| CN=srv_certsvc,OU=Admin,DC=domain,DC=local |
| CN=KerbRoast1,OU=Admin,DC=domain,DC=local |
| CN=AdminEmail,OU=Admin,DC=domain,DC=local |
| CN=Demo NoPriv,OU=Admin,DC=domain,DC=local |
| CN=domain user,OU=Admin,DC=domain,DC=local |
| CN=srv_na,OU=Admin,DC=domain,DC=local |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| CN=kerbdeleg3,OU=Admin,DC=domain,DC=local |
| CN=srv_recover,OU=Admin,DC=domain,DC=local |
| CN=NestedDA,OU=People,DC=domain,DC=local |
| CN=srv_AA,OU=Admin,DC=domain,DC=local |
| CN=AdminKerb1,OU=Admin,DC=domain,DC=local |
T-AlgsAES
Description:The purpose is to check if AES can be used with Kerberos on trusts
Technical explanation:By default, RC4 is used as the signature algorithm on Kerberos tickets.
If AES is enabled on a domain and AES is not enabled on trust, AES tickets will not be usable on the trust. The Kerberos tickets sent to the trust will fail or the trusted domain will fallback to NTLM.
The encryption algorithms allowed for a trust are stored in an attribute named msDS-SupportedEncryptionTypes.
If this attribute is not set (or has a value of zero), RC4 will be applied by default.
Else, it defines the algorithm to use for Kerberos signature.
Enable AES on the domain.
Beware: there is a checkbox in the trust properties named "The other domain supports Kerberos AES Encryption".
If you enable this setting, AES will be enabled but RC4 will also be disabled.
The recommended way is to enable both RC4 and AES as a transition. It can be done by running the command:
ksetup /setenctypeattr mytrust.com RC4-HMAC-MD5 AES128-CTS-HMAC-SHA1-96 AES256-CTS-HMAC-SHA1-96
This way, the attribute msDS-SupportedEncryptionTypes of the trust will be modified to support both RC4 and AES.
1 points if present
Documentation:https://techcommunity.microsoft.com/t5/itops-talk-blog/tough-questions-answered-can-i-disable-rc4-etype-for-kerberos-on/ba-p/382718
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/6cfc7b50-11ed-4b4d-846d-6f08f0812919
https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/decrypting-the-selection-of-supported-kerberos-encryption-types/ba-p/1628797
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| Trust | Reason |
|---|---|
| child.domain.local | Not Configured |
S-TerminalServicesGPO
Description:This rule verifies the recommended configuration for Terminal Services.
Technical explanation:It is a common practice for hackers to look for open sessions on remote servers.
This can be done by attempting to open the user registry and checking if there is an access denied error or if the registry hive is not available at all.
If found, the hacker can exploit this information by targeting this computer, or if the session is still active, hijack it and impact the client computer.
Indeed, you can access the local drive by default and push a malicious file such as a login script in the start menu of the remote user.
Another alternative is if the session is not secure, to capture the credentials in memory.
The printer redirection has no known attack pattern.
However due to past vulnerabilites with the Printer spooler, the complexity of the underlying protocol, the relative absence of need to this feature, we recommend to block it.
It can also be a bypass for copy / paste restriction and it is recommended to deny it in most admin bastion.
The Terminal Services configuration can be found in Policies / Administrative Templates / Windows Components / Remote Desktop Services / Remote Desktop Session Host
The details of this rule is located in Printer Redirection and Session Time Limits.
PingCastle recommends to set the following Policy:
Set time limit for disconnected sessions: 2h (aka MaxDisconnectionTime)
Set time limit for active but idle Remote Desktop Services sessions: 8h (aka MaxIdleTime)
Do not allow client printer redirection: Enabled (aka fDisableCpm)
This rule is active if nothing is set or if the time limit is set to NEVER.
Informative rule (0 point)
Documentation:https://woshub.com/remote-desktop-session-time-limit/
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-tsts/ce70794f-2138-43e8-bf6c-2c147887d6a2
https://community.spiceworks.com/t/are-redirected-printers-a-security-risk/826344/27
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| GPO | Reason |
|---|---|
| Windows default without an active GPO | MaxIdleTime is not set |
| Windows default without an active GPO | MaxDisconnectionTime is not set |
| Windows default without an active GPO | fDisableCpm is not set |
S-FirewallScript
Description:This rule verifies whether programs, such as script engines, are allowed to connect to the internet by default.
Technical explanation:Malicious scripts, often distributed via phishing emails, frequently attempt to connect to the internet to propagate their infection.
To mitigate this risk, we recommend implementing a set of firewall rules through Group Policy Objects (GPOs).
These rules will prohibit direct internet connections for specific programs.
The current list of programs to restrict includes: wscript.exe, mshta.exe, cscript.exe, conhost.exe, and runScriptHelper.exe.
1) Create Firewall Rules via GPO
Configure the firewall rules under Computer Configuration / Policies / Windows Settings / Security Settings / Windows Defender Firewall with Advanced Security.
Ensure the rules are applied on the Outbound side.
Activate the rules.
2) Network Restrictions:
We recommend setting the rules as active for the following IP address ranges to allow local network access:
0.0.0.0 to 9.255.255.255
11.0.0.0 to 126.255.255.255
128.0.0.1 to 172.15.255.255
172.32.0.0 to 192.167.255.255
192.169.0.0 to 255.255.255.255
Alternatively, you can choose to apply the rules to ALL IP addresses or add your internal proxy IP.
Informative rule (0 point)
Documentation:https://medium.com/@cryps1s/endpoint-isolation-with-the-windows-firewall-462a795f4cfb
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Firewall configuration
| Program | Reason |
|---|---|
| wscript.exe | No Firewall rules found |
| mshta.exe | No Firewall rules found |
| cscript.exe | No Firewall rules found |
| conhost.exe | No Firewall rules found |
| runScriptHelper.exe | No Firewall rules found |
S-DefenderASR
Description:This rule confirms the activation of Defender ASR (Attack Surface Reduction) mitigations within a Group Policy Object (GPO).
Technical explanation:Microsoft Defender, the default antivirus included with Windows, activates automatically on systems without a pre-installed alternative.
Defender’s ASR features, designed to minimize vulnerability to attacks, are available even in the standard version.
These protections have been part of Windows since the release of Windows 10 version 1710 and are also applicable to Windows Server 2012 R2.
Note: Windows 11 may enable in some conditions those 3 ASR rules: Block abuse of exploited vulnerable signed drivers, Block credential stealing from the Windows local security authority subsystem (lsass.exe), Block persistence through WMI event subscription
To apply an ASR mitigation, navigate to the GPO setting "Configure Attack Surface Reduction rules" found under Computer Configuration > Policies > Administrative Templates > Windows Components > Microsoft Defender Antivirus (formerly Windows Defender Antivirus) > Microsoft (Windows) Defender Exploit Guard > Attack Surface Reduction.
Upon enabling this setting, select "Set the state for each ASR rule".
Then, input the mitigation’s GUID as the Value name and assign 1 as the Value to enforce the rule in Block mode.
Other configurable values include 2 for Audit mode and 6 for Warn mode.
For instance, to block JavaScript or VBScript from executing downloaded executable content, use the GUID: d3e037e1-3eb8-44c8-a917-57927947596d.
It is recommended to set Defender ASR rules as recommended in the article below.
Prior to implementation, conduct an impact analysis to anticipate any potential disruptions, and utilize Audit mode to identify possible issues.
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/defender-endpoint/attack-surface-reduction-rules-reference?view=o365-worldwide#per-asr-rule-alert-and-notification-details
https://blog.palantir.com/microsoft-defender-attack-surface-reduction-recommendations-a5c7d41c3cf8
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Defender ASR
| Guid | Label | Reason |
|---|---|---|
| 7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c | Block Adobe Reader from creating child processes | Not found - Block or Warn recommended |
| 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2 | Block credential stealing from the Windows local security authority subsystem (lsass.exe) | Not found - Block or Warn recommended |
| be9ba2d9-53ea-4cdc-84e5-9b1eeee46550 | Block executable content from email client and webmail | Not found - Block or Warn recommended |
| d3e037e1-3eb8-44c8-a917-57927947596d | Block JavaScript or VBScript from launching downloaded executable content | Not found - Block or Warn recommended |
| 3b576869-a4ec-4529-8536-b80a7769e899 | Block Office applications from creating executable content | Not found - Block or Warn recommended |
| e6db77e5-3df2-4cf1-b95a-636979351e5b | Block persistence through WMI event subscription | Not found - Block or Warn recommended |
| b2b3f03d-6a65-4f7b-a9c7-1c7ef74a9ba4 | Block untrusted and unsigned processes that run from USB | Not found - Block or Warn recommended |
| 56a863a9-875e-4185-98a7-b882c64b5ce5 | Block abuse of exploited vulnerable signed drivers | Not found - Block or Warn recommended |
| 75668c1f-73b5-4cf0-bb93-3ecf5cb7cc84 | Block Office applications from injecting code into other processes | Not found - Audit recommended |
| 92e97fa1-2edf-4476-bdd6-9dd0b4dddc7b | Block Win32 API calls from Office macros | Not found - Audit recommended |
| d4f940ab-401b-4efc-aadc-ad5f3c50688a | Block all Office applications from creating child processes | Not found - Audit recommended |
| 5beb7efe-fd9a-4556-801d-275e5ffc04cc | Block execution of potentially obfuscated scripts | Not found - Audit recommended |
| 01443614-cd74-433a-b99e-2ecdc07bfc25 | Block executable files from running unless they meet a prevalence, age, or trusted list criterion | Not found - Audit recommended |
| c1db55ab-c21a-4637-bb3f-a12568109d35 | Use advanced protection against ransomware | Not found - Audit recommended |
| d1e49aac-8f56-4280-b9ba-993a6d77406c | Block process creations originating from PSExec and WMI commands | Not found - Audit recommended |
| 26190899-1602-49e8-8b27-eb1d0a1ce869 | Block Office communication application from creating child processes | Not found - Audit recommended |
| 33ddedf1-c6e0-47cb-833e-de6133960387 | Block rebooting machine in Safe Mode (preview) | Not found - Audit recommended |
| c0033c00-d16d-4114-a5a0-dc9b3a7d2ceb | Block use of copied or impersonated system tools (preview) | Not found - Audit recommended |
S-FolderOptions
Description:The objective is to ensure scripts do not automatically execute upon opening by default.
Technical explanation:By default, PowerShell scripts (.ps1) open in Notepad, which blocks these extensions from being exploited in phishing attacks that evade email filters through multi-layered archives.
However, several legacy script extensions (.js, .jse, .vbs, .vbe, .vb, .wsh, .wsf) still execute with their respective engines.
While .js and .jse files are commonly associated with web content and handled by browsers, it’s crucial to recognize their potential for harm when executed directly in Windows.
Redirecting these files to open in Notepad safeguards against inadvertent execution without affecting web browsing.
The browser navigation is not impacted by this recommendation.
Review is recommended for other script files before implementing this security measure.
Note: Javascript execution can be mitigated by an "Attack surface reduction rule" named "Impede JavaScript and VBScript to launch executables" available since Windows 10, version 1709.
But we still recommend to apply the folder options mitigation as it is more effective.
Navigate to Computer Configuration > Preferences > Control Panel Settings > Folder Options.
Create a new File Type with the "Replace" action for the extension you wish to secure.
In "Configure class settings", add a new "open" action with Notepad as the default application: C:\Windows\System32\notepad.exe.
Informative rule (0 point)
Documentation:https://isc.sans.edu/diary/Controlling+JavaScript+Malware+Before+it+Runs/21171
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Folder Options
| Extension | Reason |
|---|---|
| js | Not found in Folder Options |
| vbs | Not found in Folder Options |
| vbe | Not found in Folder Options |
| vb | Not found in Folder Options |
| wsh | Not found in Folder Options |
| wsf | Not found in Folder Options |
P-UnprotectedOU
Description:The purpose is to ensure that Organizational Units (OUs) and Containers in Active Directory are protected to prevent accidental deletion, which could lead to data loss and disruptions in the network infrastructure.
Technical explanation:In Active Directory, Organizational Units can be protected from accidental deletion (reads: using the del key in the wrong place at the wrong time).
This way these objects cannot be deleted, unless the protection is removed. This Active Directory feature was first introduced in Windows Server 2008.
This protection consists of a Deny ACE added to the NTSecurityDescriptor attribute applied to Everyone with the flag set to Delete and DeleteTree.
To safeguard against accidental deletions, it is essential to enable the "Protect object from accidental deletion" option for critical OUs and Containers.
When this option is enabled, it adds an additional layer of security, preventing unintended deletions.
To implement this protection:
* Open the Active Directory Users and Computers management console.
* Locate the OU or Container that requires protection.
* Right-click on the OU or Container, select "Properties."
* In the "Object" tab, check the "Protect object from accidental deletion" option.
* Click "Apply" and then "OK" to save the changes.
You can list unprotected OU using the PowerShell command:
Get-ADOrganizationalUnit -filter {name -like "*"} -Properties ProtectedFromAccidentalDeletion | format-table Name,ProtectedFromAccidentalDeletion
and protect them using the command:
Get-ADOrganizationalUnit -filter {name -like "*"} -Properties ProtectedFromAccidentalDeletion | where {$_.ProtectedFromAccidentalDeletion -eq $false} | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion $true
Note: only 10 will be listed below. Checkout the Delegations section for the complete list.
Informative rule (0 point)
Documentation:https://dirteam.com/sander/2011/07/13/preventing-ous-and-containers-from-accidental-deletion/
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Delegations
| OU |
|---|
| OU=Domain Controllers,DC=domain,DC=local |
| OU=GPOTest,DC=domain,DC=local |
| OU=Systems,DC=domain,DC=local |
| OU=Clients,OU=Systems,DC=domain,DC=local |
| OU=Servers,OU=Systems,DC=domain,DC=local |
Data Backup
Mitre Att&ck - Mitigation - Data Backup [1]
A-BackupMetadata
Description:The purpose is to check if the backups are actually up to date in case they are needed. The alert can be triggered when a domain is backed up using non-recommended methods
Technical explanation:A verification is done on the backups, ensuring that the backup is performed according to Microsoft standards. Indeed, at each backup the DIT Database Partition Backup Signature is updated. If for any reasons, backups are needed to perform a rollback (rebuild a domain) or to track past changes, the backups will actually be up to date. This check is equivalent to a REPADMIN /showbackup *.
Advised solution:Plan AD backups based on Microsoft standards. These standards depend on the Operating System. For example with the wbadmin utility: wbadmin start systemstatebackup -backuptarget:d:
Points:15 points if the occurence is greater than or equals than 7
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/jj130668(v=ws.10)
[US]STIG V-25385 - Active Directory data must be backed up daily for systems with a Risk Management Framework categorization for Availability of moderate or high. Systems with a categorization of low must be backed up weekly.
[MITRE]Mitre Att&ck - Mitigation - Data Backup
The detail can be found in Backup
Privileged Account Management
Mitre Att&ck - Mitigation - Privileged Account Management [3]
P-ServiceDomainAdmin
Description:The purpose is to check for accounts with non-expiring passwords in the "Domain Administrator" group
Technical explanation:PingCastle is checking accounts with never expiring password, that are mostly used as service accounts.
"Service Accounts" can imply a high security risk as their password are stored in clear text in the LSA database, which can then be easily exploited using Mimikatz or Cain&Abel for instance. In addition, their passwords don't change and can be used in Kerberoast attacks.
Accounts with never expiring passwords are mostly service accounts.
To mitigate the security risk, it is strongly advised to lower the privileges of the "Service Accounts", meaning that they should be removed from the "Domain Administrator" group, while ensuring that the password of each and every "Service Account" is longer than 20 characters
15 points if the occurence is greater than or equals than 2
Documentation:[US]STIG V-36432 - Membership to the Domain Admins group must be restricted to accounts used only to manage the Active Directory domain and domain controllers.
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R11 [subsection.2.5]
[FR]ANSSI - Privileged accounts with never-expiring passwords (vuln1_dont_expire_priv)1
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
[MITRE]T1003.004 OS Credential Dumping: LSA Secrets
The detail can be found in Admin Groups
| DN |
|---|
| CN=srv_AA,OU=Admin,DC=domain,DC=local |
| CN=srv_recover,OU=Admin,DC=domain,DC=local |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| CN=srv_sd,OU=Admin,DC=domain,DC=local |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| CN=DA,CN=Users,DC=domain,DC=local |
| CN=NestedDA,OU=People,DC=domain,DC=local |
P-SchemaAdmin
Description:The purpose is to ensure that no account can make unexpected modifications to the schema
Technical explanation:The group "Schema Admins" is used to give permissions to alter the schema. Once a modification is performed on the schema such as new objects, it cannot be undone. This can result in a rebuild of the domain. The best practice is to have this group empty and to add an administrator when a schema update is required, then remove this group membership.
Advised solution:Remove the accounts or groups belonging to the "schema administrators" group.
Points:10 points if present
Documentation:[US]STIG V-72835 - Membership to the Schema Admins group must be limited
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R13 [subsection.3.2]
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
The detail can be found in Admin Groups
P-LogonDenied
Description:The purpose is to ensure that there is a tier isolation.
Technical explanation:A way to collect an administrator credential is to take control of a workstation or server in the unsecured tiers and expect that an administrator will connect to it.
An attack such as credential theft or Kerberos delegation is then performed.
To reduce the impact of such compromise, the best practice is to isolate components (such as admins, DC) in tiers.
Typically, a domain admin should not be allowed to connect to any workstation or lower tier server but login only to perform highly privileged operations on tier 0 systems.
To check for this policy, PingCastle looks at all GPOs and checks, if there is a GPO denying logon (SeDenyRemoteInteractiveLogonRight, SeDenyInteractiveLogonRight) of admins (Domain Admins or Administrators) to a specific scope.
False positives can occurs for this rule:
* if the expected GPO is hidden due to ACL checks
* if the targeted group is not "checked" when saving the GPO. Indeed, the group will be saved as is without a conversion to its technical name and it will prohibit a match if there are groups internationalized, aka renamed given a specific language.
As a consequence, only one deny policy on one group will fulfill this requirements. The program also does not check if the GPO is applied on an Organizational Unit or a Container.
Also this rule is enforced only if there are more than 200 users and 200 computers.
You should add a GPO to prohibit the logon of specific groups Domain Admins and Administrators.
The setting is located in Computer Policy -> Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment.
Then "Deny" logon locally and "Deny" logon through Remote Desktop Services.
1 points if present
Documentation:https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/plan/security-best-practices/appendix-f--securing-domain-admins-groups-in-active-directory
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
The detail can be found in GPO Login
Privileged Process Integrity
Mitre Att&ck - Mitigation - Privileged Process Integrity [1]
P-ProtectedUsers
Description:The purpose is to ensure that all privileged accounts are in the Protected User security group
Technical explanation:The Protected User group is a special security group which automatically applies protections to minimize credential exposure. Starting with Windows 8.1. Older Operating System must be updated to take this protection in account such as the Windows 7 KB2871997 patch.
For admins, it:
- Disables NTLM authentication
- Reduces Kerberos ticket lifetime
- Mandates strong encryption algorithms, such as AES
- Prevents password caching on workstations
- Prevents any type of Kerberos delegation
Please also note that a few links (see below) recommends that at least one account is kept outside of the group Protected Users in case there is a permission problem.
That's why this rule is not triggered if only one account is not protected.
After having reviewed the potential impact on adding users to this group, add the missing privileged accounts to this group.
Points:10 points if the occurence is greater than or equals than 2
Documentation:https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group
https://blog.netwrix.com/2015/02/20/add-sensitive-user-accounts-to-active-directory-protected-users-group/
https://dirteam.com/sander/2014/11/25/ten-things-you-need-to-be-aware-of-before-using-the-protected-users-group/
https://blog.andreas-schreiner.de/2018/09/07/active-directory-sicherheit-teil-1-privilegierte-benutzer/
[US]STIG V-78131 - Accounts with domain level administrative privileges must be members of the Protected Users group in domains with a domain functional level of Windows 2012 R2 or higher.
[FR]ANSSI CERTFR-2017-ALE-012
[FR]ANSSI - Privileged accounts outside of the Protected Users group (vuln3_protected_users)3
[MITRE]Mitre Att&ck - Mitigation - Privileged Process Integrity
The detail can be found in Admin Groups
| User |
|---|
| srv_certsvc |
| Administrator |
| srv_na_col |
| TestUser_DA |
| TestUser_EA |
| DA |
| AdminKerb1 |
| srv_AA |
| srv_recover |
| srv_sd |
| srv_1secure |
| ED_MERRILL |
| TestUser_NEA |
| NestedDA |
| RUPERT_COMPTON |
Update Software
Mitre Att&ck - Mitigation - Update Software [2]
S-OS-W10
Description:The purpose is to ensure that there is no use of non-supported version of Windows 10 or Windows 11 within the domain
Technical explanation:Some versions of Windows 10 and Windows 11 OS are no longer supported, and may be vulnerable to exploits that are not patched anymore.
Advised solution:In order to solve this security issue, you should upgrade all the Windows 10 or Windows 11 to a more recent version.
Use PingCastle.exe and select export on the main menu. Then choose to export computers. PingCastle will produce a list of all your computers with the OS version in a csv file. You can then use Excel to filter them.
Do note that you can get the full details regarding the OS used with the following PowerShell command: Get-ADComputer -Filter {(Enabled -eq $true) -and (OperatingSystem -Like "*Windows 10*")} -Property Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion | format-table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap -Auto
15 points if the occurence is greater than or equals than 15
then 10 points if the occurence is greater than or equals than 6
then 5 points if present
https://learn.microsoft.com/en-us/windows/release-health/release-information
[FR]ANSSI CERTFR-2005-INF-003
[MITRE]Mitre Att&ck - Mitigation - Update Software
The detail can be found in Operating Systems
| Version | Number | Active |
|---|---|---|
| Windows 10 22H2 | 1 | 0 |
| Windows 11 22H2 | 1 | 1 |
S-OS-2012
Description:The purpose is to ensure that there is no use of the obsolete and vulnerable OS Windows Server 2012 for the workstations within the domain
Technical explanation:The Windows Server 2012 OS is no longer supported, as it is vulnerable to many publicly known exploits: Administrator's credentials can be captured, security protocols are weak, etc.
Advised solution:In order to solve this security issue, you should upgrade all the servers to a more recent version of Windows, starting from Windows Server 2012.
Use PingCastle.exe and select export on the main menu. Then choose to export computers. PingCastle will produce a list of all your computers with the OS version in a csv file. You can then use Excel to filter them.
Do note that you can get the full details regarding the OS used with the following PowerShell command: Get-ADComputer -Filter {(Enabled -eq $true) -and (OperatingSystem -Like "*Server 2012*")} -Property Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion | format-table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap -Auto
10 points if the occurence is greater than or equals than 15
then 5 points if the occurence is greater than or equals than 6
then 2 points if present
https://learn.microsoft.com/en-US/lifecycle/products/windows-server-2012-r2
[FR]ANSSI CERTFR-2005-INF-003
[MITRE]Mitre Att&ck - Mitigation - Update Software
The detail can be found in Operating Systems
User Account Management
Mitre Att&ck - Mitigation - User Account Management [2]
S-ADRegistration
Description:The purpose is to ensure that basic users cannot register extra computers in the domain
Technical explanation:By default, a basic user can register up to 10 computers within the domain. This default configuration represents a security issue as basic users shouldn't be able to create such accounts and this task should be handled by administrators.
If the value of the attribute ms-DS-MachineAccountQuota is not set (the program see this as "Infinite"), there is no limit to computer addition.
Note: this program checks also the GPO for SeMachineAccountPrivilege assignment. This assignment can be used to restrict the impact of the key ms-DS-MachineAccountQuota.
To solve the issue, limit the number of extra computers that can be registered by a basic user. It can be reduced by modifying the value of ms-DS-MachineAccountQuota to zero (0). Another solution can be to remove the "Authenticated Users" group in the domain controllers policy altogether. Do note, that if you need to set delegation to an account, so it can add computers to the domain, it can be done through 2 methods: Delegation in the OU or by assigning the SeMachineAccountPrivilege to a special group
Points:10 points if present
Documentation:https://learn.microsoft.com/troubleshoot/windows-server/identity/default-workstation-numbers-join-domain
http://prajwaldesai.com/allow-domain-user-to-add-computer-to-domain/
http://blog.backslasher.net/preventing-users-from-adding-computers-to-a-domain.html
[MITRE]Mitre Att&ck - Mitigation - User Account Management
[FR]ANSSI - Unrestricted domain join (vuln4_user_accounts_machineaccountquota)4
S-DefaultOUChanged
Description:The purpose is to ensure that the default location of computers and user OU has not been changed.
Technical explanation:Default OU such as CN=Computers or CN=Users are stored within the wellKnownObjects attribute of the Domain object.
There are 12 default locations officialy defined.
They can be changed using the program redircmp.
Changing these default can alter the behavior of programs (such as security audit programs) as they may not check the modified objects.
You have to use redircmp to set the value back to normal. See documentation for more details
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/5a00c890-6be5-4575-93c4-8bf8be0ca8d8
https://rickardnobel.se/verify-redirected-computers-container-in-active-directory/
[MITRE]Mitre Att&ck - Mitigation - User Account Management
| Expected | Found |
|---|---|
| CN=Users,DC=domain,DC=local | OU=Admin,DC=domain,DC=local |
Stale Objects : 53 /100
It is about operations related to user or computer objects
S-OldNtlm
Description:The purpose is to check if NTLMv1 or LM can be used by DC
Technical explanation:NTLMv1 is an old protocol which is known to be vulnerable to cryptographic attacks.
It is typically used when a hacker sniffs the network and tries to retrieve NTLM hashes which can then be used to impersonate users.
This attack can be combined with coerced authentication attacks - a hacker forces the DC to connect to a controlled host.
In this case, NTLMv1 can be specified so the hacker can retrieve the NTLM hash of the DC, impersonates it and then take control of the domain.
This attack is still possible with NTLMv2 but this is more difficult.
Windows has default security settings regarding LM/NTLM. Windows XP: Send LM & NTLM responses, Windows Server 2003: Send NTLM response only, Vista/2008: Win7/2008 R2: Send NTLMv2 response only.
However Domain Controllers have relaxed default settings to accept the connection of older operating systems.
That means that by default, NTLMv1 is accepted on domain controllers.
If no GPO defines the LAN Manager Authentication Level, the DC fall back to the non secure default.
After an audit of NTLMv1 usage (see the links below), you need to raise the LAN Manager Authentication Level to "Send NTLMv2 response only. Refuse LM & NTLM".
This can be done by editing the policy "Network security: LAN Manager authentication level" which can be accessed in Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options
The policy will be applied after a computer reboot.
Beware that you may break software which is not compatible with Ntlmv2 such as very old Linux stacks or very old Windows before Windows Vista.
But please note that Ntlmv2 can be activited on all Windows starting Windows 95 and other operating systems.
15 points if present
Documentation:https://learn.microsoft.com/en-us/troubleshoot/windows-server/windows-security/audit-domain-controller-ntlmv1
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-restrict-ntlm-ntlm-authentication-in-this-domain
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-lan-manager-authentication-level
https://learn.microsoft.com/en-us/troubleshoot/windows-client/windows-security/enable-ntlm-2-authentication
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R37 [paragraph.3.6.2.1]
The detail can be found in Security settings
| GPO | Value |
|---|---|
| Windows default without an active GPO | 3 |
S-PrimaryGroup
Description:The purpose is to check for unusual values in the primarygroupid attribute used to store group memberships
Technical explanation:In Active Directory, group membership is stored on the "members" attribute and on the "primarygroupid" attribute. The default primary group value is "Domain Users" for the users, "Domain Computers" for the computers and "Domain Controllers" for the domain controllers. The primarygroupid contains the RID (last digits of a SID) of the group targeted. It can be used to store hidden membership as this attribute is not often analyzed.
Advised solution:Unless strongly justified, change the primary group id to its default: 513 or 514 for users, 516 or 521 for domain controllers, 514 or 515 for computers. The primary group can be edited in a friendly manner by editing the account with the "Active Directory Users and Computers" and after selecting the "Member Of" tab, "set primary group".
You can use the following script to list Users with a primary group id different from domain users:
$DomainUsersSid = New-Object System.Security.Principal.SecurityIdentifier ([System.Security.Principal.WellKnownSidType]::AccountDomainUsersSid,(Get-ADDomain).DomainSID)
Get-ADUser -Filter * -Properties PrimaryGroup | Where-Object { $_.PrimaryGroup -ne (Get-ADGroup -Filter {SID -eq $DomainUsersSid} ).DistinguishedName } | Select-Object UserPrincipalName,PrimaryGroup
15 points if present
Documentation:[FR]ANSSI - Accounts with modified PrimaryGroupID (vuln3_primary_group_id_nochange)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information and Computer information
| DN |
|---|
| CN=CLARK_PEREZ,OU=GOO,OU=People,DC=domain,DC=local |
| CN=JANELL_ODONNELL,OU=Admin,DC=domain,DC=local |
S-ADRegistration
Description:The purpose is to ensure that basic users cannot register extra computers in the domain
Technical explanation:By default, a basic user can register up to 10 computers within the domain. This default configuration represents a security issue as basic users shouldn't be able to create such accounts and this task should be handled by administrators.
If the value of the attribute ms-DS-MachineAccountQuota is not set (the program see this as "Infinite"), there is no limit to computer addition.
Note: this program checks also the GPO for SeMachineAccountPrivilege assignment. This assignment can be used to restrict the impact of the key ms-DS-MachineAccountQuota.
To solve the issue, limit the number of extra computers that can be registered by a basic user. It can be reduced by modifying the value of ms-DS-MachineAccountQuota to zero (0). Another solution can be to remove the "Authenticated Users" group in the domain controllers policy altogether. Do note, that if you need to set delegation to an account, so it can add computers to the domain, it can be done through 2 methods: Delegation in the OU or by assigning the SeMachineAccountPrivilege to a special group
Points:10 points if present
Documentation:https://learn.microsoft.com/troubleshoot/windows-server/identity/default-workstation-numbers-join-domain
http://prajwaldesai.com/allow-domain-user-to-add-computer-to-domain/
http://blog.backslasher.net/preventing-users-from-adding-computers-to-a-domain.html
[MITRE]Mitre Att&ck - Mitigation - User Account Management
[FR]ANSSI - Unrestricted domain join (vuln4_user_accounts_machineaccountquota)4
S-OS-W10
Description:The purpose is to ensure that there is no use of non-supported version of Windows 10 or Windows 11 within the domain
Technical explanation:Some versions of Windows 10 and Windows 11 OS are no longer supported, and may be vulnerable to exploits that are not patched anymore.
Advised solution:In order to solve this security issue, you should upgrade all the Windows 10 or Windows 11 to a more recent version.
Use PingCastle.exe and select export on the main menu. Then choose to export computers. PingCastle will produce a list of all your computers with the OS version in a csv file. You can then use Excel to filter them.
Do note that you can get the full details regarding the OS used with the following PowerShell command: Get-ADComputer -Filter {(Enabled -eq $true) -and (OperatingSystem -Like "*Windows 10*")} -Property Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion | format-table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap -Auto
15 points if the occurence is greater than or equals than 15
then 10 points if the occurence is greater than or equals than 6
then 5 points if present
https://learn.microsoft.com/en-us/windows/release-health/release-information
[FR]ANSSI CERTFR-2005-INF-003
[MITRE]Mitre Att&ck - Mitigation - Update Software
The detail can be found in Operating Systems
| Version | Number | Active |
|---|---|---|
| Windows 10 22H2 | 1 | 0 |
| Windows 11 22H2 | 1 | 1 |
S-DC-SubnetMissing
Description:The purpose is to ensure that the minimum set of subnet(s) has been configured in the domain
Technical explanation:When multiple sites are created in a domain, networks should be declared in the domain in order to optimize processes such as DC attribution. In addition, PingCastle can collect the information to be able to build a network map. This rule has been triggered because at least one domain controller has an IP address which was not found in subnet declaration. These IP addresses have been collected by querying the DC FQDN IP address in both IPv6 and IPv4 format.
Advised solution:Locate the IP address which was found as not being part of declared subnet, then add this subnet to the "Active Directory Sites" tool. If you have found IPv6 addresses and it was not expected, you should disable the IPv6 protocol on the network card.
Points:5 points if present
Documentation:[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
Details:The detail can be found in Domain controllers
| Domain controller | ip |
|---|---|
| DC | 192.168.1.145 |
S-OS-2012
Description:The purpose is to ensure that there is no use of the obsolete and vulnerable OS Windows Server 2012 for the workstations within the domain
Technical explanation:The Windows Server 2012 OS is no longer supported, as it is vulnerable to many publicly known exploits: Administrator's credentials can be captured, security protocols are weak, etc.
Advised solution:In order to solve this security issue, you should upgrade all the servers to a more recent version of Windows, starting from Windows Server 2012.
Use PingCastle.exe and select export on the main menu. Then choose to export computers. PingCastle will produce a list of all your computers with the OS version in a csv file. You can then use Excel to filter them.
Do note that you can get the full details regarding the OS used with the following PowerShell command: Get-ADComputer -Filter {(Enabled -eq $true) -and (OperatingSystem -Like "*Server 2012*")} -Property Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion | format-table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap -Auto
10 points if the occurence is greater than or equals than 15
then 5 points if the occurence is greater than or equals than 6
then 2 points if present
https://learn.microsoft.com/en-US/lifecycle/products/windows-server-2012-r2
[FR]ANSSI CERTFR-2005-INF-003
[MITRE]Mitre Att&ck - Mitigation - Update Software
The detail can be found in Operating Systems
S-PwdNeverExpires
Description:The purpose is to ensure that every account has a password which is compliant with password expiration policies
Technical explanation:Some accounts have passwords which never expire. Should an attacker compromise one of these accounts, he would be able to maintain long-term access to the Active Directory domain.
We have noted that some Linux servers, domain joined, are configured with a password which never expires.
This is a misconfiguration because a password change can be configured. It was however not the default on some plateform.
See one of the link below for more information.
In order to make Active Directory enforce periodic password change, accounts must not have the "Password never expires" flag set in the "Account" tab of the user properties. Their passwords should then be rolled immediately.
For service accounts, Windows provides the "managed service accounts" and "group managed service accounts" features to facilitate the automatic change of passwords.
Please note that there is a document in the section below which references solutions for service accounts of well known products.
Also Linux servers should be configured with automatic machine account change.
1 points if present
Documentation:https://adsecurity.org/?p=4115
https://access.redhat.com/discussions/1283873
[FR]ANSSI - Accounts with never-expiring passwords (vuln2_dont_expire)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information
| DN |
|---|
| CN=DA,CN=Users,DC=domain,DC=local |
| CN=NestedUser1,OU=Admin,DC=domain,DC=local |
| CN=TestUser1,OU=Admin,DC=domain,DC=local |
| CN=TestUser2,OU=Test1,OU=Testing,DC=domain,DC=local |
| CN=ShouldNotShow,OU=Test1,OU=Testing,DC=domain,DC=local |
| CN=TestUser3,OU=Testing,DC=domain,DC=local |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=TestUser1_BadSuc,OU=TestSubjects,OU=VulnerableTest-20250619-160707,OU=Testing,DC=domain,DC=local |
| CN=TestUser1_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser2_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser3_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser4_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser5_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser6_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser7_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser8_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser9_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser10_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser11_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser12_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser13_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser14_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser15_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser16_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser_NEA,OU=Testing,DC=domain,DC=local |
| CN=TestUser17_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=TestUser18_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| CN=MSOL_c92a2de74d9c,OU=Admin,DC=domain,DC=local |
| CN=Entra1,OU=Users,OU=Entra,DC=domain,DC=local |
| CN=PermTest1,OU=Admin,DC=domain,DC=local |
| CN=srv_si,OU=Admin,DC=domain,DC=local |
| CN=srv_sd,OU=Admin,DC=domain,DC=local |
| CN=srv_certsvc,OU=Admin,DC=domain,DC=local |
| CN=KerbRoast1,OU=Admin,DC=domain,DC=local |
| CN=AdminEmail,OU=Admin,DC=domain,DC=local |
| CN=Demo NoPriv,OU=Admin,DC=domain,DC=local |
| CN=domain user,OU=Admin,DC=domain,DC=local |
| CN=srv_na,OU=Admin,DC=domain,DC=local |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| CN=kerbdeleg3,OU=Admin,DC=domain,DC=local |
| CN=srv_recover,OU=Admin,DC=domain,DC=local |
| CN=NestedDA,OU=People,DC=domain,DC=local |
| CN=srv_AA,OU=Admin,DC=domain,DC=local |
| CN=AdminKerb1,OU=Admin,DC=domain,DC=local |
S-DefaultOUChanged
Description:The purpose is to ensure that the default location of computers and user OU has not been changed.
Technical explanation:Default OU such as CN=Computers or CN=Users are stored within the wellKnownObjects attribute of the Domain object.
There are 12 default locations officialy defined.
They can be changed using the program redircmp.
Changing these default can alter the behavior of programs (such as security audit programs) as they may not check the modified objects.
You have to use redircmp to set the value back to normal. See documentation for more details
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/5a00c890-6be5-4575-93c4-8bf8be0ca8d8
https://rickardnobel.se/verify-redirected-computers-container-in-active-directory/
[MITRE]Mitre Att&ck - Mitigation - User Account Management
| Expected | Found |
|---|---|
| CN=Users,DC=domain,DC=local | OU=Admin,DC=domain,DC=local |
S-AesNotEnabled
Description:The purpose is to verify that AES is enabled for service accounts.
Technical explanation:The default encryption algorithm used by Kerberos is RC4, which directly utilizes the NTLM hash of the user’s password.
However, due to the rapid advancements in computing power, it’s recommended to transition from RC4 to the more secure AES algorithm.
Before disabling RC4, the first step is to enable AES.
It’s important to note that service accounts and user accounts with the ‘serviceprincipalname’ attribute (also known as SPN) need to be configured to support AES.
Without this configuration, AES will not be fully operational.
Accounts are listed if :
1) no password changed occured after the first DC Win 2008 install to initate AES secrets or
2) they have a SPN and the account is not flaged to use AES for encryption with msDS-SupportedEncryptionTypes
Also be advised that other checks must be performed before disabling RC4 (such as trust accounts, ...). A dedicated section in this report explores AES compatibility.
It is recommended to enable AES as an encryption algorithm in the user configuration dialog or in the "msDSSupportedEncryptionTypes" attribute at LDAP level.
It has to be enabled in the property of an account by checking all the boxes "This account supports Keberos AES XXX encryption".
For GMSA account, you have to manually edit the property msDS-SupportedEncryptionTypes
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/archive/blogs/openspecification/msds-supportedencryptiontypes-episode-1-computer-accounts
[FR]ANSSI - Service accounts supported encryption algorithms (vuln3_kerberos_properties_encryption)3
[MITRE]T1558.004 Steal or Forge Kerberos Tickets: AS-REP Roasting
The detail can be found in User information and Computer information
S-DefenderASR
Description:This rule confirms the activation of Defender ASR (Attack Surface Reduction) mitigations within a Group Policy Object (GPO).
Technical explanation:Microsoft Defender, the default antivirus included with Windows, activates automatically on systems without a pre-installed alternative.
Defender’s ASR features, designed to minimize vulnerability to attacks, are available even in the standard version.
These protections have been part of Windows since the release of Windows 10 version 1710 and are also applicable to Windows Server 2012 R2.
Note: Windows 11 may enable in some conditions those 3 ASR rules: Block abuse of exploited vulnerable signed drivers, Block credential stealing from the Windows local security authority subsystem (lsass.exe), Block persistence through WMI event subscription
To apply an ASR mitigation, navigate to the GPO setting "Configure Attack Surface Reduction rules" found under Computer Configuration > Policies > Administrative Templates > Windows Components > Microsoft Defender Antivirus (formerly Windows Defender Antivirus) > Microsoft (Windows) Defender Exploit Guard > Attack Surface Reduction.
Upon enabling this setting, select "Set the state for each ASR rule".
Then, input the mitigation’s GUID as the Value name and assign 1 as the Value to enforce the rule in Block mode.
Other configurable values include 2 for Audit mode and 6 for Warn mode.
For instance, to block JavaScript or VBScript from executing downloaded executable content, use the GUID: d3e037e1-3eb8-44c8-a917-57927947596d.
It is recommended to set Defender ASR rules as recommended in the article below.
Prior to implementation, conduct an impact analysis to anticipate any potential disruptions, and utilize Audit mode to identify possible issues.
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/defender-endpoint/attack-surface-reduction-rules-reference?view=o365-worldwide#per-asr-rule-alert-and-notification-details
https://blog.palantir.com/microsoft-defender-attack-surface-reduction-recommendations-a5c7d41c3cf8
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Defender ASR
| Guid | Label | Reason |
|---|---|---|
| 7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c | Block Adobe Reader from creating child processes | Not found - Block or Warn recommended |
| 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2 | Block credential stealing from the Windows local security authority subsystem (lsass.exe) | Not found - Block or Warn recommended |
| be9ba2d9-53ea-4cdc-84e5-9b1eeee46550 | Block executable content from email client and webmail | Not found - Block or Warn recommended |
| d3e037e1-3eb8-44c8-a917-57927947596d | Block JavaScript or VBScript from launching downloaded executable content | Not found - Block or Warn recommended |
| 3b576869-a4ec-4529-8536-b80a7769e899 | Block Office applications from creating executable content | Not found - Block or Warn recommended |
| e6db77e5-3df2-4cf1-b95a-636979351e5b | Block persistence through WMI event subscription | Not found - Block or Warn recommended |
| b2b3f03d-6a65-4f7b-a9c7-1c7ef74a9ba4 | Block untrusted and unsigned processes that run from USB | Not found - Block or Warn recommended |
| 56a863a9-875e-4185-98a7-b882c64b5ce5 | Block abuse of exploited vulnerable signed drivers | Not found - Block or Warn recommended |
| 75668c1f-73b5-4cf0-bb93-3ecf5cb7cc84 | Block Office applications from injecting code into other processes | Not found - Audit recommended |
| 92e97fa1-2edf-4476-bdd6-9dd0b4dddc7b | Block Win32 API calls from Office macros | Not found - Audit recommended |
| d4f940ab-401b-4efc-aadc-ad5f3c50688a | Block all Office applications from creating child processes | Not found - Audit recommended |
| 5beb7efe-fd9a-4556-801d-275e5ffc04cc | Block execution of potentially obfuscated scripts | Not found - Audit recommended |
| 01443614-cd74-433a-b99e-2ecdc07bfc25 | Block executable files from running unless they meet a prevalence, age, or trusted list criterion | Not found - Audit recommended |
| c1db55ab-c21a-4637-bb3f-a12568109d35 | Use advanced protection against ransomware | Not found - Audit recommended |
| d1e49aac-8f56-4280-b9ba-993a6d77406c | Block process creations originating from PSExec and WMI commands | Not found - Audit recommended |
| 26190899-1602-49e8-8b27-eb1d0a1ce869 | Block Office communication application from creating child processes | Not found - Audit recommended |
| 33ddedf1-c6e0-47cb-833e-de6133960387 | Block rebooting machine in Safe Mode (preview) | Not found - Audit recommended |
| c0033c00-d16d-4114-a5a0-dc9b3a7d2ceb | Block use of copied or impersonated system tools (preview) | Not found - Audit recommended |
S-TerminalServicesGPO
Description:This rule verifies the recommended configuration for Terminal Services.
Technical explanation:It is a common practice for hackers to look for open sessions on remote servers.
This can be done by attempting to open the user registry and checking if there is an access denied error or if the registry hive is not available at all.
If found, the hacker can exploit this information by targeting this computer, or if the session is still active, hijack it and impact the client computer.
Indeed, you can access the local drive by default and push a malicious file such as a login script in the start menu of the remote user.
Another alternative is if the session is not secure, to capture the credentials in memory.
The printer redirection has no known attack pattern.
However due to past vulnerabilites with the Printer spooler, the complexity of the underlying protocol, the relative absence of need to this feature, we recommend to block it.
It can also be a bypass for copy / paste restriction and it is recommended to deny it in most admin bastion.
The Terminal Services configuration can be found in Policies / Administrative Templates / Windows Components / Remote Desktop Services / Remote Desktop Session Host
The details of this rule is located in Printer Redirection and Session Time Limits.
PingCastle recommends to set the following Policy:
Set time limit for disconnected sessions: 2h (aka MaxDisconnectionTime)
Set time limit for active but idle Remote Desktop Services sessions: 8h (aka MaxIdleTime)
Do not allow client printer redirection: Enabled (aka fDisableCpm)
This rule is active if nothing is set or if the time limit is set to NEVER.
Informative rule (0 point)
Documentation:https://woshub.com/remote-desktop-session-time-limit/
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-tsts/ce70794f-2138-43e8-bf6c-2c147887d6a2
https://community.spiceworks.com/t/are-redirected-printers-a-security-risk/826344/27
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| GPO | Reason |
|---|---|
| Windows default without an active GPO | MaxIdleTime is not set |
| Windows default without an active GPO | MaxDisconnectionTime is not set |
| Windows default without an active GPO | fDisableCpm is not set |
S-FolderOptions
Description:The objective is to ensure scripts do not automatically execute upon opening by default.
Technical explanation:By default, PowerShell scripts (.ps1) open in Notepad, which blocks these extensions from being exploited in phishing attacks that evade email filters through multi-layered archives.
However, several legacy script extensions (.js, .jse, .vbs, .vbe, .vb, .wsh, .wsf) still execute with their respective engines.
While .js and .jse files are commonly associated with web content and handled by browsers, it’s crucial to recognize their potential for harm when executed directly in Windows.
Redirecting these files to open in Notepad safeguards against inadvertent execution without affecting web browsing.
The browser navigation is not impacted by this recommendation.
Review is recommended for other script files before implementing this security measure.
Note: Javascript execution can be mitigated by an "Attack surface reduction rule" named "Impede JavaScript and VBScript to launch executables" available since Windows 10, version 1709.
But we still recommend to apply the folder options mitigation as it is more effective.
Navigate to Computer Configuration > Preferences > Control Panel Settings > Folder Options.
Create a new File Type with the "Replace" action for the extension you wish to secure.
In "Configure class settings", add a new "open" action with Notepad as the default application: C:\Windows\System32\notepad.exe.
Informative rule (0 point)
Documentation:https://isc.sans.edu/diary/Controlling+JavaScript+Malware+Before+it+Runs/21171
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Folder Options
| Extension | Reason |
|---|---|
| js | Not found in Folder Options |
| vbs | Not found in Folder Options |
| vbe | Not found in Folder Options |
| vb | Not found in Folder Options |
| wsh | Not found in Folder Options |
| wsf | Not found in Folder Options |
S-KerberosArmoringDC
Description:The purpose is to ensure that DC supports Kerberos armoring when functional level is at least Windows Server 2012
Technical explanation:Kerberos Armoring is an optimization of the Kerberos protocol. It avoids the pre-authentication steps and thereby prevents pre-authentication attacks.
It is supported only starting Windows Server 2012 DC and Windows 8 workstations.
If Kerberos Armoring is requested for other operating systems (such as Windows 7 or Linux), the Kerberos authentication protocol may refuse to work.
To enable Kerberos armoring for domain controllers, edit the GPO and go to Computer Configuration > Administrative Templates > System > KDC
then enable the policy "KDC support for claims, compound authentication and Kerberos armoring".
The policy should be set to at least "Supported".
The safest settings is "Fail authentication requests when Kerberos armoring is not available" but it should be enabled only if the clients support Kerberos armoring.
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831747(v=ws.11)
https://pupuweb.com/solved-how-enable-kerberos-armoring-eap-fast-ad/
[MITRE]T1558 Steal or Forge Kerberos Tickets
If activated, the detail can be found in Security settings
S-FirewallScript
Description:This rule verifies whether programs, such as script engines, are allowed to connect to the internet by default.
Technical explanation:Malicious scripts, often distributed via phishing emails, frequently attempt to connect to the internet to propagate their infection.
To mitigate this risk, we recommend implementing a set of firewall rules through Group Policy Objects (GPOs).
These rules will prohibit direct internet connections for specific programs.
The current list of programs to restrict includes: wscript.exe, mshta.exe, cscript.exe, conhost.exe, and runScriptHelper.exe.
1) Create Firewall Rules via GPO
Configure the firewall rules under Computer Configuration / Policies / Windows Settings / Security Settings / Windows Defender Firewall with Advanced Security.
Ensure the rules are applied on the Outbound side.
Activate the rules.
2) Network Restrictions:
We recommend setting the rules as active for the following IP address ranges to allow local network access:
0.0.0.0 to 9.255.255.255
11.0.0.0 to 126.255.255.255
128.0.0.1 to 172.15.255.255
172.32.0.0 to 192.167.255.255
192.169.0.0 to 255.255.255.255
Alternatively, you can choose to apply the rules to ALL IP addresses or add your internal proxy IP.
Informative rule (0 point)
Documentation:https://medium.com/@cryps1s/endpoint-isolation-with-the-windows-firewall-462a795f4cfb
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Firewall configuration
| Program | Reason |
|---|---|
| wscript.exe | No Firewall rules found |
| mshta.exe | No Firewall rules found |
| cscript.exe | No Firewall rules found |
| conhost.exe | No Firewall rules found |
| runScriptHelper.exe | No Firewall rules found |
Privileged Accounts : 100 /100
It is about administrators of the Active Directory
P-ControlPathIndirectEveryone
Description:The purpose is to ensure that there is no control path involving everyone.
Technical explanation:
If you have access to a key server and the helpdesk can reset your password, then the helpdesk has access to the key server.
This is the kind of logic used by hackers to take control of the domain using key infrastructure objects (domain root, ...) or groups (domain administrators, ...).
Permissions are collected and analyzed to produce a control paths analysis.
Only write permissions (and specific ones) are used for this analysis.
Then the program identifies which users or computers, that are not members of known groups, can take control of this object.
To be fast, some tradeoffs have been selected. For example, logged on users on servers are ignored.
The program may also select paths which are not exploitable and ignore paths if it cannot read every permissions.
[Everyone] includes the user groups Anonymous, Everyone, Authenticated Users, Domain Users, Domain Computers and Builtin.
You should analyze the chart and determine which underlying object is involved and grants write permissions to everyone.
Then edit the permissions and locate the write permission involved.
Then delete it or replace it according to your delegation model.
25 points if present
Documentation:https://github.com/BloodHoundAD/BloodHound
https://github.com/ANSSI-FR/AD-control-paths
[MITRE]T1069.002 Permission Groups Discovery: Domain Groups
The detail can be found in Control Paths Analysis
| Group |
|---|
| Certificate Publishers |
| Domain Controllers |
| Read Only Domain Controllers |
P-Delegated
Description:The purpose is to ensure that all Administrator Accounts have the configuration flag "this account is sensitive and cannot be delegated" (or are members of the built-in group "Protected Users" when your domain functional level is at least Windows Server 2012 R2).
Technical explanation:Without the flag "This account is sensitive and cannot be delegated" any account can be impersonated by some service account. It is a best practice to enforce this flag on administrators accounts.
Advised solution:To correct the situation, you should make sure that all your Administrator Accounts have the check-box "This account is sensitive and cannot be delegated" active or add your Administrator Accounts to the built-in group "Protected Users" if your domain functional level is at least Windows Server 2012 R2 (some functionalities may not work properly afterwards, you should check the official documentation).
If you want to enable the check-box "This account is sensitive and cannot be delegated" but this is not possible because the box is not present (typically for GMSA accounts), you can add the flag manually by adding the number 1048576 to the attribute useraccountcontrol of the account.
Please note that there is a section below in this report named "Admin Groups" which gives more information.
20 points if present
Documentation:[US]STIG V-36435 - Delegation of privileged accounts must be prohibited.
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Admin Groups
| DN | Reason |
|---|---|
| CN=srv_certsvc,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=Administrator,CN=Users,DC=domain,DC=local | Not a protected user |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=DA,CN=Users,DC=domain,DC=local | Not a protected user |
| CN=AdminKerb1,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_AA,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_recover,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_sd,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local | Not a protected user |
| CN=ED_MERRILL,OU=People,DC=domain,DC=local | Not a protected user |
| CN=TestUser_NEA,OU=Testing,DC=domain,DC=local | Not a protected user |
| CN=NestedDA,OU=People,DC=domain,DC=local | Not a protected user |
| CN=RUPERT_COMPTON,OU=ESM,OU=People,DC=domain,DC=local | Not a protected user |
P-Kerberoasting
Description:The purpose is to ensure that the password of admin accounts cannot be retrieved using the Kerberoast attack.
Technical explanation:To access a service using Kerberos, a user requests a ticket (named TGS) to the DC specific to the service.
This ticket is encrypted using a derivative of the service password, but can be brute-forced to retrieve the original password.
Any account having the attribute SPN populated is considered as a service account.
Given that any user can request a ticket for a service account, these accounts can have their password retrieved.
In addition, services are known to have their password not changed at a regular basis and to use well-known words.
Please note that this program ignores service accounts that had their password changed in the last 40 days ago to support using password rotation as a mitigation.
If the account is a service account, the service should be removed from the privileged group or have a process to change its password at a regular basis.
If the user is a person, the SPN attribute of the account should be removed.
5 points per discovery
Documentation:https://adsecurity.org/?p=3466
[FR]ANSSI - Privileged accounts with SPN (vuln1_spn_priv)1
[MITRE]T1558.003 Steal or Forge Kerberos Tickets: Kerberoasting
The detail can be found in Admin Groups
| User | Groups | SPNs |
|---|---|---|
| Administrator | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/administrator |
| TestUser_DA | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/tda123 http/tda11 cifs/tda1 http/tda111 |
| TestUser_EA | Administrators Domain Administrators Enterprise Administrators Schema Administrators | http/ http/tea4.domain.local http/tea3 http/tea2 http/tea1 |
P-DelegationGPOData
Description:The purpose is to ensure that standard users cannot modify GPO
Technical explanation:When the group Authenticated Users, Everyone or any similar groups have permission to modify a GPO, it can be abused to take control of the accounts where this GPO applies. It can potentially lead to the compromise of the domain
Advised solution:Edit the Access Control List (ACL) of the GPO object or the directory where the items is located. Then remove any write permission given to the group.
Points:15 points per discovery
Documentation:[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R18 [subsubsection.3.3.2]
[US]STIG V-2370 - The access control permissions for the directory service site group policy must be configured to use the required access permissions.
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| GPO | Item | Account | Right |
|---|---|---|---|
| NTLM Block | \\DC2.domain.local\sysvol\domain.local\Policies\{E018745D-AF45-473D-B5F2-31169FA435C2} | Authenticated Users | FullControl |
P-ServiceDomainAdmin
Description:The purpose is to check for accounts with non-expiring passwords in the "Domain Administrator" group
Technical explanation:PingCastle is checking accounts with never expiring password, that are mostly used as service accounts.
"Service Accounts" can imply a high security risk as their password are stored in clear text in the LSA database, which can then be easily exploited using Mimikatz or Cain&Abel for instance. In addition, their passwords don't change and can be used in Kerberoast attacks.
Accounts with never expiring passwords are mostly service accounts.
To mitigate the security risk, it is strongly advised to lower the privileges of the "Service Accounts", meaning that they should be removed from the "Domain Administrator" group, while ensuring that the password of each and every "Service Account" is longer than 20 characters
15 points if the occurence is greater than or equals than 2
Documentation:[US]STIG V-36432 - Membership to the Domain Admins group must be restricted to accounts used only to manage the Active Directory domain and domain controllers.
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R11 [subsection.2.5]
[FR]ANSSI - Privileged accounts with never-expiring passwords (vuln1_dont_expire_priv)1
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
[MITRE]T1003.004 OS Credential Dumping: LSA Secrets
The detail can be found in Admin Groups
| DN |
|---|
| CN=srv_AA,OU=Admin,DC=domain,DC=local |
| CN=srv_recover,OU=Admin,DC=domain,DC=local |
| CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| CN=srv_sd,OU=Admin,DC=domain,DC=local |
| CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| CN=DA,CN=Users,DC=domain,DC=local |
| CN=NestedDA,OU=People,DC=domain,DC=local |
P-DisplaySpecifier
Description:The purpose is to ensure that scripts used for the customization of admin UI are stored safely
Technical explanation:DisplaySpecifier are Active Directory objects stored in the DisplaySpecifier container of the Configuration naming context.
They are used to customize the user interface.
Specifically the attribute adminContextMenu is used to customize administration actions, where COM objects or scripts can be called.
If the script is stored outside the SYSVOL directory, it can be used to execute custom actions and it is run under the administrator context.
The scripts identified by this rule should be moved to the SYSVOL and properly secured.
Points:10 points if present
Documentation:https://www.semperis.com/blog/active-directory-security-abusing-display-specifiers/
https://learn.microsoft.com/en-us/windows/win32/ad/display-specifiers
[FR]ANSSI - Dangerous Display Specifiers (vuln1_display_specifier)1
[MITRE]T1569 System Services
| DN | Path | Changed |
|---|---|---|
| CN=domainDNS-Display,CN=407,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=407,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=414,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=414,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=404,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=404,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40E,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40E,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=419,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=408,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=408,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=413,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=413,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=409,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=409,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=410,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=410,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41D,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41D,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=C0A,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=C0A,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=415,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=415,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=405,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=405,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=411,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=411,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41F,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=41F,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40B,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40B,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=416,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=416,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=406,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=406,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=412,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=412,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=804,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=804,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40C,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=40C,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=816,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15010,&PingCastle - Run Scan,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_RunScan.bat | 2026-01-06 23:04:04Z |
| CN=domainDNS-Display,CN=816,CN=DisplaySpecifiers,CN=Configuration,DC=domain,DC=local | 15000,&PingCastle - View Report,\\Development2026.domain.local\PingCastle_ADContextMenu$\Scripts\PingCastle_ViewReport.bat | 2026-01-06 23:04:04Z |
P-SchemaAdmin
Description:The purpose is to ensure that no account can make unexpected modifications to the schema
Technical explanation:The group "Schema Admins" is used to give permissions to alter the schema. Once a modification is performed on the schema such as new objects, it cannot be undone. This can result in a rebuild of the domain. The best practice is to have this group empty and to add an administrator when a schema update is required, then remove this group membership.
Advised solution:Remove the accounts or groups belonging to the "schema administrators" group.
Points:10 points if present
Documentation:[US]STIG V-72835 - Membership to the Schema Admins group must be limited
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R13 [subsection.3.2]
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
The detail can be found in Admin Groups
P-UnconstrainedDelegation
Description:This rule identifies accounts configured with Kerberos unconstrained delegation, a high-risk setting that allows a compromised service to impersonate any domain user and potentially lead to full domain compromise.
Technical explanation:Kerberos unconstrained delegation allows a service to reuse a user’s Ticket Granting Ticket (TGT) to authenticate to any service in the domain. If the delegated account is compromised, cached TGTs can be extracted and used to impersonate any authenticating user.
If a privileged account or a Domain Controller authenticates to such a service, potentially via forced authentication techniques, the attacker can escalate privileges and compromise the entire domain. Disabling the account does not remove this risk, as delegation settings persist and become active again if the account is re-enabled.
Kerberos unconstrained delegation should be removed wherever it is configured. If delegation is required, it must be replaced with Kerberos constrained delegation.
Step 1: Remove Unconstrained Delegation
Remove the ability for the account to delegate credentials to any service.
Computer accounts
Set-ADComputer -Identity
User accounts
Set-ADUser -Identity
Step 2: Configure Constrained Delegation (Only If Required)
If an application requires delegation:
1. Open Active Directory Users and Computers
2. Open the account properties
3. Go to the Delegation tab
4. Select “Trust this computer for delegation to specified services only”
5. Select “Use Kerberos only”
6. Add only the specific services that are required for the application
Do not enable delegation if it is not strictly necessary.
5 points per discovery
Documentation:https://learn.microsoft.com/en-us/archive/blogs/389thoughts/get-rid-of-accounts-that-use-kerberos-unconstrained-delegation
https://adsecurity.org/?p=1667
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R18 [subsubsection.3.3.2]
[FR]ANSSI - Unconstrained authentication delegation (vuln2_delegation_t4d)2
[MITRE]T1187 Forced Authentication
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in User information and Computer information
| DN | Name |
|---|---|
| CN=kerbdeleg1,OU=Admin,DC=domain,DC=local | kerbdeleg1 |
| CN=kerbdeleg3,OU=Admin,DC=domain,DC=local | kerbdeleg3 |
P-ProtectedUsers
Description:The purpose is to ensure that all privileged accounts are in the Protected User security group
Technical explanation:The Protected User group is a special security group which automatically applies protections to minimize credential exposure. Starting with Windows 8.1. Older Operating System must be updated to take this protection in account such as the Windows 7 KB2871997 patch.
For admins, it:
- Disables NTLM authentication
- Reduces Kerberos ticket lifetime
- Mandates strong encryption algorithms, such as AES
- Prevents password caching on workstations
- Prevents any type of Kerberos delegation
Please also note that a few links (see below) recommends that at least one account is kept outside of the group Protected Users in case there is a permission problem.
That's why this rule is not triggered if only one account is not protected.
After having reviewed the potential impact on adding users to this group, add the missing privileged accounts to this group.
Points:10 points if the occurence is greater than or equals than 2
Documentation:https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group
https://blog.netwrix.com/2015/02/20/add-sensitive-user-accounts-to-active-directory-protected-users-group/
https://dirteam.com/sander/2014/11/25/ten-things-you-need-to-be-aware-of-before-using-the-protected-users-group/
https://blog.andreas-schreiner.de/2018/09/07/active-directory-sicherheit-teil-1-privilegierte-benutzer/
[US]STIG V-78131 - Accounts with domain level administrative privileges must be members of the Protected Users group in domains with a domain functional level of Windows 2012 R2 or higher.
[FR]ANSSI CERTFR-2017-ALE-012
[FR]ANSSI - Privileged accounts outside of the Protected Users group (vuln3_protected_users)3
[MITRE]Mitre Att&ck - Mitigation - Privileged Process Integrity
The detail can be found in Admin Groups
| User |
|---|
| srv_certsvc |
| Administrator |
| srv_na_col |
| TestUser_DA |
| TestUser_EA |
| DA |
| AdminKerb1 |
| srv_AA |
| srv_recover |
| srv_sd |
| srv_1secure |
| ED_MERRILL |
| TestUser_NEA |
| NestedDA |
| RUPERT_COMPTON |
P-RODCAdminRevealed
Description:The purpose is to check if privileged users have already been revealed
Technical explanation:On Active Directory, all users revealed to a RODC are tracked by an attribute set on the computer object of the RODC named msDS-RevealedUsers.
The program checks on the list of revealed users if one of them is known as a privileged user.
Indeed, the RODC is caching the authentication secrets related of this user, which can then be used to impersonate it.
In addition to that, RODC are placed in general on more riskier environment.
The admin account should have its secrets change (a password reset) and be sure that the account will not be revealed anymore.
Points:5 points per discovery
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/8dfc81be-7461-48f2-8caf-07402bccb0ea
[FR]ANSSI - Privileged users revealed on RODC (vuln2_rodc_priv_revealed)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Domain controllers
| Domain controller | User |
|---|---|
| RODC | CN=DA,CN=Users,DC=domain,DC=local |
P-RODCAllowedGroup
Description:The purpose is to ensure that the Allowed RODC Password Replication Group group is empty.
Technical explanation:Accounts belonging to the Allowed RODC Password Replication Group group have their password hashes revealed on all RODCs.
Advised solution:This group should be emptied, and dedicated groups should only be added to the Password Replication Policy of each relevant RODC.
Points:5 points if present
Documentation:[FR]ANSSI - Dangerous configuration of replication groups for read-only domain controllers (RODCs) (allow) (vuln3_rodc_allowed_group)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| Member |
|---|
| CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| CN=Admins,OU=Admin,DC=domain,DC=local |
| CN=DA,CN=Users,DC=domain,DC=local |
P-RODCNeverReveal
Description:The purpose is to ensure that the protection against revealing privileged group is active
Technical explanation:In addition to the group Denied RODC Password Replication Group there is a custom setting set for RODC in an attribute named msDS-NeverRevealGroup.
This rule checks the current value against the default one.
Check the value of the attribute msDS-NeverRevealGroup and the presence of the following expected groups:
- Administrators;
- Server Operators;
- Account Operators;
- Backup Operators;
- Denied RODC Password Replication Group
This can be managed in the Password Replication Policy tab of the computer object in the Active Directory Users and Computers console.
5 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/8dfc81be-7461-48f2-8caf-07402bccb0ea
[FR]ANSSI - Dangerous configuration of read-only domain controllers (RODC) (neverReveal) (vuln3_rodc_never_reveal)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Domain controllers
| Domain controller | Group |
|---|---|
| RODC | Administrators |
| RODC | Server Operators |
| RODC | Account Operators |
| RODC | Backup Operators |
| RODC | Denied RODC Password Replication Group |
P-LogonDenied
Description:The purpose is to ensure that there is a tier isolation.
Technical explanation:A way to collect an administrator credential is to take control of a workstation or server in the unsecured tiers and expect that an administrator will connect to it.
An attack such as credential theft or Kerberos delegation is then performed.
To reduce the impact of such compromise, the best practice is to isolate components (such as admins, DC) in tiers.
Typically, a domain admin should not be allowed to connect to any workstation or lower tier server but login only to perform highly privileged operations on tier 0 systems.
To check for this policy, PingCastle looks at all GPOs and checks, if there is a GPO denying logon (SeDenyRemoteInteractiveLogonRight, SeDenyInteractiveLogonRight) of admins (Domain Admins or Administrators) to a specific scope.
False positives can occurs for this rule:
* if the expected GPO is hidden due to ACL checks
* if the targeted group is not "checked" when saving the GPO. Indeed, the group will be saved as is without a conversion to its technical name and it will prohibit a match if there are groups internationalized, aka renamed given a specific language.
As a consequence, only one deny policy on one group will fulfill this requirements. The program also does not check if the GPO is applied on an Organizational Unit or a Container.
Also this rule is enforced only if there are more than 200 users and 200 computers.
You should add a GPO to prohibit the logon of specific groups Domain Admins and Administrators.
The setting is located in Computer Policy -> Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment.
Then "Deny" logon locally and "Deny" logon through Remote Desktop Services.
1 points if present
Documentation:https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/plan/security-best-practices/appendix-f--securing-domain-admins-groups-in-active-directory
[MITRE]Mitre Att&ck - Mitigation - Privileged Account Management
The detail can be found in GPO Login
P-UnprotectedOU
Description:The purpose is to ensure that Organizational Units (OUs) and Containers in Active Directory are protected to prevent accidental deletion, which could lead to data loss and disruptions in the network infrastructure.
Technical explanation:In Active Directory, Organizational Units can be protected from accidental deletion (reads: using the del key in the wrong place at the wrong time).
This way these objects cannot be deleted, unless the protection is removed. This Active Directory feature was first introduced in Windows Server 2008.
This protection consists of a Deny ACE added to the NTSecurityDescriptor attribute applied to Everyone with the flag set to Delete and DeleteTree.
To safeguard against accidental deletions, it is essential to enable the "Protect object from accidental deletion" option for critical OUs and Containers.
When this option is enabled, it adds an additional layer of security, preventing unintended deletions.
To implement this protection:
* Open the Active Directory Users and Computers management console.
* Locate the OU or Container that requires protection.
* Right-click on the OU or Container, select "Properties."
* In the "Object" tab, check the "Protect object from accidental deletion" option.
* Click "Apply" and then "OK" to save the changes.
You can list unprotected OU using the PowerShell command:
Get-ADOrganizationalUnit -filter {name -like "*"} -Properties ProtectedFromAccidentalDeletion | format-table Name,ProtectedFromAccidentalDeletion
and protect them using the command:
Get-ADOrganizationalUnit -filter {name -like "*"} -Properties ProtectedFromAccidentalDeletion | where {$_.ProtectedFromAccidentalDeletion -eq $false} | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion $true
Note: only 10 will be listed below. Checkout the Delegations section for the complete list.
Informative rule (0 point)
Documentation:https://dirteam.com/sander/2011/07/13/preventing-ous-and-containers-from-accidental-deletion/
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
The detail can be found in Delegations
| OU |
|---|
| OU=Domain Controllers,DC=domain,DC=local |
| OU=GPOTest,DC=domain,DC=local |
| OU=Systems,DC=domain,DC=local |
| OU=Clients,OU=Systems,DC=domain,DC=local |
| OU=Servers,OU=Systems,DC=domain,DC=local |
Trusts : 61 /100
It is about links between two Active Directories
T-SIDHistorySameDomain
Description:The purpose is to ensure that accounts are not linked for more privileged accounts in the same domain
Technical explanation:SID History is an attribute used in migration to link with a former account. It is not possible to have an account linked with an account belonging to the same domain. This can be analyzed by comparing the domain part of the SID History with the domain SID.
Advised solution:It is not possible to have this occurrence except if a user from domain A has been migrated to domain B and then migrated again to domain A. This should be strongly investigated as it may be linked to a compromise of the domain.
To remove the SIDHistory from a user account, run:
Get-ADUser USERNAME -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
For a group, run:
Get-ADGroup GROUPNAME -properties sidhistory | foreach {Set-ADGroup $_ -remove @{sidhistory=$_.sidhistory.value}}
For all users in a OU:
Get-ADUser -SearchBase "OU=Accounts,DC=mydomain,DC=com" -Filter {sidhistory -like '*'} -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
50 points if present
Documentation:[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R15 [paragraph.3.3.1.5]
[FR]ANSSI - Accounts or groups with SID history set (vuln3_sidhistory_present)3
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
[MITRE]T1134.005 Access Token Manipulation: SID-History Injection
The SIDHistory detail can be found in User information and Computer information and a quick summary in SID History
T-SIDHistoryDangerous
Description:The purpose is to ensure that the dangerous SID are not stored in the SIDHistory attribute.
Technical explanation:SID History is an attribute used in migration to link with a former account.
This rule checks for SID not coming from a former domain (such as SYSTEM) or from a former domain but having a RID (the last part of the SID) lower than 1000.
Indeed, native privileged accounts have a SID lower than 1000.
A list of Well Known SID is referenced in the documentation below.
Identify the account, computer or group having these dangerous SID set in SID History, then clean it up by editing directly the SIDHistory attribute of the underlying AD object.
To remove the SIDHistory from a user account, run:
Get-ADUser USERNAME -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
For a group, run:
Get-ADGroup GROUPNAME -properties sidhistory | foreach {Set-ADGroup $_ -remove @{sidhistory=$_.sidhistory.value}}
For all users in a OU:
Get-ADUser -SearchBase "OU=Accounts,DC=mydomain,DC=com" -Filter {sidhistory -like '*'} -properties sidhistory | foreach {Set-ADUser $_ -remove @{sidhistory=$_.sidhistory.value}}
10 points if present
Documentation:https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/manage/understand-security-identifiers
[FR]ANSSI - Recommandations de sécurité relatives à Active Directory - R15 [paragraph.3.3.1.5]
[FR]ANSSI - Accounts or groups with unexpected SID history (vuln2_sidhistory_dangerous)2
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
[MITRE]T1134.005 Access Token Manipulation: SID-History Injection
The SIDHistory detail can be found in User information and Computer information and a quick summary in SID History
| Domain |
|---|
| domain.local |
T-AlgsAES
Description:The purpose is to check if AES can be used with Kerberos on trusts
Technical explanation:By default, RC4 is used as the signature algorithm on Kerberos tickets.
If AES is enabled on a domain and AES is not enabled on trust, AES tickets will not be usable on the trust. The Kerberos tickets sent to the trust will fail or the trusted domain will fallback to NTLM.
The encryption algorithms allowed for a trust are stored in an attribute named msDS-SupportedEncryptionTypes.
If this attribute is not set (or has a value of zero), RC4 will be applied by default.
Else, it defines the algorithm to use for Kerberos signature.
Enable AES on the domain.
Beware: there is a checkbox in the trust properties named "The other domain supports Kerberos AES Encryption".
If you enable this setting, AES will be enabled but RC4 will also be disabled.
The recommended way is to enable both RC4 and AES as a transition. It can be done by running the command:
ksetup /setenctypeattr mytrust.com RC4-HMAC-MD5 AES128-CTS-HMAC-SHA1-96 AES256-CTS-HMAC-SHA1-96
This way, the attribute msDS-SupportedEncryptionTypes of the trust will be modified to support both RC4 and AES.
1 points if present
Documentation:https://techcommunity.microsoft.com/t5/itops-talk-blog/tough-questions-answered-can-i-disable-rc4-etype-for-kerberos-on/ba-p/382718
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/6cfc7b50-11ed-4b4d-846d-6f08f0812919
https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/decrypting-the-selection-of-supported-kerberos-encryption-types/ba-p/1628797
[MITRE]Mitre Att&ck - Mitigation - Active Directory Configuration
| Trust | Reason |
|---|---|
| child.domain.local | Not Configured |
Anomalies : 100 /100
It is about specific security control points
A-DnsZoneUpdate1
Description:Critical DNS zones (domain zone and RootDNSServers) are configured to accept anonymous updates, allowing any device to modify DNS records without authentication.
Technical explanation:Active Directory-integrated DNS zones can be configured to accept three types of updates: no updates (static), secure updates only (authenticated), or nonsecure and secure updates. This rule examines your most critical DNS zones to determine if they allow nonsecure updates.
The zones checked by this rule are the foundation of Active Directory operations: your primary domain DNS zone (e.g., contoso.com), the RootDNSServers zone, and _msdcs zones. The _msdcs zones are particularly critical as they contain the global catalog and domain controller locator records used by the entire Active Directory forest for authentication and replication.
When nonsecure updates are enabled (ZONE_UPDATE_UNSECURE), any device on the network can create or modify DNS records without authentication. For these critical zones, this means an attacker could redirect domain controller lookups, hijack global catalog queries, or impersonate critical AD services. The impact extends beyond a single domain - compromising _msdcs affects forest-wide operations.
The rule searches across all DNS storage locations in Active Directory: the DomainDnsZones partition (replicated domain-wide), the ForestDnsZones partition (replicated forest-wide), and the legacy storage in the domain naming context. It automatically filters out replication conflicts (CNF objects) and in-progress replication objects to avoid false positives.
This rule (A-DnsZoneUpdate1) focuses on these critical infrastructure zones. Its companion rule (A-DnsZoneUpdate2) examines all other zones in your environment.
To fix this vulnerability, configure the zone for secure-only updates:
GUI Method:
1. Open DNS Manager (dnsmgmt.msc)
2. Navigate to the affected zone
3. Right-click the zone → Properties → General tab
4. Change "Dynamic updates" from "Nonsecure and secure" to "Secure only"
PowerShell Method:
# Find all zones with insecure updates
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"}
# Fix a specific zone
Set-DnsServerPrimaryZone -Name "contoso.com" -DynamicUpdate Secure -ComputerName DC01
# Fix all insecure zones
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"} | ForEach-Object {
Set-DnsServerPrimaryZone -Name $_.ZoneName -DynamicUpdate Secure -ComputerName DC01
}
Command Line Method:
# Local server
dnscmd /Config <ZoneName> /AllowUpdate 2
# Remote server
dnscmd <ServerName> /Config <ZoneName> /AllowUpdate 2
# Example
dnscmd DC01 /Config contoso.com /AllowUpdate 2
15 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/f97756c9-3783-428b-9451-b376f877319a
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/dnscmd
[FR]ANSSI - Misconfigured DNS zones (vuln1_dnszone_bad_prop)1
[MITRE]T1557 Man-in-the-Middle
| Zone | Domain | DN | Partition |
|---|---|---|---|
| domain.local | domain.local | DC=domain.local,CN=MicrosoftDNS,DC=DomainDnsZones,DC=domain,DC=local | DomainDnsZones |
| _msdcs.domain.local | domain.local | DC=_msdcs.domain.local,CN=MicrosoftDNS,DC=ForestDnsZones,DC=domain,DC=local | ForestDnsZones |
A-CertTempCustomSubject
Description:This check verifies if certificate templates in Active Directory Certificate Services (AD CS) allow user-controlled subject information and meet other common criteria associated with the ESC1 vulnerability.
Technical explanation:ESC1 is a vulnerability in Active Directory Certificate Services (AD CS) that occurs when certificate templates allow users to control the Subject Name as well as meet other criteria, such as:
To mitigate ESC1, use one or more of the options below:
Option 1: Modify Certificate Template Settings in ADCS
15 points if present
Documentation:Certified-PreOwned https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name | CA | EnrollmentPrincipals | LastModified |
|---|---|---|---|
| ESC1 | DC.domain.local\Enterprise CA | Authenticated Users | 21/07/2025 11:00:16 |
A-CertTempAnyPurpose
Description:This check verifies whether certificate templates in Active Directory Certificate Services (AD CS) have the "Any Purpose" Enhanced Key Usage (EKU) or lack an EKU entirely, potentially enabling privilege escalation or misuse.
Technical explanation: Enhanced Key Usage (EKU) defines the intended purpose of a certificate. ESC2 arises when the following EKUs are defined along with other vulnerable criteria that enable low privileged users to request the certificate with no oversight.
There are multiple ways in which remediation of this issue can be completed. It involves restricting the template in one or more ways using the instructions below.
15 points if present
Documentation:https://posts.specterops.io/certified-pre-owned-d95910965cd2
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name | CA | EnrollmentPrincipals | LastModified |
|---|---|---|---|
| ESC2 | DC.domain.local\Enterprise CA | Authenticated Users | 11/09/2025 10:57:01 |
A-CertTempAgent
Description:The purpose of this rule is to ensure that there is no agent certificate that can be requested by anyone
Technical explanation:An Agent certificate is a special certificate used to request certificates on behalf of other users.
A template has been detected with the agent EKU and that can be enrolled by a large number of users.
Review the permissions that allow a wide enrollment of this certificate template
15 points if present
Documentation:https://posts.specterops.io/certified-pre-owned-d95910965cd2
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[FR]ANSSI - Dangerous enrollment permission on authentication certificate templates (vuln1_adcs_template_auth_enroll_with_name)1
[MITRE]T1558 Steal or Forge Kerberos Tickets
The detail can be found in Certificate Templates
| Name |
|---|
| ESC3-Enrollment |
A-BackupMetadata
Description:The purpose is to check if the backups are actually up to date in case they are needed. The alert can be triggered when a domain is backed up using non-recommended methods
Technical explanation:A verification is done on the backups, ensuring that the backup is performed according to Microsoft standards. Indeed, at each backup the DIT Database Partition Backup Signature is updated. If for any reasons, backups are needed to perform a rollback (rebuild a domain) or to track past changes, the backups will actually be up to date. This check is equivalent to a REPADMIN /showbackup *.
Advised solution:Plan AD backups based on Microsoft standards. These standards depend on the Operating System. For example with the wbadmin utility: wbadmin start systemstatebackup -backuptarget:d:
Points:15 points if the occurence is greater than or equals than 7
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/jj130668(v=ws.10)
[US]STIG V-25385 - Active Directory data must be backed up daily for systems with a Risk Management Framework categorization for Availability of moderate or high. Systems with a categorization of low must be backed up weekly.
[MITRE]Mitre Att&ck - Mitigation - Data Backup
The detail can be found in Backup
A-DC-Spooler
Description:The purpose is to ensure that credentials cannot be extracted from the DC via its Print Spooler service
Technical explanation:When there's an account with unconstrained delegation configured (which is fairly common) and the Print Spooler service running on a computer, you can get that computers credentials sent to the system with unconstrained delegation as a user. With a domain controller, the TGT of the DC can be extracted allowing an attacker to reuse it with a DCSync attack and obtain all user hashes and impersonate them.
Advised solution:The Print Spooler service should be deactivated on domain controllers. Please note as a consequence that the Printer Pruning functionality (rarely used) will be unavailable.
Points:10 points if present
Documentation:https://adsecurity.org/?p=4056
https://www.slideshare.net/harmj0y/derbycon-the-unintended-risks-of-trusting-active-directory
[MITRE]T1187 Forced Authentication
The detail can be found in Domain controllers
| Domain controller |
|---|
| DC |
| DC2 |
| RODC |
A-MinPwdLen
Description:The purpose is to verify if the password policy of the domain enforces users to have at least 8 characters in their password
Technical explanation:A check is performed to identify if the GPO regarding password policy allows less than 8 characters password. Short passwords represent a high risk because they can fairly easily be brute-forced or password sprayed. Most CERT and agencies advise for at least 8 characters (and often this number goes up to 12)
Advised solution:To solve the issue, the best way is to either remove the GPO enabling short password, or to modify it in order to increase the password length to at least 8 characters
Points:10 points if present
Documentation:https://www.microsoft.com/en-us/research/publication/password-guidance/
[FR]ANSSI - Privileged group members with weak password policy (vuln2_privileged_members_password)2
[MITRE]T1201 Password Policy Discovery
The detail can be found in Password policies
| GPO |
|---|
| Default Domain Policy |
A-AuditDC
Description:The purpose is to ensure that the audit policy on domain controllers collects the right set of events.
Technical explanation:To detect and mitigate an attack, the right set of events need to be collected.
The audit policy is a compromise between too much and too few events to collect.
To solve this problem, the suggested audit policy from adsecurity.org is checked against the audit policy in place.
Identify the Audit settings to apply and fix them.
Be aware that there are two places for audit settings.
For "Simple" audit configuration:
in Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Audit Policies
For "Advanced" audit configuration:
in Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration
Also be sure that the audit GPO is applied to all domain controllers, as the underlying object may be in a OU where the GPO is not applied.
10 points if present
Documentation:https://adsecurity.org/?p=3299
https://adsecurity.org/?p=3377
[MITRE]Mitre Att&ck - Mitigation - Audit
The detail can be found in Audit settings
The table below shows the settings that were not found as configured in a GPO for a given domain controller.
| Type | Audit | Problem | Rationale | Domain controller |
|---|---|---|---|---|
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | DC |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | DC |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | DC |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | DC |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | DC |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | DC |
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | DC2 |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | DC2 |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | DC2 |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | DC2 |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | DC2 |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | DC2 |
| Advanced | Policy Change / Authentication Policy Change | No GPO check for audit success | Collect events 4713, 4716, 4739, 4867, to track trust modifications | RODC |
| Advanced | Detailed Tracking / DPAPI Activity | No GPO check for audit success | Collect event 4692 to track the export of DPAPI backup key | RODC |
| Advanced | Detailed Tracking / Process Creation | No GPO check for audit success | Collect event 4688 to get the history of executed programs | RODC |
| Advanced | System / Security System Extension | No GPO check for audit success | Collect events 4610, 4697 to track lsass security packages and services | RODC |
| Advanced | Privilege Use / Sensitive Privilege Use | No GPO check for audit success | Collect events 4672, 4673, 4674 for privileges tracking such as the debug one | RODC |
| Advanced | Logon/Logoff / Special Logon | No GPO check for audit success | Collect event 4964 for special group attributed at logon | RODC |
A-DC-Coerce
Description:The objective is to assess the vulnerability of the Domain Controller (DC) to Coerce attacks.
Technical explanation:Coerce attacks are a category of attacks which aims to forcing domain controllers to authenticate to a device controlled by the attacker for the purpose to relay this authentication to gain privileges.
This category of attacks is usually mitigated by applying patch (PetitPotam), disabling services (Spooler), added RPC filter (EDR or firewall) or ensuring integrity (SMB integrity).
Because each of these protections can be individually bypassed (NTLM integrity is disabled on LDAPS), the aim of this scan is to detect proactively if vulnerable RPC services are exposed.
PingCastle estimates that Coerceable interfaces are protected if:
- the GPO "Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers" is applied through a GPO to DC
- or if RPC interfaces are not reachable
Because these interfaces need to be tested from a computer controlled by the attacker, PingCastle cannot do this test with reliability.
Instead, it sends a malformed RPC packet to try to trigger an error such as "Permission denied" or "RPC interface unavailable".
If the error RPC_X_BAD_STUB_DATA (1783) is triggered, PingCastle considers that the interface is available.
A report that a vulnerable interface is online may not be accurate because its full exploitation is not tested.
Also to avoid EDR alerts or to not perform the scan, you can run PingCastle with the flag --skip-dc-rpc
To effectively mitigate the vulnerability, consider one of the following approaches:
1. Apply Group Policy Object (GPO) - "Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers":
Apply this GPO specifically to the Organizational Unit (OU) "Domain Controllers".
Caution: Enabling this GPO might impact services dependent on NTLM such as files copy Backups.
Consider setting the GPO in "Audit mode" initially to identify and assess the impact on affected services.
2. Enable RPC Filters in Windows Firewall:
Configure Windows Firewall to block specific Interface IDs associated with vulnerable RPC interfaces.
This is done using the netsh command. See the documentation links for more information.
Exercise caution: This method filters the entire interface, not specific Operation Numbers (OpNum).
Adjust exceptions for necessary services to ensure critical functionality.
3. Implement External Filters (e.g., EDR, Firewalls):
Leverage third-party solutions, such as Endpoint Detection and Response (EDR) tools or firewalls.
Notable project: rpcfirewall https://github.com/zeronetworks/rpcfirewall, offering logical filtering at the OpNum level.
Be cautious of potential impact and ensure compatibility with existing infrastructure.
10 points if present
Documentation:https://github.com/p0dalirius/Coercer
https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-restrict-ntlm-outgoing-ntlm-traffic-to-remote-servers
https://blog.nviso.eu/2023/12/08/rpc-or-not-here-we-log-preventing-exploitation-and-abuse-with-rpc-firewall/
[MITRE]T1187 Forced Authentication
The detail can be found in Domain controllers
| DCName | IP | Interface | Function | OpNum |
|---|---|---|---|---|
| DC | 10.0.0.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 10.0.0.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC | 10.0.1.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 10.0.1.10 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC | 192.168.1.145 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC | 192.168.1.145 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| DC2 | 10.0.0.11 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| DC2 | 10.0.0.11 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
| RODC | 10.0.0.56 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotification | 62 |
| RODC | 10.0.0.56 | 12345678-1234-abcd-ef00-0123456789ab | RpcRemoteFindFirstPrinterChangeNotificationEx | 65 |
A-HardenedPaths
Description:The purpose is to ensure that there is no weakness related to hardened paths
Technical explanation:Two vulnerabilities have been reported in 2015 (MS15-011 and MS15-014) which allows a domain takeover via GPO modifications done with a man-in-the-middle attack.
To mitigate these vulnerabilites, Microsoft has designed a workaround named "Hardened Paths". It forces connection settings to enforce Integrity, Mutual Authentication or Privacy.
By default if this policy is empty, if will enforce Integrity and Mutual Authentication on the SYSVOL or NETLOGON shares.
This rule checks if there have been any overwrite to disable this protection.
You have to edit the Hardened Path section in the GPO.
This section is located in Computer Configuration/Policies/Administrative Templates/Network/Network Provider.
Check each value reported here and make sure that entries containing SYSVOL or NETLOGON have RequireIntegrity and RequireMutualAuthentication set to 1.
In addition to that, check entries having the pattern \\DCName\* and apply the same solution.
5 points if present
Documentation:
https://labs.withsecure.com/publications/how-to-own-any-windows-network-with-group-policy-hijacking-attacks
https://talubu.wordpress.com/2018/02/28/configuring-unc-hardened-access-through-group-policy/
https://adsecurity.org/?p=1405
https://support.microsoft.com/en-us/topic/ms15-011-vulnerability-in-group-policy-could-allow-remote-code-execution-february-10-2015-91b4bda2-945d-455b-ebbb-01d1ec191328
[US]STIG V-63577 - Hardened UNC Paths must be defined to require mutual authentication and integrity for at least the \\*\SYSVOL and \\*\NETLOGON shares.
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
The detail can be found in the Hardened Paths configuration section.
| GPO | Key | RequireIntegrity | RequireMutualAuthentication | RequirePrivacy |
|---|---|---|---|---|
| No GPO Found | NETLOGON | Not Set | Not Set | Not Set |
| No GPO Found | SYSVOL | Not Set | Not Set | Not Set |
A-AnonymousAuthorizedGPO
Description:The purpose is to identify domains having a GPO which allows access to the domain without any account
Technical explanation:It is possible that domains are set to authorize connection without any account, which represents a security breach. It allows potential attackers to enumerate all the users and computers belonging to a domain, in order to identify very efficiently future weak targets.
It is possible to verify the results provided by the PingCastle solution by using a Kali Linux distribution. You should run [rpcclient -U '' -N target_ip_address] to finally type [enumdomusers].
In order to remove the anonymous access, we advise to identify the GPO indicated by the program and change the setting restrictanonymous and restrictanonymoussam
Points:5 points if present
Documentation:https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc963223%28v%3dtechnet.10%29
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/jj852184(v=ws.11%29
[US]STIG V-14798 - Directory data (outside the root DSE) of a non-public directory must be configured to prevent anonymous access.
[MITRE]T1110.003 Brute Force: Password Spraying
The detail can be found in Security settings
| GPO |
|---|
| Anonymous Stuff |
A-DCLdapSign
Description:The purpose is to check if signing is really required for LDAP
Technical explanation:If the the request for signing of each LDAP request is not enforced, a man in the middle can be performed on an LDAP connection.
For example to add a user to the admin group.
This test is made by ignoring the local computer security policies.
Signature enforcement is done by setting the flag ISC_REQ_INTEGRITY when initializig the Negotiate / NTLM / Kerberos authentication.
The opposite test is made with the flag ISC_REQ_NO_INTEGRITY set.
PingCastle is testing if this setting is in place by performing a LDAP authentication with and without signature enforcement.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on a DC, the DC will not be tested.
You have to make sure that ALL LDAP clients are compatible with LDAP signature.
All versions of Windows since XP support this and also most of the Unix clients.
You have to follow the Microsoft article quoted in reference to enable LDAP signing.
This includes auditing the clients which are not compatible and instructions on how to enforce this policy.
5 points if present
Documentation:https://learn.microsoft.com/en-US/troubleshoot/windows-server/identity/enable-ldap-signing-in-windows-server
https://support.microsoft.com/en-us/topic/2020-2023-and-2024-ldap-channel-binding-and-ldap-signing-requirements-for-windows-kb4520412-ef185fb8-00f7-167d-744c-f299a66fc00a
https://github.com/zyn3rgy/LdapRelayScan
[MITRE]T1557 Man-in-the-Middle
| Domain controller |
|---|
| DC |
| DC2 |
| RODC |
A-CertEnrollChannelBinding
Description:The purpose is to check if the Extended protection for HTTPS access to the certificate enrollment interface is in place
Technical explanation:The Windows PKI, also named Active Directory Certificate Services (ADCS), can be used to request certificates.
Two services can be used: Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
The certificates provided by these services can be used with Kerberos to login.
Because this service can deliver certificates for Domain Controller, it can be considered as part of Tier 0.
As a legacy service, the mechanisms to prohibit credential relay are not enforced by default.
If an attacker is able to relay privileged credentials (for example with the PetitPotam attack), it can be used to take control of the domain.
To avoid this attack with HTTPS, a feature named Channel Binding exists. It consists of passing to the authentication layer a property of the TLS channel (typically a hash of the server certificate) to bind the outer channel (TLS) and the inner channel (HTTP).
This protection is also called "Extended Protection". See rfc5929 for more details.
PingCastle is looking for enrollment servers registered in the Active Directory.
It then connect to the special page https://xxx/certsrv/certrqxt.asp and https://xxx/yyy_CES_Kerberos/service.svc
An authentication is attempted with and without Channel Binding.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on the server, the server will not be tested.
The Extended Protection for Authentication (EPA, also called Channel Binding) should be activated on the enrollment server.
This can be achieved by opening the IIS console on the enrollment server.
In the Authentcation settings, open the Advanced Settings for the Windows Authentication.
Set "Extended Protection" to "Required".
Do this operation for the Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
See the link to KB5005413 below for more information. This KB also suggest to restrict the authentication to Kerberos only.
5 points if present
Documentation:https://support.microsoft.com/en-us/topic/kb5005413-mitigating-ntlm-relay-attacks-on-active-directory-certificate-services-ad-cs-3612b773-4043-4aa9-b23d-b87910cd3429
https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
[MITRE]T1557 Man-in-the-Middle
| Server | Service |
|---|---|
| DC.domain.local | WebEnrollment |
A-CertEnrollHttp
Description:The purpose is to check if HTTP can be used to access the certificate enrollment interface
Technical explanation:The Windows PKI, also named Active Directory Certificate Services (ADCS), can be used to request certificates.
Two services can be used: Certification Authority Web Enrollment (WebEnrollment) and Certificate Enrollment Web Service (CES).
The certificates provided by these services can be used with Kerberos to login.
Because this service can deliver certificates for Domain Controllers, it can be considered as part of Tier 0.
As a legacy service, the mechanisms to prohibit credential relay are not enforced by default.
If an attacker is able to relay privileged credentials (for example with the PetitPotam attack), it can be used to take control of the domain.
PingCastle is looking for enrollment servers registered in the Active Directory (pKIEnrollmentService objects).
It then connects to the special page http://xxx/certsrv/certrqxt.asp and http://xxx/yyy_CES_Kerberos/services.svc and tries to access the page with authentication.
If the authentication succeed and no error is returned,the program considers the interface accessible.
False positives may exists if the PingCastle program is run on the server tested. That's why, if PingCastle is run on the server, the server will not be tested.
The access to certificate enrollment with HTTP should be disabled.
This can be achieved by opening the IIS console on the enrollment server.
If the service quoted in detail is WebEnrollment, the url is certsrv, else it is ending by CES_Keberos.
In the Binding setting (link at the right), keep the HTTPS binding and remove the HTTP binding.
See the link to KB5005413 in references for more information.
Note: By default, the CES service is not accessible by HTTP.
5 points if present
Documentation:https://support.microsoft.com/en-us/topic/kb5005413-mitigating-ntlm-relay-attacks-on-active-directory-certificate-services-ad-cs-3612b773-4043-4aa9-b23d-b87910cd3429
https://dirkjanm.io/ntlm-relaying-to-ad-certificate-services/
https://www.riskinsight-wavestone.com/en/2021/06/microsoft-adcs-abusing-pki-in-active-directory-environment/
https://www.vkernel.ro/blog/installing-and-configuring-cep-and-ces-for-certificate-enrolling-on-non-domain-joined-computers
[MITRE]T1557 Man-in-the-Middle
| Server | Service |
|---|---|
| DC.domain.local | WebEnrollment |
A-PreWin2000Other
Description:The purpose is checking that no additional account has been added to the "Pre-Windows 2000 Compatible Access" group
Technical explanation:The pre-Windows 2000 compatible access group grants access to some RPC calls which should not be available to users or computers.
Advised solution:Remove the members from the PreWin2000 group while making sure that the group "Authenticated Users" is present. Then reboot each DC.
Points:2 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/7a76a403-ed8d-4c39-adb7-a3255cab82c5
[FR]ANSSI - Use of the "Pre-Windows 2000 Compatible Access" group (vuln3_compatible_2000_not_default)3
[MITRE]T1110.003 Brute Force: Password Spraying
| DN |
|---|
| CN=DEVELOPMENT2026,CN=Computers,DC=domain,DC=local |
| CN=PC,CN=Computers,DC=domain,DC=local |
| CN=DC,OU=Domain Controllers,DC=domain,DC=local |
A-DnsZoneUpdate2
Description:DNS zones other than the primary domain zone are configured to accept anonymous updates, allowing any device to modify DNS records without authentication.
Technical explanation:Beyond the critical infrastructure zones checked by A-DnsZoneUpdate1, Active Directory typically hosts numerous additional DNS zones including reverse lookup zones (like 10.0.0.in-addr.arpa), application-specific zones, and subdomain zones. This rule examines all these secondary zones to identify those configured to accept nonsecure updates.
While these zones might seem less critical than your domain and _msdcs zones, they still present significant security risks when configured for nonsecure updates. Reverse lookup zones can be manipulated to bypass security controls that rely on PTR record validation. Application zones often contain service endpoints that, if hijacked, could redirect users to malicious services. Subdomain zones may host departmental or regional services that attackers could compromise.
The vulnerability exists when these zones are set to accept "nonsecure and secure" updates, meaning any network-connected device can modify records without proving its identity. This opens the door to DNS poisoning attacks, service hijacking, and reconnaissance activities that help attackers map your infrastructure.
Like its companion rule A-DnsZoneUpdate1, this check examines zones across all Active Directory partitions and filters out replication artifacts. Together, these two rules ensure complete coverage of your DNS security posture - with A-DnsZoneUpdate1 covering critical AD infrastructure and A-DnsZoneUpdate2 covering everything else.
To fix this vulnerability, configure all zones for secure-only updates:
GUI Method:
1. Open DNS Manager (dnsmgmt.msc)
2. Navigate to the affected zone
3. Right-click the zone → Properties → General tab
4. Change "Dynamic updates" from "Nonsecure and secure" to "Secure only"
PowerShell Method:
# Find all zones with insecure updates
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"}
# Fix a specific zone
Set-DnsServerPrimaryZone -Name "10.0.0.in-addr.arpa" -DynamicUpdate Secure -ComputerName DC01
# Fix all insecure zones
Get-DnsServerZone | Where-Object {$_.DynamicUpdate -eq "NonsecureAndSecure"} | ForEach-Object {
Set-DnsServerPrimaryZone -Name $_.ZoneName -DynamicUpdate Secure -ComputerName DC01
}
Command Line Method:
# Local server
dnscmd /Config <ZoneName> /AllowUpdate 2
# Remote server
dnscmd <ServerName> /Config <ZoneName> /AllowUpdate 2
# Example
dnscmd DC01 /Config contoso.com /AllowUpdate 2
Note: Some zones may require nonsecure updates for DHCP or legacy systems. Document any exceptions.
1 points if present
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/f97756c9-3783-428b-9451-b376f877319a
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/dnscmd
[FR]ANSSI - Misconfigured DNS zones (vuln3_dnszone_bad_prop)3
[MITRE]T1557 Man-in-the-Middle
| Zone | Domain | DN | Partition |
|---|---|---|---|
| 0.0.10.in-addr.arpa | domain.local | DC=0.0.10.in-addr.arpa,CN=MicrosoftDNS,DC=DomainDnsZones,DC=domain,DC=local | DomainDnsZones |
| Forest-Test.local | domain.local | DC=Forest-Test.local,CN=MicrosoftDNS,DC=ForestDnsZones,DC=domain,DC=local | ForestDnsZones |
| test3.local | domain.local | DC=test3.local,CN=MicrosoftDNS,CN=System,DC=domain,DC=local | DefaultNamingContext |
A-DCLdapsProtocolAdvanced
Description:The purpose is to ensure that all DC are using the most advanced protocols when acting as server.
Technical explanation:TLS 1.0 and TLS 1.1 are no longer recommended to use, even if there is no pratical attack to could lead to an immediate compromise of the DC.
The SChannel component needs to be tuned in order to not propose these protocols. Many guidelines to handle this problem issued by Microsoft do not talk about SChannel but rather IIS. These guidlines are quoted in the documentation section below.
PingCastle is able to check the SSL version if LDAPS is exposed. LDAPS is automatically exposed once a certificate is available for the DC and the service restarted.
Please note that PingCastle is using the native .Net SSL stack to perform this test. .Net begins to ignore these weak protocols starting the version 4.7 of the framework and as a consequence, PingCasle may miss some weak protocol detection.
To test for these protocols, you can use a version of openssl with the deprecated protocols still compiled in, e.g. openssl-unsafe from Kali Linux, with the following commands:
openssl-unsafe s_client -connect dc.domain.local:636 -tls1
openssl-unsafe s_client -connect dc.domain.local:636 -tls1_1
Apply Windows updates and registry tweaks described in the documentation section to use Tls 1.2 and later.
Informative rule (0 point)
Documentation:https://support.microsoft.com/en-us/topic/kb5017811-manage-transport-layer-security-tls-1-0-and-1-1-after-default-behavior-change-on-september-20-2022-e95b1b47-9c7c-4d64-9baf-610604a64c3e
https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls#configuring-schannel-protocols-in-the-windows-registry
[MITRE]T1600.001 Weaken Encryption: Reduce Key Space
The detail can be found in Domain controllers
| DC | Protocol |
|---|---|
| DC | Tls |
| DC | Tls11 |
| DC2 | Tls |
| RODC | Tls |
| RODC | Tls11 |
A-AuditPowershell
Description:The purpose is to ensure that PowerShell logging is enabled.
Technical explanation:PowerShell is a powerful language, also used by hackers because of this quality. Hackers are able to run programs such as mimikatz in memory using obfuscated commands such as Invoke-Mimikatz.
Because there is no artefact on the disk, the incident response task is difficult for the forensic analysts.
For this reason, we recommend to enable PowerShell logging via a group policy, despite the fact that these security settings may be part of the workstation or server images.
Go to Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell
And enable "Turn on Module logging" and "Turn on PowerShell Script Block logging"
We recommend to set "*" as the module list.
Informative rule (0 point)
Documentation:https://adsecurity.org/?p=2604
https://learn.microsoft.com/en-us/powershell/scripting/wmf/whats-new/script-logging?view=powershell-6
[US]STIG V-68819 - PowerShell script block logging must be enabled
[MITRE]Mitre Att&ck - Mitigation - Audit
The detail can be found in Security settings
A-NoNetSessionHardening
Description:The purpose is to ensure that mitigations are in place against the Bloodhound tool
Technical explanation:By default, Windows computers allow any authenticated user to enumerate network sessions to it.
This means an attacker could enumerate network sessions to a file share hosting home directories or a Domain Controller to see who's connected to SYSVOL (to apply Group Policy) and determine which workstations each user and admin account is logged into.
Bloodhound uses this capability extensively to map out credentials in the network.
Disabling Net Session Enumeration removes the capability for any user to enumerate net session info (Recon).
If this mitigation is not part of the computer image, apply the following recommendations:
Run the NetCease PowerShell script (referenced below) on a reference workstation.
Open the Group Policy Management Console. Right-click the Group Policy object (GPO) that should contain the new preference item, and then click Edit .
In the console tree under Computer Configuration, expand the Preferences folder, and then expand the Windows Settings folder.
Right-click the Registry node, point to New, and select Registry Wizard.
Select the reference workstation on which the desired registry settings exist, then click Next .
Browse to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity\
and select the check box for “SrvsvcSessionInfo” from which you want to create a Registry preference item. Select the check box for a key only if you want to create a Registry item for the key rather than for a value within the key.
Click Finish.
The settings that you selected appear as preference items in the Registry Wizard Values collection
Informative rule (0 point)
Documentation:https://github.com/p0w3rsh3ll/NetCease
https://adsecurity.org/?p=3299
[MITRE]T1087.001 Account Discovery: Local Account
The detail can be found in Security settings
A-DsHeuristicsLDAPSecurity
Description:The purpose is to identify domains having mitigation for CVE-2021-42291 not set to enabled
Technical explanation:The way an Active Directory behaves can be controlled via the attribute DsHeuristics of CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration.
A parameter stored in its attribute and whose value is LDAPAddAutZVerifications and LDAPOwnerModify can be set to modify the mitigatation of CVE-2021-42291.
The KB5008383 has introduced changes to default security descriptor of Computer containers to add audit and limit computer creation without being admin.
Indeed, it is recommended to not let anyone create computer accounts as they can be used to abuse Kerberos or to perform relay attacks.
Mitigations in CVE-2021-42291 consist of 3 choices to be set on 2 settings.
They are named LDAPAddAutZVerifications and LDAPOwnerModify and are respectively the 28th and 29th character of this string.
For the expected values:
- With the value 0 (the default), it enables an additional audit mechanism
- With the value 1 (recommended), it enforces new security permissions, especially to require an action of the domain admin when unusual actions are performed
- With the value 2 (not recommended), it disables the audit mechanism that has been added by default and do not enable the new security permissions
The easiest and fastest way to correct this issue is to replace the 28th and 29th character of the DsHeuristics attribute.
The value of LDAPAddAutZVerifications and LDAPOwnerModify should be set to 1.
Open the procedure embedded into the KB5008383 to apply this mitigation and change the DsHeuristics value.
Note: You have to pay attention that there are control characters at the 10th and 20th position to avoid undesired changes of the DsHeuristics attribute.
Typically if the DsHeuristics is empty, the expected new value is 00000000010000000002000000011
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/e5899be4-862e-496f-9a38-33950617d2c5
https://support.microsoft.com/en-au/topic/kb5008383-active-directory-permissions-updates-cve-2021-42291-536d5555-ffba-4248-a60e-d6cbc849cde1
[FR]ANSSI - Dangerous dsHeuristics settings (vuln3_dsheuristics_bad)3
[MITRE]T1187 Forced Authentication
| Setting | Position | Value |
|---|---|---|
| LDAPAddAuthZVerifications | 28th | Not Set |
| LDAPOwnerModify | 29th | Not Set |
A-NoServicePolicy
Description:The purpose is to give information regarding a best practice for the Service Account password policy. Indeed, having a 20+ characters password for this account greatly helps reducing the risk of Kerberoasting attacks (offline cracking of the TGS tickets)
Note: PSO (Password Settings Objects) will be visible only if the user, which collected the information, has the permission to view it.
The rule is purely informative, as it gives insights regarding a best practice. It verifies if there is a GPO or PSO enforcing a 20+ characters password for the Service Accounts.
Advised solution: The recommended way to handle service accounts is to use "Managed service accounts" introduced since Windows Server 2008 R2 (search for "msDS-ManagedServiceAccount").
To solve the anomaly, you should implement a PSO or GPO password guarantying a 20+ length password.
Informative rule (0 point)
Documentation:https://www.microsoft.com/en-us/research/publication/password-guidance/
[MITRE]T1201 Password Policy Discovery
The detail can be found in Password Policies
A-DnsZoneAUCreateChild
Description:The purpose is to check if Authenticated Users has the right to create DNS records
Technical explanation:When a computer is joined to a domain, a DNS record is created in the DnsZone to allow the computer to update its DNS settings.
By design, Microsoft choose to grant to the group Authenticated Users (aka every computers and users) the right to create DNS records.
Once created, only the owner keeps the right to edit the new object.
The vulnerability is that specific DNS records can be created to perform man-in-the-middle attacks.
One example is to create a wildcard record (a record with the name "*"), a failover DNS record or anticipating the creation of a DNS record with the right permissions.
As of today, this rule is considered "informative" because the default configuration where Authenticated Users can create DNS records is considered safe.
The reason for this classification is that no exploitation of that vulnerability has been reported.
The proposed enhancement is to replace the identity who has been granted the right to create DNS Records (permission CreateChild) from Authenticated Users to Domain Computers.
To perform this change, you have to edit the permission of the DNSZone whose object is located in the container CN=MicrosoftDNS,DC=DomainDnsZones.
It should be noticed that if there is a privilege escalation on a computer, an attacker can impersonate the computer account and bypass this mitigation.
The best mitigation is to create the DNS records manually as part as the domain join process and to revoke the permission granted to Authenticated Users.
Informative rule (0 point)
Documentation:https://www.ws-its.de/gegenmassnahme-zum-angriff-dns-wildcard/
https://www.netspi.com/blog/technical/network-penetration-testing/exploiting-adidns/
[MITRE]T1557 Man-in-the-Middle
| DNSZone |
|---|
| domain.local |
| 0.0.10.in-addr.arpa |
| _msdcs.domain.local |
| Forest-Test.local |
| test3.local |
A-RootDseAnonBinding
Description:The purpose is to ensure that Anonymous Binding on RootDse is not enabled
Technical explanation:The rootDse is a special object that enables clients to discover the functionalities of the server, such as LDAP version or support for special processing.
On Windows, it can be accessed by default without binding, which allows everyone to access this data.
There is no confidential data in this attribute, only the Operating System version and the name of the domain.
Since Windows 2019, the rootDse access can be set to require authentication.
You can test the anonymous access of the rootDse object by launching ldp.exe and selecting 'Connect' on the Connection menu.
You should receive the error "The server has been configured to deny unauthenticated simple binds."
Edit the attribute msDS-Other-Settings of the object CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration.
Add a new line with the content: DenyUnauthenticatedBind=1
Informative rule (0 point)
Documentation:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/3f0137a1-63df-400c-bf97-e1040f055a99
https://blog.lithnet.io/2018/12/disabling-unauthenticated-binds-in.html
[MITRE]T1018 Remote System Discovery
A-NoGPOLLMNR
Description:The purpose is to ensure that local name resolution protocol (LLMNR) cannot be used to collect credentials by performing a network attack
Technical explanation:LLMNR is a protocol which translates names such as foo.bar.com into an ip address. LLMNR has been designed to translate name locally in case the default protocol DNS is not available.
Regarding Active Directory, DNS is mandatory which makes LLMNR useless.
LLMNR exploits typo mistakes or faster response time to redirect users to a specially designed share, server or website.
Being trusted, this service will trigger the single sign on procedure which can be abused to retrieve the user credentials.
LLMNR is enabled by default on all OS except starting from Windows 10 v1903 and Windows Server v1903 where it is disabled.
Enable the GPO Turn off multicast name resolution and check that no GPO overrides this setting.
(if it is the case, the policy involved will be displayed below)
Informative rule (0 point)
Documentation:https://youtu.be/Fg2gvk0qgjM
[MITRE]T1557.001 Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay
The detail can be found in Security settings
This section shows the main technical characteristics of the domain.
| Domain | Netbios Name | Domain Functional Level | Forest Functional Level | Creation date | DC count | Schema version | Recycle Bin enabled |
|---|---|---|---|---|---|---|---|
| domain.local | DOMAIN | Windows Server 2016 | Windows Server 2016 | 2025-05-01 23:27:08Z | 3 | Windows Server 2025 | TRUE |
No Entra ID configuration has been found in this domain
This section gives information about the user accounts stored in the Active Directory
A honey pot has been configured. It is used to generate fake security issues that are heavily monitored and that a hacker will spot using security tools like PingCastle. By enabling this feature, all the accounts listed below will not be evaluated with PingCastle rules.
| Nb User Accounts | Nb Enabled | Nb Disabled | Nb Active | Nb Inactive | Nb AccessDenied | Nb Locked | Nb pwd never Expire | Nb SidHistory | Nb Bad PrimaryGroup | Nb Password not Req. | Nb Des enabled. | Nb unconstrained delegations (enabled) | Nb unconstrained delegations (disabled) | Nb Reversible password |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 261 | 257 | 4 | 224 | 33 | 0 | 0 | 46 | 1 | 2 | 0 | 0 | 0 | 0 | 0 |
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| duser1 | 2025-08-01 11:12:59Z | Never | 2025-08-01 12:13:35Z | CN=duser1,OU=Admin,DC=domain,DC=local |
| Entra1 | 2025-07-01 11:29:41Z | 2025-07-22 13:58:59Z | 2025-07-01 12:29:41Z | CN=Entra1,OU=Users,OU=Entra,DC=domain,DC=local |
| KerbRoast1 | 2025-07-29 12:24:09Z | Never | 2025-07-29 13:24:09Z | CN=KerbRoast1,OU=Admin,DC=domain,DC=local |
| NestedUser1 | 2025-05-09 13:14:01Z | Never | 2025-05-09 14:14:01Z | CN=NestedUser1,OU=Admin,DC=domain,DC=local |
| PermTest1 | 2025-07-11 14:22:44Z | 2025-07-11 15:26:35Z | 2025-07-11 15:24:31Z | CN=PermTest1,OU=Admin,DC=domain,DC=local |
| pingcastleGMSA$ | 2025-06-16 10:49:42Z | 2025-06-16 11:51:56Z | 2025-06-16 11:49:42Z | CN=pingcastleGMSA,CN=Managed Service Accounts,DC=domain,DC=local |
| ShouldNotShow | 2025-05-22 17:22:10Z | Never | 2025-05-22 18:22:10Z | CN=ShouldNotShow,OU=Test1,OU=Testing,DC=domain,DC=local |
| srv_certsvc | 2025-07-17 11:44:12Z | 2025-07-17 12:46:25Z | 2025-07-17 12:44:12Z | CN=srv_certsvc,OU=Admin,DC=domain,DC=local |
| srv_dhcp | 2025-05-14 08:43:25Z | 2025-06-13 20:56:58Z | 2025-05-14 09:43:25Z | CN=srv_dhcp,OU=Admin,DC=domain,DC=local |
| TestUser_EA | 2025-06-19 13:32:20Z | Never | 2025-06-19 14:32:20Z | CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| TestUser_NEA | 2025-06-19 17:00:11Z | Never | 2025-06-19 18:00:11Z | CN=TestUser_NEA,OU=Testing,DC=domain,DC=local |
| TestUser1 | 2025-05-21 16:36:35Z | Never | 2025-05-21 17:36:35Z | CN=TestUser1,OU=Admin,DC=domain,DC=local |
| TestUser1_BadSuc | 2025-06-19 15:07:09Z | Never | 2025-06-19 16:07:09Z | CN=TestUser1_BadSuc,OU=TestSubjects,OU=VulnerableTest-20250619-160707,OU=Testing,DC=domain,DC=local |
| TestUser1_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser1_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser10_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser10_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser11_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser11_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser12_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser12_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser13_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser13_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser14_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser14_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser15_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser15_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser16_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser16_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser17_Vuln | 2025-06-20 10:56:04Z | Never | 2025-06-20 11:56:04Z | CN=TestUser17_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser18_Vuln | 2025-06-20 11:09:56Z | Never | 2025-06-20 12:09:56Z | CN=TestUser18_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUSer2 | 2025-05-22 10:20:53Z | Never | 2025-05-22 11:20:53Z | CN=TestUser2,OU=Test1,OU=Testing,DC=domain,DC=local |
| TestUser2_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser2_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser3 | 2025-06-19 12:58:36Z | Never | 2025-06-19 13:58:36Z | CN=TestUser3,OU=Testing,DC=domain,DC=local |
| TestUser3_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser3_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser4_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser4_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser5_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser5_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser6_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser6_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser7_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser7_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser8_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser8_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser9_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser9_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| AdminEmail | 2025-08-06 09:08:42Z | Never | 2025-08-06 10:08:42Z | CN=AdminEmail,OU=Admin,DC=domain,DC=local |
| AdminKerb1 | 2026-01-22 23:09:32Z | Never | 2026-01-22 23:09:32Z | CN=AdminKerb1,OU=Admin,DC=domain,DC=local |
| DA | 2025-05-01 23:51:34Z | 2026-01-26 09:49:01Z | 2025-10-17 14:51:09Z | CN=DA,CN=Users,DC=domain,DC=local |
| demoNoPriv | 2025-09-09 14:26:31Z | 2025-09-09 15:42:25Z | 2025-09-09 15:26:31Z | CN=Demo NoPriv,OU=Admin,DC=domain,DC=local |
| domainuser | 2025-09-15 22:57:53Z | 2025-09-16 00:00:00Z | 2025-09-15 23:57:53Z | CN=domain user,OU=Admin,DC=domain,DC=local |
| Entra1 | 2025-07-01 11:29:41Z | 2025-07-22 13:58:59Z | 2025-07-01 12:29:41Z | CN=Entra1,OU=Users,OU=Entra,DC=domain,DC=local |
| kerbdeleg3 | 2025-10-28 13:55:05Z | Never | 2025-10-28 13:55:05Z | CN=kerbdeleg3,OU=Admin,DC=domain,DC=local |
| KerbRoast1 | 2025-07-29 12:24:09Z | Never | 2025-07-29 13:24:09Z | CN=KerbRoast1,OU=Admin,DC=domain,DC=local |
| MSOL_c92a2de74d9c | 2025-07-01 11:28:26Z | 2026-01-05 10:16:50Z | 2025-07-01 12:28:26Z | CN=MSOL_c92a2de74d9c,OU=Admin,DC=domain,DC=local |
| NestedDA | 2025-12-09 19:48:40Z | Never | 2025-12-09 19:48:40Z | CN=NestedDA,OU=People,DC=domain,DC=local |
| NestedUser1 | 2025-05-09 13:14:01Z | Never | 2025-05-09 14:14:01Z | CN=NestedUser1,OU=Admin,DC=domain,DC=local |
| PermTest1 | 2025-07-11 14:22:44Z | 2025-07-11 15:26:35Z | 2025-07-11 15:24:31Z | CN=PermTest1,OU=Admin,DC=domain,DC=local |
| ShouldNotShow | 2025-05-22 17:22:10Z | Never | 2025-05-22 18:22:10Z | CN=ShouldNotShow,OU=Test1,OU=Testing,DC=domain,DC=local |
| srv_1secure | 2025-06-25 09:49:19Z | 2025-09-03 21:34:50Z | 2025-09-11 13:16:31Z | CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| srv_AA | 2025-12-10 10:56:59Z | Never | 2025-12-10 10:56:59Z | CN=srv_AA,OU=Admin,DC=domain,DC=local |
| srv_certsvc | 2025-07-17 11:44:12Z | 2025-07-17 12:46:25Z | 2025-07-17 12:44:12Z | CN=srv_certsvc,OU=Admin,DC=domain,DC=local |
| srv_na | 2025-10-14 21:12:44Z | 2026-01-05 10:15:18Z | 2025-10-14 22:12:44Z | CN=srv_na,OU=Admin,DC=domain,DC=local |
| srv_na_col | 2025-10-15 11:06:21Z | 2026-01-05 10:17:18Z | 2025-10-15 12:06:21Z | CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| srv_recover | 2025-11-21 11:26:21Z | 2025-12-13 19:49:01Z | 2025-11-21 11:26:21Z | CN=srv_recover,OU=Admin,DC=domain,DC=local |
| srv_sd | 2025-07-15 12:49:52Z | 2026-01-05 10:15:25Z | 2025-07-15 13:49:52Z | CN=srv_sd,OU=Admin,DC=domain,DC=local |
| srv_si | 2025-07-15 12:49:36Z | 2025-12-10 10:40:06Z | 2025-07-15 13:49:36Z | CN=srv_si,OU=Admin,DC=domain,DC=local |
| TestUser_DA | 2025-06-19 13:32:37Z | 2025-11-04 13:12:29Z | 2025-11-04 13:20:52Z | CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| TestUser_EA | 2025-06-19 13:32:20Z | Never | 2025-06-19 14:32:20Z | CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| TestUser_NEA | 2025-06-19 17:00:11Z | Never | 2025-06-19 18:00:11Z | CN=TestUser_NEA,OU=Testing,DC=domain,DC=local |
| TestUser1 | 2025-05-21 16:36:35Z | Never | 2025-05-21 17:36:35Z | CN=TestUser1,OU=Admin,DC=domain,DC=local |
| TestUser1_BadSuc | 2025-06-19 15:07:09Z | Never | 2025-06-19 16:07:09Z | CN=TestUser1_BadSuc,OU=TestSubjects,OU=VulnerableTest-20250619-160707,OU=Testing,DC=domain,DC=local |
| TestUser1_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser1_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser10_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser10_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser11_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser11_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser12_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser12_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser13_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser13_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser14_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser14_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser15_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser15_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser16_Vuln | 2025-06-19 15:09:54Z | Never | 2025-06-19 16:09:54Z | CN=TestUser16_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser17_Vuln | 2025-06-20 10:56:04Z | Never | 2025-06-20 11:56:04Z | CN=TestUser17_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser18_Vuln | 2025-06-20 11:09:56Z | Never | 2025-06-20 12:09:56Z | CN=TestUser18_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUSer2 | 2025-05-22 10:20:53Z | Never | 2025-05-22 11:20:53Z | CN=TestUser2,OU=Test1,OU=Testing,DC=domain,DC=local |
| TestUser2_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser2_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser3 | 2025-06-19 12:58:36Z | Never | 2025-06-19 13:58:36Z | CN=TestUser3,OU=Testing,DC=domain,DC=local |
| TestUser3_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser3_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser4_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser4_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser5_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser5_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser6_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser6_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser7_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser7_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser8_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser8_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| TestUser9_Vuln | 2025-06-19 15:09:53Z | Never | 2025-06-19 16:09:53Z | CN=TestUser9_Vuln,OU=TestSubjects,OU=VulnerableTest-20250619-160953,OU=Testing,DC=domain,DC=local |
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| TestUser1 | 2025-05-21 16:36:35Z | Never | 2025-05-21 17:36:35Z | CN=TestUser1,OU=Admin,DC=domain,DC=local |
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| CLARK_PEREZ | 2025-09-11 14:13:02Z | Never | 2025-09-11 15:13:02Z | CN=CLARK_PEREZ,OU=GOO,OU=People,DC=domain,DC=local |
| JANELL_ODONNELL | 2025-09-11 14:13:09Z | Never | 2025-09-11 15:13:09Z | CN=JANELL_ODONNELL,OU=Admin,DC=domain,DC=local |
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| Administrator | 2025-05-01 23:27:12Z | 2025-12-17 12:45:37Z | 2025-05-02 00:16:58Z | CN=Administrator,CN=Users,DC=domain,DC=local |
| AdminKerb1 | 2026-01-22 23:09:32Z | Never | 2026-01-22 23:09:32Z | CN=AdminKerb1,OU=Admin,DC=domain,DC=local |
| kerbdeleg2 | 2025-08-28 13:11:13Z | Never | 2025-10-28 12:49:30Z | CN=kerbdeleg2,OU=Admin,DC=domain,DC=local |
| KerbRoast1 | 2025-07-29 12:24:09Z | Never | 2025-07-29 13:24:09Z | CN=KerbRoast1,OU=Admin,DC=domain,DC=local |
| TestUser_DA | 2025-06-19 13:32:37Z | 2025-11-04 13:12:29Z | 2025-11-04 13:20:52Z | CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| TestUser_EA | 2025-06-19 13:32:20Z | Never | 2025-06-19 14:32:20Z | CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
Here is the distribution where the password has been changed for the last time. Only enabled user accounts are analyzed (no guest account for example).
| SID History from domain | First date seen | Last date seen | Count | Dangerous SID Found |
|---|---|---|---|---|
| domain.local | 2025-05-21 16:36:35Z | 2025-05-21 16:36:35Z | 1 | True |
This section gives information about the computer accounts stored in the Active Directory
| Nb Computer Accounts | Nb Enabled | Nb Disabled | Nb Active | Nb Inactive | Nb AccessDenied | Nb SidHistory | Nb Bad PrimaryGroup | Nb unconstrained delegations (enabled) | Nb unconstrained delegations (disabled) | Nb Reversible password |
|---|---|---|---|---|---|---|---|---|---|---|
| 215 | 214 | 1 | 211 | 3 | 0 | 0 | 0 | 0 | 0 |
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| CHILDDC$ | 2025-07-21 17:41:36Z | 2025-07-21 18:41:36Z | 2025-07-21 18:41:36Z | CN=CHILDDC,CN=Computers,DC=domain,DC=local |
| dcshadow$ | 2025-06-30 12:24:51Z | Never | 2025-06-30 13:24:51Z | CN=dcshadow,CN=Computers,DC=domain,DC=local |
| DESKTOP-KCEBN9C$ | 2025-05-15 11:21:40Z | 2025-07-20 05:36:10Z | 2025-06-24 14:49:24Z | CN=DESKTOP-KCEBN9C,OU=Computers,OU=Entra,DC=domain,DC=local |
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| SERVER1$ | 2025-08-06 09:02:47Z | Never | 2025-08-06 10:02:47Z | CN=Server1,CN=Computers,DC=domain,DC=local |
| SERVER2$ | 2025-08-06 09:02:55Z | Never | 2025-08-06 10:02:55Z | CN=Server2,CN=Computers,DC=domain,DC=local |
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| AWSWAPPS1000000$ | 2025-09-11 14:04:43Z | Never | 2025-09-11 15:04:43Z | CN=AWSWAPPS1000000,OU=T2-Devices,OU=Tier 2,OU=Admin,DC=domain,DC=local |
| AWSWWEBS1000000$ | 2025-09-11 14:04:44Z | Never | 2025-09-11 15:04:44Z | CN=AWSWWEBS1000000,OU=TestOU_030,OU=GPOTest,DC=domain,DC=local |
| AWSWWKS1000002$ | 2025-09-11 14:13:39Z | Never | 2025-09-11 15:13:39Z | CN=AWSWWKS1000002,OU=Test,OU=ESM,OU=Tier 2,DC=domain,DC=local |
| AZRWCTRX1000000$ | 2025-09-11 14:04:37Z | Never | 2025-09-11 15:04:37Z | CN=AZRWCTRX1000000,OU=Testing,DC=domain,DC=local |
| AZRWCTRX1000004$ | 2025-09-11 14:13:28Z | Never | 2025-09-11 15:13:28Z | CN=AZRWCTRX1000004,OU=ServiceAccounts,OU=AWS,OU=Stage,DC=domain,DC=local |
| BDEWVIR1000000$ | 2025-09-11 14:04:44Z | Never | 2025-09-11 15:04:44Z | CN=BDEWVIR1000000,OU=Groups,OU=FIN,OU=Tier 1,DC=domain,DC=local |
| FINWCTRX1000001$ | 2025-09-11 14:13:42Z | Never | 2025-09-11 15:13:42Z | CN=FINWCTRX1000001,OU=ServiceAccounts,OU=ITS,OU=Stage,DC=domain,DC=local |
| FINWVIR1000003$ | 2025-09-11 14:13:25Z | Never | 2025-09-11 15:13:25Z | CN=FINWVIR1000003,OU=ServiceAccounts,OU=AWS,OU=Tier 1,DC=domain,DC=local |
| FSRWAPPS1000001$ | 2025-09-11 14:04:57Z | Never | 2025-09-11 15:04:57Z | CN=FSRWAPPS1000001,OU=Devices,OU=AWS,OU=Tier 1,DC=domain,DC=local |
| FSRWVIR1000001$ | 2025-09-11 14:04:47Z | Never | 2025-09-11 15:04:47Z | CN=FSRWVIR1000001,OU=TestOU_033,OU=GPOTest,DC=domain,DC=local |
| FSRWWKS1000000$ | 2025-09-11 14:04:49Z | Never | 2025-09-11 15:04:49Z | CN=FSRWWKS1000000,OU=TestOU_047,OU=GPOTest,DC=domain,DC=local |
| GOOWDBAS1000002$ | 2025-09-11 14:13:43Z | Never | 2025-09-11 15:13:43Z | CN=GOOWDBAS1000002,OU=TestOU_008,OU=GPOTest,DC=domain,DC=local |
| GOOWSECS1000000$ | 2025-09-11 14:04:57Z | Never | 2025-09-11 15:04:57Z | CN=GOOWSECS1000000,OU=T2-Devices,OU=Tier 2,OU=Admin,DC=domain,DC=local |
| HREWVIR1000002$ | 2025-09-11 14:13:28Z | Never | 2025-09-11 15:13:29Z | CN=HREWVIR1000002,OU=TST,OU=Tier 1,DC=domain,DC=local |
| ITSWWKS1000003$ | 2025-09-11 14:13:45Z | Never | 2025-09-11 15:13:45Z | CN=ITSWWKS1000003,OU=TestOU_044,OU=GPOTest,DC=domain,DC=local |
| OGCWAPPS1000000$ | 2025-09-11 14:13:40Z | Never | 2025-09-11 15:13:40Z | CN=OGCWAPPS1000000,OU=Test,OU=AZR,OU=Tier 1,DC=domain,DC=local |
| SECWDBAS1000001$ | 2025-09-11 14:04:51Z | Never | 2025-09-11 15:04:51Z | CN=SECWDBAS1000001,OU=TestOU_025,OU=GPOTest,DC=domain,DC=local |
| TSTWLPT1000002$ | 2025-09-11 14:13:32Z | Never | 2025-09-11 15:13:32Z | CN=TSTWLPT1000002,OU=ServiceAccounts,OU=HRE,OU=Tier 1,DC=domain,DC=local |
| TSTWWKS1000000$ | 2025-09-11 14:04:54Z | Never | 2025-09-11 15:04:54Z | CN=TSTWWKS1000000,OU=T2-Permissions,OU=Tier 2,OU=Admin,DC=domain,DC=local |
If you need to find the computers running a specific OS, we advise to use PingCastle.exe and the export / computers feature available from the main menu. Indeed the computer details are not included in the report for performance issues. Doing this will impact significantly the report size and the time to load the report.
| Operating System | Nb OS | Nb Enabled | Nb Disabled | Nb Active | Nb Inactive | Nb AccessDenied | Nb SidHistory | Nb Bad PrimaryGroup | Nb unconstrained delegations (enabled) | Nb unconstrained delegations (disabled) | Nb Reversible password |
|---|---|---|---|---|---|---|---|---|---|---|---|
| OperatingSystem not set | 200 | 200 | 0 | 199 | 1 | 0 | 0 | 0 | 0 | 0 | |
| Windows Server 2019 1809 | 11 | 10 | 1 | 9 | 1 | 0 | 0 | 0 | 0 | 0 | |
| Windows 10 22H2 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
| Windows Server 2025 24H2 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | |
| Windows 11 22H2 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
Here is a specific zoom related to the Active Directory servers: the domain controllers.
| Domain controller | Operating System | IsGlobalCatalog | IsReadOnly | Creation Date | Startup Time | Uptime | Owner | Null sessions | SMB v1 | Remote spooler | FSMO role | WebDAV |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DC | Windows 2019 | TRUE | FALSE | 2025-05-01 23:28:07Z | 2026-01-06 10:08:28Z | 029 days | DOMAIN\Domain Admins | NO | NO | YES | PDC, RID pool manager, Infrastructure master, Schema master, Domain naming Master | NO |
| DC2 | Windows 2019 | TRUE | FALSE | 2025-05-02 10:34:33Z | 2026-01-26 10:10:18Z | 009 days | DOMAIN\Domain Admins | NO | NO | YES | NO | |
| RODC | Windows 2019 | TRUE | TRUE | 2025-05-02 22:00:24Z | 2026-01-27 07:50:06Z | 008 days | DOMAIN\Domain Admins | NO | NO | YES | NO |
Here is the distribution of the LAPS password fresshness (legacy vs the new Microsoft extension).
Here is the application of LAPS
Note: LAPS cannot be installed on Domain controllers. As a consequence LAPS cannot be deployed on 100% of the servers. There is currently 3 domain controllers or Entra ID gateway listed in this report.
| Operating System | Enabled Computers | Active Computers | Legacy LAPS | Windows LAPS | Both LAPS applied | LAPS Total | Ratio (%) |
|---|---|---|---|---|---|---|---|
| Windows Server 2019 1809 | 10 | 0 | 0 | 0 | 0 | 0 | 0 |
| Windows 10 22H2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| Windows Server 2025 24H2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| Windows 11 22H2 | 1 | 1 | 0 | 1 | 0 | 1 | 100 |
| OperatingSystem not set | 199 | 0 | 0 | 0 | 0 | 0 | 0 |
This section is focused on the groups which are critical for admin activities. If the report has been saved which the full details, each group can be zoomed with its members. If it is not the case, for privacy reasons, only general statistics are available.
| Group Name | Nb Admins | Nb Enabled | Nb Disabled | Nb Inactive | Nb PWd never expire | Nb Smart Card required | Nb Service accounts | Nb can be delegated | Nb external users | Nb protected users |
|---|---|---|---|---|---|---|---|---|---|---|
| Account Operators | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Administrators | 15 | 15 | 0 | 8 | 12 | 0 | 4 | 15 | 0 | 0 |
| Backup Operators | 2 | 2 | 0 | 1 | 2 | 0 | 2 | 2 | 0 | 0 |
| Certificate Operators | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Certificate Publishers | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Dns Admins | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Domain Administrators | 11 | 11 | 0 | 4 | 10 | 0 | 4 | 11 | 0 | 0 |
| Enterprise Administrators | 8 | 8 | 0 | 4 | 5 | 0 | 3 | 8 | 0 | 0 |
| Enterprise Key Administrators | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Key Administrators | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Print Operators | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Replicator | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Schema Administrators | 4 | 4 | 0 | 1 | 3 | 0 | 3 | 4 | 0 | 0 |
| Server Operators | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| SamAccountName | Enabled | Active | Pwd never Expired | Locked | Smart Card required | Service account | Flag Cannot be delegated present | Creation date | Last login | Password last set | In Protected Users | Distinguished name |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Administrator | YES | YES | NO | NO | NO | YES | NO | 2025-05-01 23:27:12Z | 2025-12-17 12:45:37Z | 2025-05-02 00:16:58Z | NO | CN=Administrator,CN=Users,DC=domain,DC=local |
| AdminKerb1 | YES | NO | YES | NO | NO | YES | NO | 2026-01-22 23:09:32Z | Not set | 2026-01-22 23:09:32Z | NO | CN=AdminKerb1,OU=Admin,DC=domain,DC=local |
| DA | YES | YES | YES | NO | NO | NO | NO | 2025-05-01 23:51:34Z | 2026-01-26 09:49:01Z | 2025-10-17 14:51:09Z | NO | CN=DA,CN=Users,DC=domain,DC=local |
| ED_MERRILL | YES | NO | NO | NO | NO | NO | NO | 2025-09-11 14:13:00Z | Not set | 2025-09-11 15:13:00Z | NO | CN=ED_MERRILL,OU=People,DC=domain,DC=local |
| NestedDA | YES | NO | YES | NO | NO | NO | NO | 2025-12-09 19:48:40Z | Not set | 2025-12-09 19:48:40Z | NO | CN=NestedDA,OU=People,DC=domain,DC=local |
| RUPERT_COMPTON | YES | NO | NO | NO | NO | NO | NO | 2025-09-11 14:13:07Z | Not set | 2025-09-11 15:13:07Z | NO | CN=RUPERT_COMPTON,OU=ESM,OU=People,DC=domain,DC=local |
| srv_1secure | YES | YES | YES | NO | NO | NO | NO | 2025-06-25 09:49:19Z | 2025-09-03 21:34:50Z | 2025-09-11 13:16:31Z | NO | CN=srv_1secure,OU=Admin,DC=domain,DC=local |
| srv_AA | YES | NO | YES | NO | NO | NO | NO | 2025-12-10 10:56:59Z | Not set | 2025-12-10 10:56:59Z | NO | CN=srv_AA,OU=Admin,DC=domain,DC=local |
| srv_certsvc | YES | NO | YES | NO | NO | NO | NO | 2025-07-17 11:44:12Z | 2025-07-17 12:46:25Z | 2025-07-17 12:44:12Z | NO | CN=srv_certsvc,OU=Admin,DC=domain,DC=local |
| srv_na_col | YES | YES | YES | NO | NO | NO | NO | 2025-10-15 11:06:21Z | 2026-01-05 10:17:18Z | 2025-10-15 12:06:21Z | NO | CN=srv_na_col,OU=Admin,DC=domain,DC=local |
| srv_recover | YES | YES | YES | NO | NO | NO | NO | 2025-11-21 11:26:21Z | 2025-12-13 19:49:01Z | 2025-11-21 11:26:21Z | NO | CN=srv_recover,OU=Admin,DC=domain,DC=local |
| srv_sd | YES | YES | YES | NO | NO | NO | NO | 2025-07-15 12:49:52Z | 2026-01-05 10:15:25Z | 2025-07-15 13:49:52Z | NO | CN=srv_sd,OU=Admin,DC=domain,DC=local |
| TestUser_DA | YES | YES | YES | NO | NO | YES | NO | 2025-06-19 13:32:37Z | 2025-11-04 13:12:29Z | 2025-11-04 13:20:52Z | NO | CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| TestUser_EA | YES | NO | YES | NO | NO | YES | NO | 2025-06-19 13:32:20Z | Not set | 2025-06-19 14:32:20Z | NO | CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| TestUser_NEA | YES | NO | YES | NO | NO | NO | NO | 2025-06-19 17:00:11Z | Not set | 2025-06-19 18:00:11Z | NO | CN=TestUser_NEA,OU=Testing,DC=domain,DC=local |
Here is the distribution of the last logon of privileged users. Only enabled accounts are analyzed.
Here is the distribution of the password age for privileged users. Only enabled accounts are analyzed.
Each specific rights defined for Organizational Unit (OU) are listed below.
| DistinguishedName | Account | Right |
|---|---|---|
| DC=domain | DOMAIN\Domain Controllers | EXT_RIGHT_REPLICATION_GET_CHANGES_ALL |
| DC=domain | DOMAIN\MSOL_c92a2de74d9c | EXT_RIGHT_REPLICATION_GET_CHANGES_ALL, EXT_RIGHT_FORCE_CHANGE_PWD |
| DC=domain | DOMAIN\Robert.Falcon | EXT_RIGHT_REPLICATION_GET_CHANGES_ALL |
| DC=domain | DOMAIN\TestUser3 | EXT_RIGHT_REPLICATION_GET_CHANGES_ALL |
| CN=Policies,CN=System | DOMAIN\Group Policy Creator Owners | CreateChild, CreateChild (All Objects) |
| CN=RAS and IAS Servers Access Check,CN=System | DOMAIN\RAS and IAS Servers | GenericWrite, WriteDacl, WriteOwner, CreateChild, WriteDacl (All Objects), All extended right, DSSelf, Write all prop |
| CN=WMIPolicy,CN=System | DOMAIN\Group Policy Creator Owners | GenericWrite, CreateChild, CreateChild (All Objects), DSSelf, Write all prop |
| CN=PolicyTemplate,CN=WMIPolicy,CN=System | DOMAIN\Group Policy Creator Owners | CreateChild, CreateChild (All Objects) |
| CN=PolicyType,CN=WMIPolicy,CN=System | DOMAIN\Group Policy Creator Owners | CreateChild, CreateChild (All Objects) |
| CN=SOM,CN=WMIPolicy,CN=System | DOMAIN\Group Policy Creator Owners | GenericWrite, CreateChild, CreateChild (All Objects), DSSelf, Write all prop |
| CN=WMIGPO,CN=WMIPolicy,CN=System | DOMAIN\Group Policy Creator Owners | CreateChild, CreateChild (All Objects) |
| OU=Domain Controllers | DOMAIN\IT_Helpdesk_Tier1 | WriteOwner, WriteOwner (All Objects) |
| OU=Testing | DOMAIN\TestUser1 | CreateChild, CreateChild (All Objects), WriteDacl, WriteDacl (Descendant msDS-DelegatedManagedServiceAccount) |
| OU=Testing | DOMAIN\TestUser3 | GenericAll, GenericWrite, WriteDacl, WriteOwner, CreateChild, GenericAll (Descendant OUs) |
| OU=Test1,OU=Testing | DOMAIN\ShouldNotShow | WriteDacl, WriteOwner |
| OU=Test1,OU=Testing | DOMAIN\TestUSer2 | CreateChild msDS-DelegatedManagedServiceAccount Objects |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser1_Vuln | GenericAll, GenericWrite, WriteDacl, WriteOwner, CreateChild, GenericAll (All Objects), All extended right, DSSelf, Write all prop |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser10_Vuln | WriteOwner, WriteOwner (Descendant OUs) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser11_Vuln | WriteDacl, WriteDacl (All Objects) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser12_Vuln | WriteDacl, WriteDacl (Descendant msDS-DelegatedManagedServiceAccount) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser13_Vuln | WriteDacl, WriteDacl (Descendant OUs) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser14_Vuln | CreateChild, CreateChild (All Objects) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser15_Vuln | CreateChild |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser16_Vuln | CreateChild, CreateChild (Descendant OUs) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser17_Vuln | CreateChild msDS-DelegatedManagedServiceAccount Objects |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser2_Vuln | WriteOwner, WriteOwner (All Objects) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser3_Vuln | WriteDacl, WriteDacl (All Objects) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser4_Vuln | CreateChild, CreateChild (All Objects) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser5_Vuln | GenericAll, GenericWrite, WriteDacl, WriteOwner, CreateChild, GenericAll (All Objects), All extended right, DSSelf, Write all prop |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser6_Vuln | GenericAll, GenericWrite, WriteDacl, WriteOwner, CreateChild, GenericAll (Descendant msDS-DelegatedManagedServiceAccount) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser7_Vuln | GenericAll, GenericWrite, WriteDacl, WriteOwner, CreateChild, GenericAll (Descendant OUs) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser8_Vuln | WriteOwner, WriteOwner (All Objects) |
| OU=VulnerableTest-20250619-160953,OU=Testing | DOMAIN\TestUser9_Vuln | WriteOwner, WriteOwner (Descendant msDS-DelegatedManagedServiceAccount) |
In particular for AD database access (DCSync, AADConnect, ...).
| DistinguishedName | Account | Right |
|---|---|---|
| DC=domain | DOMAIN\Domain Controllers | EXT_RIGHT_REPLICATION_GET_CHANGES_ALL |
| DC=domain | DOMAIN\MSOL_c92a2de74d9c | EXT_RIGHT_REPLICATION_GET_CHANGES_ALL, EXT_RIGHT_FORCE_CHANGE_PWD |
| DC=domain | DOMAIN\Robert.Falcon | EXT_RIGHT_REPLICATION_GET_CHANGES_ALL |
| DC=domain | DOMAIN\TestUser3 | EXT_RIGHT_REPLICATION_GET_CHANGES_ALL |
This section focuses on permissions issues that can be exploited to take control of the domain.
This is an advanced section that should be examined after having looked at the Admin Groups section.
This analysis focuses on accounts found in control path and located in other domains.
No operative link with other domains has been found.
This part tries to summarize in a single table if major issues have been found.
Focus on finding critical objects such as the Everyone group then try to decrease the number of objects having indirect access.
The detail is displayed below.
| Priority to remediate | Critical Object Found | Number of objects with Indirect | Max number of indirect numbers | Max ratio |
|---|---|---|---|---|
| Critical | YES | 5 | 2 | 25 |
| High | NO | 1 | 1 | 50 |
| Medium | YES | 1 | 2 | 0 |
| Other | YES | 1 | 2 | 0 |
If the report has been saved which the full details, each object can be zoomed with its full detail. If it is not the case, for privacy reasons, only general statistics are available.
| Group or user account | Priority | Users member | Computer member of the group | Indirect control | Unresolved members | Links | Detail |
|---|---|---|---|---|---|---|---|
| Account Operators | High | 0 | 0 | 0 | 0 | None | Analysis |
| Administrator | Critical | 0 | 0 | None | Analysis | ||
| Administrators | Critical | 15 (Details) | 0 | 1 (Details) | 0 | None | Analysis |
| Backup Operators | High | 2 (Details) | 0 | 1 (Details) | 0 | None | Analysis |
| Certificate Operators | Medium | 0 | 0 | 0 | 0 | None | Analysis |
| Certificate Publishers | Other | 0 | 2 (Details) | 2 including EVERYONE (Details) | 0 | None | Analysis |
| Dns Admins | Medium | 0 | 0 | 0 | 0 | None | Analysis |
| Domain Administrators | Critical | 11 (Details) | 0 | 1 (Details) | 0 | None | Analysis |
| Enterprise Administrators | Critical | 8 (Details) | 0 | 1 (Details) | 0 | None | Analysis |
| Enterprise Key Administrators | Medium | 0 | 0 | 0 | 0 | None | Analysis |
| Key Administrators | Medium | 0 | 0 | 0 | 0 | None | Analysis |
| Print Operators | Medium | 0 | 0 | 0 | 0 | None | Analysis |
| Replicator | Medium | 0 | 0 | 0 | 0 | None | Analysis |
| Schema Administrators | Critical | 4 (Details) | 0 | 1 (Details) | 0 | None | Analysis |
| Server Operators | High | 0 | 0 | 0 | 0 | None | Analysis |
If the report has been saved which the full details, each object can be zoomed with its full detail. If it is not the case, for privacy reasons, only general statistics are available.
| Group or user account | Priority | Users member | Computer member of the group | Indirect control | Unresolved members | Links | Detail |
|---|---|---|---|---|---|---|---|
| AdminSDHolder container | Critical | 0 | 0 | None | Analysis | ||
| Builtin OU | Medium | 0 | 0 | None | Analysis | ||
| Certificate store | Medium | 0 | 0 | None | Analysis | ||
| Computers container | Medium | 0 | 0 | None | Analysis | ||
| Domain Controllers | Critical | 0 | 2 (Details) | 2 including EVERYONE (Details) | 0 | None | Analysis |
| Domain Root | Medium | 0 | 0 | None | Analysis | ||
| Enterprise Read Only Domain Controllers | Other | 0 | 0 | 0 | 0 | None | Analysis |
| Group Policy Creator Owners | Medium | 1 (Details) | 0 | 0 | 0 | None | Analysis |
| Krbtgt account | Medium | 0 | 0 | None | Analysis | ||
| Read Only Domain Controllers | Medium | 0 | 1 (Details) | 2 including EVERYONE (Details) | 0 | None | Analysis |
| Users container | Medium | 0 | 0 | None | Analysis |
This section focuses on the relations that this domain has with other domains
This part displays the direct links that this domain has with other domains.
| Trust Partner | Type | Attribut | Direction | SID Filtering active | TGT Delegation | Creation | Is Active ? | Algorithm |
|---|---|---|---|---|---|---|---|---|
| child.domain.local | Uplevel | Intra-Forest | Bidirectional | Not applicable | Not applicable | 2025-07-24 11:36:39Z | TRUE | Default (RC4) |
These are the domains that PingCastle was able to detect but which is not releated to direct trusts. It may be children of a forest or bastions.
| Reachable domain | Discovered using | Netbios | Creation date |
|---|
This detects trusted certificates which can be used in man in the middle attacks, or which can issue smart card logon certificates
Number of trusted certificates: 2
| Source | Store | Subject | Issuer | NotBefore | NotAfter | Module size | Signature Alg | SC Logon |
|---|---|---|---|---|---|---|---|---|
| Enterprise NTAuth | NTLMStore | CN=Contoso-ENT-ROOT-CA, DC=domain, DC=local | CN=Contoso-ENT-ROOT-CA, DC=domain, DC=local | 2026-01-07 15:37:33Z | 2036-01-07 15:47:23Z | 4096 | sha256RSA | False |
| Enterprise NTAuth | NTLMStore | CN=Enterprise CA, DC=domain, DC=local | CN=Enterprise CA, DC=domain, DC=local | 2025-05-02 16:00:27Z | 2030-05-02 16:10:27Z | 2048 | sha256RSA | False |
This section lists certificate templates which can be used to generate a certificate. A misconfiguration can allow an attacker to create its own certificate and use it to impersonate other users
Number of certificate templates: 15
| Name | Destination | Manager approval | Enrollee can supply subject | Issuance requirements | Vulnerable ACL | Everyone can enroll | Agent template | Any purpose | For Authentication | Flag No Security |
|---|---|---|---|---|---|---|---|---|---|---|
| User | User | NO | NO | NO | NO | YES | NO | NO | YES | NO |
| EFS | User | NO | NO | NO | NO | YES | NO | NO | NO | NO |
| Administrator | User | NO | NO | NO | NO | NO | NO | NO | YES | NO |
| EFSRecovery | User | NO | NO | NO | NO | NO | NO | NO | NO | NO |
| Machine | Computer | NO | NO | NO | NO | YES | NO | NO | YES | NO |
| DomainController | Computer | NO | NO | NO | NO | NO | NO | NO | YES | NO |
| WebServer | Computer | NO | YES | NO | NO | NO | NO | NO | NO | NO |
| SubCA | Computer | NO | YES | NO | NO | NO | NO | YES | YES | NO |
| DomainControllerAuthentication | Computer | NO | NO | NO | NO | NO | NO | NO | YES | NO |
| DirectoryEmailReplication | Computer | NO | NO | NO | NO | NO | NO | NO | NO | NO |
| KerberosAuthentication | Computer | NO | NO | NO | NO | NO | NO | NO | YES | NO |
| WebServerCustomURL | Computer | NO | YES | NO | NO | YES | NO | NO | NO | NO |
| ESC1 | User | NO | YES | NO | NO | YES | NO | NO | YES | NO |
| ESC2 | User | NO | NO | NO | NO | YES | NO | YES | YES | NO |
| ESC3-Enrollment | User | NO | NO | NO | NO | YES | YES | NO | NO | NO |
The delegations for certificate templates are listed below.
| DistinguishedName | Account | Right |
|---|---|---|
| CN=DirectoryEmailReplication,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Domain Controllers | Enroll |
| CN=DirectoryEmailReplication,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Enterprise Read-only Domain Controllers | Enroll |
| CN=DomainController,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Domain Controllers | Enroll |
| CN=DomainController,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Enterprise Read-only Domain Controllers | Enroll |
| CN=DomainControllerAuthentication,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Domain Controllers | Enroll |
| CN=DomainControllerAuthentication,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Enterprise Read-only Domain Controllers | Enroll |
| CN=EFS,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | Domain Users | Enroll |
| CN=ESC1,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | Authenticated Users | Enroll |
| CN=ESC1,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\DA | GenericWrite, WriteDacl, WriteOwner, CreateChild, WriteDacl (All Objects), DSSelf, Write all prop |
| CN=ESC2,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | Authenticated Users | Enroll |
| CN=ESC2,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\DA | GenericWrite, WriteDacl, WriteOwner, CreateChild, WriteDacl (All Objects), DSSelf, Write all prop |
| CN=ESC3-Enrollment,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | Authenticated Users | Enroll |
| CN=ESC3-Enrollment,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\DA | GenericWrite, WriteDacl, WriteOwner, CreateChild, WriteDacl (All Objects), DSSelf, Write all prop |
| CN=KerberosAuthentication,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Domain Controllers | Enroll |
| CN=KerberosAuthentication,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Enterprise Read-only Domain Controllers | Enroll |
| CN=Machine,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | Domain Computers | Enroll |
| CN=User,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | Domain Users | Enroll |
| CN=WebServerCustomURL,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | Authenticated Users | Enroll |
| CN=WebServerCustomURL,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration | DOMAIN\Administrator | GenericWrite, WriteDacl, WriteOwner, CreateChild, WriteDacl (All Objects), DSSelf, Write all prop |
This section lists certificates in use on Domain Controllers. They give an attacker hints about the PKI configuration.
Number of DC certificates: 3
| DC Name | Subject | SAN | EKU | Template | NotBefore | NotAfter | Module size | Signature Alg |
|---|---|---|---|---|---|---|---|---|
| DC | CN=DC.domain.local | DC.domain.local | Client Authentication, Server Authentication, | 2025-05-02 16:44:53Z | 2026-05-02 16:44:53Z | 2048 | sha256RSA | |
| DC2 | CN=DC2.domain.local | DC2.domain.local | Client Authentication, Server Authentication, | 2025-05-02 19:25:52Z | 2026-05-02 19:25:52Z | 2048 | sha256RSA | |
| RODC | CN=rodc.domain.local | rodc.domain.local | Client Authentication, Server Authentication, | 2025-05-02 23:49:31Z | 2026-05-02 23:49:31Z | 2048 | sha256RSA |
Microsoft Entra Connect help maintaining a synchronization between the Active Directory and Entra ID. Microsoft Entra Connect servers should be considered as Tiers0 as they usually have the right to read the hashes of the user passwords.
| Identifier | Computer | Tenant | IsEnabled | Created | LastLogon | PwdLastSet | Computer object found |
|---|
WSUS settings allow workstations and servers located on the intranet to be updated. The reference documentation is here. Here are the settings found in GPO.
| Policy Name | WSUS Server | UseWUServer | ElevateNonAdmins | AUOptions | NoAutoUpdate | NoAutoRebootWithLoggedOnUsers |
|---|
Exchange is the mail server of Microsoft. Because it is deeply integrated into the Active Directory, it is a component to be monitored
PingCastle is checking objects of type msExchExchangeServer and the schema to provide the information below.
| Name | In service date | Version | Proxy |
|---|
SCCM or its more recent name Microsoft Endpoint Manager is the Microsoft tool to manage the workstations and servers. It is used typically to deploy packages.
PingCastle is checking objects of type mSSMSManagementPoint and the schema to provide the information below.
| Name | Version | Client operational version | AAD TenantID | AAD TenantName |
|---|
Service Connection Points are a configuration stored in the AD to expose services to all computers.
| Service | Class | DNS | Binding Info | DN |
|---|
This section checks for known pain points in AES activation and RC4 removal for kerberos
This section is here to evaluate the know problems when removing RC4. If you plan to do so, you should check all the items highlighted below and proceed with a small group of test computers.
Please see the following articles:
This program will proceed to know:
This program starts by determining for how long the infrastructure in place is compatible with AES.
This is done by retrieving the creation date of the groupe 'Read-Only Domain Controllers' which is linked to the first DC compatible with AES (Windows Server 2008).
Installation date of the first DC compatible with AES: 2025-05-01 23:28:07Z
All passwords saved after this date have their hash saved with both RC4 and AES.
To issue Kerberos ticket, the krbtgt account holding the kerberos secret key must have a password changed AFTER the installation of the first DC compatible with AES.
Last krbtgt change: 2025-05-02 00:28:07Z
OK
To support AES, all DC must be at least Windows 2008.
| Domain Controller | OS | AES compatible |
|---|---|---|
| DC | Windows 2019 | Yes |
| DC2 | Windows 2019 | Yes |
| RODC | Windows 2019 | Yes |
OK
To be used over trusts, AES requires the trust to support this algorithm. This is done thought the special attribute msDS-SupportedEncryptionTypes.
Be aware that checking 'The other domain supports Kerberos AES Encryption' in the trust property disables RC4. This check is not recommended during the migration phase.
| Trust Partner | Creation | Is Active ? | Algorithm | AES compatible |
|---|---|---|---|---|
| child.domain.local | 2025-07-24 11:36:39Z | TRUE | Default (RC4) | No |
Not OK
To be used over Azure, the special AzureSSO account must be setup to support AES.
No Entra ID SSO detected
OK
Kerberos tickets for services are signed by the password hash of the service account. The service account must be declared as compatible to handle AES. This is done through the special attribute named msDS-SupportedEncryptionTypes or by checking 'This account supports Kerberos AES XXX bit encryption' in the account properties.
The service account must also have a password newer than the first DC compatible with AES. If there was no password change, the creation date must be newer than the first DC compatible with AES.
If a service account is not compatible, you will received error messages like 'The encryption type requested is not supported by the KDC'. See the following KB for SharePoint of SCCM errors:
Number of service account found without AES configuration: 25
| Name | Creation | Last logon | Pwd Last Set | Distinguished name |
|---|---|---|---|---|
| Administrator | 2025-05-01 23:27:12Z | 2025-12-17 12:45:37Z | 2025-05-02 00:16:58Z | CN=Administrator,CN=Users,DC=domain,DC=local |
| AdminKerb1 | 2026-01-22 23:09:32Z | Never | 2026-01-22 23:09:32Z | CN=AdminKerb1,OU=Admin,DC=domain,DC=local |
| AWSWAPPS1000000$ | 2025-09-11 14:04:43Z | Never | 2025-09-11 15:04:43Z | CN=AWSWAPPS1000000,OU=T2-Devices,OU=Tier 2,OU=Admin,DC=domain,DC=local |
| AWSWWEBS1000000$ | 2025-09-11 14:04:44Z | Never | 2025-09-11 15:04:44Z | CN=AWSWWEBS1000000,OU=TestOU_030,OU=GPOTest,DC=domain,DC=local |
| AWSWWKS1000002$ | 2025-09-11 14:13:39Z | Never | 2025-09-11 15:13:39Z | CN=AWSWWKS1000002,OU=Test,OU=ESM,OU=Tier 2,DC=domain,DC=local |
| AZRWCTRX1000000$ | 2025-09-11 14:04:37Z | Never | 2025-09-11 15:04:37Z | CN=AZRWCTRX1000000,OU=Testing,DC=domain,DC=local |
| AZRWCTRX1000004$ | 2025-09-11 14:13:28Z | Never | 2025-09-11 15:13:28Z | CN=AZRWCTRX1000004,OU=ServiceAccounts,OU=AWS,OU=Stage,DC=domain,DC=local |
| BDEWVIR1000000$ | 2025-09-11 14:04:44Z | Never | 2025-09-11 15:04:44Z | CN=BDEWVIR1000000,OU=Groups,OU=FIN,OU=Tier 1,DC=domain,DC=local |
| FINWCTRX1000001$ | 2025-09-11 14:13:42Z | Never | 2025-09-11 15:13:42Z | CN=FINWCTRX1000001,OU=ServiceAccounts,OU=ITS,OU=Stage,DC=domain,DC=local |
| FINWVIR1000003$ | 2025-09-11 14:13:25Z | Never | 2025-09-11 15:13:25Z | CN=FINWVIR1000003,OU=ServiceAccounts,OU=AWS,OU=Tier 1,DC=domain,DC=local |
| FSRWAPPS1000001$ | 2025-09-11 14:04:57Z | Never | 2025-09-11 15:04:57Z | CN=FSRWAPPS1000001,OU=Devices,OU=AWS,OU=Tier 1,DC=domain,DC=local |
| FSRWVIR1000001$ | 2025-09-11 14:04:47Z | Never | 2025-09-11 15:04:47Z | CN=FSRWVIR1000001,OU=TestOU_033,OU=GPOTest,DC=domain,DC=local |
| FSRWWKS1000000$ | 2025-09-11 14:04:49Z | Never | 2025-09-11 15:04:49Z | CN=FSRWWKS1000000,OU=TestOU_047,OU=GPOTest,DC=domain,DC=local |
| GOOWDBAS1000002$ | 2025-09-11 14:13:43Z | Never | 2025-09-11 15:13:43Z | CN=GOOWDBAS1000002,OU=TestOU_008,OU=GPOTest,DC=domain,DC=local |
| GOOWSECS1000000$ | 2025-09-11 14:04:57Z | Never | 2025-09-11 15:04:57Z | CN=GOOWSECS1000000,OU=T2-Devices,OU=Tier 2,OU=Admin,DC=domain,DC=local |
| HREWVIR1000002$ | 2025-09-11 14:13:28Z | Never | 2025-09-11 15:13:29Z | CN=HREWVIR1000002,OU=TST,OU=Tier 1,DC=domain,DC=local |
| ITSWWKS1000003$ | 2025-09-11 14:13:45Z | Never | 2025-09-11 15:13:45Z | CN=ITSWWKS1000003,OU=TestOU_044,OU=GPOTest,DC=domain,DC=local |
| kerbdeleg2 | 2025-08-28 13:11:13Z | Never | 2025-10-28 12:49:30Z | CN=kerbdeleg2,OU=Admin,DC=domain,DC=local |
| KerbRoast1 | 2025-07-29 12:24:09Z | Never | 2025-07-29 13:24:09Z | CN=KerbRoast1,OU=Admin,DC=domain,DC=local |
| OGCWAPPS1000000$ | 2025-09-11 14:13:40Z | Never | 2025-09-11 15:13:40Z | CN=OGCWAPPS1000000,OU=Test,OU=AZR,OU=Tier 1,DC=domain,DC=local |
| SECWDBAS1000001$ | 2025-09-11 14:04:51Z | Never | 2025-09-11 15:04:51Z | CN=SECWDBAS1000001,OU=TestOU_025,OU=GPOTest,DC=domain,DC=local |
| TestUser_DA | 2025-06-19 13:32:37Z | 2025-11-04 13:12:29Z | 2025-11-04 13:20:52Z | CN=TestUser_DA,OU=Testing,DC=domain,DC=local |
| TestUser_EA | 2025-06-19 13:32:20Z | Never | 2025-06-19 14:32:20Z | CN=TestUser_EA,OU=Testing,DC=domain,DC=local |
| TSTWLPT1000002$ | 2025-09-11 14:13:32Z | Never | 2025-09-11 15:13:32Z | CN=TSTWLPT1000002,OU=ServiceAccounts,OU=HRE,OU=Tier 1,DC=domain,DC=local |
| TSTWWKS1000000$ | 2025-09-11 14:04:54Z | Never | 2025-09-11 15:04:54Z | CN=TSTWWKS1000000,OU=T2-Permissions,OU=Tier 2,OU=Admin,DC=domain,DC=local |
Not OK
The algorithm to use for kerberos request is decided by a local GPO which is overwritten by domain GPO.
Here is the list of domain GPO altering the kerberos algorithms
| Policy Name | Algorithm | AES compatible | RC4 compatible |
|---|
OK
Beware that no GPO supporting AES / RC4 have been found and if the supported algorithm is not defined in the master, AES will not be enabled by default
This section focuses on security checks specific to the Active Directory environment.
The program checks the last date of the AD backup. This date is computed using the replication metadata of the attribute dsaSignature (reference).
Last backup date: 2025-06-30 13:44:11Z
LAPS is used to have a unique local administrator password on all workstations / servers of the domain. Then this password is changed at a fixed interval. The risk is when a local administrator hash is retrieved and used on other workstation in a pass-the-hash attack. Please note that the LAPS schema is installed on the forest and as a consequence the installation date can be before the domain creation date.
Mitigation: having a process when a new workstation is created or install LAPS and apply it through a GPO
Legacy LAPS installation date: 2025-09-11 14:04:04Z
Windows LAPS installation date: 2025-11-06 11:37:10Z
Windows Event Forwarding is a native mechanism used to collect logs on all workstations / servers of the domain. Microsoft recommends to Use Windows Event Forwarding to help with intrusion detection Here is the list of servers configured for WEF found in GPO
Number of WEF configuration found: 0
The account password for the krbtgt account should be rotated twice yearly at a minimum. More frequent password rotations are recommended, with 40 days the current recommendation by ANSSI. Additional rotations based on external events, such as departure of an employee who had privileged network access, are also strongly recommended.
You can perform this action using this script
You can use the version gathered using replication metadata from two reports to guess the frequency of the password change or if the two consecutive resets have been done. Version starts at 1.
Kerberos password last changed: 2025-05-02 00:28:07Z version: 2
This control detects accounts which are former 'unofficial' admins. Indeed when an account belongs to a privileged group, the attribute admincount is set. If the attribute is set without being an official member, this is suspicious. To suppress this warning, the attribute admincount of these accounts should be removed after review.
Number of accounts to review: 0
This control detects if one of the attributes userPassword or unixUserPassword has been set on accounts. Indeed, these attributes are designed to store encrypted secrets for unix (or mainframe) interconnection. However in the large majority, interconnected systems are poorly designed and the user password is stored in these attributes in clear text or poorly encrypted. The userPassword attribute is also used in classic LDAP systems to change the user password by setting its value. But, with Active Directory, it is considered by default as a normal attribute and doesn't trigger a password but shows instead the password in clear text.
Number of accounts to review: 0
This control detects if one of the attributes javaCodebase, javaFactory or javaClassname has been set on accounts. Indeed, these attributes are designed to add custom code to AD object when running java code. However it can be abused to run code on servers having the flag com.sun.jndi.ldap.object.trustURLCodebase set to true. This is a vulnerability similar to the log4shell vulnerability.
Java Schema extension: Not Found
No active user account found with Java code
You can check here for backdoors or typos in the scriptPath attribute
| Script Name | Count |
|---|---|
| None | 257 |
This section display advanced information, if any has been found
Note: PSO (Password Settings Objects) will be visible only if the user, which collected the information, has the permission to view it.
PSO shown in the report will be prefixed by "PSO:"
| Policy Name | Complexity | Max Password Age | Min Password Age | Min Password Length | Password History | Reversible Encryption | Lockout Threshold | Lockout Duration | Reset account counter locker after |
|---|---|---|---|---|---|---|---|---|---|
| Default Domain Policy | True | 42 day(s) | 1 day(s) | 7 | 24 | False | 0 | Not Set | Not Set |
This is the settings related to screensavers stored in Group Policies. Each non compliant setting is written in red.
| Policy Name | Screensaver enforced | Password request | Start after (seconds) | Grace Period (seconds) |
|---|---|---|---|---|
| Test_ScreenSaver_013 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_014 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_051 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_066 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_004 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_045 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_049 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_044 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_042 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_022 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_010 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_064 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_062 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_065 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_025 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_012 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_043 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_068 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_047 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_040 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_041 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_003 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_048 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_037 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_060 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_006 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_073 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_024 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_030 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_007 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_057 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_018 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_031 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_035 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_056 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_008 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_028 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_021 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_009 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_055 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_070 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_015 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_071 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_075 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_032 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_026 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_027 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_072 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_011 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_002 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_036 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_074 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_023 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_029 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_063 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_039 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_017 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_038 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_058 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_034 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_067 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_054 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_005 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_050 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_019 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_069 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_052 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_046 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_033 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_016 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_061 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_053 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_020 [Not linked] | True | Not Set | Not Set | Not Set |
| Test_ScreenSaver_001 | True | Not Set | 900 | Not Set |
| Test_ScreenSaver_059 | True | Not Set | 900 | Not Set |
This section focuses on security settings stored in the Active Directory technical security policies.
The password in GPO are obfuscated, not encrypted. Consider any passwords listed here as compromised and change them immediately.
Giving local group membership in a GPO is a way to become administrator.
The local admin of a domain controller can become domain administrator instantly.
A GPO can be used to deploy security settings to workstations.
The best practice out of the default security baseline is reported in green.
The following settings in red are unsual and may need to be reviewed.
Each setting is accompanied with its value and a link to the GPO explanation.
You will find below the checks where no occurences have been found
| Policy Name | Setting | Value |
|---|---|---|
| Anonymous Stuff | Do not allow anonymous enumeration of SAM accounts and shares (Technical details) | Disabled |
| Anonymous Stuff | Do not allow anonymous enumeration of SAM accounts and shares (Technical details) | Disabled |
| Anonymous Stuff | Do not allow anonymous enumeration of SAM accounts (Technical details) | Disabled |
| NTLM Block | Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers | Audit (Deny All is not enabled) |
| Security Settings | Kerberos client support for claims, compound authentication and Kerberos armoring | Enabled |
Audit settings allow the system to generate logs which are useful to detect intrusions. Here are the settings found in GPO.
Simple audit events are described here and Advanced audit events are described here
You can get a list of all audit settings with the command line: auditpol.exe /get /category:* (source)
Simple audit settings are located in: Computer Configuration / Policies / Windows Settings / Security Settings / Local Policies / Audit Policy. Simple audit settings are named [Simple Audit].
Advanced audit settings are located in: Computer Configuration / Policies / Windows Settings / Security Settings / Advanced Audit Policy Configuration. This category is displayed below.
| Policy Name | Category | Setting | Value |
|---|---|---|---|
| Default Domain Controllers Policy | [Simple Audit] | Audit system events | Success and Failure |
| Default Domain Controllers Policy | [Simple Audit] | Audit logon events | Success and Failure |
| Default Domain Controllers Policy | [Simple Audit] | Audit account management | Success |
| Default Domain Controllers Policy | [Simple Audit] | Audit account logon events | Success and Failure |
| Default Domain Controllers Policy | [Simple Audit] | Audit directory service access | Success |
| EventLog | Account Logon | Credential Validation | Success and Failure |
| EventLog | Logon/Logoff | Logoff | Success and Failure |
| EventLog | Logon/Logoff | Logon | Success and Failure |
| EventLog | System | Security State Change | Success and Failure |
| EventLog | Logon/Logoff | Other Logon/Logoff | Success and Failure |
| EventLog | Account Logon | Kerberos Service Ticket Operations | Success and Failure |
| EventLog | Account Logon | Kerberos Authentication Service | Success and Failure |
| EventLog | Account Management | User Account Management | Success |
| EventLog | Account Management | Computer Account Management | Success |
| EventLog | Account Management | Security Group Management | Success |
| EventLog | Account Management | Distribution Group Management | Success |
| EventLog | DS Access | Directory Service Access | Success |
Giving privileges in a GPO is a way to become administrator without being part of a group.
For example, SeTcbPriviledge gives the right to act as SYSTEM, which has more privileges than the administrator account.
| GPO Name | Privilege | Members |
|---|---|---|
| TrustedCred | SeTrustedCredManAccessPrivilege | <empty> |
| Default Domain Controllers Policy | SeAssignPrimaryTokenPrivilege | S-1-5-82-3876422241-1344743610-1729199087-774402673-2621913236 |
| Default Domain Controllers Policy | SeAssignPrimaryTokenPrivilege | NT AUTHORITY\NETWORK SERVICE |
| Default Domain Controllers Policy | SeAssignPrimaryTokenPrivilege | NT AUTHORITY\LOCAL SERVICE |
| Default Domain Controllers Policy | SeAssignPrimaryTokenPrivilege | S-1-5-82-3006700770-424185619-1745488364-794895919-4004696415 |
| Default Domain Controllers Policy | SeAssignPrimaryTokenPrivilege | S-1-5-82-271721585-897601226-2024613209-625570482-296978595 |
| Default Domain Controllers Policy | SeBackupPrivilege | BUILTIN\Server Operators |
| Default Domain Controllers Policy | SeBackupPrivilege | BUILTIN\Backup Operators |
| Default Domain Controllers Policy | SeBackupPrivilege | Administrators |
| Default Domain Controllers Policy | SeDebugPrivilege | Administrators |
| Default Domain Controllers Policy | SeLoadDriverPrivilege | BUILTIN\Print Operators |
| Default Domain Controllers Policy | SeLoadDriverPrivilege | Administrators |
| Default Domain Controllers Policy | SeMachineAccountPrivilege | Authenticated Users |
| Default Domain Controllers Policy | SeRestorePrivilege | BUILTIN\Server Operators |
| Default Domain Controllers Policy | SeRestorePrivilege | BUILTIN\Backup Operators |
| Default Domain Controllers Policy | SeRestorePrivilege | Administrators |
| Default Domain Controllers Policy | SeSecurityPrivilege | Administrators |
| Default Domain Controllers Policy | SeTakeOwnershipPrivilege | Administrators |
| Default Domain Controllers Policy | SeEnableDelegationPrivilege | Administrators |
| Security Settings | SeTrustedCredManAccessPrivilege | <empty> |
Login authorization and restriction can be set by GPOs. Indeed, by default, everyone is allowed to login on every computer except domain controllers. Defining login restriction is a way to have different isolated tiers. Here are the settings found in GPOs.
| GPO Name | Privilege | Members |
|---|---|---|
| Default Domain Controllers Policy | Log on as a batch job | BUILTIN\IIS_IUSRS |
| Default Domain Controllers Policy | Log on as a batch job | BUILTIN\Performance Log Users |
| Default Domain Controllers Policy | Log on as a batch job | BUILTIN\Backup Operators |
| Default Domain Controllers Policy | Log on as a batch job | Administrators |
| Default Domain Controllers Policy | Allow log on locally | NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERS |
| Default Domain Controllers Policy | Allow log on locally | BUILTIN\Print Operators |
| Default Domain Controllers Policy | Allow log on locally | BUILTIN\Server Operators |
| Default Domain Controllers Policy | Allow log on locally | BUILTIN\Account Operators |
| Default Domain Controllers Policy | Allow log on locally | BUILTIN\Backup Operators |
| Default Domain Controllers Policy | Allow log on locally | Administrators |
| Default Domain Controllers Policy | Access this computer from the network | BUILTIN\Pre-Windows 2000 Compatible Access |
| Default Domain Controllers Policy | Access this computer from the network | NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERS |
| Default Domain Controllers Policy | Access this computer from the network | Authenticated Users |
| Default Domain Controllers Policy | Access this computer from the network | Administrators |
| Default Domain Controllers Policy | Access this computer from the network | Everyone |
A GPO login script is a way to force the execution of data on behalf of users. Only enabled users are analyzed.
A GPO can be used to deploy applications or copy files. These files may be controlled by a third party to control the execution of local programs.
File associations may be managed through Group Policy Objects (GPO) by navigating to "Folder Options". This setting is located under Computer Configuration / Preferences / Control Panel Settings / Folders Options in the GPO.
This method serves as an effective countermeasure against script execution from phishing emails by setting Notepad as the default program for opening script files, rather than the script engine. The script extensions that can be reconfigured include: .js, .jse, .vbs, .vbe, .vb, .wsh, and .wsf. Specifically, JavaScript files with extensions .js and .jse can be safely altered to open with Notepad. Other file extensions may have an impact and needs to be assessed before being configured.
| GPO Name | Type | Action | Application |
|---|---|---|---|
| Security Settings | jse | R | C:\Windows\System32\notepad.exe |
Microsoft Defender is the default Antivirus shipped with Windows. There are many alternatives, but if a computer is installed without an antivirus, it will be enabled by default.
A set of mitigation named ASR (attack surface reduction) can be enabled, even on non premium version of Microsoft Defender Antivirus (formerly Windows Defender Antivirus). Some protections are available since Windows 10 1710 and even Windows 2012 R2. See https://learn.microsoft.com/en-us/defender-endpoint/attack-surface-reduction-rules-reference?view=o365-worldwide for more information.
To enable a mitigation, enable the GPO "Configure Attack Surface Reduction rules" in Computer Configuration / Policies / Administrative Templates / Windows Components / Microsoft Defender Antivirus (formerly Windows Defender Antivirus) / Microsoft (Windows) Defender Exploit Guard / Attack Surface Reduction. After having Enabled the setting, click on Set the state for each ASR rule. Add the GUID of the mitigation as Value name and set 1 as Value to enforce the Block mode. Example for Block JavaScript or VBScript from launching downloaded executable content: d3e037e1-3eb8-44c8-a917-57927947596d. The other values are: 2 for Audit and 6 for Warn.
| GPO Name | Rule | Description | Action |
|---|
Firewall rules may be managed through Group Policy Objects (GPO). This setting is located under Computer Configuration / Policies Windows Settings / Security Settings / Windows Defender Firewall with Advanced Security.
| GPO Name | Name | Active | Direction | Action | Application | Remote IP |
|---|