Back to Intelligence

CaptiveCrunch (Midnight Blizzard) & UNC6671 Vishing Extortion: OTX Pulse Analysis — M365 Credential Theft Detection Pack

SA
Security Arsenal Team
August 12, 2026
9 min read

Two concurrent OTX pulses reveal a coordinated surge in identity-centric attacks against Microsoft 365 and enterprise cloud environments. The first pulse, attributed to UNC2452 (Midnight Blizzard / APT29 / Cozy Bear / Storm-2945), details the CaptiveCrunch campaign: a nation-state-grade operation that compromises captive portal networks at hotels and conference venues to intercept DNS and HTTP traffic, redirecting travelers to attacker-controlled infrastructure. The attack chain combines three delivery mechanisms — lookalike M365/OWA phishing pages, device code phishing abusing the Microsoft Entra ID authentication flow, and ClickFix-style social engineering delivering the CornFlake and ChocoShell malware families. Targeting spans the United States, India, Saudi Arabia, and the British Indian Ocean Territory — consistent with diplomatic, government, and executive travel patterns.

The second pulse tracks UNC6671, a financially motivated data-theft extortion actor that continues operating despite the alleged retirement of its BlackFile brand in May 2026. UNC6671 has diversified across extortion fronts — Redact, Pink, Helix, and Falcon — and uses vishing (voice phishing) impersonating IT helpdesk staff, calling employees on personal mobile devices and directing them to spoofed Okta/passkey enrollment portals. The operation employs adversary-in-the-middle (AiTM) techniques specifically engineered to defeat phishing-resistant MFA, followed by SaaS exfiltration and extortion. Targeted verticals span 16 industries including financial services, defense, healthcare, and telecommunications.

Collective objective: Both campaigns converge on the same prize — cloud identity. Midnight Blizzard seeks persistent espionage access to M365 tenants; UNC6671 seeks data to monetize through extortion. Defenders should treat any anomalous Entra ID device code flow, Okta enrollment event, or hotel-network credential prompt as high-fidelity signals this week.

Threat Actor / Malware Profile

UNC2452 — Midnight Blizzard (CaptiveCrunch)

  • Distribution method: Compromised captive portal infrastructure at hospitality venues. DNS responses and HTTP redirects on hotel Wi-Fi are manipulated to send victims to attacker-controlled domains (m365-owa.com, ms365-device.com, ms365-live.com, owa-ms365.com). ClickFix lures instruct victims to paste malicious commands into Run/Terminal dialogs.
  • Payload behavior: CornFlake acts as an initial-access dropper/loader staged via the ClickFix social engineering flow; ChocoShell provides a remote shell capability leveraging legitimate-looking package-management or update processes for execution cover. Both families prioritize token and credential harvesting from browser sessions and M365 authentication artifacts.
  • C2 communication: IPv4 38.146.28.75 serves as observed C2/staging infrastructure. Traffic masquerades as legitimate Microsoft service communications (TLS to lookalike ms365-* domains).
  • Persistence mechanism: Device code phishing grants durable OAuth tokens against Microsoft Entra ID — persistence survives password resets unless refresh tokens are revoked. Host-side persistence is expected via scheduled tasks or Run keys established by the ClickFix-executed stager.
  • Anti-analysis: Abuse of legitimate authentication flows (Entra ID device code) produces minimal malicious host telemetry; exploitation of CVE-2026-21509 may assist delivery or evasion. ClickFix execution shifts initial execution into user-initiated trusted processes (e.g., powershell.exe, mshta.exe), bypassing many email/web sandbox controls.

UNC6671 — Multi-Brand Vishing Extortion

  • Distribution method: Voice phishing from spoofed IT helpdesk personas, contacting employees on personal mobile devices (bypassing corporate call controls). Victims are directed to spoofed enrollment portals: oktaenroll.com, idokta.com, myoktasso.com, mypaskeysso.com, setupssopasskey.com, passkeyms.com, keyokta.com, portalpasskey.com.
  • Payload behavior: AiTM phishing proxies capture session cookies and manipulate passkey/MFA enrollment — victims are tricked into enrolling attacker-controlled passkeys or approving attacker sessions, neutralizing phishing-resistant MFA.
  • C2 communication: 79 indicators dominated by lookalike identity-provider domains proxied through AiTM infrastructure; sessions are replayed in real time against legitimate Okta/Entra endpoints.
  • Persistence mechanism: Attacker-enrolled passkeys and MFA factors provide durable account access that survives password changes.
  • Anti-analysis: No host malware required for the initial compromise — pure identity-layer attack. Post-compromise, SaaS-native exfiltration (Helix/Pink/Redact tooling) blends with legitimate admin activity, evading endpoint detection.

