In this module
1.8 Cross-Product Incident Correlation
Cross-Product Incident Correlation
Introduction
Required role: Security Reader (minimum for portal navigation). Security Administrator for configuration changes.
This subsection is not in Microsoft Learn. It teaches the skill that defines an advanced SOC analyst: tracing an attack across multiple Defender products using KQL and the unified Advanced Hunting schema.
// Complete cross-product attack timeline for a single user
let targetUser = "j.morrison";
let targetEmail = "j.morrison@northgateeng.com";
let timeWindow = 48h;
union
// Phase 1: Email delivery
(EmailEvents
| where Timestamp > ago(timeWindow)
| where RecipientEmailAddress =~ targetEmail
| where ThreatTypes has "Phish" or DeliveryAction == "Delivered"
| project Timestamp, Phase = "1-Email",
Detail = strcat("From: ", SenderFromAddress, " | Subject: ", Subject),
SourceIP = SenderIPv4,
Entity = RecipientEmailAddress),
// Phase 2: URL click
(UrlClickEvents
| where Timestamp > ago(timeWindow)
| where AccountUpn =~ targetEmail
| project Timestamp, Phase = "2-Click",
Detail = strcat("Clicked: ", Url, " | Verdict: ", ActionType),
SourceIP = IPAddress,
Entity = AccountUpn),
// Phase 3: Authentication
(IdentityLogonEvents
| where Timestamp > ago(timeWindow)
| where AccountUpn has targetUser
| where ActionType == "LogonSuccess"
| project Timestamp, Phase = "3-Auth",
Detail = strcat(LogonType, " from ", IPAddress, " to ", Application),
SourceIP = IPAddress,
Entity = AccountUpn),
// Phase 4: Endpoint activity
(DeviceProcessEvents
| where Timestamp > ago(timeWindow)
| where AccountName has targetUser
| where FileName in~ ("powershell.exe", "cmd.exe", "wscript.exe",
"mshta.exe", "certutil.exe", "bitsadmin.exe")
| project Timestamp, Phase = "4-Endpoint",
Detail = strcat(FileName, " | ", ProcessCommandLine),
SourceIP = "",
Entity = DeviceName),
// Phase 5: Cloud app activity
(CloudAppEvents
| where Timestamp > ago(timeWindow)
| where AccountDisplayName has targetUser
or AccountId has targetUser
| where ActionType in ("New-InboxRule", "Set-Mailbox",
"FileDownloaded", "Consent to application.",
"Add delegated permission grant.")
| project Timestamp, Phase = "5-CloudApp",
Detail = strcat(ActionType, " in ", Application),
SourceIP = IPAddress,
Entity = AccountDisplayName)
| order by Timestamp asc// Pivot on attacker IP: who else was compromised from the same infrastructure?
let attackerIP = "203.0.113.47";
let attackWindow = 7d;
IdentityLogonEvents
| where Timestamp > ago(attackWindow)
| where IPAddress == attackerIP
| where ActionType == "LogonSuccess"
| summarize FirstAccess = min(Timestamp),
LastAccess = max(Timestamp),
LogonCount = count(),
Applications = make_set(Application)
by AccountUpn
| order by FirstAccess asc// Pivot on phishing sender domain: how many users received emails from this campaign?
let phishDomain = "contoso-hr.com";
let campaignWindow = 7d;
EmailEvents
| where Timestamp > ago(campaignWindow)
| where SenderFromDomain =~ phishDomain
| summarize EmailCount = count(),
UniqueRecipients = dcount(RecipientEmailAddress),
Recipients = make_set(RecipientEmailAddress, 20),
DeliveredCount = countif(DeliveryAction == "Delivered"),
BlockedCount = countif(DeliveryAction == "Blocked")
| project EmailCount, UniqueRecipients, DeliveredCount, BlockedCount, RecipientsTry it yourself
In Advanced Hunting on your developer tenant, run the data pipeline health check query from subsection 1.7 to see which tables have data. Then try a simplified cross-product union query: combine EmailEvents and IdentityLogonEvents for a specific user (use a sample user from your developer tenant) and sort by timestamp. Even with limited data in a developer tenant, this exercise builds familiarity with the union syntax and the different field names across tables. If EmailEvents is empty, check whether Defender for Office 365 is configured in your developer tenant.
What you should observe
The cross-product union query returns events from different tables in a single chronological view. You will notice that field names differ between tables — EmailEvents uses RecipientEmailAddress while IdentityLogonEvents uses AccountUpn. The project operator in each union leg normalizes these different field names into consistent columns, which is essential for readability. In a real investigation, this query pattern is the foundation for every cross-product analysis you will perform.
Knowledge check
NIST CSF: DE.AE-1 (Baseline of operations established), PR.DS-1 (Data-at-rest is protected). ISO 27001: A.8.15 (Logging), A.8.16 (Monitoring activities). SOC 2: CC7.2 (Monitor system components). Every configuration in this subsection contributes to the logging and monitoring controls that auditors verify.
The myth: Default security settings are sufficient
The reality: Microsoft's security defaults provide a baseline — MFA for admins, blocking legacy authentication. But defaults do not configure: conditional access policies tailored to your risk profile, Defender for Office 365 anti-phishing policies for your specific impersonation targets, custom detection rules for your environment, or data loss prevention policies for your sensitive data. Defaults prevent the easiest attacks. Custom configuration prevents the attacks targeting YOUR organization.
Check your understanding
1. You are investigating a phishing incident. EmailEvents shows the phishing email was delivered to j.morrison@northgateeng.com. IdentityLogonEvents shows a successful sign-in for j.morrison from IP 203.0.113.47 four minutes after the email delivery. CloudAppEvents shows a New-InboxRule action from the same IP two minutes after the sign-in. What entity connects these three events across three different products?
2. You discover that the attacker IP (203.0.113.47) was used to access three different user accounts over three hours. The first account received a phishing email, but the other two did not. How were the second and third accounts likely compromised?
3. You have two separate incidents in the queue. Incident A contains an endpoint alert (Mimikatz execution on DESKTOP-NGE042). Incident B, created three days later, contains a cloud app alert (anomalous file downloads from SharePoint by admin.t.clark). The incidents are not automatically correlated. How do you determine whether they are related?
4. Which Advanced Hunting table would you query to find inbox rules created by an attacker after compromising a user account?
Interactive lab: triage cross-product Defender XDR alerts
Six alerts from across the Defender product suite — Endpoint, Office 365, Identity, and Cloud Apps. Each alert comes from a different product with different telemetry. Classify each and identify which alerts are part of the same attack chain.
You manage NE's M365 security stack. Microsoft releases a new Defender feature in preview. The feature promises to reduce AiTM risk by 80%. Do you enable it immediately?
Not in production. Enable in a test tenant or for a pilot group first. Preview features may: change behavior before GA, have undocumented interactions with existing CA policies, or produce unexpected results in specific tenant configurations. The deployment sequence: (1) enable in a test tenant and validate against NE's CA policy set, (2) enable for a pilot group of 10 users for 2 weeks, (3) monitor for FPs and operational impact, (4) roll out to all users after successful pilot. Microsoft's '80% reduction' claim is based on their telemetry across all tenants — NE's specific configuration may produce different results.
You've set up your M365 tenant and learned the Defender XDR unified portal.
Module 0 got your M365 developer tenant configured with sample data. Module 1 took you through the Defender XDR unified incident queue across endpoint, email, identity, and cloud apps. Now you investigate every major M365 attack type and deploy the detections that catch them next time.
- 15 investigation and configuration modules — Defender for Endpoint, Purview, Defender for Cloud, Security Copilot, Sentinel workspace design, log ingestion, analytics rules, and threat hunting
- 5 named attack investigations — AiTM credential phishing, BEC and financial fraud, consent phishing and OAuth grant abuse, token replay and session hijacking, insider threat
- KQL from fundamentals through advanced hunting — dedicated modules on query language, cross-table joins, statistical analysis, and threat hunting queries
- SC-200 exam objectives fully covered — every module maps to the January 2026 SC-200 update. The certification is the side effect of operational competence, not the goal
- Production artefacts per module — detection rules, investigation playbooks, and hardening checklists you deploy to your own tenant