Account added to a privileged local or domain group
AN0865 is the directory's own record of this technique: the six group membership events that Security logging emits when a principal is added to or removed from a security-enabled group. This rule keeps the three additions — 4728 for a global group, 4732 for a local or builtin group, 4756 for a universal group — and drops the matching removals 4729, 4733 and 4757, because removing a member is the cleanup half rather than the persistence, and carrying it would roughly double the volume for events that describe the opposite act. MITRE's `TargetGroup` knob is what the second selection implements, populated here with well-known relative identifiers rather than with group names: the event's `TargetSid` is the group, and matching on the RID suffix (-512 Domain Admins, -519 Enterprise Admins, -518 Schema Admins, -520 Group Policy Creator Owners, -544 the builtin Administrators, -548/-549/-550/-551 the operator groups, -555 Remote Desktop Users, -580 Remote Management Users) survives a localised Windows install and a renamed group, both of which defeat a list of names. The technique description calls out Remote Desktop Users and the administrators group specifically, and the operator groups are included because each is a documented route back to domain admin. The RID suffixes cannot collide with a custom group: RIDs for new objects begin at 1000, so a value such as 2544 does not end in `-544`. Limits and prerequisite. What this cannot see is the group that matters most in many estates — a delegated helpdesk or application group with a site-specific RID, or DnsAdmins, which has no well-known RID. Adding those RIDs or switching the selection to `TargetUserName` is the first tuning step. MITRE's `TimeWindow` and `UserContext` knobs — fire only outside a change window, or only when the modifying account is not a known provisioning identity — are a schedule and a per-identity baseline, and lib/sigma models neither, so nothing here encodes them; the event does carry `SubjectUserName` and `MemberName`, which is where that filtering belongs once the site knows its own provisioning accounts. The Linux and macOS arms AN0866 and AN0867 are not attempted here: they are a different log source with a different vocabulary and belong in their own rule. Prerequisite: these events require *Audit Security Group Management* (Success), which unlike Process Creation auditing is on by default on current Windows client and server builds, so the events are usually being written. The gap is collection, not policy: 4728 and 4756 are written on the domain controller that serviced the change, so all DCs must be forwarded or the change is simply missed, and 4732 for a local Administrators addition — the single most common form of this technique — is written only in the Security log of the member server or workstation it happened on, which many estates do not ship at all. Where a hardening baseline or a legacy policy has turned the subcategory off, this returns zero rows, and zero rows there reads as quiet when it means blind; confirm with `auditpol /get /subcategory:"Security Group Management"` rather than assuming either way. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0310, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full descriptionShow less
The detection
The 4 SIEM queries below are previews produced by Siemphony’s own translator, not pySigma, and none has been executed against a real backend — review before you deploy.
detection.yml
title: Account added to a privileged local or domain groupid: cb61e4d7-bf63-4bdf-b6ae-cc166cd01bc0status: experimentaldescription: | AN0865 is the directory's own record of this technique: the six group membership events that Security logging emits when a principal is added to or removed from a security-enabled group. This rule keeps the three additions — 4728 for a global group, 4732 for a local or builtin group, 4756 for a universal group — and drops the matching removals 4729, 4733 and 4757, because removing a member is the cleanup half rather than the persistence, and carrying it would roughly double the volume for events that describe the opposite act. MITRE's `TargetGroup` knob is what the second selection implements, populated here with well-known relative identifiers rather than with group names: the event's `TargetSid` is the group, and matching on the RID suffix (-512 Domain Admins, -519 Enterprise Admins, -518 Schema Admins, -520 Group Policy Creator Owners, -544 the builtin Administrators, -548/-549/-550/-551 the operator groups, -555 Remote Desktop Users, -580 Remote Management Users) survives a localised Windows install and a renamed group, both of which defeat a list of names. The technique description calls out Remote Desktop Users and the administrators group specifically, and the operator groups are included because each is a documented route back to domain admin. The RID suffixes cannot collide with a custom group: RIDs for new objects begin at 1000, so a value such as 2544 does not end in `-544`. Limits and prerequisite. What this cannot see is the group that matters most in many estates — a delegated helpdesk or application group with a site-specific RID, or DnsAdmins, which has no well-known RID. Adding those RIDs or switching the selection to `TargetUserName` is the first tuning step. MITRE's `TimeWindow` and `UserContext` knobs — fire only outside a change window, or only when the modifying account is not a known provisioning identity — are a schedule and a per-identity baseline, and lib/sigma models neither, so nothing here encodes them; the event does carry `SubjectUserName` and `MemberName`, which is where that filtering belongs once the site knows its own provisioning accounts. The Linux and macOS arms AN0866 and AN0867 are not attempted here: they are a different log source with a different vocabulary and belong in their own rule. Prerequisite: these events require *Audit Security Group Management* (Success), which unlike Process Creation auditing is on by default on current Windows client and server builds, so the events are usually being written. The gap is collection, not policy: 4728 and 4756 are written on the domain controller that serviced the change, so all DCs must be forwarded or the change is simply missed, and 4732 for a local Administrators addition — the single most common form of this technique — is written only in the Security log of the member server or workstation it happened on, which many estates do not ship at all. Where a hardening baseline or a legacy policy has turned the subcategory off, this returns zero rows, and zero rows there reads as quiet when it means blind; confirm with `auditpol /get /subcategory:"Security Group Management"` rather than assuming either way. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0310, not hand-written and not tested by its author. Any lab result is on this rule's own page.references: - https://attack.mitre.org/techniques/T1098/007 - https://attack.mitre.org/detectionstrategies/DET0310author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-17tags: - attack.persistence - attack.privilege-escalation - attack.t1098.007logsource: product: windows service: securitydetection: selection_member_added: EventID: - 4728 - 4732 - 4756 selection_privileged_group: TargetSid|endswith: - '-512' - '-518' - '-519' - '-520' - '-544' - '-548' - '-549' - '-550' - '-551' - '-555' - '-580' condition: selection_member_added and selection_privileged_groupfalsepositives: - "Identity provisioning and access-request automation. Joiner-mover-leaver workflows, IGA connectors and self-service access tools add accounts to Remote Desktop Users and to delegated administrator groups continuously and in bulk, so in any organisation with automated provisioning this is by far the highest-volume match and the reason the rule is medium rather than high." - "Server and application installers that grant their service account rights during setup. Backup, monitoring and database products add the account they run as to the local Administrators or Backup Operators group as a documented install step, producing one match per host during a rollout." - "Endpoint build and imaging. Domain join scripts, golden-image provisioning and lab rebuilds add the support or engineering group to local Administrators on every machine they touch, so a hardware refresh or an OS upgrade wave emits a burst of 4732 events with nobody at the keyboard." - "Routine directory administration inside a change window. Adding a new administrator to Domain Admins or nesting a role group under an operator group is ordinary work for the identity team, and the event is indistinguishable from the adversary's apart from the account that performed it and the ticket behind it."level: mediumSentinel · KQL
Run this as a search.
SecurityEvent| where ((EventID == 4728 or EventID == 4732 or EventID == 4756) and (TargetSid endswith "-512" or TargetSid endswith "-518" or TargetSid endswith "-519" or TargetSid endswith "-520" or TargetSid endswith "-544" or TargetSid endswith "-548" or TargetSid endswith "-549" or TargetSid endswith "-550" or TargetSid endswith "-551" or TargetSid endswith "-555" or TargetSid endswith "-580"))
Splunk · SPL
Run this as a search.
index=* ((EventID="4728" OR EventID="4732" OR EventID="4756") AND (TargetSid="*-512" OR TargetSid="*-518" OR TargetSid="*-519" OR TargetSid="*-520" OR TargetSid="*-544" OR TargetSid="*-548" OR TargetSid="*-549" OR TargetSid="*-550" OR TargetSid="*-551" OR TargetSid="*-555" OR TargetSid="*-580"))Elastic · ES|QL
Run this as a search.
FROM logs-*| WHERE ((event.code == 4728 OR event.code == 4732 OR event.code == 4756) AND (TO_LOWER(winlog.event_data.TargetSid) LIKE "*-512" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-518" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-519" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-520" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-544" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-548" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-549" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-550" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-551" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-555" OR TO_LOWER(winlog.event_data.TargetSid) LIKE "*-580"))
Wazuh · XML rule
Deploy to your manager — this is a rule, not a search.
<group name="sigma,windows,"> <!-- Rule ids must be unique on your manager; 100000+ is the user range. --> <rule id="100000" level="7"> <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. --> <field name="EventID" type="pcre2">(?i)(^4728$|^4732$|^4756$)</field> <field name="TargetSid" type="pcre2">(?i)(-512$|-518$|-519$|-520$|-544$|-548$|-549$|-550$|-551$|-555$|-580$)</field> <description>Account added to a privileged local or domain group</description> <mitre> <id>T1098.007</id> </mitre> </rule></group>
Verdicts · reactions · comments
Community
Verdicts from engineers who actually deployed it, and the conversation around it.
Nobody has run this in a real environment and said what happened.
Verdicts from engineers who deployed it
0 castNo verdicts reported yet. The first one is worth more than the tenth — say what you ran it against.
Log in to report a verdict.
Log in to join the discussion.
No comments yet. Someone who deploys this will have something to say about it.