← Back to SOC feed Coverage →

Suspicious link sharing pattern

kql LOW Azure-Sentinel
T1598
microsoftofficial
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-04-20T09:00:00Z · Confidence: medium

Hunt Hypothesis

Adversaries may be using link sharing across multiple Zoom chat channels to exfiltrate data or deploy malware, leveraging the platform’s communication channels for lateral movement. SOC teams should proactively hunt for this behavior in Azure Sentinel to identify potential covert command and control or data exfiltration activities.

KQL Query

let threshold = 3;
ZoomLogs
| where Event =~ "chat_message.sent"
| extend Channel = tostring(parse_json(ChatEvents).Channel)
| extend Message = tostring(parse_json(ChatEvents).Message)
| where Message matches regex "http(s?):\\/\\/"
| summarize Channels = makeset(Channel), StartTime = min(TimeGenerated), EndTime = max(TimeGenerated) by Message, User, UserId
| extend ChannelCount = arraylength(Channels)
| where ChannelCount > threshold
| extend AccountName = tostring(split(User, "@")[0]), AccountUPNSuffix = tostring(split(User, "@")[1])

Analytic Rule Definition

id: 1218175f-c534-421c-8070-5dcaabf28067
name: Suspicious link sharing pattern
description: |
  'Alerts in links that have been shared across multiple Zoom chat channels by the same user in a short space if time.
  Adjust the threshold figure to change the number of channels a message needs to be posted in before an alert is raised.'
severity: Low
requiredDataConnectors: []
queryFrequency: 1d
queryPeriod: 1d
triggerOperator: gt
triggerThreshold: 0
tactics:
  - Reconnaissance
relevantTechniques:
  - T1598
query: |
  let threshold = 3;
  ZoomLogs
  | where Event =~ "chat_message.sent"
  | extend Channel = tostring(parse_json(ChatEvents).Channel)
  | extend Message = tostring(parse_json(ChatEvents).Message)
  | where Message matches regex "http(s?):\\/\\/"
  | summarize Channels = makeset(Channel), StartTime = min(TimeGenerated), EndTime = max(TimeGenerated) by Message, User, UserId
  | extend ChannelCount = arraylength(Channels)
  | where ChannelCount > threshold
  | extend AccountName = tostring(split(User, "@")[0]), AccountUPNSuffix = tostring(split(User, "@")[1])
entityMappings:
  - entityType: Account
    fieldMappings:
      - identifier: FullName
        columnName: User
      - identifier: Name
        columnName: AccountName
      - identifier: UPNSuffix
        columnName: AccountUPNSuffix
version: 1.0.4
kind: Scheduled
metadata:
    source: 
        kind: Community
    author:
        name: Microsoft Security Research
    support:
        tier: Community
    categories:
        domains: [ "Security - Others" ]

MITRE ATT&CK Context

References

False Positive Guidance

Original source: https://github.com/Azure/Azure-Sentinel/blob/main/Detections/ZoomLogs/SupiciousLinkSharing.yaml