Detection rules › Kusto
Red Sift - MFA disabled on account
This query searches for authentication events where MFA has been disabled on an account, which may indicate account takeover activity, weakened account protections, or unauthorized administrative changes.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Persistence | T1556 Modify Authentication Process |
| Defense Impairment | T1556 Modify Authentication Process |
| Credential Access | T1556 Modify Authentication Process |
Rule body kusto
id: 16f26d2c-6296-490b-af4f-b30bcf1c4461
name: Red Sift - MFA disabled on account
description: |
This query searches for authentication events where MFA has been disabled on an account, which may indicate account takeover activity, weakened account protections, or unauthorized administrative changes.
severity: High
status: Available
requiredDataConnectors:
- connectorId: RedSiftPush
dataTypes:
- RedSiftAuth_CL
queryFrequency: 1h
queryPeriod: 1h
triggerOperator: gt
triggerThreshold: 0
tactics:
- DefenseEvasion
relevantTechniques:
- T1556
query: |
RedSiftAuth_CL
| extend
ActivityName = tostring(column_ifexists("ActivityName", "")),
UserEmail = tostring(column_ifexists("UserEmail", "")),
ActorUserEmail = tostring(column_ifexists("ActorUserEmail", "")),
SrcIp = tostring(column_ifexists("SrcIp", "")),
HttpUserAgent = tostring(column_ifexists("HttpUserAgent", "")),
ServiceName = tostring(column_ifexists("ServiceName", "")),
Severity = tostring(column_ifexists("Severity", "")),
UserUid = tostring(column_ifexists("UserUid", "")),
ActorUserUid = tostring(column_ifexists("ActorUserUid", ""))
| where ActivityName =~ "MFA Disabled"
| where isnotempty(UserEmail) or isnotempty(ActorUserEmail)
| extend TargetAccount = iff(isnotempty(UserEmail), UserEmail, ActorUserEmail)
| project
TimeGenerated,
TargetAccount,
UserEmail,
ActorUserEmail,
SrcIp,
HttpUserAgent,
ServiceName,
ActivityName,
Severity,
UserUid,
ActorUserUid
entityMappings:
- entityType: Account
fieldMappings:
- identifier: FullName
columnName: TargetAccount
- entityType: IP
fieldMappings:
- identifier: Address
columnName: SrcIp
customDetails:
ActorUserEmail: ActorUserEmail
UserAgent: HttpUserAgent
ServiceName: ServiceName
ActivityName: ActivityName
alertDetailsOverride:
alertDisplayNameFormat: "RedSift - MFA Disabled for {{TargetAccount}}"
alertDescriptionFormat: "MFA was disabled for {{TargetAccount}}. Actor: {{ActorUserEmail}}. Source IP: {{SrcIp}}."
incidentConfiguration:
createIncident: true
groupingConfiguration:
enabled: true
reopenClosedIncident: false
lookbackDuration: P1D
matchingMethod: Selected
groupByEntities:
- Account
eventGroupingSettings:
aggregationKind: AlertPerResult
suppressionEnabled: false
suppressionDuration: PT1H
version: 1.0.0
kind: Scheduled
Stages and Predicates
Stage 1: source
RedSiftAuth_CL
Stage 2: extend
| extend
ActivityName = tostring(column_ifexists("ActivityName", "")),
UserEmail = tostring(column_ifexists("UserEmail", "")),
ActorUserEmail = tostring(column_ifexists("ActorUserEmail", "")),
SrcIp = tostring(column_ifexists("SrcIp", "")),
HttpUserAgent = tostring(column_ifexists("HttpUserAgent", "")),
ServiceName = tostring(column_ifexists("ServiceName", "")),
Severity = tostring(column_ifexists("Severity", "")),
UserUid = tostring(column_ifexists("UserUid", "")),
ActorUserUid = tostring(column_ifexists("ActorUserUid", ""))
Stage 3: where
| where ActivityName =~ "MFA Disabled"
Stage 4: where
| where isnotempty(UserEmail) or isnotempty(ActorUserEmail)
Stage 5: extend
| extend TargetAccount = iff(isnotempty(UserEmail), UserEmail, ActorUserEmail)
TargetAccount =isnotempty(UserEmail)UserEmailActorUserEmailStage 6: project
| project
TimeGenerated,
TargetAccount,
UserEmail,
ActorUserEmail,
SrcIp,
HttpUserAgent,
ServiceName,
ActivityName,
Severity,
UserUid,
ActorUserUid
Indicators
Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.
| Field | Kind | Values |
|---|---|---|
ActivityName | eq |
|
ActorUserEmail | is_not_null | |
UserEmail | is_not_null |
Output fields
Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.
| Field | Source |
|---|---|
ActivityName | project |
ActorUserEmail | project |
ActorUserUid | project |
HttpUserAgent | project |
ServiceName | project |
Severity | project |
SrcIp | project |
TargetAccount | project |
TimeGenerated | project |
UserEmail | project |
UserUid | project |