Domain group enumeration via net group or the AD cmdlets
Matches the Windows leg of AN1025: a process-creation event where net.exe or its net1.exe helper is invoked with the group verb against a domain, or where the command line carries one of the directory-reading cmdlets and utilities that return domain group objects. The net arm requires both ` group ` and `/domain` on the same command line, which keeps the rule on the domain side of the T1069.001/T1069.002 split — ` localgroup` never contains ` group ` with a leading space, and the published T1069.001 rule owns that half. The cmdlet and utility names below are authored here, not supplied by MITRE; the analytic gives only the knobs. What the analytic actually asks for is a chain — enumeration followed by LSASS or API access within a window — and lib/sigma models no timeframe, no aggregation and no identity lookup, so MITRE's TimeWindow, UserContext and ProcessLineageDepth knobs are all unexpressible and a match means one enumeration command ran and nothing more. Three coverage limits are structural: the LDAP and ADSI routes that read the same groups without a new process leave nothing on this logsource, a PowerView cmdlet typed into an already-running session never reaches CommandLine at all, and base64-encoded PowerShell hides the cmdlet name. The brief maps Security EventID 4688 onto the Sysmon-shaped process_creation category; this rule is written in the Sysmon EventID 1 vocabulary (Image, CommandLine), so an estate feeding 4688 into that category must map NewProcessName onto Image first, and must have both Audit Process Creation and the separate Include command line in process creation events policy enabled — neither is on by default, and without the second one CommandLine is empty and every selection here is dead. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0360, 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
Sentinel · KQL
Run this as a search.
DeviceProcessEvents| where (((FolderPath endswith "\\net.exe" or FolderPath endswith "\\net1.exe") and (ProcessCommandLine contains " group " and ProcessCommandLine contains "/domain")) or (ProcessCommandLine contains "Get-ADGroup" or ProcessCommandLine contains "Get-ADPrincipalGroupMembership" or ProcessCommandLine contains "Get-DomainGroup" or ProcessCommandLine contains "Get-NetGroup" or ProcessCommandLine contains "dsquery group" or ProcessCommandLine contains "dsget group"))
Splunk · SPL
Run this as a search.
index=* (((Image="*\\net.exe" OR Image="*\\net1.exe") AND (CommandLine="* group *" AND CommandLine="*/domain*")) OR (CommandLine="*Get-ADGroup*" OR CommandLine="*Get-ADPrincipalGroupMembership*" OR CommandLine="*Get-DomainGroup*" OR CommandLine="*Get-NetGroup*" OR CommandLine="*dsquery group*" OR CommandLine="*dsget group*"))Elastic · ES|QL
Run this as a search.
FROM logs-*| WHERE (((TO_LOWER(process.executable) LIKE "*\\\\net.exe" OR TO_LOWER(process.executable) LIKE "*\\\\net1.exe") AND (TO_LOWER(process.command_line) LIKE "* group *" AND TO_LOWER(process.command_line) LIKE "*/domain*")) OR (TO_LOWER(process.command_line) LIKE "*get-adgroup*" OR TO_LOWER(process.command_line) LIKE "*get-adprincipalgroupmembership*" OR TO_LOWER(process.command_line) LIKE "*get-domaingroup*" OR TO_LOWER(process.command_line) LIKE "*get-netgroup*" OR TO_LOWER(process.command_line) LIKE "*dsquery group*" OR TO_LOWER(process.command_line) LIKE "*dsget group*"))
Wazuh · XML rule
Deploy to your manager — this is a rule, not a search.
<group name="sigma,windows,process_creation,"> <!-- 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="5"> <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. --> <field name="Image" type="pcre2">(?i)(\\net\.exe$|\\net1\.exe$)</field> <field name="CommandLine" type="pcre2">(?i)(?=.*(?: group ))(?=.*(?:/domain)).*</field> <description>Domain group enumeration via net group or the AD cmdlets (1/2)</description> <mitre> <id>T1069.002</id> </mitre> </rule> <rule id="100001" level="5"> <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. --> <field name="CommandLine" type="pcre2">(?i)(Get-ADGroup|Get-ADPrincipalGroupMembership|Get-DomainGroup|Get-NetGroup|dsquery group|dsget group)</field> <description>Domain group enumeration via net group or the AD cmdlets (2/2)</description> <mitre> <id>T1069.002</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.