Back to Intelligence

UNC6671 Vishing Campaign Targets Personal Phones to Bypass MFA and Steal SaaS Data — Detection and Hardening Guide

SA
Security Arsenal Team
August 7, 2026
12 min read

A data extortion group tracked as UNC6671 is running an active voice phishing (vishing) campaign against financial services, private equity, and professional services firms — and their most effective tactic isn't exploiting software, it's exploiting your help desk process and your employees' personal phones. Posing as IT help desk staff conducting a "mandatory, urgent security migration," the operators call employees directly on personal mobile numbers, walk them to attacker-controlled credential harvesting pages, capture MFA session tokens in real time, and then pillage SaaS environments (email, file storage, HR and finance platforms) for data to extort.

This matters for two reasons. First, no patch fixes this — the attack surface is your identity provider configuration, your help desk authentication workflow, and your users' trust in a phone call. Second, the deliberate pivot to personal phones is engineered to bypass your MDM, your EDR, your corporate email filtering, and every control you've layered onto managed devices. If your detection strategy ends at the corporate perimeter, you are blind to the initial access vector entirely.

Technical Analysis

Threat Actor and Targeting

UNC6671 is a financially motivated data extortion group whose tradecraft mirrors the broader wave of help-desk-impersonation intrusions the industry has tracked over the past 18 months. The current campaign targets:

  • Financial services and private equity — where a single compromised associate's mailbox yields LP lists, deal terms, and wire instructions
  • Professional services — law firms, consultancies, and accounting firms holding client-confidential data across multiple tenants
  • SaaS-centric enterprises — organizations whose crown jewels live in Microsoft 365, Google Workspace, Okta/Entra ID, Salesforce, Workday, and similar platforms rather than on-premises

