← Back to SOC feed Coverage →

MDI_Group_Memebership_Changes

kql MEDIUM Azure-Sentinel
IdentityDirectoryEvents
huntingmicrosoftofficial
This rule was pulled from an open-source repository and enriched with AI. Validate in a test environment before deploying to production.
View original rule at Azure-Sentinel →
Retrieved: 2026-05-09T11:00:00Z · Confidence: medium

Hunt Hypothesis

Accounts being added or removed from Active Directory groups may indicate lateral movement or privilege changes by an adversary, as unauthorized group membership modifications can facilitate persistent access or escalate privileges within the environment. SOC teams should proactively hunt for these changes in Azure Sentinel to identify potential compromise and mitigate risk before further damage occurs.

KQL Query

//Added to group
IdentityDirectoryEvents 
| where Application == "Active Directory"
| where ActionType == "Group Membership changed"
| extend parsed=parse_json(AdditionalFields)
| extend INITIATED_BY = iff( isnull(AdditionalFields.["ACTOR.ACCOUNT"]), AdditionalFields.["ACTOR.ACCOUNT"], AdditionalFields.["ACTOR.ACCOUNT"])
| extend GROUP_CHANGED = iff( isnull(AdditionalFields.["TO.GROUP"]), AdditionalFields.["TO.GROUP"], AdditionalFields.["TO.GROUP"])
| where GROUP_CHANGED <> ""
| extend GROUP_ADDED = iff( isnull(AdditionalFields.["TARGET_OBJECT.GROUP"]), AdditionalFields.["TARGET_OBJECT.GROUP"], AdditionalFields.["TARGET_OBJECT.GROUP"])
| extend USER_ADDED = iff( isnull(AdditionalFields.["TARGET_OBJECT.USER"]), AdditionalFields.["TARGET_OBJECT.USER"], AdditionalFields.["TARGET_OBJECT.USER"])
| extend DEVICE_ADDED = iff( isnull(AdditionalFields.["TARGET_OBJECT.DEVICE"]), AdditionalFields.["TARGET_OBJECT.DEVICE"], AdditionalFields.["TARGET_OBJECT.DEVICE"])
| project Timestamp, ActionType, INITIATED_BY, GROUP_CHANGED, GROUP_ADDED, USER_ADDED, DEVICE_ADDED,AdditionalFields

//Removed from group
IdentityDirectoryEvents 
| where Application == "Active Directory"
| where ActionType == "Group Membership changed"
| extend parsed=parse_json(AdditionalFields)
| extend INITIATED_BY = iff( isnull(AdditionalFields.["ACTOR.ACCOUNT"]), AdditionalFields.["ACTOR.ACCOUNT"], AdditionalFields.["ACTOR.ACCOUNT"])
| extend GROUP_CHANGED = iff( isnull(AdditionalFields.["FROM.GROUP"]), AdditionalFields.["FROM.GROUP"], AdditionalFields.["FROM.GROUP"])
| where GROUP_CHANGED <> ""
| extend GROUP_REMOVED = iff( isnull(AdditionalFields.["TARGET_OBJECT.GROUP"]), AdditionalFields.["TARGET_OBJECT.GROUP"], AdditionalFields.["TARGET_OBJECT.GROUP"])
| extend USER_REMOVED = iff( isnull(AdditionalFields.["TARGET_OBJECT.USER"]), AdditionalFields.["TARGET_OBJECT.USER"], AdditionalFields.["TARGET_OBJECT.USER"])
| extend DEVICE_REMOVED = iff( isnull(AdditionalFields.["TARGET_OBJECT.DEVICE"]), AdditionalFields.["TARGET_OBJECT.DEVICE"], AdditionalFields.["TARGET_OBJECT.DEVICE"])
| project Timestamp, ActionType, INITIATED_BY, GROUP_CHANGED, GROUP_REMOVED, USER_REMOVED, DEVICE_REMOVED,AdditionalFields

Analytic Rule Definition

id: b66fb322-247a-4472-a231-2533b34ed059
name: MDI_Group_Memebership_Changes
description: |
  Find accounts that have been added/removed from groups in AD.
