KQL Email Security Queries
Phishing Emails Detected (Last 24h)
EmailEvents
| where TimeGenerated > ago(24h)
| where ThreatTypes has "Phish"
| summarize
Count = count(),
Recipients = make_set(RecipientEmailAddress),
Subjects = make_set(Subject)
by SenderFromAddress
| sort by Count desc
Emails with Malicious URLs
EmailUrlInfo
| where TimeGenerated > ago(24h)
| where UrlLocation == "EmailBody"
| join kind=inner (
EmailEvents
| where ThreatTypes has "Phish" or ThreatTypes has "Malware"
) on NetworkMessageId
| summarize count() by Url, SenderFromAddress, Subject
| sort by count_ desc
Suspicious Attachment Types
EmailAttachmentInfo
| where TimeGenerated > ago(24h)
| where FileType in ("exe", "scr", "bat", "ps1", "vbs", "js", "hta", "iso", "img")
| join kind=inner (EmailEvents) on NetworkMessageId
| project TimeGenerated, SenderFromAddress, RecipientEmailAddress, Subject, FileName, FileType
| sort by TimeGenerated desc
BEC (Business Email Compromise) Indicators
// Emails impersonating executives
let executives = dynamic(["ceo@", "cfo@", "ciso@", "vp."]);
EmailEvents
| where TimeGenerated > ago(7d)
| where SenderFromAddress !endswith "@chla.usc.edu" // external senders
| where Subject contains "wire" or Subject contains "transfer"
or Subject contains "payment" or Subject contains "urgent"
or Subject contains "invoice"
| summarize count() by SenderFromAddress, Subject
| sort by count_ desc
Mail Flow Summary
EmailEvents
| where TimeGenerated > ago(24h)
| summarize
Total = count(),
Delivered = countif(DeliveryAction == "Delivered"),
Blocked = countif(DeliveryAction == "Blocked"),
Junked = countif(DeliveryAction == "Junked"),
Replaced = countif(DeliveryAction == "Replaced")
| extend BlockRate = round(todouble(Blocked) / Total * 100, 1)
Top Targeted Users
EmailEvents
| where TimeGenerated > ago(7d)
| where ThreatTypes != ""
| summarize
ThreatCount = count(),
ThreatTypes = make_set(ThreatTypes),
Senders = dcount(SenderFromAddress)
by RecipientEmailAddress
| sort by ThreatCount desc
| take 20