Attack Chain (Defender's View)

Based on the reported tradecraft, the intrusion sequence breaks down as follows:

  1. Reconnaissance and pretext building. Operators collect employee names, personal mobile numbers, and org chart detail from LinkedIn, data broker sites, breached credential dumps, and prior victims. The pretext — a "mandatory security migration" — is deliberately chosen because it justifies urgency, secrecy ("don't discuss the migration"), and unusual technical steps.

  2. Vishing contact on personal devices. The call arrives on the employee's personal phone. No corporate email gateway, no MDM, no EDR sees this. Caller ID spoofing and professional scripts (often with hold music, ticket numbers, and spoofed internal directories) establish legitimacy.

  3. Credential and session capture. The victim is directed to an adversary-in-the-middle (AiTM) phishing proxy that mirrors the real SSO login. The proxy relays the authentication in real time, capturing the username, password, and the MFA response / session cookie. This defeats SMS OTP, TOTP, and push-based MFA. Only phishing-resistant MFA (FIDO2/WebAuthn passkeys, certificate-based auth) structurally defeats this step.

  4. SaaS access and persistence. With a valid session token, the actor authenticates directly to cloud applications from their own infrastructure — frequently registering a new MFA method or device on the compromised account to survive password resets. In many intrusions of this class, actors also guide victims to install remote access tooling (AnyDesk, ScreenConnect, TeamViewer) under the guise of "migration support software," giving them a hands-on-keyboard foothold.

  5. Data collection and extortion. Mailboxes, SharePoint/OneDrive, Google Drive, and HR/finance SaaS are enumerated and exfiltrated — often via legitimate sync clients or bulk export features that look like normal user activity. Extortion follows, with threats to leak stolen data.

Exploitation Status

This is confirmed active exploitation in the wild against named verticals, not a theoretical technique. There is no associated CVE — the vulnerability is procedural (help desk identity proofing, MFA reset workflows) and architectural (non-phishing-resistant MFA, unmanaged device contact). Because there is no CISA KEV entry or vendor patch, the remediation burden falls entirely on identity hardening and detection engineering.

Detection & Response

The most reliable detection opportunities exist after the phone call — at the identity layer and on endpoints where persistence or remote tooling is installed. The rules and queries below target those observables.

SIGMA Rules

YAML
---
title: Remote Access Tool Installation During Suspected Vishing Window
id: 9c2e4a71-3f58-4b6d-a1e7-8d2c5f9a3b41
status: experimental
description: Detects installation or execution of remote access tools (AnyDesk, ScreenConnect, TeamViewer, Splashtop, LogMeIn) commonly deployed during help desk impersonation / vishing intrusions where attackers instruct victims to install 'migration support software'.
references:
  - https://thehackernews.com/2026/08/unc6671-vishing-attacks-target-personal.html
  - https://attack.mitre.org/techniques/T1219/
author: Security Arsenal
date: 2026/08/10
tags:
  - attack.command_and_control
  - attack.t1219
logsource:
  category: process_creation
  product: windows
detection:
  selection_image:
    Image|endswith:
      - '\AnyDesk.exe'
      - '\ScreenConnect.ClientService.exe'
      - '\TeamViewer.exe'
      - '\TeamViewer_Service.exe'
      - '\Splashtop.exe'
      - '\SRManager.exe'
      - '\LMIGuardianSvc.exe'
      - '\GoToAssist*.exe'
      - '\ZohoMeeting*.exe'
  selection_path:
    Image|contains:
      - '\AppData\Local\'
      - '\AppData\Roaming\'
      - '\Users\Public\'
      - '\Downloads\'
  condition: selection_image or selection_path
falsepositives:
  - Organizations with sanctioned RMM deployments — baseline approved tools and paths, alert on everything else
  - Legitimate IT remote support sessions
level: high
---
title: MFA Credential or Authenticator Method Modified Via PowerShell or Graph API
id: 4b1d8f62-7a3c-4e95-b2d8-6f1a9c4e7d35
status: experimental
description: Detects local modification of MFA-related configuration or suspicious use of credential management utilities that may follow session token theft in AiTM phishing intrusions.
references:
  - https://thehackernews.com/2026/08/unc6671-vishing-attacks-target-personal.html
  - https://attack.mitre.org/techniques/T1556/
author: Security Arsenal
date: 2026/08/10
tags:
  - attack.credential_access
  - attack.t1556
  - attack.t1555
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    CommandLine|contains:
      - 'vaultcmd'
      - 'rundll32.exe keymgr.dll'
      - 'cmdkey /list'
      - 'Microsoft.AAD.BrokerPlugin'
      - 'TokenBroker'
  condition: selection
falsepositives:
  - Rare legitimate credential administration; investigate context and user
level: medium
---
title: Browser Cookie and Session Store Access by Non-Browser Process
id: 7e5c3a94-1d68-4f27-9b3a-2c8e6d4f1a92
status: experimental
description: Detects non-browser processes accessing browser cookie/session databases, a technique used to extract cloud session tokens after credential theft for replay against SaaS platforms.
references:
  - https://thehackernews.com/2026/08/unc6671-vishing-attacks-target-personal.html
  - https://attack.mitre.org/techniques/T1539/
author: Security Arsenal
date: 2026/08/10
tags:
  - attack.credential_access
  - attack.t1539
logsource:
  category: file_access
  product: windows
detection:
  selection_target:
    TargetFilename|contains:
      - '\Cookies'
      - '\Login Data'
      - '\Local State'
      - '\Network\Cookies'
  selection_path:
    TargetFilename|contains:
      - '\Google\Chrome\'
      - '\Microsoft\Edge\'
      - '\Mozilla\Firefox\'
  filter_browsers:
    Image|endswith:
      - '\chrome.exe'
      - '\msedge.exe'
      - '\firefox.exe'
      - '\msmpeng.exe'
  condition: selection_target and selection_path and not filter_browsers
falsepositives:
  - Backup and sync agents; EDR telemetry collectors — baseline and exclude known-good
level: high

KQL — Microsoft Sentinel / Defender

The highest-fidelity hunt for this campaign is at the identity layer: an MFA method change followed by an anomalous SaaS sign-in. Correlate Entra ID audit events with sign-in telemetry, and separately hunt for RMM tooling execution on endpoints.

KQL — Microsoft Sentinel / Defender
// Hunt 1: MFA method change or new device registration followed by risky SaaS sign-in within 24h
// Tables: AuditLogs + SigninLogs (Sentinel) — adjust for AADNonInteractiveUserSignInLogs as needed
let mfaEvents =
AuditLogs
| where TimeGenerated > ago(7d)
| where OperationName has_any ("Add authentication method", "Update user", "Add service principal credentials", "Add registered device")
| where tostring(TargetResources[0].displayName) != ""
| extend TargetUser = tostring(TargetResources[0].userPrincipalName)
| extend Actor = tostring(InitiatedBy.user.userPrincipalName)
| extend ModifiedProps = tostring(TargetResources[0].modifiedProperties)
| where ModifiedProps has_any ("StrongAuthentication", "Phone", "Authenticator", "Device")
| project MFAChangeTime=TimeGenerated, TargetUser, Actor, OperationName, CorrelationId;
SigninLogs
| where TimeGenerated > ago(7d)
| where ResultType == 0
| join kind=inner mfaEvents on $left.UserPrincipalName == $right.TargetUser
| where TimeGenerated between (MFAChangeTime .. MFAChangeTime + 24h)
| extend NewLocation = iif(isempty(Location), "Unknown", Location)
| summarize FirstSignIn=min(TimeGenerated), SignInCount=count(), Locations=make_set(NewLocation), IPs=make_set(IPAddress), Apps=make_set(AppDisplayName)
    by UserPrincipalName, Actor, OperationName, MFAChangeTime
| project UserPrincipalName, OperationName, Actor, MFAChangeTime, FirstSignIn, SignInCount, Locations, IPs, Apps
| sort by MFAChangeTime desc;

// Hunt 2: Endpoint execution of remote access tools (vishing 'migration software')
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where FileName has_any ("AnyDesk.exe", "ScreenConnect.ClientService.exe", "TeamViewer.exe", "Splashtop.exe", "GoToAssist", "ZohoMeeting")
   or ProcessCommandLine has_any ("anydesk", "screenconnect", "teamviewer")
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), CommandLines=make_set(ProcessCommandLine)
    by DeviceName, FileName, InitiatingProcessAccountName, InitiatingProcessFileName
