Skip to content

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

Siemphony’s repertoire

Non-DC-shaped account exercises AD replication topology rights

Siemphony@siemphonymediumT1207unverified
AN0770 is a four-stage chain — nTDSDSA/server object creation, DRS-SPN usage, replication RPCs (DrsAddEntry, DrsReplicaAdd, GetNCChanges) from a non-DC host, and Kerberos auth against those SPNs — and this rule reaches two of the four stages with the three Security event IDs the brief actually supplies. The first arm matches 4928 and 4929 (a replication naming-context link was established or removed) on EventID alone: this corpus already has a rule for T1003.006/DCSync built on 4662 with the Get-Changes/Get-Changes-All extended rights, and its description explains why 4929 was left unused there — it is topology administration, not a secret pull. That is exactly the signal DCShadow needs instead: registering a rogue DC means creating a *new* replication partner, which is what 4928/4929 record. No field beyond EventID is used on this arm, because the Microsoft-documented schema for these two events (Naming Context, Source DRA, Destination DRA) was not confidently verifiable while authoring this rule, and AUTHORING.md is explicit that an unverified field name should not be guessed into a selector — so this arm cannot be narrowed to a specific naming context or partner, and fires on every legitimate topology change too. The second arm reuses T1003.006's 4662/AccessMask/Properties shape but with a different, deliberately non-overlapping GUID pair: DS-Replication-Manage-Topology (1131f6ac-9c07-11d1-f79f-00c04fc2dcd2) and DS-Replication-Synchronize (1131f6ab-9c07-11d1-f79f-00c04fc2dcd2), the rights that let a principal add itself as a replication partner and push a sync (DrsAddEntry/DrsReplicaAdd), rather than the Get-Changes pair that only pulls (DCSync). A principal or tool holding Get-Changes without Manage-Topology cannot register a rogue DC, which is why this arm does not fire on the Entra Connect/DSInternals false positives T1003.006 documents. This arm carries T1003.006's machine-account filter too (SubjectUserName not ending in '$'): unlike Get-Changes, which only Entra Connect and similar tools exercise under a user account, Synchronize is the right every real DC checks on essentially every routine replication pull from every partner, so leaving it unfiltered would make ordinary intra-site replication traffic — not any of the four false positives below — the rule's dominant, unlisted source of matches, firing under every DC's own machine account on every replication cycle. That filter is also the rule's blind spot, same as T1003.006's: a rogue DC registered under a stolen or spoofed computer account, or DCShadow launched from a machine context rather than a compromised admin user, is filtered out by design and this arm goes silent for it. The SuspiciousSPNs knob (the DRS SPN E3514235-4B06-11D1-AB04-00C04FC2DCD2) and the object-creation and Kerberos stages have no logsource in the brief that carries them — 5136/5137 (object creation) and 4769 (Kerberos service ticket) are absent from AN0770's logSources — and MITRE's TimeWindow (300s) correlation between object creation and replication traffic is a cross-event join lib/sigma cannot express, so a match here is one topology or rights event, not a confirmed DCShadow chain. Prerequisite: 4928/4929 need the *Directory Service Replication* audit subcategory; 4662 needs *Audit Directory Service Access* for Success plus an audit ACE on the domain naming context covering the two replication extended rights, matching T1003.006's prerequisite note — DS Access auditing is in the domain-controller baseline, but the SACL is worth confirming before trusting a quiet result. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0276 (AN0770), 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

Sentinel · KQL

Run this as a search.

SecurityEvent| where ((EventID == 4928 or EventID == 4929) or ((EventID == 4662 and AccessMask =~ "0x100" and (Properties contains "1131f6ac-9c07-11d1-f79f-00c04fc2dcd2" or Properties contains "1131f6ab-9c07-11d1-f79f-00c04fc2dcd2")) and not (SubjectUserName endswith "$")))

Splunk · SPL

Run this as a search.

index=* ((EventID="4928" OR EventID="4929") OR ((EventID="4662" AND AccessMask="0x100" AND (Properties="*1131f6ac-9c07-11d1-f79f-00c04fc2dcd2*" OR Properties="*1131f6ab-9c07-11d1-f79f-00c04fc2dcd2*")) AND NOT (SubjectUserName="*$")))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((event.code == 4928 OR event.code == 4929) OR ((event.code == 4662 AND TO_LOWER(AccessMask) == "0x100" AND (TO_LOWER(Properties) LIKE "*1131f6ac-9c07-11d1-f79f-00c04fc2dcd2*" OR TO_LOWER(Properties) LIKE "*1131f6ab-9c07-11d1-f79f-00c04fc2dcd2*")) AND NOT (TO_LOWER(user.name) LIKE "*$")))

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. -->  <!-- 2 rules: the Sigma condition ORs across different fields,       which one rule cannot express. Any one matching is a hit. -->  <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)(^4928$|^4929$)</field>    <description>Non-DC-shaped account exercises AD replication topology rights (1/2)</description>    <mitre>      <id>T1207</id>    </mitre>  </rule>   <rule id="100001" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="EventID" type="pcre2">(?i)^4662$</field>    <field name="AccessMask" type="pcre2">(?i)^0x100$</field>    <field name="Properties" type="pcre2">(?i)(1131f6ac-9c07-11d1-f79f-00c04fc2dcd2|1131f6ab-9c07-11d1-f79f-00c04fc2dcd2)</field>    <field name="SubjectUserName" negate="yes" type="pcre2">(?i)\$$</field>    <description>Non-DC-shaped account exercises AD replication topology rights (2/2)</description>    <mitre>      <id>T1207</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.