← Back to SOC feed Coverage →

Display Name - Detect Teams IT Helpdesk Impersonation Msg Phishing & Vishing

kql MEDIUM Azure-Sentinel
T1566
CloudAppEvents
huntingmicrosoftofficialphishing
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-09-04T23:00:00Z · Confidence: medium

Hunt Hypothesis

This hypothesis targets adversaries leveraging the trusted internal IT helpdesk persona within Microsoft Teams to execute phishing or vishing attacks, a common initial access vector that bypasses traditional email filters. Proactively hunting for these impersonation attempts is critical in Azure Sentinel to identify social engineering campaigns that exploit user trust and facilitate credential theft or malicious file execution before they propagate across the organization.

KQL Query

let TeamsVishing =
CloudAppEvents
| where Timestamp > ago(1h)
| where Application == @"Microsoft Teams" and ActionType == @"CallParticipantDetail" and tostring(RawEventData.Attendees) has "@"
| extend CallerPSTN = tostring(RawEventData.UserId)
| extend Domain = tostring(split(CallerPSTN, "@")[1])
| extend Caller = tostring(split(CallerPSTN, "@")[0])
| where CallerPSTN has "onmicrosoft.com" and (CallerPSTN has "helpdesk" or CallerPSTN has "support" or CallerPSTN has "admin")
| distinct Caller, Domain;
CloudAppEvents
| where Timestamp > ago(1h)
| where Application == "Microsoft Teams" and ActionType == "ChatCreated" and IsExternalUser == true
| extend ThreadCreatorUpn = tostring(RawEventData.Members[0].UPN)
    ,ThreadCreatorDisplayName = tostring(RawEventData.Members[0].DisplayName)
    ,ThreadCreatorOrganizationId = tostring(RawEventData.Members[0].OrganizationId)
    ,TRecipient1Upn = tostring(RawEventData.Members[1].UPN)
    ,Recipient1DisplayName = tostring(RawEventData.Members[1].DisplayName)
    ,Recipient1OrganizationId = tostring(RawEventData.Members[1].OrganizationId)
    ,Recipient2Upn = tostring(RawEventData.Members[2].UPN)
    ,Recipient2DisplayName = tostring(RawEventData.Members[2].DisplayName)
    ,Recipient2OrganizationId = tostring(RawEventData.Members[2].OrganizationId)
    ,ThreadId = tostring(RawEventData.ChatThreadId)
| where ThreadCreatorUpn has "onmicrosoft.com" and (ThreadCreatorUpn has "helpdesk" or ThreadCreatorUpn has "support" or ThreadCreatorUpn has "admin")
| summarize by ThreadCreatorUpn, ThreadCreatorDisplayName, ThreadCreatorOrganizationId,
    TRecipient1Upn, Recipient1DisplayName, Recipient1OrganizationId,
    Recipient2Upn, Recipient2DisplayName, Recipient2OrganizationId,
    ThreadId, tostring(IsExternalUser), tostring(IsImpersonated)
| union TeamsVishing

Analytic Rule Definition

id: d9fee5bc-e4f8-4ae2-a729-dc399a419cce
name: Display Name - Detect Teams IT Helpdesk Impersonation Msg Phishing & Vishing
description: |
  This query check Teams IT helpdesk impersonation initial access via Teams chat and voice
description-detailed: |
  This query check Teams IT helpdesk impersonation initial access via Teams chat and voice
requiredDataConnectors:
- connectorId: MicrosoftThreatProtection
  dataTypes:
  - CloudAppEvents
tactics:
  - InitialAccess
relevantTechniques:
  - T1566
query: |
   let TeamsVishing =
   CloudAppEvents
   | where Timestamp > ago(1h)
   | where Application == @"Microsoft Teams" and ActionType == @"CallParticipantDetail" and tostring(RawEventData.Attendees) has "@"
   | extend CallerPSTN = tostring(RawEventData.UserId)
   | extend Domain = tostring(split(CallerPSTN, "@")[1])
   | extend Caller = tostring(split(CallerPSTN, "@")[0])
   | where CallerPSTN has "onmicrosoft.com" and (CallerPSTN has "helpdesk" or CallerPSTN has "support" or CallerPSTN has "admin")
   | distinct Caller, Domain;
   CloudAppEvents
   | where Timestamp > ago(1h)
   | where Application == "Microsoft Teams" and ActionType == "ChatCreated" and IsExternalUser == true
   | extend ThreadCreatorUpn = tostring(RawEventData.Members[0].UPN)
       ,ThreadCreatorDisplayName = tostring(RawEventData.Members[0].DisplayName)
       ,ThreadCreatorOrganizationId = tostring(RawEventData.Members[0].OrganizationId)
       ,TRecipient1Upn = tostring(RawEventData.Members[1].UPN)
       ,Recipient1DisplayName = tostring(RawEventData.Members[1].DisplayName)
       ,Recipient1OrganizationId = tostring(RawEventData.Members[1].OrganizationId)
       ,Recipient2Upn = tostring(RawEventData.Members[2].UPN)
       ,Recipient2DisplayName = tostring(RawEventData.Members[2].DisplayName)
       ,Recipient2OrganizationId = tostring(RawEventData.Members[2].OrganizationId)
       ,ThreadId = tostring(RawEventData.ChatThreadId)
   | where ThreadCreatorUpn has "onmicrosoft.com" and (ThreadCreatorUpn has "helpdesk" or ThreadCreatorUpn has "support" or ThreadCreatorUpn has "admin")
   | summarize by ThreadCreatorUpn, ThreadCreatorDisplayName, ThreadCreatorOrganizationId,
       TRecipient1Upn, Recipient1DisplayName, Recipient1OrganizationId,
       Recipient2Upn, Recipient2DisplayName, Recipient2OrganizationId,
       ThreadId, tostring(IsExternalUser), tostring(IsImpersonated)
   | union TeamsVishing
version: 1.0.0

Required Data Sources

Sentinel TableNotes
CloudAppEventsEnsure 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/Email and Collaboration Queries/Spoof and Impersonation/Detect Teams IT Helpdesk Impersonation Msg Phishing & Vishing.yaml