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.75serves as observed C2/staging infrastructure. Traffic masquerades as legitimate Microsoft service communications (TLS to lookalikems365-*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*.comand*ms365*.com/*m365-*.compatterns 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
---
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
// 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
# 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.75at 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
mshtaand 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.