Microsoft Teams Vishing and Malicious Payload Execution
An adversary is using external Microsoft Teams accounts to masquerade as IT support and coerce employees into executing RMM tools or custom payloads that perform discovery and persistence.
Based on research by Unit 42 2026-09-20 12 steps · 5 queries T1027 T1033 T1069.002 T1176 T1204.002 T1219 T1547 T1562.001 T1566.003
Brief
Why This Hunt Matters
A recent report by Unit 42, "Spring Ring: An Inside Look at Voice Phishing Campaigns in Microsoft Teams" (https://unit42.paloaltonetworks.com/spring-ring-voice-phishing-campaigns/), details how adversaries exploit the trust users place in collaboration platforms. Instead of email, they use external Teams accounts to initiate vishing calls. They impersonate IT staff and guide users to install remote monitoring and management (RMM) tools or execute custom payloads. This hunt identifies the full lifecycle of these attacks, from the initial lure to the establishment of persistence.
How the Hunt Flows
The hunt begins by scoping the environment. It identifies every host currently running or having Microsoft Teams installed to focus the analysis on the most likely targets.
The second phase identifies the initial social engineering engagement. It correlates DNS lookups for known vishing domains—often spoofed onmicrosoft.com subdomains—with the immediate execution of remote management software like Quick Assist or specific campaign payloads. This correlation is vital because Quick Assist is a legitimate tool often used by real IT departments; seeing it follow a suspicious DNS resolution provides the necessary context for a high-confidence alert.
The third phase searches for secondary indicators of compromise. It looks for rare binaries running from the user’s temporary directory, specifically focusing on naming patterns like vhlp- and scnr-. These files represent the adversary's attempt to stage more permanent access once the initial RMM session is established.
Finally, the hunt examines script activity for post-exploitation tradecraft. It identifies PowerShell or command-line blocks attempting to bypass AMSI or perform domain discovery, such as enumerating domain groups. By weighing this evidence against the initial social engineering verdict, the hunt provides a clear picture of the attack's success.
Blind Spots
This hunt focuses on endpoint and network telemetry. It cannot see the verbal content of the Teams vishing call itself. If an adversary captures credentials verbally or triggers an MFA prompt without executing code on the machine, the initial hook remains invisible. Additionally, while the campaign is known to sideload browser extensions, this hunt does not inspect the internal DOM manipulation or cookie theft performed by those extensions.
In this series
Steps
-
Identify hosts with Microsoft Teams
Query · scopingDefine the target scope by finding every host currently running or having Microsoft Teams installed.
reads hb_software_inventorysqlSELECT DISTINCT device_hostname FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%teams%'What a hit looks like. A list of hosts likely to be targeted by Teams-based vishing. Silence means Teams is not detected in the software inventory.
-
DNS lookups to vishing domains
Query · enrichmentFind hosts that resolved domains associated with the external Teams tenants or malware hosting sites.
reads hb_dns_activitysqlSELECT device_hostname, query_hostname, process_name, time FROM hb_dns_activity WHERE (instr(',' || '{{teams_lure_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 OR instr(',' || '{{malware_host_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Hosts communicating with known vishing tenants or malicious payload sites. Silence proves no resolution for these specific domains occurred.
-
Execution of RMM or tailored payloads
Query · detection candidateDetect the launch of remote monitoring tools like Quick Assist or executables matching the campaign's tailored naming convention.
reads hb_process_activitysqlSELECT device_hostname, process_name, process_cmd_line, time, user_name FROM hb_process_activity WHERE (LOWER(process_name) LIKE '%quickassist.exe' OR LOWER(process_cmd_line) LIKE '%-org-filters-update-%') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. A process event showing either Quick Assist or a specific campaign payload launched by a user.
-
Evaluate early-stage vishing success
Agent triageAnalyze whether the DNS lures and process executions on the same host indicate a successful vishing engagement.
-
Rare binaries running from Temp directory
Query · baselineFind execution of persistent binaries moved to Temp with the vhlp- or scnr- naming convention, and stack-count to identify rare occurrences.
reads hb_process_activitysqlSELECT LOWER(process_name) AS process, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_process_activity WHERE (LOWER(process_path) LIKE '%\\temp\\vhlp-%' OR LOWER(process_path) LIKE '%\\temp\\scnr-%') AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY process HAVING host_count < 3What a hit looks like. Persistent binaries running from Temp that are unique to a few hosts. Fleet-wide files are likely benign system components.
-
Discovery and AMSI bypass scripts
Query · triageIdentify script blocks attempting to disable AMSI or enumerate domain groups and users.
reads hb_script_activitysqlSELECT device_hostname, script_content, time FROM hb_script_activity WHERE (LOWER(script_content) LIKE '%amsiinitfailed%' OR LOWER(script_content) LIKE '%whoami /groups%' OR LOWER(script_content) LIKE '%net group /dom%') AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Script contents matching the campaign's discovery and evasion tradecraft. Silence proofs no such script blocks were logged.
-
Weigh full-chain evidence
Agent triageReview the early social engineering verdict alongside the follow-on persistence and discovery evidence.
-
Route on final verdict
DecisionRoute to containment if a malicious verdict is reached.
-
Isolate host and capture payloads
Response actionIsolate the compromised endpoint to prevent lateral movement and capture the persistent binaries for analysis.
-
Review vishing evidence
Analyst taskA human analyst reviews the agent's work and host context to confirm a vishing event.
-
Close out hunt
Analyst taskRecord findings for the periodic hunt cycle.
Coverage
Scenario coverage
| Stage | Covered | How, or why not |
|---|---|---|
| Teams Vishing and Impersonation T1566.003 |
Yes | dns-vishing-lures |
| User Execution of RMM and Payloads T1204.002 · T1219 |
Yes | rmm-and-payload-execution |
| Staging and Persistence T1547 |
Yes | temp-directory-persistence |
| Bypassing AMSI and Browser Hijacking T1027 · T1562.001 · T1176 |
Yes | script-based-discovery |
| Host and Domain Discovery T1033 · T1069.002 |
Yes | script-based-discovery |
| NTLM Relay and PetitPotam T1557.001 · T1210 |
Out of scope | Belongs to another part of the 'Spring Ring: An Inside Look at Voice Phishing Campaigns in Microsoft Teams' series. |
| PowerShell RAT C2 Beaconing T1071.001 |
Out of scope | Belongs to another part of the 'Spring Ring: An Inside Look at Voice Phishing Campaigns in Microsoft Teams' series. |
Blind spots
- Needs Microsoft Teams Voice Recording or Call Metadata. An adversary could verbally capture credentials or perform MFA fatigue without immediate endpoint activity, leaving the initial hook invisible to behavior-based hunting. It would answer What was the verbal content of the vishing call?.
- Needs hb_browser_extension_activity. A sideloaded extension can steal session cookies or manipulate browser DOM silently, bypassing process-based detection. It would answer What actions did the sideloaded Edge extension perform?.
Parameters & data
Parameters
| Parameter | Type | Default | What it is |
|---|---|---|---|
lookback_days | number | 14 | Days of history to examine for activity. |
malware_host_domains | list[domain] | san-sid.com | Adversary-controlled domains used for hosting malicious payloads. |
scope_hosts | list[host] | — | Targeted hostnames for the hunt; leave empty to search the full estate. |
teams_lure_domains | list[domain] | internalsystemsdaily.onmicrosoft.com, itprotectiondepartment.onmicrosoft.com, mandatorynetworkmonitoring.onmicrosoft.com, internalusahelpdeskit.onmicrosoft.com, certifiedupdatenetwork.onmicrosoft.com, infrastructureopsdesk.onmicrosoft.com, systemdeploymentcenter.onmicrosoft.com, systemsupportoperations.onmicrosoft.com | External Microsoft Teams tenant domains used for impersonation lures. |
Telemetry
| Source | Category | Telemetry |
|---|---|---|
| Endpoint telemetry (hb_ surfaces) | endpoint | endpoint |
Source
---
analysis: A single rule on Quick Assist or PowerShell obfuscation is noisy; this hunt
pivots from external DNS lures to correlated RMM execution and follow-on persistence,
creating a high-confidence chain that requires cross-surface analysis.
blind_spots:
- id: teams-voice-content-gap
question: What was the verbal content of the vishing call?
requires: Microsoft Teams Voice Recording or Call Metadata
risk: An adversary could verbally capture credentials or perform MFA fatigue without
immediate endpoint activity, leaving the initial hook invisible to behavior-based
hunting.
stage: initial-access-teams-vishing
- id: browser-extension-visibility
question: What actions did the sideloaded Edge extension perform?
requires: hb_browser_extension_activity
risk: A sideloaded extension can steal session cookies or manipulate browser DOM
silently, bypassing process-based detection.
stage: defense-evasion-obfuscation-and-hijack
coverage:
- stage: initial-access-teams-vishing
status: covered
steps:
- dns-vishing-lures
- stage: execution-rmm-and-custom-payloads
status: covered
steps:
- rmm-and-payload-execution
- stage: persistence-staging-temp
status: covered
steps:
- temp-directory-persistence
- stage: defense-evasion-obfuscation-and-hijack
status: covered
steps:
- script-based-discovery
- stage: discovery-host-and-domain
status: covered
steps:
- script-based-discovery
- reason: 'Belongs to another part of the ''Spring Ring: An Inside Look at Voice Phishing
Campaigns in Microsoft Teams'' series.'
stage: lateral-movement-ntlm-relay
status: out_of_scope
- reason: 'Belongs to another part of the ''Spring Ring: An Inside Look at Voice Phishing
Campaigns in Microsoft Teams'' series.'
stage: command-and-control-rat
status: out_of_scope
guardrails:
claims: no_unsupported
evidence: citation_required
missing_data: not_benign
telemetry: untrusted
hunt:
applicability: campaign-specific
handoff: keep-as-periodic-hunt
justification: Microsoft Teams vishing exploits the high-trust nature of internal
communications platforms. This hunt identifies the coordination between external
lures and endpoint tradecraft that traditional signature-based rules often miss.
methodology: model-assisted
trigger: intel-report
hypothesis: An adversary is using external Microsoft Teams accounts to masquerade
as IT support and coerce employees into executing RMM tools or custom payloads that
perform discovery and persistence.
labels:
- hunt
- attack.t1566.003
- attack.t1204.002
- attack.t1219
- attack.t1547
- attack.t1027
- attack.t1562.001
- attack.t1176
- attack.t1033
- attack.t1069.002
name: Microsoft Teams Vishing and Malicious Payload Execution
parameters:
lookback_days:
default: '14'
description: Days of history to examine for activity.
type: number
malware_host_domains:
default:
- san-sid.com
description: Adversary-controlled domains used for hosting malicious payloads.
from:
kind: article
observed: '2026-08-31'
ref: unit-42-spring-ring
type: list[domain]
scope_hosts:
default: []
description: Targeted hostnames for the hunt; leave empty to search the full estate.
type: list[host]
teams_lure_domains:
default:
- internalsystemsdaily.onmicrosoft.com
- itprotectiondepartment.onmicrosoft.com
- mandatorynetworkmonitoring.onmicrosoft.com
- internalusahelpdeskit.onmicrosoft.com
- certifiedupdatenetwork.onmicrosoft.com
- infrastructureopsdesk.onmicrosoft.com
- systemdeploymentcenter.onmicrosoft.com
- systemsupportoperations.onmicrosoft.com
description: External Microsoft Teams tenant domains used for impersonation lures.
from:
kind: article
observed: '2026-08-31'
ref: unit-42-spring-ring
type: list[domain]
provenance:
authors:
- name: Huntbase hunt generation
org: huntbase.io
generated:
by: huntbase-hunt-generation
from: https://unit42.paloaltonetworks.com/spring-ring-voice-phishing-campaigns/
gates:
- dry-run
- lint
model: hb_google/gemini-3-flash-preview
rationale: The hunt targets hosts with Microsoft Teams. If the software inventory
is empty, widen the scope to all Windows workstations to account for unmanaged Teams
installations.
references:
- name: "Unit 42 \u2014 Spring Ring: An Inside Look at Voice Phishing Campaigns in\
\ Microsoft Teams"
url: https://unit42.paloaltonetworks.com/spring-ring-voice-phishing-campaigns/
related:
- hunt: lateral-movement-ntlm-relay
reason: The NTLM relay and PetitPotam phase requires specific Domain Controller
telemetry and is handled by a sibling hunt.
relation: out-of-scope-alternative
scenario:
stages:
- name: Teams Vishing and Impersonation
observables:
- internalsystemsdaily.onmicrosoft.com
- itprotectiondepartment.onmicrosoft.com
- mandatorynetworkmonitoring.onmicrosoft.com
- internalusahelpdeskit.onmicrosoft.com
- certifiedupdatenetwork.onmicrosoft.com
- infrastructureopsdesk.onmicrosoft.com
- systemdeploymentcenter.onmicrosoft.com
- systemsupportoperations.onmicrosoft.com
slug: initial-access-teams-vishing
tactic: initial-access
techniques:
- T1566.003
- name: User Execution of RMM and Payloads
observables:
- Quick Assist
- s3.us-west-2.amazonaws.com
- '*-org-filters-update-*.exe'
- san-sid.com
slug: execution-rmm-and-custom-payloads
tactic: execution
techniques:
- T1204.002
- T1219
- name: Staging and Persistence
observables:
- \Temp\vhlp-*.exe
- \Temp\scnr-*.exe
slug: persistence-staging-temp
tactic: persistence
techniques:
- T1547
- name: Bypassing AMSI and Browser Hijacking
observables:
- amsiInitFailed
- Headless Microsoft Edge
- Sideloaded Edge extension
- Obfuscated PowerShell script
slug: defense-evasion-obfuscation-and-hijack
tactic: defense-evasion
techniques:
- T1027
- T1562.001
- T1176
- name: Host and Domain Discovery
observables:
- whoami /groups
- net group /dom
slug: discovery-host-and-domain
tactic: discovery
techniques:
- T1033
- T1069.002
- name: NTLM Relay and PetitPotam
observables:
- C:\ProgramData\IntegrityData\python.exe
- Port 445 SMB scanning
- PetitPotam coercion against Domain Controllers
slug: lateral-movement-ntlm-relay
tactic: lateral-movement
techniques:
- T1557.001
- T1210
- name: PowerShell RAT C2 Beaconing
observables:
- san-sid.com
slug: command-and-control-rat
tactic: command-and-control
techniques:
- T1071.001
summary: Spring Ring is a social engineering campaign that leverages external Microsoft
Teams accounts to impersonate IT help desks via vishing calls. Attackers coerce
employees into running remote management tools or custom malware, leading to domain
enumeration and NTLM relay attacks (PetitPotam) intended to compromise domain
controllers.
series:
index: 1
slug: spring-ring-an-inside-look-at-voice-phishing-campaigns-in-microsoft-teams
title: 'Spring Ring: An Inside Look at Voice Phishing Campaigns in Microsoft Teams'
total: 2
severity: high
targets:
analyst:
name: Tier-2 analyst
role: analyst
endpoint:
category: endpoint
name: Endpoint telemetry (hb_ surfaces)
telemetry:
- endpoint
hunter:
agent: true
name: Hunt agent
tlp: clear
type: investigation
---
# Microsoft Teams Vishing and Malicious Payload Execution
The Spring Ring campaign leverages the inherent trust in SaaS collaboration platforms to initiate vishing calls via external Teams accounts. This hunt first identifies the initial social engineering phase by tracking DNS lookups to suspicious onmicrosoft.com subdomains and subsequent execution of RMM tools like Quick Assist or tailored payloads. It then follows the attack chain to look for follow-on behaviors including AMSI bypass attempts, discovery commands, and persistence established in temporary directories.
## scope-teams-hosts
<!-- Identify hosts with Microsoft Teams -->
Define the target scope by finding every host currently running or having Microsoft Teams installed.
```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hosts likely to be targeted by Teams-based vishing. Silence means
Teams is not detected in the software inventory.
reads:
- device_hostname
- package_name
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT DISTINCT device_hostname FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%teams%'
```
## check-lure-and-execution
<!-- Identify Initial Lure and Tool Launch -->
parallel:
- → dns-vishing-lures
- → rmm-and-payload-execution
join: → triage-initial-lure
## dns-vishing-lures
<!-- DNS lookups to vishing domains -->
Find hosts that resolved domains associated with the external Teams tenants or malware hosting sites.
```sqlite target=endpoint role=enrichment params=(teams_lure_domains=teams_lure_domains, malware_host_domains=malware_host_domains, scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
expected: Hosts communicating with known vishing tenants or malicious payload sites.
Silence proves no resolution for these specific domains occurred.
reads:
- device_hostname
- query_hostname
- process_name
- time
silence: evidence_of_absence
source: hb_dns_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, query_hostname, process_name, time FROM hb_dns_activity WHERE (instr(',' || '{{teams_lure_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 OR instr(',' || '{{malware_host_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## rmm-and-payload-execution
<!-- Execution of RMM or tailored payloads -->
Detect the launch of remote monitoring tools like Quick Assist or executables matching the campaign's tailored naming convention.
```sqlite target=endpoint role=detection-candidate params=(scope_hosts=scope_hosts, lookback_days=lookback_days)
~~~yaml
expected: A process event showing either Quick Assist or a specific campaign payload
launched by a user.
reads:
- device_hostname
- process_name
- process_cmd_line
- time
- user_name
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, process_name, process_cmd_line, time, user_name FROM hb_process_activity WHERE (LOWER(process_name) LIKE '%quickassist.exe' OR LOWER(process_cmd_line) LIKE '%-org-filters-update-%') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## triage-initial-lure
<!-- Evaluate early-stage vishing success -->
```agent target=hunter
cite: required
context:
- dns-vishing-lures
- rmm-and-payload-execution
max_iterations: 3
objective: Determine if any host resolved a vishing domain and immediately launched
an RMM tool or the specific campaign payload.
success_criteria: A per-host verdict of social-engineering-likely or benign.
tools:
- endpoint
```
## check-persistence-and-discovery
<!-- Search for Persistence and Discovery Tradecraft -->
parallel:
- → temp-directory-persistence
- → script-based-discovery
join: → triage-full-chain
## temp-directory-persistence
<!-- Rare binaries running from Temp directory -->
Find execution of persistent binaries moved to Temp with the vhlp- or scnr- naming convention, and stack-count to identify rare occurrences.
```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days)
~~~yaml
baseline:
compare: first_seen
window: '{{lookback_days}}d'
expected: Persistent binaries running from Temp that are unique to a few hosts. Fleet-wide
files are likely benign system components.
prevalence:
by: device_hostname
key:
- process_name
rare_below: 3
reads:
- device_hostname
- process_path
- process_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT LOWER(process_name) AS process, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_process_activity WHERE (LOWER(process_path) LIKE '%\\temp\\vhlp-%' OR LOWER(process_path) LIKE '%\\temp\\scnr-%') AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY process HAVING host_count < 3
```
## script-based-discovery
<!-- Discovery and AMSI bypass scripts -->
Identify script blocks attempting to disable AMSI or enumerate domain groups and users.
```sqlite target=endpoint role=triage params=(lookback_days=lookback_days)
~~~yaml
expected: Script contents matching the campaign's discovery and evasion tradecraft.
Silence proofs no such script blocks were logged.
reads:
- device_hostname
- script_content
- time
silence: evidence_of_absence
source: hb_script_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, script_content, time FROM hb_script_activity WHERE (LOWER(script_content) LIKE '%amsiinitfailed%' OR LOWER(script_content) LIKE '%whoami /groups%' OR LOWER(script_content) LIKE '%net group /dom%') AND time >= datetime('now', '-{{lookback_days}} days')
```
## triage-full-chain
<!-- Weigh full-chain evidence -->
```agent target=hunter
cite: required
context:
- triage-initial-lure
- temp-directory-persistence
- script-based-discovery
max_iterations: 5
objective: Determine if the hosts with suspicious early vishing lures also show definitive
signs of payload persistence and domain discovery.
success_criteria: A per-host verdict of malicious | suspicious | benign.
tools:
- endpoint
```
## route-on-verdict
<!-- Route on final verdict -->
if~: "the triage-full-chain verdict is malicious for at least one host" (confidence: high, judge=hunter)
then: → isolate-host
indeterminate: → analyst-review
unavailable: → analyst-review (blind_spot: teams-voice-content-gap)
else: → close-out
## isolate-host
<!-- Isolate host and capture payloads -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host from the network. Capture any executables located in the user's Temp directory matching the vhlp-* or scnr-* naming convention.
```
→ analyst-review
## analyst-review
<!-- Review vishing evidence -->
```manual target=analyst
Verify the DNS resolutions to external tenants and the Quick Assist launch. Interview the user to confirm they received a call from an 'IT Technician' and were guided to launch specific software.
```
→ end
## close-out
<!-- Close out hunt -->
```manual target=analyst
Record the absence of Spring Ring activity. If Quick Assist launches were found without corresponding DNS lures, consider these for exclusion or lower-severity monitoring.
```
→ end
Run it
Take this hunt into your environment.
Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.
Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.