Detection rules › Splunk

Windows AD Domain Controller Audit Policy Disabled

Status
production
Severity
medium
Group by
AuditPolicyChanges, SubcategoryGuid
Author
Dean Luxton
Source
github.com/splunk/security_content

The following analytic detects the disabling of audit policies on a domain controller. It leverages EventCode 4719 from Windows Security Event Logs to identify changes where success or failure auditing is removed. This activity is significant as it suggests an attacker may have gained access to the domain controller and is attempting to evade detection by tampering with audit policies. If confirmed malicious, this could lead to severe consequences, including data theft, privilege escalation, and full network compromise. Immediate investigation is required to determine the source and intent of the change.

Known false positives

  • No false positives have been identified at this time.

MITRE ATT&CK coverage

TacticTechniques
Defense Impairment

Telemetry coverage

Rule body

name: Windows AD Domain Controller Audit Policy Disabled
id: fc3ccef1-60a4-4239-bd66-b279511b4d14
version: 12
creation_date: '2023-01-25'
modification_date: '2026-05-13'
author: Dean Luxton
status: production
type: TTP
description: The following analytic detects the disabling of audit policies on a domain controller. It leverages EventCode 4719 from Windows Security Event Logs to identify changes where success or failure auditing is removed. This activity is significant as it suggests an attacker may have gained access to the domain controller and is attempting to evade detection by tampering with audit policies. If confirmed malicious, this could lead to severe consequences, including data theft, privilege escalation, and full network compromise. Immediate investigation is required to determine the source and intent of the change.
data_source:
    - Windows Event Log Security 4719
search: |-
    `wineventlog_security` EventCode=4719 (AuditPolicyChanges IN ("%%8448","%%8450","%%8448, %%8450") OR Changes IN ("Failure removed","Success removed","Success removed, Failure removed")) dest_category="domain_controller"
      | replace "%%8448" with "Success removed", "%%8450" with "Failure removed", "%%8448, %%8450" with "Success removed, Failure removed" in AuditPolicyChanges
      | eval AuditPolicyChanges=coalesce(AuditPolicyChanges,Changes), SubcategoryGuid=coalesce(SubcategoryGuid,Subcategory_GUID)
      | stats min(_time) as _time values(host) as dest
        BY AuditPolicyChanges SubcategoryGuid
      | lookup advanced_audit_policy_guids GUID as SubcategoryGuid OUTPUT Category SubCategory
      | `windows_ad_domain_controller_audit_policy_disabled_filter`
how_to_implement: Ensure you are ingesting EventCode `4719` from your domain controllers, the category domain_controller exists in assets and identities, and that assets and identities is enabled. If A&I is not configured, you will need to manually filter the results within the base search.
known_false_positives: No false positives have been identified at this time.
references:
    - https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4719
finding:
    title: GPO $SubCategory$ of $Category$ was disabled on $dest$
    entity:
        field: dest
        type: system
        score: 50
analytic_story:
    - Windows Audit Policy Tampering
asset_type: Endpoint
mitre_attack_id:
    - T1685
product:
    - Splunk Enterprise
    - Splunk Enterprise Security
    - Splunk Cloud
category: endpoint
security_domain: endpoint

Stages and Predicates

Stage 1: search

`wineventlog_security` EventCode=4719 (AuditPolicyChanges IN ("%%8448","%%8450","%%8448, %%8450") OR Changes IN ("Failure removed","Success removed","Success removed, Failure removed")) dest_category="domain_controller"

Stage 2: replace

| replace "%%8448" with "Success removed", "%%8450" with "Failure removed", "%%8448, %%8450" with "Success removed, Failure removed" in AuditPolicyChanges

Stage 3: eval

| eval AuditPolicyChanges=coalesce(AuditPolicyChanges,Changes), SubcategoryGuid=coalesce(SubcategoryGuid,Subcategory_GUID)

Stage 4: stats

| stats min(_time) as _time values(host) as dest
    BY AuditPolicyChanges SubcategoryGuid

Stage 5: lookup

| lookup advanced_audit_policy_guids GUID as SubcategoryGuid OUTPUT Category SubCategory
Lookup table
advanced_audit_policy_guids
Key field
GUID as SubcategoryGuid
Output columns
['Category', 'Category'], ['SubCategory', 'SubCategory']

Stage 6: search

| `windows_ad_domain_controller_audit_policy_disabled_filter`

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
AuditPolicyChangesin
  • "%%8448"
  • "%%8448, %%8450"
  • "%%8450"
field:"AuditPolicyChanges" kind:in
Changesin
  • "Failure removed"
  • "Success removed"
  • "Success removed, Failure removed"
field:"Changes" kind:in
EventCodeeq
  • 4719 corpus 2 (splunk 2)
field:"EventID" kind:eq value:"4719"
dest_categoryeq
  • "domain_controller"
field:"dest_category" kind:eq