| sort by FirstSeen desc;

// Hunt 3: Impossible travel / unfamiliar ASN sign-ins to SaaS apps (AiTM proxy replay indicator)
SigninLogs
| where TimeGenerated > ago(7d)
| where ResultType == 0
| where AppDisplayName has_any ("Office 365", "SharePoint", "Exchange", "Salesforce", "Google", "Workday", "Okta")
| summarize Locations=make_set(Location), Countries=make_set(tostring(LocationDetails.countryOrRegion)), ASNs=make_set(tostring(NetworkLocationDetails)), IPs=make_set(IPAddress)
    by UserPrincipalName, bin(TimeGenerated, 1h)
| where array_length(Countries) > 1
| project UserPrincipalName, TimeGenerated, Countries, IPs, ASNs
| sort by TimeGenerated desc;

Velociraptor VQL

VQL — Velociraptor
-- Hunt for remote access tooling and browser session store access indicative of
-- vishing-driven intrusion persistence (UNC6671-style help desk impersonation)
SELECT Pid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE Name =~ '(?i)(anydesk|screenconnect|teamviewer|splashtop|gotoassist|zohoassist|logmein)'
   OR Exe =~ '(?i)(anydesk|screenconnect|teamviewer|splashtop|gotoassist)'
   OR CommandLine =~ '(?i)(anydesk|screenconnect|teamviewer)'

-- Enumerate recently created RMM executables in user-writable paths
SELECT FullPath, Size, Mtime, Ctime
FROM glob(globs=[
  'C:/Users/*/Downloads/*AnyDesk*.exe',
  'C:/Users/*/Downloads/*ScreenConnect*.exe',
  'C:/Users/*/Downloads/*TeamViewer*.exe',
  'C:/Users/*/AppData/**/*AnyDesk*.exe',
  'C:/Users/Public/**/*ScreenConnect*.exe'
])
ORDER BY Ctime DESC

Remediation / Verification Script

PowerShell
# UNC6671 Vishing Response: Audit recent MFA method changes and flag high-risk accounts
# Requires: Microsoft.Graph PowerShell SDK (Identity.SignIns scope: AuditLog.Read.All, Directory.Read.All)
# Run as: Global Reader or Security Reader minimum

Import-Module Microsoft.Graph.Identity.SignIns -ErrorAction Stop
Connect-MgGraph -Scopes "AuditLog.Read.All","Directory.Read.All","UserAuthenticationMethod.Read.All" -NoWelcome

$lookback = (Get-Date).AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ssZ")

# 1. Find recent MFA/authentication method changes in the directory audit log
Write-Host "`n=== Recent Authentication Method Changes (last 7 days) ===" -ForegroundColor Cyan
$auditEvents = Get-MgAuditLogDirectoryAudit -Filter "activityDateTime ge $lookback" -All |
    Where-Object { $_.ActivityDisplayName -match "authentication method|registered device|strongAuthentication" }

$auditEvents | ForEach-Object {
    $target = $_.TargetResources[0].UserPrincipalName
    $actor  = if ($_.InitiatedBy.User) { $_.InitiatedBy.User.UserPrincipalName } else { $_.InitiatedBy.App.DisplayName }
    [PSCustomObject]@{
        Time      = $_.ActivityDateTime
        Activity  = $_.ActivityDisplayName
        Actor     = $actor
        Target    = $target
        Result    = $_.Result
    }
} | Format-Table -AutoSize

# 2. For each account with a recent change, enumerate current auth methods to spot attacker-registered factors
Write-Host "`n=== Auth Methods on Changed Accounts (verify each is user-recognized) ===" -ForegroundColor Cyan
$changedUsers = $auditEvents | ForEach-Object { $_.TargetResources[0].UserPrincipalName } | Sort-Object -Unique
foreach ($u in $changedUsers) {
    if ([string]::IsNullOrWhiteSpace($u)) { continue }
    try {
        $methods = Get-MgUserAuthenticationMethod -UserId $u -ErrorAction Stop
        foreach ($m in $methods) {
            [PSCustomObject]@{
                User       = $u
                MethodType = $m.AdditionalProperties.'@odata.type'
                Detail     = ($m.AdditionalProperties | ConvertTo-Json -Compress -Depth 3)
            }
        }
    } catch {
        Write-Warning "Could not enumerate methods for $u : $_"
    }
}