IOC Analysis

The indicator set spans four operational types:

  • IPv4 (38.146.28.75): CaptiveCrunch C2/staging. Operationalize at firewall, proxy, and DNS sinkhole layers. Low false-positive risk — block outright.
  • Domains (12+ lookalikes): Two thematic clusters — M365/OWA impersonation (m365-owa.com, ms365-device.com, ms365-live.com, owa-ms365.com) and Okta/passkey impersonation (oktaenroll.com, idokta.com, portalpasskey.com, etc.). Feed to DNS security (protective DNS, Pi-hole enterprise, ZTNA URL filtering) and to email/web gateways. Also register permutation monitoring — actors rotate lookalikes rapidly; hunt *okta*.com and *ms365*.com / *m365-*.com patterns not owned by Microsoft/Okta.
  • FileHash-SHA256 (2 samples): CornFlake/ChocoShell payloads. Push to EDR block lists (Defender, CrowdStrike custom IOC, SentinelOne blacklist) and retro-hunt across 90 days of process/file telemetry.
  • CVE-2026-21509: Verify exposure via vulnerability scanner; prioritize internet-facing and endpoint assets given the delivery vector.

Tooling: OTX DirectConnect/API for indicator sync; MISP or OpenCTI for enrichment and correlation; iocextract for parsing; Shodan/Censys for passive infrastructure pivots on the C2 IP; urlscan.io and VirusTotal for live detonation of the phishing domains; DNSTwist for lookalike-domain generation and monitoring.

Detection Engineering

YAML
---
title: Midnight Blizzard CaptiveCrunch ClickFix Execution Chain
id: 8f2a1c3e-7b1d-4e5f-9a6c-captivecrunch01
status: experimental
description: Detects ClickFix-style user-initiated execution of PowerShell/mshta spawning from browser or Run dialog context, consistent with CornFlake/ChocoShell delivery via compromised captive portals.
author: Security Arsenal Threat Intel
date: 2026/08/13
references:
    - https://www.zscaler.com/blogs/security-research/captivecrunch-midnight-blizzard-weaponizes-hotel-wi-fi-captive-portals
logsource:
    category: process_creation
    product: windows
detection:
    selection_parent:
        ParentImage|endswith:
            - '\explorer.exe'
            - '\chrome.exe'
            - '\msedge.exe'
            - '\firefox.exe'
    selection_child:
        Image|endswith:
            - '\powershell.exe'
            - '\pwsh.exe'
            - '\mshta.exe'
            - '\wscript.exe'
            - '\cscript.exe'
    selection_cmd:
        CommandLine|contains:
            - 'Invoke-Expression'
            - 'IEX'
            - 'DownloadString'
            - 'FromBase64String'
            - 'ms365-'
            - 'm365-owa'
            - '38.146.28.75'
    condition: selection_parent and selection_child and selection_cmd
falsepositives:
    - Rare legitimate admin scripts launched manually from Run dialog
level: high
tags:
    - attack.execution
    - attack.t1059.001
    - attack.t1204
    - attack.t1105
---
title: Microsoft 365 Lookalike Domain Network Connection
id: 9c3b2d4f-8c2e-5f6a-0b7d-captivecrunch02
status: experimental
description: Detects outbound connections to Midnight Blizzard CaptiveCrunch phishing and C2 infrastructure, including M365/OWA lookalike domains and known C2 IP 38.146.28.75.
author: Security Arsenal Threat Intel
date: 2026/08/13
logsource:
    category: network_connection
    product: windows
detection:
    selection_domain:
        DestinationHostname|contains:
            - 'm365-owa.com'
            - 'ms365-device.com'
            - 'ms365-live.com'
            - 'owa-ms365.com'
    selection_ip:
        DestinationIp:
            - '38.146.28.75'
    filter_legit:
        Initiated: 'false'
    condition: 1 of selection_* and not filter_legit
