Skip to content

Siemphony is in beta and still being built. How a rule earns its badge.

Siemphony’s repertoire

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 description

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: medium

Sentinel · 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.

Log in to react
Not yet reported on

Nobody has run this in a real environment and said what happened.

Verdicts from engineers who deployed it

0 cast

No 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.