requiredDataConnectors:
- connectorId: MicrosoftThreatProtection
  dataTypes:
  - IdentityDirectoryEvents
tactics:
 - Credential Access
query: |
    //Added to group
    IdentityDirectoryEvents 
    | where Application == "Active Directory"
    | where ActionType == "Group Membership changed"
    | extend parsed=parse_json(AdditionalFields)
    | extend INITIATED_BY = iff( isnull(AdditionalFields.["ACTOR.ACCOUNT"]), AdditionalFields.["ACTOR.ACCOUNT"], AdditionalFields.["ACTOR.ACCOUNT"])
    | extend GROUP_CHANGED = iff( isnull(AdditionalFields.["TO.GROUP"]), AdditionalFields.["TO.GROUP"], AdditionalFields.["TO.GROUP"])
    | where GROUP_CHANGED <> ""
    | extend GROUP_ADDED = iff( isnull(AdditionalFields.["TARGET_OBJECT.GROUP"]), AdditionalFields.["TARGET_OBJECT.GROUP"], AdditionalFields.["TARGET_OBJECT.GROUP"])
    | extend USER_ADDED = iff( isnull(AdditionalFields.["TARGET_OBJECT.USER"]), AdditionalFields.["TARGET_OBJECT.USER"], AdditionalFields.["TARGET_OBJECT.USER"])
    | extend DEVICE_ADDED = iff( isnull(AdditionalFields.["TARGET_OBJECT.DEVICE"]), AdditionalFields.["TARGET_OBJECT.DEVICE"], AdditionalFields.["TARGET_OBJECT.DEVICE"])
    | project Timestamp, ActionType, INITIATED_BY, GROUP_CHANGED, GROUP_ADDED, USER_ADDED, DEVICE_ADDED,AdditionalFields

    //Removed from group
    IdentityDirectoryEvents 
    | where Application == "Active Directory"
    | where ActionType == "Group Membership changed"
    | extend parsed=parse_json(AdditionalFields)
    | extend INITIATED_BY = iff( isnull(AdditionalFields.["ACTOR.ACCOUNT"]), AdditionalFields.["ACTOR.ACCOUNT"], AdditionalFields.["ACTOR.ACCOUNT"])
    | extend GROUP_CHANGED = iff( isnull(AdditionalFields.["FROM.GROUP"]), AdditionalFields.["FROM.GROUP"], AdditionalFields.["FROM.GROUP"])
    | where GROUP_CHANGED <> ""
    | extend GROUP_REMOVED = iff( isnull(AdditionalFields.["TARGET_OBJECT.GROUP"]), AdditionalFields.["TARGET_OBJECT.GROUP"], AdditionalFields.["TARGET_OBJECT.GROUP"])
    | extend USER_REMOVED = iff( isnull(AdditionalFields.["TARGET_OBJECT.USER"]), AdditionalFields.["TARGET_OBJECT.USER"], AdditionalFields.["TARGET_OBJECT.USER"])
    | extend DEVICE_REMOVED = iff( isnull(AdditionalFields.["TARGET_OBJECT.DEVICE"]), AdditionalFields.["TARGET_OBJECT.DEVICE"], AdditionalFields.["TARGET_OBJECT.DEVICE"])
    | project Timestamp, ActionType, INITIATED_BY, GROUP_CHANGED, GROUP_REMOVED, USER_REMOVED, DEVICE_REMOVED,AdditionalFields
version: 1.0.0
metadata:
    source:
        kind: Community
    author:
        name: Matt Novitsch
    support:
        tier: Community
    categories:
        domains: [ "Security - Identity" ]

Required Data Sources

Sentinel TableNotes
IdentityDirectoryEventsEnsure this data connector is enabled

MITRE ATT&CK Context

References

False Positive Guidance

Original source: https://github.com/Azure/Azure-Sentinel/blob/main/Hunting Queries/Microsoft 365 Defender/Discovery/MDI_Group_Memebership_Changes.yaml