falsepositives:
    - Threat research and sandbox detonation
level: critical
tags:
    - attack.command_and_control
    - attack.t1071.001
    - attack.t1566
---
title: UNC6671 Okta and Passkey Lookalike Domain Access
id: 0d4c3e5a-9d3f-6a7b-1c8e-unc6671vik03
status: experimental
description: Detects DNS or web proxy requests to UNC6671 vishing/AiTM spoofed Okta and passkey enrollment portals used in helpdesk impersonation campaigns.
author: Security Arsenal Threat Intel
date: 2026/08/13
references:
    - https://cloud.google.com/blog/topics/threat-intelligence/unc6671-targets-financial-services-and-enterprise-cloud-environments
logsource:
    category: dns
    product: windows
detection:
    selection:
        QueryName|contains:
            - 'oktaenroll.com'
            - 'idokta.com'
            - 'myoktasso.com'
            - 'mypasskeysso.com'
            - 'setupssopasskey.com'
            - 'passkeyms.com'
            - 'keyokta.com'
            - 'portalpasskey.com'
    condition: selection
falsepositives:
    - Security researcher lookups
level: critical
tags:
    - attack.credential_access
    - attack.t1566.004
    - attack.t1557
    - attack.t1078
KQL — Microsoft Sentinel / Defender
// Security Arsenal — CaptiveCrunch + UNC6671 Unified Hunt (Microsoft Sentinel)
// Hunt 1: Network connections to known phishing/C2 infrastructure
let PhishDomains = dynamic(["m365-owa.com","ms365-device.com","ms365-live.com","owa-ms365.com",
    "oktaenroll.com","idokta.com","myoktasso.com","mypaskeysso.com","setupssopasskey.com",
    "passkeyms.com","keyokta.com","portalpasskey.com"]);
let NetworkHits = DeviceNetworkEvents
| where TimeGenerated > ago(14d)
| where RemoteUrl has_any (PhishDomains) or RemoteIP == "38.146.28.75"
| project NetworkTime=TimeGenerated, DeviceName, InitiatingProcessFileName,
    InitiatingProcessCommandLine, RemoteIP, RemoteUrl, ActionType;
// Hunt 2: ClickFix-style process chains (browser/explorer spawning script interpreters)
let ClickFixProcs = DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where InitiatingProcessFileName in~ ("explorer.exe","chrome.exe","msedge.exe","firefox.exe")
| where FileName in~ ("powershell.exe","pwsh.exe","mshta.exe","wscript.exe","cscript.exe")
| where ProcessCommandLine has_any ("IEX","Invoke-Expression","DownloadString","FromBase64String")
| project ProcTime=TimeGenerated, DeviceName, FileName, ProcessCommandLine,
    InitiatingProcessFileName, SHA256, AccountName;
// Hunt 3: Known CornFlake/ChocoShell payload hashes
let HashHits = DeviceProcessEvents
| where TimeGenerated > ago(30d)
| where SHA256 in ("918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593",
    "be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c")
| project HashTime=TimeGenerated, DeviceName, FileName, FolderPath, SHA256;
union NetworkHits, ClickFixProcs, HashHits
| sort by DeviceName
PowerShell
# Security Arsenal — CaptiveCrunch / CornFlake / ChocoShell Host IOC Hunt
# Run via EDR remote shell or as administrative script across endpoints

$Report = @()

# 1. Known payload hashes
$Hashes = @(
    '918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593',
    'be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c'
)

# 2. Suspicious persistence — Run keys with script interpreters or odd paths
$RunKeys = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',
    'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
)
foreach ($Key in $RunKeys) {
    if (Test-Path $Key) {
        Get-ItemProperty $Key | ForEach-Object {
            $_.PSObject.Properties | Where-Object {
                $_.Value -match 'powershell|mshta|wscript|cscript|AppData|Temp' -and
                $_.Name -notmatch '^PS'
            } | ForEach-Object {
                $Report += [PSCustomObject]@{Type='RunKey'; Path=$Key; Name=$_.Name; Value=$_.Value}
            }
        }
    }
}