# 3. Verify phishing-resistant MFA coverage: list users with ONLY phone/SMS methods (highest vishing risk)
Write-Host "`n=== Users Lacking Phishing-Resistant MFA (FIDO2/Windows Hello/CBA) ===" -ForegroundColor Cyan
$report = Get-MgReportAuthenticationMethodUserRegistrationDetail -All
$report | Where-Object {
    $_.IsMfaRegistered -eq $true -and
    ($_.MethodsRegistered -notmatch "fido2|windowsHelloForBusiness|certificateBasedAuthentication|passkey")
} | Select-Object UserPrincipalName, MethodsRegistered, IsMfaCapable | Format-Table -AutoSize

Write-Host "`nAction: Any MFA change NOT confirmed with the user via a verified callback = treat as compromised. Revoke sessions, remove rogue methods, reset credentials." -ForegroundColor Yellow
Disconnect-MgGraph

Remediation

There is no vendor patch for this campaign — remediation is architectural and procedural. Prioritize in this order:

1. Deploy Phishing-Resistant MFA (Highest Impact)

UNC6671's AiTM proxy defeats SMS, TOTP, and push MFA. It does not defeat FIDO2/WebAuthn passkeys, Windows Hello for Business, or certificate-based authentication, because those bind the authentication to the legitimate origin domain. Migrate all users — starting with finance, executives, help desk, and IT admins — to phishing-resistant methods. In Entra ID, enforce this via Authentication Strengths in Conditional Access; in Okta, via authenticator enrollment policies requiring phishing-resistant factors for high-risk apps. This single control structurally breaks the attack chain at step 3.

2. Lock Down the Help Desk Identity-Proofing Workflow

The help desk is the pivot point. Implement and enforce:

  • Mandatory callback verification to a number on file (corporate directory, not caller-provided) before any MFA reset, device registration, or password change
  • Out-of-band manager approval for MFA method changes on privileged or finance-role accounts
  • No credential resets based solely on an inbound call or Teams/Slack message — require a second channel
  • A verbal or out-of-band duress/verification code for sensitive resets
  • Help desk audit logging with alerting on every MFA reset (wire the KQL Hunt 1 above into a Sentinel analytics rule)

3. Token and Session Controls

  • Enable Conditional Access token protection (binding sign-in sessions to the device) and Continuous Access Evaluation (CAE) so stolen session tokens are revoked faster
  • Configure sign-in frequency policies to shorten session lifetimes for high-risk SaaS apps
  • Alert on new MFA device registration, impossible travel, and sign-ins from anonymizing/VPN ASNs
  • Block legacy authentication entirely

4. Address the Personal-Phone Vector

  • Publish a clear, repeated policy: IT will never call your personal phone asking you to visit a URL, install software, or approve an MFA prompt. Vishing succeeds on ambiguity — remove it.
  • Establish a single, known internal verification channel (e.g., a published internal number or a self-service portal with a per-user verification phrase) employees can use to validate any unexpected "IT" contact.
  • Run targeted vishing simulations against financial and professional services staff — not just email phishing.

5. Remote Access Tool Governance

  • Maintain an allowlist of sanctioned RMM tools; block or alert on all others via AppLocker/WDAC and EDR custom indicators (see Sigma rule 1 and KQL Hunt 2)
  • Block execution of RMM binaries from user-writable paths (Downloads, AppData, Public)

6. If You Suspect Compromise

  1. Revoke all sessions and refresh tokens for the affected account (Revoke-MgUserSignInSession / Okta session clear) — a password reset alone does NOT kill stolen session cookies
  2. Enumerate and remove attacker-registered MFA methods and devices (use the PowerShell script above)
  3. Reset credentials and re-enroll the user on phishing-resistant MFA
  4. Audit SaaS audit logs (Unified Audit Log for M365, Google Workspace logs, Salesforce Event Monitoring) for bulk downloads, mailbox rules, forwarding, and file sharing changes during the compromise window
  5. Hunt laterally: the same vishing campaign almost certainly targeted multiple employees — check for MFA changes across the org, not just the known victim
  6. Prepare for extortion contact: preserve logs, engage IR counsel early, and do not let the attacker set the timeline

Conclusion

UNC6671's campaign is a reminder that the most consequential "vulnerability" in a SaaS-first enterprise is often an unauthenticated phone call. The group wins because it attacks the gap between identity controls and human process — personal phones that your security stack cannot see, and help desk workflows built for convenience rather than verification. Phishing-resistant MFA, hardened identity-proofing at the help desk, and identity-layer detection for MFA changes and session anomalies are not optional hardening anymore; for financial and professional services firms, they are the difference between a blocked call and an extortion letter.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.