The User Passed MFA... But It Wasn't Really Them
The sign-in looked legitimate.
Correct username. Correct password. MFA successful. Conditional Access allowed it.
Everything appeared to line up.
The problem was...
the attacker did not need to bypass MFA.
They inherited the authenticated session.
This Agent Foskett briefing looks at a modern Microsoft identity problem: attackers do not always break authentication. Sometimes they steal the trust that authentication already created.
The dashboard may show MFA success. The sign-in logs may show a successful authentication. But the real investigation begins when we ask what happened after MFA was satisfied.
Briefing summary
MFA success is not always the end of the story. GEMXIT looks at how Entra ID sign-ins, AuthenticationDetails, Conditional Access, Microsoft Defender XDR and KQL can reveal suspicious activity after an authenticated session has already been trusted.
What happened
Why MFA success still needs investigation
First hunt: successful MFA sessions with unusual context
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
SigninLogs | where TimeGenerated > ago(7d) | where ResultType == 0 | where AuthenticationRequirement has "multiFactorAuthentication" | project TimeGenerated, UserPrincipalName, AppDisplayName, IPAddress, Location, UserAgent, DeviceDetail, ConditionalAccessStatus
Second hunt: repeated access from changing session context
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
SigninLogs | where TimeGenerated > ago(14d) | where ResultType == 0 | summarize SignIns = count(), IPs = make_set(IPAddress), Apps = make_set(AppDisplayName), UserAgents = make_set(UserAgent), Locations = make_set(Location) by UserPrincipalName, bin(TimeGenerated, 1d) | where array_length(IPs) > 3 or array_length(UserAgents) > 3 | order by SignIns desc
Third hunt: suspicious activity after MFA success
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
AuditLogs | where TimeGenerated > ago(7d) | where OperationName has_any ("FileDownloaded", "Add member", "Update user", "Consent", "Mailbox") | extend Hour = datetime_part("hour", TimeGenerated) | where Hour < 6 or Hour > 20 | project TimeGenerated, OperationName, InitiatedBy, TargetResources | order by TimeGenerated desc
What this kind of activity can indicate
How GEMXIT approaches MFA session investigations
Final thought
It is: “What happened after trust was granted?”
Continue the investigation with MFA Session Hijacking, The Session Token Never Expired, The Login Came Through A Trusted Device, When Nothing Looks Wrong, The Dashboard Was Green and Microsoft Security Operations.
Develop IT. Protect IT.GEMXIT PTY LTD | GEMXIT UK LTD