# 3. Scheduled tasks executing script interpreters (ClickFix persistence)
Get-ScheduledTask | Where-Object {
    $_.Actions.Execute -match 'powershell|mshta|wscript|cscript'
} | ForEach-Object {
    $Report += [PSCustomObject]@{Type='ScheduledTask'; Path=$_.TaskPath;
        Name=$_.TaskName; Value=($_.Actions.Execute + ' ' + $_.Actions.Arguments)}
}

# 4. Active/recent connections to C2 IP
Get-NetTCPConnection | Where-Object { $_.RemoteAddress -eq '38.146.28.75' } | ForEach-Object {
    $Proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
    $Report += [PSCustomObject]@{Type='NetworkC2'; Path=$Proc.Path;
        Name=$Proc.ProcessName; Value="$($_.RemoteAddress):$($_.RemotePort) [$($_.State)]"}
}

# 5. Hash-sweep common staging directories
$ScanPaths = @("$env:TEMP", "$env:APPDATA", "$env:LOCALAPPDATA\Temp", "$env:PUBLIC\Downloads")
foreach ($Dir in $ScanPaths) {
    if (Test-Path $Dir) {
        Get-ChildItem $Dir -Recurse -File -ErrorAction SilentlyContinue |
            Where-Object { $_.Length -lt 50MB } | ForEach-Object {
            $H = (Get-FileHash $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash
            if ($Hashes -contains $H) {
                $Report += [PSCustomObject]@{Type='HashMatch'; Path=$_.FullName; Name=$_.Name; Value=$H}
            }
        }
    }
}

# 6. DNS cache check for lookalike domains
$BadDomains = 'm365-owa|ms365-device|ms365-live|owa-ms365|oktaenroll|idokta|myoktasso|mypaskeysso|setupssopasskey|passkeyms|keyokta|portalpasskey'
Get-DnsClientCache | Where-Object { $_.Entry -match $BadDomains } | ForEach-Object {
    $Report += [PSCustomObject]@{Type='DNSCache'; Path=''; Name=$_.Entry; Value=$_.Data}
}

if ($Report.Count -gt 0) {
    $Report | Format-Table -AutoSize
    $Report | Export-Csv -Path "$env:TEMP\arsenal_captivecrunch_hunt.csv" -NoTypeInformation
    Write-Host "[!] $($Report.Count) suspicious artifacts found — escalate to IR" -ForegroundColor Red
} else {
    Write-Host "[+] No CaptiveCrunch/UNC6671 host artifacts detected" -ForegroundColor Green
}

Response Priorities

Immediate (0-4 hours):

  • Block 38.146.28.75 at perimeter firewall, proxy, and EDR network controls; sinkhole all 12 lookalike domains at protective DNS.
  • Push both SHA256 hashes to EDR block lists; retro-hunt 90 days for execution artifacts.
  • Deploy the Sigma rules and Sentinel KQL queries above; alert at high/critical severity.
  • Search proxy/DNS logs for any historical resolution of the phishing domains — each hit is a probable compromised identity.

24 hours:

  • For any user with a confirmed hit: revoke all Entra ID refresh tokens and active sessions (device code phishing persistence survives password resets), force password reset, and re-register MFA.
  • Audit Entra ID sign-in logs for anomalous device code flow authentications and new device enrollments; audit Okta system log for unexpected passkey/MFA factor enrollments (UNC6671's persistence vector).
  • Audit hotel/conference-traveling executives and finance staff specifically — both campaigns target them.
  • Issue an all-hands advisory: IT helpdesk will never call personal mobile numbers or request passkey enrollment at external URLs.

1 week:

  • Architecture hardening: Enforce Conditional Access policies blocking device code flow where not operationally required; require compliant-device conditions for M365 access; deploy FIDO2-only policies with attestation to prevent rogue passkey enrollment.
  • Stand up lookalike-domain monitoring (DNSTwist/permutation feeds) for your own IdP and SSO brand names — UNC6671 rotates fronts rapidly.
  • Restrict ClickFix execution surface: block mshta and script interpreters from spawning from browsers via WDAC/AppLocker rules.
  • Add captive-portal travel guidance: mandate VPN-on-untrusted-Wi-Fi for all mobile users, and brief traveling staff on the CaptiveCrunch social engineering pattern.
  • Patch or mitigate CVE-2026-21509 across the endpoint estate.

Related Resources

Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub

Is your security operations ready?

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