Flax Typhoon / Integrity Technology Group: Microscan and FishHub Seizure Hunt
Executive Summary
On 2026-10-08 the US Justice Department and FBI announced court-authorized seizures of the domains behind two hacking tools, Microscan (internet-wide vulnerability scanning) and FishHub (spear phishing and follow-on malware delivery). The DOJ release says the tools were operated and used by actors working for Integrity Technology Group, a company based in the People's Republic of China with PRC government contracts, and that the actors are associated with Flax Typhoon. The same day the FBI, CISA, NSA and partner agencies published joint advisory AA26-281A, and CISA added five CVEs to the Known Exploited Vulnerabilities catalog with a federal due date of 2026-10-11.
The advisory describes a repeatable pipeline: scan with Microscan and open-source scanners, exploit internet-facing software (ProFTPD, ONLYOFFICE Docs, Strapi, Apache Struts, ISC BIND, plus three older KEV entries), run EBurst password spraying and XSS credential harvesting against Microsoft Exchange and Microsoft 365, persist with renamed SoftEther VPN clients (conhost.exe, dllhost.exe), and steal mail with Curlc4 and office-cli. Confirmed Microscan targets include a South Carolina power company, Japanese and Polish airports, Taiwanese gas and power companies and a multinational NGO. FishHub victims include about 20 Taiwanese universities.
What this pack can and cannot do. The six domains named by the DOJ (and a seventh reported by the Hacker News and found in the advisory) are now seized, so DNS and network hits are retrospective evidence of past contact, not live C2. Falcon sees the Exchange and Linux server process chains, Windows endpoint execution of the FishHub-style payload, failed-logon fan-out on Windows and domain controllers, and file hashes. Falcon does not see Microsoft 365 / Entra sign-ins, Exchange IIS logs, web-shell file writes in script languages, the spear-phishing email itself, or a crash of a BIND DNS server. Those are listed as gaps in Section 15 and covered with native hunts in Section 7 where a native log exists.
IOC posture. All 33 indicators ship as detect. No indicator is corroborated by two independent saved sources in a form that would justify prevent, the domains are already seized, and several are legitimate software (SoftEther) or public tools. See Section 10.
Defender priority: patch or isolate any internet-facing ProFTPD, ONLYOFFICE Docs, Strapi, Apache Struts or BIND instance now (KEV due date 2026-10-11), review Exchange and Microsoft 365 for password spraying across many accounts, and run Q1 to Q3 and Q11 over 90 to 180 days of history to find past contact.
Source Review & Web Hunter Notes
Eight source snapshots were saved verbatim (page text) to FlaxTyphoon-IntegrityTech-Microscan-Hunt-sources/ and every indicator in Section 10 traces to one of them. Tier 1 sources are US government publications.
| # | Tier | Source | Key finding | Carry forward |
|---|---|---|---|---|
| 1 | 1 | DOJ Office of Public Affairs press release 26-1155 (2026-10-08) | Names Microscan, FishHub, Integrity Tech, Flax Typhoon; lists six seized domains; 200,000+ device Mirai-variant botnet (2024 action); victims | yes |
| 2 | 1 | CISA KEV catalog JSON feed, release 2026.10.08 (five entries extracted) | All five CVEs added 2026-10-08, due date 2026-10-11, BOD 26-04 required action | yes |
| 3 | 1 | CISA / FBI / NSA joint advisory AA26-281A (2026-10-08) | Full TTPs: Microscan, EBurst, XSS, SoftEther, Curlc4, office-cli, DC.exe; IOC appendix (domains, IPs, hashes); eight exploited CVEs | yes (primary IOC source) |
| 4 | 2 | The Hacker News, "Flax Typhoon Exploits Five Flaws" (2026-10-09) | Five CVE descriptions and CVSS; three older KEV CVEs; federal deadline | yes |
| 5 | 2 | The Hacker News, "FBI Seizes 7 Domains" (2026-10-09) | Lists seven seized domains (adds 98aiblog.com); aliases Ethereal Panda and RedJuliett; two IP addresses from court documents | partial (single source for the two IPs) |
| 6 | 2 | CyberScoop | Corroborates tool names, victims and the joint advisory | partial |
| 7 | 2 | The Record | Corroborates tools, victims and EBurst use against Exchange | partial |
| 8 | 3 | gblock.app analysis of the advisory | Restates advisory detail; only used to corroborate 98aiblog.com and natcloudservice.com | partial, not independent of source 3 |
Decisions and discrepancies
- Six or seven seized domains. The DOJ release (source 1) names six. The Hacker News (source 5) names seven, adding
98aiblog.com. CISA AA26-281A (source 3) independently lists98aiblog.comas a SoftEther hosting domain. The seventh domain is therefore shipped, labelled as not named in the DOJ release. - Directive number. The requested brief referred to BOD 22-01. The CISA KEV feed entries (source 2) cite BOD 26-04, so this pack uses BOD 26-04.
- Botnet size. The DOJ release says more than 200,000 devices (September 2024 action). The larger figures (1.2 million database records, about 260,000 active devices as of 2024-06-05) come from the Hacker News and The Record reporting of court documents and are secondary only. They are not used in any detection.
- Not usable. BleepingComputer returned only a summary through the fetch tool and SecurityWeek returned HTTP 403, so neither was snapshotted or cited. The USAO-WDPA copy of the DOJ release returned no content. No fetched page contained instructions aimed at the analyst.
- Hashes were not taken from summaries. Every hash in this pack was read from the raw AA26-281A page text (snapshot 3), not from an AI-generated page summary.
Hunt Brief & Attack Chain
Hypothesis: an Integrity Tech-enabled operator scanned the environment with Microscan or an open-source scanner, then obtained a foothold through one of the KEV-listed internet-facing products or through password spraying and XSS against Exchange and Microsoft 365. After that, the operator persisted with a renamed SoftEther client, collected credentials (including DCSync), and exfiltrated mail.
| Step | Behavior | Telemetry (plain terms, then platforms) | Hunt angle |
|---|---|---|---|
| 1 Recon | Microscan and open-source scanners probe ports 21, 22, 53, 80, 443, 1080 | Perimeter and web server logs (outside endpoint telemetry). Scanner tools run from a victim host: process creation with command line (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q14; native firewall and web log review (Section 7) |
| 2 Initial access, products | Exploitation of ProFTPD, ONLYOFFICE Docs, Strapi, Struts, BIND (and Bash, Pulse Secure, GitLab) | Web and FTP server logs (outside endpoint telemetry). Child processes of the service on Linux and Windows (process creation with parent name) | Q5, Q6, Q7 |
| 3 Initial access, identity | EBurst password spraying against ten Exchange interfaces; XSS credential harvest | Failed logon events on the Exchange server (CrowdStrike: UserLogonFailed2. Defender: DeviceLogonEvents). Domain controller authentication failures (CrowdStrike Falcon Identity: ActiveDirectoryAuthenticationFailure). Entra sign-in logs and IIS logs (outside endpoint telemetry) | Q8, Q9; native hunts |
| 4 Execution | Web shells under IIS (w3wp.exe parent); XSS-delivered live700_v1.exe launches DiagTrack.exe | Process creation with parent name and image path | Q4, Q10, Q11 |
| 5 Persistence | Renamed SoftEther VPN client as conhost.exe or dllhost.exe, auto-reconnect | Process creation with image path; outbound connection with owning process (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Q10, Q12, Q2 |
| 6 Credential access | DC.exe performs DCSync over RPC replication | Domain controller directory-replication audit events (Windows Security 4662, outside endpoint telemetry); Falcon Identity Protection native detection | Q11 for the hash; Section 7 for 4662 |
| 7 Collection and exfiltration | Curlc4 (PHP, EWS API), office-cli (Linux, Outlook 365 client credentials), RC4 or AES-128-CBC archives, files renamed 001.gif, Css.js, Include.png, M2k.js | Process creation with command line; DNS lookup with requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); Entra audit logs for app secrets | Q2, Q3, Q11, Q13 |
Exploited CVEs (AA26-281A Table 16)
| CVE | Product | CVSS | Weakness | KEV |
|---|---|---|---|---|
| CVE-2015-3306 | ProFTPD (affected 1.3.5), mod_copy SITE CPFR / CPTO | 10.0 | Improper access control: arbitrary file read and write | Added 2026-10-08, due 2026-10-11 |
| CVE-2021-3199 | ONLYOFFICE Docs / DocumentServer (5.1.5 through 5.6.2) | 9.8 | Path traversal with JWT via an image upload parameter, RCE | Added 2026-10-08, due 2026-10-11 |
| CVE-2023-22894 | Strapi (up to 4.5.5), end-of-life | 7.2 | Cleartext storage; admin panel query filter; chains with CVE-2023-22621 to RCE | Added 2026-10-08, due 2026-10-11 |
| CVE-2016-3081 | Apache Struts (2.3.19 to 2.3.28 ranges) | 8.1 | Command injection via method:prefix with Dynamic Method Invocation | Added 2026-10-08, due 2026-10-11 |
| CVE-2015-5477 | ISC BIND 9.x (before 9.9.7-P2, 9.10.x before 9.10.2-P3) | 7.5 | Reachable assertion via TKEY queries: denial of service | Added 2026-10-08, due 2026-10-11 |
| CVE-2014-6278, CVE-2019-11510, CVE-2021-22205 | GNU Bash (Shellshock), Pulse Connect Secure, GitLab | n/a | Also exploited per AA26-281A; already in KEV before this action | Earlier KEV entries |
Hunt hypotheses (ordered by fidelity)
- Known hash or masquerade of the FishHub-style payload, SoftEther copies, office-cli or dc.exe is present (Q10, Q11). Confidence high.
- An Exchange IIS worker process spawned a shell or recon tool (Q4). Confidence high, medium FP.
- conhost.exe or dllhost.exe holds external connections (Q12). Confidence medium.
- A Struts, Node, ONLYOFFICE or PHP service spawned a shell (Q5, Q6). Confidence medium.
- One source address failed logons across ten or more accounts (Q8, Q9). Confidence medium.
- Past contact with the seized or advisory-listed infrastructure (Q1 to Q3). Retrospective, confidence varies by indicator.
- Curlc4 artifacts or scanning tools on a Linux or server host (Q13, Q14). Confidence medium.
Consolidated IOC Table
33 atomic indicators (21 domains, 3 IPv4, 9 SHA-256). The advisory warns that several indicators date back to 2016 and should be vetted before blocking. All are detect, expiry 2027-04-10. Sources in the last-but-one column use the numbering from Section 2.
| Type | Value | Confidence | Action | Context | Sources | Expiry |
|---|---|---|---|---|---|---|
| domain | c0cc[.]cc | HIGH | detect | Flax Typhoon Microscan access domain, seized 2026-10-08 | DOJ release (1); Hacker News (5) | 2027-04-10 |
| domain | 98aicai[.]com | HIGH | detect | Flax Typhoon FishHub malware delivery domain, seized 2026-10-08 | DOJ release (1); Hacker News (5) | 2027-04-10 |
| domain | 98aicode[.]com | HIGH | detect | Flax Typhoon FishHub malware delivery domain, seized 2026-10-08 | DOJ release (1); Hacker News (5) | 2027-04-10 |
| domain | outlook3650[.]com | HIGH | detect | Flax Typhoon FishHub delivery domain, Outlook/Microsoft 365 brand lookalike, seized 2026-10-08 | DOJ release (1); Hacker News (5) | 2027-04-10 |
| domain | youtubecard[.]com | HIGH | detect | Flax Typhoon FishHub delivery domain, YouTube brand lookalike, seized 2026-10-08 | DOJ release (1); Hacker News (5) | 2027-04-10 |
| domain | linkedinns[.]net | HIGH | detect | Flax Typhoon FishHub delivery domain, LinkedIn brand lookalike, seized 2026-10-08 | DOJ release (1); Hacker News (5) | 2027-04-10 |
| domain | 98aiblog[.]com | HIGH | detect | Flax Typhoon SoftEther hosting domain, named in AA26-281A; reported as seventh seized domain by Hacker News only (not in DOJ release) | CISA AA26-281A (3); Hacker News (5); gblock (8) | 2027-04-10 |
| domain | natcloudservice[.]com | MEDIUM | detect | Flax Typhoon Curlc4 mail-theft bot main C2 domain | CISA AA26-281A (3); gblock (8) | 2027-04-10 |
| domain | upl[.]natcloudservice[.]com | MEDIUM | detect | Flax Typhoon Curlc4 download and upload host | CISA AA26-281A (3) | 2027-04-10 |
| domain | dns[.]studiocloud[.]xyz | MEDIUM | detect | Flax Typhoon DiagTrack.exe encrypted HTTP C2 attributed to Integrity Tech by the FBI | CISA AA26-281A (3) | 2027-04-10 |
| domain | studiocloud[.]xyz | MEDIUM | detect | Flax Typhoon infrastructure parent domain (AA26-281A Table 12) | CISA AA26-281A (3) | 2027-04-10 |
| domain | 96cee[.]com | MEDIUM | detect | Flax Typhoon infrastructure domain (AA26-281A Table 12) | CISA AA26-281A (3) | 2027-04-10 |
| domain | javacheck[.]ooguy[.]com | MEDIUM | detect | Flax Typhoon SoftEther VPN host | CISA AA26-281A (3) | 2027-04-10 |
| domain | javaupdate[.]giize[.]com | MEDIUM | detect | Flax Typhoon SoftEther VPN host | CISA AA26-281A (3) | 2027-04-10 |
| domain | pw[.]sexytube0[.]com | MEDIUM | detect | Flax Typhoon SoftEther VPN host | CISA AA26-281A (3) | 2027-04-10 |
| domain | ximmd[.]sexytube0[.]com | MEDIUM | detect | Flax Typhoon SoftEther VPN host | CISA AA26-281A (3) | 2027-04-10 |
| domain | hmbcloud[.]net | MEDIUM | detect | Flax Typhoon SoftEther VPN hosting domain | CISA AA26-281A (3) | 2027-04-10 |
| domain | hmbcloud[.]com | MEDIUM | detect | Flax Typhoon SoftEther VPN hosting domain | CISA AA26-281A (3) | 2027-04-10 |
| domain | hmbiplc-01[.]com | MEDIUM | detect | Flax Typhoon SoftEther VPN hosting domain | CISA AA26-281A (3) | 2027-04-10 |
| domain | asean[.]twimg[.]co[.]uk | MEDIUM | detect | Flax Typhoon SoftEther VPN host (twimg.co.uk is a lookalike; the legitimate CDN is twimg.com) | CISA AA26-281A (3) | 2027-04-10 |
| domain | bsnl[.]twimg[.]co[.]uk | MEDIUM | detect | Flax Typhoon SoftEther VPN host | CISA AA26-281A (3) | 2027-04-10 |
| ipv4 | 149.28.132[.]137 | MEDIUM | detect | Flax Typhoon Curlc4 download host (upl.natcloudservice.com) | CISA AA26-281A (3) | 2027-04-10 |
| ipv4 | 202.182.109[.]151 | MEDIUM | detect | Flax Typhoon botnet database server (court documents as reported) | Hacker News (5) | 2027-04-10 |
| ipv4 | 198.13.53[.]226 | MEDIUM | detect | Flax Typhoon Microscan original host (court documents as reported) | Hacker News (5) | 2027-04-10 |
| sha256 | c4503db6ece93eddf4511e787607cb14606a1df9f526f1e39992497119437cec | MEDIUM | detect | Flax Typhoon live700_v1.exe XSS-delivered payload | CISA AA26-281A (3) | 2027-04-10 |
| sha256 | 804a53be802378a8ec4c94602fd3d6584e0d472d83148e8a42c731950fec415d | MEDIUM | detect | Flax Typhoon DiagTrack.exe masquerading C2 implant | CISA AA26-281A (3) | 2027-04-10 |
| sha256 | add7dd142e4f7e2873bc8f7b7fb6308063608e0b49a773dea93abad4047f1489 | MEDIUM | detect | Flax Typhoon office-cli Linux Outlook 365 mail exfiltration tool | CISA AA26-281A (3) | 2027-04-10 |
| sha256 | 9dc85f9569a15eaf51c7d34254767ea30dd67b2178cec4cc7125288b9544fe00 | MEDIUM | detect | Flax Typhoon dc.exe DCSync tool | CISA AA26-281A (3) | 2027-04-10 |
| sha256 | b1552703ff0035f197c22cdb3a514bb6aa45ec98de3ef5409faab0978f18c35e | MEDIUM | detect | Flax Typhoon renamed SoftEther client saved as conhost.exe (legitimate VPN software) | CISA AA26-281A (3) | 2027-04-10 |
| sha256 | 8a592e22c51311d482272ec5aba0103c9cd0cfd78e5b5ba75dfa8f1c56926672 | MEDIUM | detect | Flax Typhoon renamed SoftEther client saved as dllhost.exe (legitimate VPN software) | CISA AA26-281A (3) | 2027-04-10 |
| sha256 | 86f1cfa6a2e0a8cb6fc1fbee28472308e6467932f8658a6a4885e29ed8c34a67 | MEDIUM | detect | Flax Typhoon renamed SoftEther client saved as dllhost.exe, second build (legitimate VPN software) | CISA AA26-281A (3) | 2027-04-10 |
| sha256 | 7b9efc7ef8957411cdd22582ce4bfb3a5f76d9c91cdb7e36bf85c9785a2480e9 | MEDIUM | detect | Flax Typhoon fscan.exe scanner (public open-source tool) | CISA AA26-281A (3) | 2027-04-10 |
| sha256 | e7e727458f573dded05537baddac2867d2801db1c3c74410398d063dfd6f6575 | MEDIUM | detect | Flax Typhoon JuicyPotato.exe privilege escalation (public open-source tool) | CISA AA26-281A (3) | 2027-04-10 |
Affected Surface & Telemetry Matrix
| Surface | Required telemetry (plain terms, then platforms) | Priority | Gap risk |
|---|---|---|---|
| Windows Exchange Server (IIS, OWA/ECP/EWS) | Process creation with parent name (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); failed logon events (CrowdStrike: UserLogonFailed2. Defender: DeviceLogonEvents) | High | IIS access logs and Exchange protocol logs are outside endpoint telemetry. A sensor on the server is required. |
| Linux servers running ProFTPD, ONLYOFFICE Docs, Strapi, Struts/Tomcat, BIND | Linux process creation with parent name (same sources, Linux sensor) | High | Many of these run on appliances, containers or hosts with no endpoint sensor. Script-language file writes (PHP, JSP) are not typed as file-write events. A BIND crash (CVE-2015-5477 is denial of service) is outside endpoint telemetry. |
| Windows endpoints (FishHub payload, SoftEther) | Process creation with image path; outbound connection with owning process (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); DNS lookup with requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents) | Medium | Spear-phishing email delivery and the XSS page are outside endpoint telemetry. Only the payload that lands is visible. |
| Domain controllers | Authentication failures and directory replication (CrowdStrike Falcon Identity Protection; Windows Security log 4625, 4662) | Medium | Requires the Identity Protection module or forwarded Security logs. |
| Microsoft 365 / Entra | Sign-in and audit logs (Entra ID, Unified Audit Log) | High | Entirely outside endpoint telemetry. This pack gives native hunts only, no Falcon query. |
| Network perimeter, web proxies, DNS resolvers | Firewall, proxy and resolver logs | Medium | Outside endpoint telemetry. Required to see Microscan scanning of your external addresses. |
ATT&CK Mapping
Technique IDs below are the ones AA26-281A cites, except T1190, T1566.002, T1505.003 and T1572, which are analyst mappings from the described behavior (marked *).
| Tactic | Technique | Observed behavior | Query or control |
|---|---|---|---|
| Reconnaissance | T1595.002 Vulnerability Scanning | Microscan, Fscan, masscan, NMAP, dirsearch, wpscan | Q3, Q14 |
| Initial Access | T1190* Exploit Public-Facing Application | Five KEV CVEs plus Bash, Pulse Secure, GitLab | Q5, Q6, Q7; Section 12 patching |
| Initial Access | T1566.002* Spearphishing Link | FishHub delivery domains (DOJ) | Q1, Q10 |
| Initial Access | T1189 Drive-by Compromise | XSS payload harvesting credentials and offering a zip | Section 7 web log review |
| Credential Access | T1110.001 / T1110.003 Password Guessing / Spraying | EBurst against ten Exchange interfaces | Q8, Q9; Section 7 |
| Credential Access | T1003.006 DCSync | DC.exe over RPC replication | Q11 (hash); Section 7 |
| Execution | T1059.001 / .004 / .006 / .007 | PowerShell SoftEther install, Unix shell office-cli, Python and Go exploit tools, JavaScript XSS | Q4, Q5, Q6, Q13 |
| Persistence | T1133 External Remote Services | SoftEther VPN client with auto-reconnect | Q2, Q10, Q12 |
| Persistence | T1505.003* Web Shell | b374.php, back.pl, error.jsp, file_back.aspx, gf.phtml, yaml-payload.jar | Q4, Q6; Section 7 |
| Defense Evasion | T1036.003 Rename System Utilities | conhost.exe, dllhost.exe, DiagTrack.exe | Q10, Q12 |
| Command and Control | T1572* Protocol Tunneling | SoftEther tunnel | Q12 |
| Collection | T1114.002 Remote Email Collection; T1074.001 Local Data Staging | Curlc4 (EWS API), office-cli (Outlook 365) | Q13; Section 7 Entra hunts |
| Exfiltration | T1020 Automated Exfiltration; T1560.003 Archive via Custom Method | RC4 or AES-128-CBC archives uploaded to attacker servers | Q2, Q3, Q13 |
Native Audit-Log Hunts
These checks use logs Falcon does not hold. Each is a plain-language recipe: translate it into your SIEM or run it in the product console.
| # | Log source | What to look for | Why |
|---|---|---|---|
| N1 | Entra ID sign-in logs | Group failed sign-ins (error 50126 invalid credentials) by source IP address; flag any address with failures across ten or more distinct users in 24 hours, especially followed by a success from the same address. | EBurst and password spraying against Microsoft 365 (T1110.003) |
| N2 | Microsoft 365 Unified Audit Log and Entra audit log | New app registrations or service principals, new client secrets, and mailbox access by an application using client credentials that you do not recognize. | office-cli uses client_id, tenant_id and secret configuration files to read Outlook 365 mail |
| N3 | Exchange IIS logs (W3SVC) | Many 401 responses from one client address across /owa, /ecp, /EWS, /Autodiscover, /Microsoft-Server-ActiveSync, /mapi, /rpc and /PowerShell. Also any new .aspx, .php, .jsp or .phtml file under the Exchange web directories. | The advisory tells defenders to include all ten EBurst interfaces |
| N4 | Domain controller Security log | Event 4662 with directory-replication rights (DS-Replication-Get-Changes) from an account that is not a domain controller. | DC.exe performs DCSync (T1003.006) |
| N5 | Web server and application logs (Struts, ONLYOFFICE, Strapi, ProFTPD) | Struts requests containing method: parameters; ONLYOFFICE image-upload parameters containing a path-traversal sequence; Strapi admin-panel filter queries; ProFTPD SITE CPFR and SITE CPTO commands from external addresses. | The five KEV CVEs; the exact request shapes are in the KEV descriptions |
| N6 | File-system search on Linux and web roots | Files named curlc4.txt, b374.php, back.pl, error.jsp, gf.phtml, yaml-payload.jar; the file /var/tmp/.sess.zip; a storage/fm directory; files named 001.gif, Css.js, Include.png or M2k.js that are not images or scripts. | Names from AA26-281A. Falcon does not type script-file writes, so this is a file-system check. |
| N7 | Email gateway | Links to the lookalike domains outlook3650.com, youtubecard.com and linkedinns.net in delivered mail, retrospectively. | FishHub delivery is by spear phishing. The domains are seized, so this finds past delivery. |
| N8 | Firewall and proxy logs | Inbound scanning of ports 21, 22, 53, 80, 443 and 1080 from many addresses; outbound connections to the Section 4 addresses. | Microscan reconnaissance and retrospective contact |
Hunt Queries: CrowdStrike CQL and SentinelOne PowerQuery
Use your tenant's own address. SentinelOne does not document a link that pre-fills a query, so each "Copy & open SentinelOne" button copies the query and opens this console: paste it into PowerQuery.
Queries Q1 to Q3 and Q11 are retrospective. "Open in Falcon" opens a 7 day window; widen it in the Falcon time picker to 90 to 180 days before reading the result. Hits on seized domains mean contact before the takedown, not current C2.
Looks for: DNS lookups, by any process, for the seven domains tied to Microscan, FishHub and the SoftEther hosting seen by the FBI. The domains were seized on 2026-10-08, so a hit means the endpoint talked to Integrity Tech infrastructure before the takedown. This is a historical-hit hunt, not live C2 detection. Set a 90 day or longer window in the Falcon time picker.
Known limitations and deployment notes
- PowerQuery: If the tenant populates dns.request instead of event.dns.request, this hunt returns nothing until the field name is swapped.
- PowerQuery assumes: On a DNS Resolved event the requesting process is src.process.*.
- PowerQuery assumes: The queried name is held in event.dns.request; the vendor docs also name dns.request, so run the readiness test to see which is populated.
- PowerQuery assumes: matches is case-insensitive by default, matching the CQL /i flag; [.] stands for a literal dot.
// HUNT: Retrospective DNS lookups of the seized Integrity Tech domains // MITRE: T1566.002 | T1568 | T1071.004 // CONF: high FP: low COST: low | REQUIRES: DNS request telemetry with the requesting process (Falcon: DnsRequest) // LOOKBACK: 90d or longer, set in the Falcon time picker. Seized 2026-10-08, so hits are HISTORICAL. // FALSE POSITIVES: researchers, sandboxes or threat-intel feeds resolving the seized names #event_simpleName=DnsRequest | DomainName=/(^|\.)(c0cc\.cc|98aicai\.com|98aicode\.com|98aiblog\.com|outlook3650\.com|youtubecard\.com|linkedinns\.net)$/i | groupBy([aid, ComputerName, DomainName, ContextBaseFileName], function=[count(as=lookups), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen)], limit=max) | sort(firstSeen, order=asc)
3 required fields · View requirements
Required telemetry
- SentinelOne EDR DNS Resolved events
Required fields
event.type: Event typeevent.dns.request: Queried namesrc.process.name: Requesting process
Recommended fields
event.time: Event timeendpoint.name: Host name
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'DNS Resolved' event.dns.request = * | limit 5 | columns event.time, endpoint.name, event.type, event.dns.request, src.process.name
// HUNT: Retrospective DNS lookups of the seized Integrity Tech domains // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1566.002, T1568, T1071.004 // CONF: high | FP: low // FALSE POSITIVES: researchers, sandboxes or threat-intel feeds resolving the seized names // EQUIVALENCE: equivalent-with-schema-assumptions - Same anchored domain-suffix match on process-attributed DNS lookups, aggregated per host, domain and process. // REQUIRES: SentinelOne EDR DNS Resolved telemetry with the requesting process // TUNING: Review each hit by firstSeen. The names were seized on 2026-10-08, so a hit is historical; researchers, sandboxes and threat-intel feeds also resolve them. // LOOKBACK: 90d or longer; set with the console time picker or the query window // CONFIGURATION: No custom detection rule or lookup table is required to run the hunt. // KNOWN GAPS: If the tenant populates dns.request instead of event.dns.request, this hunt returns nothing until the field name is swapped. // VALIDATION LEVEL: static-reviewed event.type = 'DNS Resolved' event.dns.request matches '(^|[.])(c0cc[.]cc|98aicai[.]com|98aicode[.]com|98aiblog[.]com|outlook3650[.]com|youtubecard[.]com|linkedinns[.]net)$' | group lookups = count(), first_seen = min(event.time), last_seen = max(event.time) by endpoint.name, event.dns.request, src.process.name | sort +first_seen | limit 200
Looks for: DNS lookups for the infrastructure domains named in AA26-281A: the Curlc4 mail-theft C2, the DiagTrack.exe C2 parent domain, and the SoftEther VPN hosts used for persistence. Domain-level match, so any subdomain hits.
FP: the advisory warns that some indicators date back to 2016 and should be vetted before action. Domains that expired and were re-registered by unrelated parties can match. Review hits by first-seen date and requesting process before escalating.
Known limitations and deployment notes
- PowerQuery: If the tenant populates dns.request instead of event.dns.request, this hunt returns nothing until the field name is swapped.
- PowerQuery assumes: On a DNS Resolved event the requesting process is src.process.*.
- PowerQuery assumes: The queried name is held in event.dns.request; the vendor docs also name dns.request, so run the readiness test to see which is populated.
- PowerQuery assumes: matches is case-insensitive by default, matching the CQL /i flag; [.] stands for a literal dot.
// HUNT: Retrospective DNS lookups of AA26-281A C2 and SoftEther host domains // MITRE: T1071.001 | T1133 | T1568 // CONF: medium FP: medium COST: low | REQUIRES: DNS request telemetry with the requesting process (Falcon: DnsRequest) // LOOKBACK: 180d or longer, set in the Falcon time picker. Treat hits as HISTORICAL leads. // FALSE POSITIVES: re-registered or reused domains; AA26-281A says some indicators date to 2016 // TUNING: review each hit by firstSeen and ContextBaseFileName; a browser lookup of a lapsed domain is weaker than conhost.exe, dllhost.exe or a scripting host resolving it #event_simpleName=DnsRequest | DomainName=/(^|\.)(natcloudservice\.com|studiocloud\.xyz|96cee\.com|hmbcloud\.(com|net)|hmbiplc-01\.com|javacheck\.ooguy\.com|javaupdate\.giize\.com|sexytube0\.com|twimg\.co\.uk)$/i | groupBy([aid, ComputerName, DomainName, ContextBaseFileName], function=[count(as=lookups), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen)], limit=max) | sort(firstSeen, order=asc)
3 required fields · View requirements
Required telemetry
- SentinelOne EDR DNS Resolved events
Required fields
event.type: Event typeevent.dns.request: Queried namesrc.process.name: Requesting process
Recommended fields
event.time: Event timeendpoint.name: Host name
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'DNS Resolved' event.dns.request = * | limit 5 | columns event.time, endpoint.name, event.type, event.dns.request, src.process.name
// HUNT: Retrospective DNS lookups of AA26-281A C2 and SoftEther host domains // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1071.001, T1133, T1568 // CONF: medium | FP: medium // FALSE POSITIVES: re-registered or reused domains; AA26-281A says some indicators date to 2016 // EQUIVALENCE: equivalent-with-schema-assumptions - Same anchored domain-suffix match on process-attributed DNS lookups, aggregated per host, domain and process. // REQUIRES: SentinelOne EDR DNS Resolved telemetry with the requesting process // TUNING: Review each hit by firstSeen and requesting process. A browser lookup of a lapsed domain is weaker than conhost.exe, dllhost.exe or a scripting host resolving it. Some AA26-281A indicators date to 2016, so treat hits as historical leads. // LOOKBACK: 180d or longer; set with the console time picker or the query window // CONFIGURATION: No custom detection rule or lookup table is required to run the hunt. // KNOWN GAPS: If the tenant populates dns.request instead of event.dns.request, this hunt returns nothing until the field name is swapped. // VALIDATION LEVEL: static-reviewed event.type = 'DNS Resolved' event.dns.request matches '(^|[.])(natcloudservice[.]com|studiocloud[.]xyz|96cee[.]com|hmbcloud[.](com|net)|hmbiplc-01[.]com|javacheck[.]ooguy[.]com|javaupdate[.]giize[.]com|sexytube0[.]com|twimg[.]co[.]uk)$' | group lookups = count(), first_seen = min(event.time), last_seen = max(event.time) by endpoint.name, event.dns.request, src.process.name | sort +first_seen | limit 200
Looks for: Outbound IPv4 connections to the three addresses named in the sources: the Curlc4 download host (AA26-281A), the host that served Microscan, and the botnet database server (both from the Hacker News write-up of the court documents). Single-source addresses, so treat as leads.
FP: addresses on rented server space can be reassigned to unrelated tenants after the actor leaves. A hit is only meaningful if its timestamp falls inside the first/last-seen window the sources give.
Known limitations and deployment notes
- PowerQuery: Connections made through a proxy show the proxy address, not the named server.
- PowerQuery assumes: On an IP Connect event the connecting process is src.process.*.
- PowerQuery assumes: dst.ip.address and dst.port.number hold the remote endpoint of the connection.
// HUNT: Retrospective connections to named Integrity Tech IPv4 addresses // MITRE: T1071.001 | T1105 | T1595.002 // CONF: medium FP: medium COST: low | REQUIRES: outbound IPv4 connection telemetry (Falcon: NetworkConnectIP4) // LOOKBACK: 180d or longer, set in the Falcon time picker. Single-source addresses; treat as leads. // FALSE POSITIVES: reassigned server addresses // TUNING: compare firstSeen against the sourced activity windows (Curlc4 host: AA26-281A; the other two: court documents as reported on 2026-10-08) and drop hits outside them #event_simpleName=NetworkConnectIP4 | RemoteAddressIP4=/^(149\.28\.132\.137|202\.182\.109\.151|198\.13\.53\.226)$/ | groupBy([aid, ComputerName, RemoteAddressIP4, RemotePort, ContextBaseFileName], function=[count(as=connections), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen)], limit=max) | sort(firstSeen, order=asc)
2 required fields · View requirements
Required telemetry
- SentinelOne EDR IP Connect events
Required fields
event.type: Event typedst.ip.address: Destination address
Recommended fields
event.time: Event timeendpoint.name: Host namedst.port.number: Destination portsrc.process.name: Connecting process
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' dst.ip.address = * | limit 5 | columns event.time, endpoint.name, event.type, dst.ip.address, dst.port.number, src.process.name
// HUNT: Retrospective connections to named Integrity Tech IPv4 addresses
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1071.001, T1105, T1595.002
// CONF: medium | FP: medium
// FALSE POSITIVES: reassigned server addresses
// EQUIVALENCE: equivalent-with-schema-assumptions - Same exact-address match on outbound IPv4 connections, aggregated per host, destination and process.
// REQUIRES: SentinelOne EDR IP Connect telemetry
// TUNING: Compare firstSeen against the sourced activity windows (Curlc4 host: AA26-281A; the other two: court documents as reported on 2026-10-08) and drop hits outside them. Addresses are single-source, so treat hits as leads.
// LOOKBACK: 180d or longer; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: Connections made through a proxy show the proxy address, not the named server.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect' dst.ip.address in ('149.28.132.137', '202.182.109.151', '198.13.53.226')
| group connections = count(), first_seen = min(event.time), last_seen = max(event.time) by endpoint.name, dst.ip.address, dst.port.number, src.process.name
| sort +first_seen
| limit 200Looks for: The PARENT is w3wp.exe, the IIS worker process that serves OWA, ECP, EWS and Autodiscover on an on-premises Exchange server. The CHILD is a shell, script host, download tool or recon binary. Flax Typhoon pairs XSS and EBurst password spraying against Exchange for its foothold, and webshells (b374.php, error.jsp, gf.phtml and others) are in its toolkit. Windows sensor only.
FP: other IIS applications on the same host, monitoring agents and health probes. Scope the hunt to Exchange servers and exclude the monitoring service account.
Known limitations and deployment notes
- PowerQuery: Non-Exchange IIS applications on the same host also match until the hunt is scoped by host.
- PowerQuery assumes: On a Process Creation event src.process.* is the creator (w3wp.exe) and tgt.process.* is the new process.
- PowerQuery assumes: The user column is src.process.user, the creator's account; the CQL UserName is the child's account, which for w3wp.exe children is normally the same application-pool identity.
- PowerQuery assumes: in:anycase makes the name lists case-insensitive, matching the CQL /i flag.
// HUNT: Exchange IIS worker process spawning shells or recon tools // MITRE: T1505.003 | T1190 | T1059 // CONF: high FP: medium COST: low | REQUIRES: process creation with parent name (Falcon: ProcessRollup2, Windows sensor on the Exchange server) // PARENT: w3wp.exe (IIS worker process hosting OWA/ECP/EWS/Autodiscover). CHILD: the tools matched below. // FALSE POSITIVES: non-Exchange IIS apps on the same host; monitoring agents and health probes // TUNING: scope to Exchange hosts only (add a ComputerName filter for your Exchange servers), and exclude your monitoring service with UserName!=/^svc-monitor$/i #event_simpleName=ProcessRollup2 | ParentBaseFileName=/^w3wp\.exe$/i | FileName=/^(cmd|powershell|pwsh|wscript|cscript|mshta|rundll32|regsvr32|certutil|bitsadmin|curl|wget|whoami|net|net1|nltest|wmic|msiexec|tasklist|ipconfig|systeminfo)\.exe$/i | groupBy([aid, ComputerName, UserName, FileName, CommandLine], function=[count(as=hits), min(@timestamp, as=firstSeen)], limit=max) | sort(hits, order=desc)
3 required fields · View requirements
Required telemetry
- SentinelOne EDR Process Creation events
Required fields
event.type: Event typesrc.process.name: Creating processtgt.process.name: Created process name
Recommended fields
event.time: Event timeendpoint.name: Host nametgt.process.cmdline: Created process command line
Optional fields
src.process.user: User
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' src.process.name = * tgt.process.name = * | limit 5 | columns event.time, endpoint.name, event.type, src.process.name, tgt.process.name
// HUNT: Exchange IIS worker process spawning shells or recon tools
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1505.003, T1190, T1059
// CONF: high | FP: medium
// FALSE POSITIVES: non-Exchange IIS apps on the same host; monitoring agents and health probes
// EQUIVALENCE: equivalent-with-schema-assumptions - Same parent and child process-name predicate on process creation, with the created process on tgt.process.* and its creator w3wp.exe on src.process.*.
// REQUIRES: SentinelOne EDR process-creation telemetry on the Exchange server
// TUNING: Scope to Exchange hosts only by filtering endpoint.name, and exclude your monitoring service account by src.process.user after baseline review.
// LOOKBACK: 30d; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: Non-Exchange IIS applications on the same host also match until the hunt is scoped by host.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' src.process.name in:anycase ('w3wp.exe') tgt.process.name in:anycase ('cmd.exe', 'powershell.exe', 'pwsh.exe', 'wscript.exe', 'cscript.exe', 'mshta.exe', 'rundll32.exe', 'regsvr32.exe', 'certutil.exe', 'bitsadmin.exe', 'curl.exe', 'wget.exe', 'whoami.exe', 'net.exe', 'net1.exe', 'nltest.exe', 'wmic.exe', 'msiexec.exe', 'tasklist.exe', 'ipconfig.exe', 'systeminfo.exe')
| group hits = count(), first_seen = min(event.time) by endpoint.name, src.process.user, tgt.process.name, tgt.process.cmdline
| sort -hits
| limit 200Looks for: CVE-2016-3081 (Apache Struts, method:prefix with Dynamic Method Invocation enabled) gives command execution inside the servlet container. The PARENT is the java or Tomcat process that hosts the Struts application. The CHILD is a shell, downloader or recon command. Works on the Windows and Linux sensors.
FP: any Java application that legitimately shells out, including CI/build servers and application wrapper scripts. Restrict to hosts known to run Struts and exclude known wrapper commands.
Known limitations and deployment notes
- PowerQuery: Java applications and CI or build servers that legitimately run shell commands match until tuned.
- PowerQuery assumes: On a Process Creation event src.process.* is the creator (the JVM) and tgt.process.* is the new process.
- PowerQuery assumes: The user column is src.process.user, the creator's account.
- PowerQuery assumes: matches is case-insensitive by default, matching the CQL /i flag; [.] stands for a literal dot.
// HUNT: Struts-hosting Java or Tomcat process spawning shells or downloaders // MITRE: T1190 | T1059.004 | T1059.003 | T1105 // CONF: medium FP: medium COST: low | REQUIRES: process creation with parent name (Falcon: ProcessRollup2, Windows or Linux sensor) // PARENT: java / javaw / tomcat (the JVM hosting the Struts app). CHILD: the tools matched below. // FALSE POSITIVES: Java apps and CI/build servers that legitimately run shell commands // TUNING: limit to hosts that run Struts; exclude known wrapper scripts with CommandLine!=/startup\.sh|catalina\.sh/i #event_simpleName=ProcessRollup2 | ParentBaseFileName=/^(java|javaw|tomcat[0-9]*|tomcat[0-9]*w)(\.exe)?$/i | FileName=/^(sh|bash|dash|cmd|powershell|pwsh|curl|wget|nc|ncat|python[0-9.]*|perl|php|whoami|id|uname|ifconfig|certutil|bitsadmin)(\.exe)?$/i | groupBy([aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], function=[count(as=hits), min(@timestamp, as=firstSeen)], limit=max) | sort(hits, order=desc)
3 required fields · View requirements
Required telemetry
- SentinelOne EDR Process Creation events
Required fields
event.type: Event typesrc.process.name: Creating processtgt.process.name: Created process name
Recommended fields
event.time: Event timeendpoint.name: Host nametgt.process.cmdline: Created process command line
Optional fields
src.process.user: User
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' src.process.name = * tgt.process.name = * | limit 5 | columns event.time, endpoint.name, event.type, src.process.name, tgt.process.name
// HUNT: Struts-hosting Java or Tomcat process spawning shells or downloaders // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1190, T1059.004, T1059.003, T1105 // CONF: medium | FP: medium // FALSE POSITIVES: Java apps and CI/build servers that legitimately run shell commands // EQUIVALENCE: equivalent-with-schema-assumptions - Same JVM-parent and shell-or-downloader-child name predicate on process creation, with the child on tgt.process.* and the JVM on src.process.*. // REQUIRES: SentinelOne EDR process-creation telemetry on Windows or Linux Struts hosts // TUNING: Limit to hosts that run Struts, and exclude known wrapper scripts such as startup.sh and catalina.sh with a tgt.process.cmdline exclusion after baseline review. // LOOKBACK: 30d; set with the console time picker or the query window // CONFIGURATION: No custom detection rule or lookup table is required to run the hunt. // KNOWN GAPS: Java applications and CI or build servers that legitimately run shell commands match until tuned. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' src.process.name matches '^(java|javaw|tomcat[0-9]*|tomcat[0-9]*w)([.]exe)?$' tgt.process.name matches '^(sh|bash|dash|cmd|powershell|pwsh|curl|wget|nc|ncat|python[0-9.]*|perl|php|whoami|id|uname|ifconfig|certutil|bitsadmin)([.]exe)?$' | group hits = count(), first_seen = min(event.time) by endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline | sort -hits | limit 200
Looks for: Linux web-shell and app-exploit execution. The PARENT is the web or application process: httpd/apache2/nginx/php-fpm for PHP webshells, node for Strapi (CVE-2023-22894, chained with CVE-2023-22621 for RCE per the KEV entry), and docservice/converter for ONLYOFFICE Docs (CVE-2021-3199). The CHILD is a shell, downloader or interpreter. The ONLYOFFICE process names are an assumption: ⚠ validate in tenant.
FP: high. node parents run npm scripts, and PHP apps shell out for legitimate reasons. Treat as a triage hunt, never an auto-action. Restrict to hosts that run the exposed products and baseline for a full release cycle first.
Known limitations and deployment notes
- PowerQuery: High false-positive risk: npm scripts under node, PHP applications that call system utilities and deploy hooks match until baselined.
- PowerQuery assumes: On a Process Creation event src.process.* is the creator (the web or app process) and tgt.process.* is the new process.
- PowerQuery assumes: endpoint.os holds the lowercase value linux for Linux agents.
- PowerQuery assumes: The user column is src.process.user, the creator's account.
- PowerQuery assumes: matches is case-insensitive by default, matching the CQL /i flag.
// HUNT: Linux web and app tier spawning shells (Apache, nginx, PHP, Node/Strapi, ONLYOFFICE) // MITRE: T1505.003 | T1190 | T1059.004 // CONF: medium FP: high COST: low | REQUIRES: Linux process creation with parent name (Falcon: ProcessRollup2, Linux sensor) // PARENT: httpd, apache2, nginx, php-fpm, php-cgi, php, node (Strapi), docservice, converter (ONLYOFFICE; validate in tenant) // FALSE POSITIVES: npm scripts under node; PHP applications that call system utilities; deploy hooks // TUNING: baseline for one release cycle; exclude known deploy users with UserName!=/^(deploy|ci)$/i; run on hosts that carry the exposed products only #event_simpleName=ProcessRollup2 | event_platform=Lin | ParentBaseFileName=/^(httpd|apache2|nginx|php-fpm[0-9.]*|php-cgi|php|node|docservice|converter)$/i | FileName=/^(sh|bash|dash|curl|wget|nc|ncat|python[0-9.]*|perl|whoami|id|uname|crontab|base64)$/i | groupBy([aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], function=[count(as=hits), min(@timestamp, as=firstSeen)], limit=max) | sort(hits, order=desc)
4 required fields · View requirements
Required telemetry
- SentinelOne EDR Process Creation events from Linux agents
Required fields
event.type: Event typeendpoint.os: Operating systemsrc.process.name: Creating processtgt.process.name: Created process name
Recommended fields
event.time: Event timeendpoint.name: Host nametgt.process.cmdline: Created process command line
Optional fields
src.process.user: User
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' endpoint.os = 'linux' src.process.name = * tgt.process.name = * | limit 5 | columns event.time, endpoint.name, event.type, endpoint.os, src.process.name, tgt.process.name
// HUNT: Linux web and app tier spawning shells (Apache, nginx, PHP, Node/Strapi, ONLYOFFICE)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1505.003, T1190, T1059.004
// CONF: medium | FP: high
// FALSE POSITIVES: npm scripts under node; PHP applications that call system utilities; deploy hooks
// EQUIVALENCE: equivalent-with-schema-assumptions - Same web-tier parent and shell-or-downloader child name predicate on Linux process creation, with the child on tgt.process.* and the web process on src.process.*.
// REQUIRES: SentinelOne EDR Linux process-creation telemetry
// TUNING: Baseline for one release cycle, exclude known deploy accounts by src.process.user, and run on hosts that carry the exposed products only. The ONLYOFFICE parent names (docservice, converter) need validating in the tenant.
// LOOKBACK: 30d; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: High false-positive risk: npm scripts under node, PHP applications that call system utilities and deploy hooks match until baselined.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' endpoint.os in:anycase ('linux') src.process.name matches '^(httpd|apache2|nginx|php-fpm[0-9.]*|php-cgi|php|node|docservice|converter)$' tgt.process.name matches '^(sh|bash|dash|curl|wget|nc|ncat|python[0-9.]*|perl|whoami|id|uname|crontab|base64)$'
| group hits = count(), first_seen = min(event.time) by endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline
| sort -hits
| limit 200Looks for: The PARENT is proftpd. CVE-2015-3306 (mod_copy, SITE CPFR/CPTO) copies files inside the daemon, so the exploit itself spawns no process and this query will NOT see it. It catches only follow-on use where a ProFTPD process ends up running a shell or downloader. Do not read a quiet result as proof of no exploitation: see the Coverage Map gap for the file-write step.
Known limitations and deployment notes
- PowerQuery: The CVE-2015-3306 copy primitive runs inside the daemon and creates no process, so it is invisible here.
- PowerQuery assumes: On a Process Creation event src.process.* is the creator (proftpd) and tgt.process.* is the new process.
- PowerQuery assumes: endpoint.os holds the lowercase value linux for Linux agents.
- PowerQuery assumes: The user column is src.process.user, the creator's account.
- PowerQuery assumes: matches and in:anycase are case-insensitive, matching the CQL /i flag.
// HUNT: ProFTPD daemon as parent of shells or downloaders // MITRE: T1190 | T1059.004 // CONF: low FP: low COST: low | REQUIRES: Linux process creation with parent name (Falcon: ProcessRollup2, Linux sensor) // PARENT: proftpd. NOTE: CVE-2015-3306 file copy happens inside the daemon and spawns no child; this is follow-on coverage only. // FALSE POSITIVES: site-specific ProFTPD exec hooks (mod_exec) calling scripts #event_simpleName=ProcessRollup2 | event_platform=Lin | ParentBaseFileName=/^proftpd$/i | FileName=/^(sh|bash|dash|curl|wget|nc|ncat|python[0-9.]*|perl|php|chmod)$/i | groupBy([aid, ComputerName, UserName, FileName, CommandLine], function=[count(as=hits), min(@timestamp, as=firstSeen)], limit=max) | sort(hits, order=desc)
4 required fields · View requirements
Required telemetry
- SentinelOne EDR Process Creation events from Linux agents
Required fields
event.type: Event typeendpoint.os: Operating systemsrc.process.name: Creating processtgt.process.name: Created process name
Recommended fields
event.time: Event timeendpoint.name: Host nametgt.process.cmdline: Created process command line
Optional fields
src.process.user: User
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' endpoint.os = 'linux' src.process.name = * tgt.process.name = * | limit 5 | columns event.time, endpoint.name, event.type, endpoint.os, src.process.name, tgt.process.name
// HUNT: ProFTPD daemon as parent of shells or downloaders
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1190, T1059.004
// CONF: low | FP: low
// FALSE POSITIVES: site-specific ProFTPD exec hooks (mod_exec) calling scripts
// EQUIVALENCE: equivalent-with-schema-assumptions - Same ProFTPD parent and shell-or-downloader child name predicate on Linux process creation, with the child on tgt.process.* and the daemon on src.process.*. Follow-on coverage only, as in the CQL.
// REQUIRES: SentinelOne EDR Linux process-creation telemetry
// TUNING: Exclude site-specific ProFTPD exec hooks (mod_exec) that call scripts by tgt.process.cmdline after baseline review. The CVE-2015-3306 file copy happens inside the daemon and spawns no child, so this is follow-on coverage only.
// LOOKBACK: 30d; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: The CVE-2015-3306 copy primitive runs inside the daemon and creates no process, so it is invisible here.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' endpoint.os in:anycase ('linux') src.process.name in:anycase ('proftpd') tgt.process.name matches '^(sh|bash|dash|curl|wget|nc|ncat|python[0-9.]*|perl|php|chmod)$'
| group hits = count(), first_seen = min(event.time) by endpoint.name, src.process.user, tgt.process.name, tgt.process.cmdline
| sort -hits
| limit 200Looks for: EBurst sprays ten Exchange interfaces (ECP, EWS, OAB, OWA, RPC, API, MAPI, PowerShell, Autodiscover, ActiveSync). On an Exchange server the Windows sensor logs failed network and cleartext logons. This groups failures by source address and flags sources that touched many distinct accounts. Run it on Exchange servers only. ⚠ validate in tenant: confirm RemoteAddressIP4 is populated on UserLogonFailed2 in your sensor version.
FP: if clients reach Exchange through a load balancer or reverse proxy, every failure carries the proxy address and the fan-out collapses onto it, which both hides the real source and flags the proxy. Vulnerability scanners and misconfigured mobile clients also fan out.
Known limitations and deployment notes
- PowerQuery: Load balancers or proxies that mask the client address collapse many clients into one source, and the agent must record failed network logons on the Exchange servers.
- PowerQuery assumes: src.endpoint.ip.address holds the client address on network logons; it is documented but not attested, so verify it on the tenant.
- PowerQuery assumes: event.login.type NETWORK and NETWORK_CLEAR_TEXT correspond to the CQL LogonType 3 and 8.
- PowerQuery assumes: estimate_distinct is approximate; the 10-account threshold is far enough from the error band to be reliable.
// HUNT: Password spray fan-out against Exchange hosts (Windows failed logons) // MITRE: T1110.003 | T1110.001 // CONF: medium FP: medium COST: medium | REQUIRES: failed logon telemetry (Falcon: UserLogonFailed2, Windows sensor on the Exchange server) // VALIDATE IN TENANT: RemoteAddressIP4 on UserLogonFailed2 // FALSE POSITIVES: load balancers or proxies that mask the client address; scanners; misconfigured mobile clients // TUNING: exclude your load balancer and scanner addresses with RemoteAddressIP4!=/^REPLACE_WITH_LB_IP$/; raise or lower the distinctAccounts threshold after one week of baseline #event_simpleName=UserLogonFailed2 | LogonType=/^(3|8)$/ | UserName=* | groupBy([RemoteAddressIP4], function=[count(as=failures), count(UserName, distinct=true, as=distinctAccounts), count(aid, distinct=true, as=targetHosts), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen)], limit=max) | test(distinctAccounts >= 10) | sort(distinctAccounts, order=desc)
6 required fields · View requirements
Required telemetry
- SentinelOne EDR Login events from Windows agents
Required fields
event.type: Event typeendpoint.os: Operating systemevent.login.loginIsSuccessful: Logon outcomeevent.login.type: Logon typeevent.login.userName: Account namesrc.endpoint.ip.address: Source address
Recommended fields
event.time: Event timeagent.uuid: Target host
Fallbacks
agent.uuid→endpoint.name: Counts target hosts by name instead of identifier.
Readiness test
event.type = 'Login' endpoint.os = 'windows' event.login.loginIsSuccessful = false event.login.type = * event.login.userName = * src.endpoint.ip.address = * | limit 5 | columns event.time, agent.uuid, event.type, endpoint.os, event.login.loginIsSuccessful, event.login.type, event.login.userName, src.endpoint.ip.address
// HUNT: Password spray fan-out against Exchange hosts (Windows failed logons)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1110.003, T1110.001
// CONF: medium | FP: medium
// FALSE POSITIVES: load balancers or proxies that mask the client address; scanners; misconfigured mobile clients
// EQUIVALENCE: approximate-analytic - Same fan-out analytic (one source address failing against ten or more distinct accounts) on SentinelOne Login events. Distinct counts use estimate_distinct, which is approximate, and the source address field is documented but not attested.
// REQUIRES: SentinelOne EDR Login events from the Windows Exchange servers
// TUNING: Scope to Exchange hosts by filtering endpoint.name before the group, exclude your load balancer and scanner addresses by src.endpoint.ip.address, and raise or lower the 10-account threshold after one week of baseline.
// LOOKBACK: 24h to 7d; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: Load balancers or proxies that mask the client address collapse many clients into one source, and the agent must record failed network logons on the Exchange servers.
// VALIDATION LEVEL: static-reviewed
event.type = 'Login' endpoint.os in:anycase ('windows') event.login.loginIsSuccessful = false event.login.type in ('NETWORK', 'NETWORK_CLEAR_TEXT') event.login.userName = * src.endpoint.ip.address = *
| group failures = count(), distinct_accounts = estimate_distinct(event.login.userName), target_hosts = estimate_distinct(agent.uuid), first_seen = min(event.time), last_seen = max(event.time) by src.endpoint.ip.address
| filter distinct_accounts >= 10
| sort -distinct_accounts
| limit 200Looks for: The same spray shape seen from domain controllers by Falcon Identity Protection: authentication failures grouped by source endpoint, flagged when one source touches many distinct accounts. Needs the Identity Protection module; without it this query returns nothing. It does NOT see Microsoft 365 / Entra cloud sign-ins: use the native hunt in Section 7 for those.
FP: shared egress addresses, service desks resetting many accounts, and stale credentials on a scheduled job that fans out across accounts.
Known limitations and deployment notes
- PowerQuery: SentinelOne cannot show Active Directory authentication failures as seen by an identity sensor from the endpoint schema alone.
// HUNT: Password spray fan-out against Active Directory (Falcon Identity) // MITRE: T1110.003 | T1110.001 // CONF: medium FP: medium COST: medium | REQUIRES: Falcon Identity Protection (Falcon: ActiveDirectoryAuthenticationFailure) // FALSE POSITIVES: shared NAT or VPN egress; service desk bulk resets; stale scheduled-job credentials // TUNING: exclude known shared egress and the service desk workstation with SourceEndpointIp!=/^REPLACE_WITH_EGRESS_IP$/; baseline distinctAccounts for a week #event_simpleName=ActiveDirectoryAuthenticationFailure | groupBy([SourceEndpointIp], function=[count(as=failures), count(SamAccountName, distinct=true, as=distinctAccounts), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen)], limit=max) | test(distinctAccounts >= 10) | sort(distinctAccounts, order=desc)
1 required field · View requirements
Required telemetry
- None: the nearest SentinelOne source is Login events on Q8
Required fields
event.type: Event type
Readiness test
event.type = 'Login' | limit 5 | columns event.type
// HUNT: Password spray fan-out against Active Directory (Falcon Identity) // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1110.003, T1110.001 // CONF: medium | FP: medium // FALSE POSITIVES: shared NAT or VPN egress; service desk bulk resets; stale scheduled-job credentials // EQUIVALENCE: unsupported-without-redesign - The CQL reads Falcon Identity Protection domain-controller authentication failures, a Falcon-only identity sensor event. The SentinelOne endpoint schema has no attested equivalent; the Windows failed-logon fan-out on the previous card is the nearest endpoint view. // REQUIRES: A SentinelOne identity or domain-controller authentication source with attested fields; none is documented in the endpoint field model. // TUNING: Use the CQL tab for this card, or the failed-logon fan-out PowerQuery on Q8 run against the domain controllers. // LOOKBACK: 7d on the CQL tab // CONFIGURATION: Use the CQL tab for this card. // KNOWN GAPS: SentinelOne cannot show Active Directory authentication failures as seen by an identity sensor from the endpoint schema alone. // VALIDATION LEVEL: static-reviewed
Looks for: Executable names the advisory ties to the XSS-delivered FishHub-style payload (live700_v1.exe, DiagTrack.exe) and to renamed SoftEther VPN clients (conhost.exe, dllhost.exe), running from anywhere other than the Windows system directories. The genuine conhost.exe and dllhost.exe live in System32 and SysWOW64. Windows sensor.
Known limitations and deployment notes
- PowerQuery: A masquerading binary that lives under a path containing the System32 folder name as a subfolder of an attacker directory is excluded by the path pattern.
- PowerQuery assumes: On a Process Creation event tgt.process.* is the new process; src.process.user is the creator's account.
- PowerQuery assumes: The path exclusion uses a dot for each path separator so no backslash escaping is needed; it also tolerates forward-slash paths.
- PowerQuery assumes: endpoint.os holds the lowercase value windows for Windows agents.
- PowerQuery assumes: in:anycase and matches are case-insensitive, matching the CQL /i flag.
// HUNT: FishHub payload and SoftEther masquerade, tool names running outside System32 // MITRE: T1036.003 | T1133 | T1204.002 // CONF: medium FP: low COST: low | REQUIRES: process creation with image path (Falcon: ProcessRollup2, Windows sensor) // FALSE POSITIVES: servicing and side-by-side component copies; unusual but legitimate installer staging #event_simpleName=ProcessRollup2 | event_platform=Win | FileName=/^(live700_v1|DiagTrack|conhost|dllhost)\.exe$/i | ImageFileName!=/\\Windows\\(System32|SysWOW64|WinSxS)\\/i | groupBy([aid, ComputerName, UserName, FileName, ImageFileName, SHA256HashData], function=[count(as=hits), min(@timestamp, as=firstSeen)], limit=max) | sort(firstSeen, order=asc)
4 required fields · View requirements
Required telemetry
- SentinelOne EDR Process Creation events from Windows agents
Required fields
event.type: Event typeendpoint.os: Operating systemtgt.process.name: Created process nametgt.process.image.path: Created process path
Recommended fields
event.time: Event timeendpoint.name: Host nametgt.process.image.sha256: Created process hash
Optional fields
src.process.user: User
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' endpoint.os = 'windows' tgt.process.name = * tgt.process.image.path = * | limit 5 | columns event.time, endpoint.name, event.type, endpoint.os, tgt.process.name, tgt.process.image.path
// HUNT: FishHub payload and SoftEther masquerade, tool names running outside System32
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1036.003, T1133, T1204.002
// CONF: medium | FP: low
// FALSE POSITIVES: servicing and side-by-side component copies; unusual but legitimate installer staging
// EQUIVALENCE: equivalent-with-schema-assumptions - Same masquerade predicate: four tool names created as processes from an image path outside System32, SysWOW64 and WinSxS, aggregated with the image hash.
// REQUIRES: SentinelOne EDR Windows process-creation telemetry with the image path
// TUNING: Review servicing and side-by-side component copies and unusual installer staging before escalating; a signed Microsoft hash in an unexpected folder is weaker than an unsigned one.
// LOOKBACK: 30d; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: A masquerading binary that lives under a path containing the System32 folder name as a subfolder of an attacker directory is excluded by the path pattern.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' endpoint.os in:anycase ('windows') tgt.process.name in:anycase ('live700_v1.exe', 'DiagTrack.exe', 'conhost.exe', 'dllhost.exe') tgt.process.image.path = * !(tgt.process.image.path matches '.Windows.(System32|SysWOW64|WinSxS).')
| group hits = count(), first_seen = min(event.time) by endpoint.name, src.process.user, tgt.process.name, tgt.process.image.path, tgt.process.image.sha256
| sort +first_seen
| limit 200Looks for: Sweeps process starts and executable writes for the nine SHA-256 values the advisory lists for dropped malware and tools: live700_v1.exe, DiagTrack.exe, office-cli (Linux ELF), dc.exe (DCSync), the renamed SoftEther conhost.exe and dllhost.exe copies, fscan.exe and JuicyPotato.exe. Hash matches are exact, but the list is a 2026 snapshot of one actor toolkit: a miss proves little.
Known limitations and deployment notes
- PowerQuery: A file written without a SHA-256 on the event is not matched, and the file branch is not limited to executables.
- PowerQuery assumes: On a Process Creation event the started image hash is tgt.process.image.sha256; on file events the written file hash is tgt.file.sha256.
- PowerQuery assumes: File-event SHA-256 population depends on the agent hashing the file at write time; confirm with the readiness test.
- PowerQuery assumes: in:anycase makes the hash comparison case-insensitive, matching the CQL /i flag.
// HUNT: Known tool hashes from AA26-281A (process start and executable write) // MITRE: T1105 | T1036.003 | T1003.006 // CONF: high FP: low COST: medium | REQUIRES: file hash on process start and executable write (Falcon: ProcessRollup2, PeFileWritten, NewExecutableWritten) // LOOKBACK: 180d or longer, set in the Falcon time picker // FALSE POSITIVES: fscan.exe and JuicyPotato.exe are public tools; SoftEther is legitimate VPN software. A hit on those is a lead, not a verdict. #event_simpleName=/^(ProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | SHA256HashData=/^(c4503db6ece93eddf4511e787607cb14606a1df9f526f1e39992497119437cec|804a53be802378a8ec4c94602fd3d6584e0d472d83148e8a42c731950fec415d|add7dd142e4f7e2873bc8f7b7fb6308063608e0b49a773dea93abad4047f1489|9dc85f9569a15eaf51c7d34254767ea30dd67b2178cec4cc7125288b9544fe00|b1552703ff0035f197c22cdb3a514bb6aa45ec98de3ef5409faab0978f18c35e|8a592e22c51311d482272ec5aba0103c9cd0cfd78e5b5ba75dfa8f1c56926672|86f1cfa6a2e0a8cb6fc1fbee28472308e6467932f8658a6a4885e29ed8c34a67|7b9efc7ef8957411cdd22582ce4bfb3a5f76d9c91cdb7e36bf85c9785a2480e9|e7e727458f573dded05537baddac2867d2801db1c3c74410398d063dfd6f6575)$/i | groupBy([aid, ComputerName, #event_simpleName, FileName, SHA256HashData], function=[count(as=hits), min(@timestamp, as=firstSeen)], limit=max) | sort(firstSeen, order=asc)
2 required fields · View requirements
Required telemetry
- SentinelOne EDR Process Creation and File Creation events with SHA-256
Required fields
tgt.process.image.sha256: Started image hashtgt.file.sha256: Written file hash
Recommended fields
event.time: Event timeendpoint.name: Host nameevent.type: Event type
Optional fields
tgt.process.name: Created process nametgt.file.path: Written file path
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
tgt.process.image.sha256 = * OR tgt.file.sha256 = * | limit 5 | columns event.time, endpoint.name, event.type, tgt.process.image.sha256, tgt.file.sha256
// HUNT: Known tool hashes from AA26-281A (process start and executable write)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1105, T1036.003, T1003.006
// CONF: high | FP: low
// FALSE POSITIVES: fscan.exe and JuicyPotato.exe are public tools; SoftEther is legitimate VPN software. A hit on those is a lead, not a verdict.
// EQUIVALENCE: equivalent-with-schema-assumptions - Same nine SHA-256 values matched on the started process image and on written files. The file branch covers any file with these hashes, a superset of the CQL's executable-write events.
// REQUIRES: SentinelOne EDR process-creation and file-event telemetry with SHA-256 populated
// TUNING: fscan.exe and JuicyPotato.exe are public tools and SoftEther is legitimate VPN software, so a hit on those is a lead, not a verdict.
// LOOKBACK: 180d or longer; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: A file written without a SHA-256 on the event is not matched, and the file branch is not limited to executables.
// VALIDATION LEVEL: static-reviewed
tgt.process.image.sha256 in:anycase ('c4503db6ece93eddf4511e787607cb14606a1df9f526f1e39992497119437cec', '804a53be802378a8ec4c94602fd3d6584e0d472d83148e8a42c731950fec415d', 'add7dd142e4f7e2873bc8f7b7fb6308063608e0b49a773dea93abad4047f1489', '9dc85f9569a15eaf51c7d34254767ea30dd67b2178cec4cc7125288b9544fe00', 'b1552703ff0035f197c22cdb3a514bb6aa45ec98de3ef5409faab0978f18c35e', '8a592e22c51311d482272ec5aba0103c9cd0cfd78e5b5ba75dfa8f1c56926672', '86f1cfa6a2e0a8cb6fc1fbee28472308e6467932f8658a6a4885e29ed8c34a67', '7b9efc7ef8957411cdd22582ce4bfb3a5f76d9c91cdb7e36bf85c9785a2480e9', 'e7e727458f573dded05537baddac2867d2801db1c3c74410398d063dfd6f6575') OR tgt.file.sha256 in:anycase ('c4503db6ece93eddf4511e787607cb14606a1df9f526f1e39992497119437cec', '804a53be802378a8ec4c94602fd3d6584e0d472d83148e8a42c731950fec415d', 'add7dd142e4f7e2873bc8f7b7fb6308063608e0b49a773dea93abad4047f1489', '9dc85f9569a15eaf51c7d34254767ea30dd67b2178cec4cc7125288b9544fe00', 'b1552703ff0035f197c22cdb3a514bb6aa45ec98de3ef5409faab0978f18c35e', '8a592e22c51311d482272ec5aba0103c9cd0cfd78e5b5ba75dfa8f1c56926672', '86f1cfa6a2e0a8cb6fc1fbee28472308e6467932f8658a6a4885e29ed8c34a67', '7b9efc7ef8957411cdd22582ce4bfb3a5f76d9c91cdb7e36bf85c9785a2480e9', 'e7e727458f573dded05537baddac2867d2801db1c3c74410398d063dfd6f6575')
| columns event.time, endpoint.name, event.type, tgt.process.name, tgt.process.image.sha256, tgt.file.path, tgt.file.sha256
| sort +event.time
| limit 200Looks for: Renamed SoftEther VPN clients keep a persistent tunnel to a hub outside the network. The genuine conhost.exe never makes external connections, and dllhost.exe (COM Surrogate) rarely does. This lists external IPv4 destinations for either name, with private ranges removed.
FP: dllhost.exe can hold connections for some COM-based software. Baseline first, then alert on conhost.exe immediately.
Known limitations and deployment notes
- PowerQuery: COM-based software where dllhost.exe holds an external connection matches until baselined, and the hunt does not filter by connection direction.
- PowerQuery assumes: On an IP Connect event the connecting process is src.process.*.
- PowerQuery assumes: The five excluded subnets match the CQL cidr() list; IPv6 destinations are not excluded.
- PowerQuery assumes: in:anycase makes the process names case-insensitive, matching the CQL /i flag.
// HUNT: conhost.exe or dllhost.exe making external network connections (SoftEther persistence) // MITRE: T1133 | T1036.003 | T1572 // CONF: medium FP: medium COST: low | REQUIRES: outbound IPv4 connection telemetry (Falcon: NetworkConnectIP4, Windows sensor) // FALSE POSITIVES: COM-based software where dllhost.exe holds an external connection // TUNING: baseline dllhost.exe destinations for a week and exclude confirmed vendor ranges; conhost.exe should have no external destinations at all #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^(conhost|dllhost)\.exe$/i | !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "127.0.0.0/8", "169.254.0.0/16"]) | groupBy([aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], function=[count(as=connections), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen)], limit=max) | sort(connections, order=desc)
3 required fields · View requirements
Required telemetry
- SentinelOne EDR IP Connect events from Windows agents
Required fields
event.type: Event typesrc.process.name: Connecting processdst.ip.address: Destination address
Recommended fields
event.time: Event timeendpoint.name: Host namedst.port.number: Destination port
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' src.process.name = * dst.ip.address = * | limit 5 | columns event.time, endpoint.name, event.type, src.process.name, dst.ip.address, dst.port.number
// HUNT: conhost.exe or dllhost.exe making external network connections (SoftEther persistence)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1133, T1036.003, T1572
// CONF: medium | FP: medium
// FALSE POSITIVES: COM-based software where dllhost.exe holds an external connection
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-name and external-destination predicate on outbound connections, with private, loopback and link-local ranges excluded by subnet.
// REQUIRES: SentinelOne EDR IP Connect telemetry on Windows agents
// TUNING: Baseline dllhost.exe destinations for a week and exclude confirmed vendor ranges; conhost.exe should have no external destinations at all.
// LOOKBACK: 14d; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: COM-based software where dllhost.exe holds an external connection matches until baselined, and the hunt does not filter by connection direction.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect' src.process.name in:anycase ('conhost.exe', 'dllhost.exe') dst.ip.address = *
| filter !(net_ipsubnet(dst.ip.address, '10.0.0.0/8') OR net_ipsubnet(dst.ip.address, '172.16.0.0/12') OR net_ipsubnet(dst.ip.address, '192.168.0.0/16') OR net_ipsubnet(dst.ip.address, '127.0.0.0/8') OR net_ipsubnet(dst.ip.address, '169.254.0.0/16'))
| group connections = count(), first_seen = min(event.time), last_seen = max(event.time) by endpoint.name, src.process.name, dst.ip.address, dst.port.number
| sort -connections
| limit 200Looks for: Command lines that reference the Curlc4 PHP bot (curlc4), its staging file /var/tmp/.sess.zip or its storage/fm working directory, plus the child process the bot renames itself to (crypto) under a PHP parent. The advisory describes Curlc4 as a stand-alone script that talks to the Exchange Web Services API, so it can run from a host that is not itself a victim. Linux sensor.
Known limitations and deployment notes
- PowerQuery: Artifacts that never appear on a process command line, such as a file written by a process the agent did not observe, are not captured.
- PowerQuery assumes: On a Process Creation event src.process.* is the creator (the php process) and tgt.process.* is the new process.
- PowerQuery assumes: endpoint.os holds the lowercase value linux for Linux agents.
- PowerQuery assumes: The user column is src.process.user, the creator's account.
- PowerQuery assumes: The script artifact is matched as sess.zip without the CQL's leading dot, so a differently prefixed copy also matches; the AA26-281A path is /var/tmp/.sess.zip.
- PowerQuery assumes: contains and matches are case-insensitive by default; the process-name equality is case-sensitive.
// HUNT: Curlc4 mail-theft bot artifacts on Linux hosts // MITRE: T1114.002 | T1074.001 | T1020 // CONF: medium FP: low COST: low | REQUIRES: Linux process creation with command line (Falcon: ProcessRollup2, Linux sensor) // ARTIFACTS: curlc4 script name, /var/tmp/.sess.zip, storage/fm, child process renamed crypto under a php parent (all from AA26-281A) // FALSE POSITIVES: an unrelated binary legitimately named crypto launched by a PHP app #event_simpleName=ProcessRollup2 | event_platform=Lin | (CommandLine="*curlc4*" OR CommandLine="*.sess.zip*" OR CommandLine="*storage/fm*" OR (FileName="crypto" ParentBaseFileName=/^php/i)) | groupBy([aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], function=[count(as=hits), min(@timestamp, as=firstSeen)], limit=max) | sort(firstSeen, order=asc)
5 required fields · View requirements
Required telemetry
- SentinelOne EDR Process Creation events from Linux agents
Required fields
event.type: Event typeendpoint.os: Operating systemtgt.process.cmdline: Created process command linetgt.process.name: Created process namesrc.process.name: Creating process
Recommended fields
event.time: Event timeendpoint.name: Host name
Optional fields
src.process.user: User
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' endpoint.os = 'linux' tgt.process.cmdline = * tgt.process.name = * src.process.name = * | limit 5 | columns event.time, endpoint.name, event.type, endpoint.os, tgt.process.cmdline, tgt.process.name, src.process.name
// HUNT: Curlc4 mail-theft bot artifacts on Linux hosts
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1114.002, T1074.001, T1020
// CONF: medium | FP: low
// FALSE POSITIVES: an unrelated binary legitimately named crypto launched by a PHP app
// EQUIVALENCE: equivalent-with-schema-assumptions - Same artifact predicate on Linux process creation: three command-line substrings, or a process named crypto created by a php parent.
// REQUIRES: SentinelOne EDR Linux process-creation telemetry with the command line
// TUNING: An unrelated binary legitimately named crypto launched by a PHP application is the known benign match; confirm the hit by its command line and path.
// LOOKBACK: 30d; set with the console time picker or the query window
// CONFIGURATION: No custom detection rule or lookup table is required to run the hunt.
// KNOWN GAPS: Artifacts that never appear on a process command line, such as a file written by a process the agent did not observe, are not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' endpoint.os in:anycase ('linux') (tgt.process.cmdline contains ('curlc4', 'sess.zip', 'storage/fm') OR (tgt.process.name = 'crypto' src.process.name matches '^php'))
| group hits = count(), first_seen = min(event.time) by endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline
| sort +first_seen
| limit 200Looks for: Execution of the open-source scanners and recon tools the advisory lists (fscan, nbtscan, ksubdomain, masscan, nmap, dirsearch, wpscan, sqlmap, OneForAll, ShuiZe and others) plus JuicyPotato, by binary name or by the Python script named on the command line. Most are dual-use, so this is a triage hunt on hosts that should never run them (servers, standard user workstations).
FP: authorized penetration testing and vulnerability management. Exclude scanner hosts and named red-team accounts.
Known limitations and deployment notes
- PowerQuery: Authorized penetration testing and vulnerability management scanners match by design.
- PowerQuery assumes: On a Process Creation event tgt.process.* is the new process; src.process.user is the creator's account.
- PowerQuery assumes: A non-word character class on each side of the script name stands in for the CQL word boundary.
- PowerQuery assumes: matches is case-insensitive by default, matching the CQL /i flag.
// HUNT: Scanning and recon tool execution named in AA26-281A // MITRE: T1595.002 | T1046 | T1068 // CONF: medium FP: medium COST: low | REQUIRES: process creation with command line (Falcon: ProcessRollup2, Windows and Linux sensors) // FALSE POSITIVES: authorized penetration testing; vulnerability management scanners // TUNING: exclude scanner hosts with ComputerName!=/^REPLACE_WITH_SCANNER_HOST$/i and red-team accounts with UserName!=/^REPLACE_WITH_REDTEAM_ACCOUNT$/i #event_simpleName=ProcessRollup2 | FileName=/^(fscan|nbtscan|nbtscan_linux|ksubdomain|ksubdomain_linux|masscan|nmap|JuicyPotato|dirsearch|wpscan|sqlmap)(\.exe|\.py)?$/i OR CommandLine=/\b(dirsearch|BBScan|OneForAll|ShuiZe|PackerFuzzer|subDomainsBrute|dirmap)\.py\b/i | groupBy([aid, ComputerName, UserName, FileName, CommandLine], function=[count(as=hits), min(@timestamp, as=firstSeen)], limit=max) | sort(firstSeen, order=asc)
3 required fields · View requirements
Required telemetry
- SentinelOne EDR Process Creation events
Required fields
event.type: Event typetgt.process.name: Created process nametgt.process.cmdline: Created process command line
Recommended fields
event.time: Event timeendpoint.name: Host name
Optional fields
src.process.user: User
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.time, endpoint.name, event.type, tgt.process.name, tgt.process.cmdline
// HUNT: Scanning and recon tool execution named in AA26-281A // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1595.002, T1046, T1068 // CONF: medium | FP: medium // FALSE POSITIVES: authorized penetration testing; vulnerability management scanners // EQUIVALENCE: equivalent-with-schema-assumptions - Same recon-tool predicate on process creation: a tool name match, or one of seven Python tool scripts on the command line. // REQUIRES: SentinelOne EDR process-creation telemetry with the command line, on Windows and Linux agents // TUNING: Exclude scanner hosts by endpoint.name and red-team accounts by src.process.user after confirming the authorized testing schedule. // LOOKBACK: 30d; set with the console time picker or the query window // CONFIGURATION: No custom detection rule or lookup table is required to run the hunt. // KNOWN GAPS: Authorized penetration testing and vulnerability management scanners match by design. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' (tgt.process.name matches '^(fscan|nbtscan|nbtscan_linux|ksubdomain|ksubdomain_linux|masscan|nmap|JuicyPotato|dirsearch|wpscan|sqlmap)([.]exe|[.]py)?$' OR tgt.process.cmdline matches '(^|[^A-Za-z0-9_])(dirsearch|BBScan|OneForAll|ShuiZe|PackerFuzzer|subDomainsBrute|dirmap)[.]py([^A-Za-z0-9_]|$)') | group hits = count(), first_seen = min(event.time) by endpoint.name, src.process.user, tgt.process.name, tgt.process.cmdline | sort +first_seen | limit 200
Detection Rules by Platform
Two queries are specific enough to promote to Custom IOAs. Both ship in detect-only (monitor) mode. No IOA in this pack uses a prevent action: the signals involve legitimate binary names and legitimate software, and nothing here has two independent sources behind a blocking decision.
CrowdStrike: Custom IOA
| IOA name | Source query | Pattern | Exclusions | Deployment path |
|---|---|---|---|---|
| Exchange IIS Worker Spawns Shell or Recon Tool | Promote Q4 | Windows process creation: parent image w3wp.exe, child image matching cmd, powershell, wscript, cscript, mshta, rundll32, regsvr32, certutil, bitsadmin, whoami, net, nltest, wmic | Scope the rule to the Exchange host group; exclude the monitoring service account | Falcon console, Custom IOAs, Windows, Process Creation rule, host group = Exchange servers, action = Detect for 14 days, review hits, keep at Detect |
| System Binary Name Outside System Directories | Promote Q10 | Windows process creation: image file name live700_v1.exe, DiagTrack.exe, conhost.exe or dllhost.exe where the image path is not under the Windows System32, SysWOW64 or WinSxS directories | None known; confirm on a pilot group that no installer stages these names | Falcon console, Custom IOAs, Windows, Process Creation rule, pilot host group, action = Detect for 7 days, then all workstations and servers, keep at Detect |
The other twelve queries stay investigate-only. Q1 to Q3 and Q11 are retrospective and belong in IOC Management and scheduled searches, not IOAs. Q5, Q6, Q8, Q9, Q12 and Q14 carry medium-or-higher FP sources that need a human reviewing hits.
SentinelOne: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| Exchange IIS Worker Spawns Shell or Recon Tool | Q4, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| System Binary Name Outside System Directories | Q10, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written |
Create the rule with POST /web/api/v2.1/cloud-detection/rules, queryType: "scheduled" and queryLang: "2.0", with the query in data.scheduledParams.query. Use 2.0 operator spellings: a rule written with the 1.0 token ContainsCIS was accepted and never fired on a tenant. The API does not warn, so lint the body before deploying.
Machine-Readable IOC Appendix
Why every row is detect. Prevent or critical severity needs two independent saved sources. Almost every indicator here comes from one document (CISA AA26-281A), and the three that appear in the DOJ release plus the Hacker News are the domains, which are already seized and sinkholed, so blocking them protects nothing new. SoftEther, fscan and JuicyPotato hashes are legitimate or public software. The two IPs come from one secondary report. All 33 rows are detect with a 2027-04-10 expiry.
type,value,action,severity,expiration,description,tags domain,c0cc.cc,detect,medium,2027-04-10,Flax Typhoon Microscan access domain - seized 2026-10-08,campaign:FlaxTyphoon domain,98aicai.com,detect,medium,2027-04-10,Flax Typhoon FishHub malware delivery domain - seized 2026-10-08,campaign:FlaxTyphoon domain,98aicode.com,detect,medium,2027-04-10,Flax Typhoon FishHub malware delivery domain - seized 2026-10-08,campaign:FlaxTyphoon domain,outlook3650.com,detect,medium,2027-04-10,Flax Typhoon FishHub delivery domain - Outlook/Microsoft 365 brand lookalike - seized 2026-10-08,campaign:FlaxTyphoon domain,youtubecard.com,detect,medium,2027-04-10,Flax Typhoon FishHub delivery domain - YouTube brand lookalike - seized 2026-10-08,campaign:FlaxTyphoon domain,linkedinns.net,detect,medium,2027-04-10,Flax Typhoon FishHub delivery domain - LinkedIn brand lookalike - seized 2026-10-08,campaign:FlaxTyphoon domain,98aiblog.com,detect,medium,2027-04-10,Flax Typhoon SoftEther hosting domain - named in AA26-281A - reported as seventh seized domain by Hacker News only - not in DOJ release,campaign:FlaxTyphoon domain,natcloudservice.com,detect,medium,2027-04-10,Flax Typhoon Curlc4 mail-theft bot main C2 domain,campaign:FlaxTyphoon domain,upl.natcloudservice.com,detect,medium,2027-04-10,Flax Typhoon Curlc4 download and upload host,campaign:FlaxTyphoon domain,dns.studiocloud.xyz,detect,medium,2027-04-10,Flax Typhoon DiagTrack.exe encrypted HTTP C2 attributed to Integrity Tech by the FBI,campaign:FlaxTyphoon domain,studiocloud.xyz,detect,medium,2027-04-10,Flax Typhoon infrastructure parent domain - AA26-281A Table 12,campaign:FlaxTyphoon domain,96cee.com,detect,low,2027-04-10,Flax Typhoon infrastructure domain - AA26-281A Table 12,campaign:FlaxTyphoon domain,javacheck.ooguy.com,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN host,campaign:FlaxTyphoon domain,javaupdate.giize.com,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN host,campaign:FlaxTyphoon domain,pw.sexytube0.com,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN host,campaign:FlaxTyphoon domain,ximmd.sexytube0.com,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN host,campaign:FlaxTyphoon domain,hmbcloud.net,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN hosting domain,campaign:FlaxTyphoon domain,hmbcloud.com,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN hosting domain,campaign:FlaxTyphoon domain,hmbiplc-01.com,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN hosting domain,campaign:FlaxTyphoon domain,asean.twimg.co.uk,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN host - twimg.co.uk is a lookalike - the legitimate CDN is twimg.com,campaign:FlaxTyphoon domain,bsnl.twimg.co.uk,detect,medium,2027-04-10,Flax Typhoon SoftEther VPN host,campaign:FlaxTyphoon ipv4,149.28.132.137,detect,medium,2027-04-10,Flax Typhoon Curlc4 download host - upl.natcloudservice.com,campaign:FlaxTyphoon ipv4,202.182.109.151,detect,medium,2027-04-10,Flax Typhoon botnet database server - court documents as reported,campaign:FlaxTyphoon ipv4,198.13.53.226,detect,medium,2027-04-10,Flax Typhoon Microscan original host - court documents as reported,campaign:FlaxTyphoon sha256,c4503db6ece93eddf4511e787607cb14606a1df9f526f1e39992497119437cec,detect,high,2027-04-10,Flax Typhoon live700_v1.exe XSS-delivered payload,campaign:FlaxTyphoon sha256,804a53be802378a8ec4c94602fd3d6584e0d472d83148e8a42c731950fec415d,detect,high,2027-04-10,Flax Typhoon DiagTrack.exe masquerading C2 implant,campaign:FlaxTyphoon sha256,add7dd142e4f7e2873bc8f7b7fb6308063608e0b49a773dea93abad4047f1489,detect,high,2027-04-10,Flax Typhoon office-cli Linux Outlook 365 mail exfiltration tool,campaign:FlaxTyphoon sha256,9dc85f9569a15eaf51c7d34254767ea30dd67b2178cec4cc7125288b9544fe00,detect,high,2027-04-10,Flax Typhoon dc.exe DCSync tool,campaign:FlaxTyphoon sha256,b1552703ff0035f197c22cdb3a514bb6aa45ec98de3ef5409faab0978f18c35e,detect,medium,2027-04-10,Flax Typhoon renamed SoftEther client saved as conhost.exe - legitimate VPN software,campaign:FlaxTyphoon sha256,8a592e22c51311d482272ec5aba0103c9cd0cfd78e5b5ba75dfa8f1c56926672,detect,medium,2027-04-10,Flax Typhoon renamed SoftEther client saved as dllhost.exe - legitimate VPN software,campaign:FlaxTyphoon sha256,86f1cfa6a2e0a8cb6fc1fbee28472308e6467932f8658a6a4885e29ed8c34a67,detect,medium,2027-04-10,Flax Typhoon renamed SoftEther client saved as dllhost.exe - second build - legitimate VPN software,campaign:FlaxTyphoon sha256,7b9efc7ef8957411cdd22582ce4bfb3a5f76d9c91cdb7e36bf85c9785a2480e9,detect,low,2027-04-10,Flax Typhoon fscan.exe scanner - public open-source tool,campaign:FlaxTyphoon sha256,e7e727458f573dded05537baddac2867d2801db1c3c74410398d063dfd6f6575,detect,low,2027-04-10,Flax Typhoon JuicyPotato.exe privilege escalation - public open-source tool,campaign:FlaxTyphoon
This pack does not ship a SentinelOne import block: the import format could not be verified against SentinelOne's own documentation. Export a sample from your console and the block can be added with confidence.
# Behavioral signatures (durable detections; atomic indicators above are perishable) w3wp.exe (IIS worker process) as parent of cmd, powershell, wscript, mshta, certutil or recon binaries on an Exchange server conhost.exe or dllhost.exe running from outside the Windows System32, SysWOW64 or WinSxS directories, or holding an external network connection Executable named DiagTrack.exe or live700_v1.exe on disk or in process lists One source address with failed logons or sign-ins across ten or more distinct accounts (EBurst password spraying) Ten EBurst interfaces on Exchange: ECP, EWS, OAB, OWA, RPC, API, MAPI, PowerShell, Autodiscover, Microsoft-Server-ActiveSync Curlc4 artifacts: /var/tmp/.sess.zip, $dir/storage/fm/.run, $dir/.run, child process renamed crypto, HTTP header X-Id on requests to the EWS path Staged archives renamed 001.gif, All_scanner_vXX.pl.gz, Css.js, Include.png, M2k.js, M2k_list.js, M2k_ui_adm.js SoftEther installers pulled with PowerShell, curl or wget from attacker infrastructure and set to auto-reconnect on startup Directory replication (DCSync) requests from a host that is not a domain controller
# Named malware and tooling in AA26-281A (reference, mixed legitimate and malicious) Microscan -- Python web application with 1,300+ scripts; seized 2026-10-08 (DOJ, CISA) FishHub -- spear-phishing and malware delivery platform; seized 2026-10-08 (DOJ) live700_v1.exe / DiagTrack.exe -- XSS-delivered payload and its masquerading implant (CISA) Curlc4 (curlc4.txt) -- PHP bot using the Exchange Web Services API for mail theft (CISA) office-cli -- Linux utility for continuous Outlook 365 mail collection with client credentials (CISA) EBurst -- open-source Python password spraying and guessing tool for Exchange (CISA) DC.exe -- DCSync tool (CISA) SoftEther VPN client renamed conhost.exe or dllhost.exe -- persistence (legitimate software, detect only) Open-source scanners: BBScan, dirsearch, Fscan, ksubdomain, masscan, NMAP, OneForAll, ShuiZe, wpscan, sqlmap, JuicyPotato (public tools, detect only) Webshell names: b374.php, back.pl, error.jsp, file_back.aspx, gf.phtml, yaml-payload.jar (CISA Table 13; hashes in the advisory)
# Patch and exposure audit (run on the relevant host type) proftpd -vv | grep -i mod_copy # CVE-2015-3306 needs mod_copy loaded; no output = not loaded proftpd -v # affected: 1.3.5 per AA26-281A; upgrade to a supported release named -v # CVE-2015-5477: affected before 9.9.7-P2 and 9.10.x before 9.10.2-P3 grep -rn "DynamicMethodInvocation" /path/to/struts.xml # must be false; Struts 2.3.19 to 2.3.28 ranges affected strapi --version (or check package.json) # CVE-2023-22894: affected up to 4.5.5 # ONLYOFFICE Docs / DocumentServer: affected 5.1.5 through 5.6.2 (CVE-2021-3199). Upgrade to a supported release. # Exchange (PowerShell): list exposed protocol endpoints to restrict Get-OwaVirtualDirectory | Format-List Server,ExternalUrl Get-EcpVirtualDirectory | Format-List Server,ExternalUrl Get-WebServicesVirtualDirectory | Format-List Server,ExternalUrl
Detection Validation Gates
| Gate | Requirement | Status in this pack |
|---|---|---|
| Telemetry ready | Endpoint sensor on every Exchange server, every Linux host running ProFTPD, ONLYOFFICE, Strapi or Struts, and on domain controllers (process creation with parent name, failed logons, DNS lookups, outbound connections). Identity Protection module for Q9. Entra sign-in logs in your SIEM for the native hunts. | Verify per tenant: Linux server coverage is the usual gap |
| Benign baseline | Run Q4, Q5, Q6, Q8, Q9, Q12 and Q14 in investigate mode for one full patch and release cycle. Record the legitimate parents and accounts for the exclusions marked TUNING. | Required before any alerting |
| Positive tests | Q4: start cmd.exe from a test IIS worker on a lab host. Q10: copy a harmless binary to a temp folder under the name conhost.exe and run it. Q8: generate failed network logons for ten test accounts from one lab address. Do not use real malware. | Not yet performed: no lab run was done for this pack |
| Promotion criteria | Zero unexplained hits across the baseline window before moving Q4 or Q10 from Detect to any stronger action. This pack recommends staying at Detect. | Pending tenant validation |
| Field validation | RemoteAddressIP4 on UserLogonFailed2 (Q8) and the ONLYOFFICE process names docservice and converter (Q6) are not confirmed in the references used. | ⚠ validate in tenant |
Hardening: Tiered & Deployable
- Patch or isolate the five KEV products (federal due date 2026-10-11). ProFTPD, ONLYOFFICE Docs, Strapi, Apache Struts and ISC BIND. MITRE M1051 (Update Software). If a product is end-of-life, remove it from the internet (M1042). Verify with the version commands in the Section 10 audit block. Authority: CISA KEV required action (BOD 26-04).
- Block legacy authentication and enforce MFA for Exchange Online and Microsoft 365. MITRE M1032 (Multi-factor Authentication), M1036 (Account Use Policies). CIS Microsoft 365 Foundations Benchmark covers blocking legacy authentication with Conditional Access. Verify: Entra sign-in logs show zero successful legacy-protocol sign-ins. See Playbook A.
- Remove ECP and the Exchange admin surface from the internet. MITRE M1035 (Limit Access to Resource Over Network), M1030 (Network Segmentation). ⚠ best-practice, no formal benchmark for IIS address restriction on Exchange; cite Microsoft Exchange Server security guidance on Microsoft Learn. Verify: an external request to /ecp is refused. See Playbook A.
- Disable ProFTPD mod_copy and Struts Dynamic Method Invocation. MITRE M1042 (Disable or Remove Feature or Program). Verify with the commands in Playbook B.
- Enable Microsoft Defender attack surface reduction rules in audit mode on Exchange servers ("Block Webshell creation for Servers" and the prevalence-based executable rule), then enforce after review. MITRE M1050 (Exploit Protection), M1038 (Execution Prevention). Requires Microsoft Defender Antivirus in active mode; not applicable where another AV holds that role. Verify:
Get-MpPreferenceshows the rule IDs. See Playbook C. - Turn on Exchange Extended Protection and keep Exchange on a supported cumulative update. MITRE M1051, M1054 (Software Configuration). Authority: Microsoft Exchange Server security guidance. ⚠ no formal CIS benchmark for this control.
- Constrain outbound traffic from servers. Servers rarely need arbitrary internet access; block conhost.exe and dllhost.exe external connections at the host firewall and allow-list required destinations. MITRE M1037 (Filter Network Traffic). CIS Controls v8, Control 13.
- Monitor and restrict Entra app registrations and client secrets. MITRE M1018 (User Account Management), M1026 (Privileged Account Management). Verify: the app-secret audit in native hunt N2 returns only known applications.
- Web application input handling. Sanitize user input to prevent XSS payload injection, as AA26-281A advises. MITRE M1021 (Restrict Web-Based Content). Authority: OWASP guidance; CISA AA26-281A mitigations.
- Move off end-of-life or unsupported server software (the Strapi KEV entry is flagged end-of-life, the Struts and ProFTPD versions in scope are many years old). MITRE M1051. Authority: CISA KEV note on EoL products.
- Put internet-facing Linux servers under an endpoint sensor and forward web, FTP and DNS logs to a central store, so Q5 to Q7 and N3 to N5 work. MITRE M1047 (Audit).
- Segment Exchange, domain controllers and web tiers so a web foothold cannot reach directory replication. MITRE M1030. CIS Controls v8, Control 12. DISA STIGs exist for Apache Tomcat and ISC BIND 9.x and should be applied to those products.
- Tiered administration and DCSync rights review. Only domain controllers and a short list of accounts hold directory replication rights. MITRE M1026. Verify with the ACL review in Playbook D.
Deployable Playbooks
Playbook A: Exchange and Microsoft 365 spray resistance
Playbook A: Exchange and Microsoft 365 password spray resistance Prerequisites: Exchange Online admin and Conditional Access admin roles; change window for the on-premises IIS edit; a break-glass account excluded from the policy. Reboot required: No (IIS restart of the Exchange front end site is not required for ipSecurity changes). Rollback: delete the Conditional Access policy or set it to Report-only; remove the IIS restriction with the appcmd clear line below. Step 1. Report-only first. In the Entra admin center create a Conditional Access policy: Users: all users, exclude the break-glass account Target resources: Office 365 Exchange Online Conditions, Client apps: Exchange ActiveSync clients and Other clients (legacy authentication) Grant: Block access Enable policy: Report-only for 7 days, review the sign-in logs, then On. Step 2. Restrict the Exchange admin center on the on-premises front end to management networks (replace the example ranges): %windir%\system32\inetsrv\appcmd.exe set config "Default Web Site/ecp" -section:system.webServer/security/ipSecurity /allowUnlisted:false /commit:apphost %windir%\system32\inetsrv\appcmd.exe set config "Default Web Site/ecp" -section:system.webServer/security/ipSecurity /+"[ipAddress='192.0.2.0',subnetMask='255.255.255.0',allowed='true']" /commit:apphost (requires the IIS "IP and Domain Restrictions" feature, Web-IP-Security) Step 3. Verify: from an address outside the allowed range, request https://<exchange-host>/ecp and expect HTTP 403. Rollback for step 2: %windir%\system32\inetsrv\appcmd.exe clear config "Default Web Site/ecp" -section:system.webServer/security/ipSecurity /commit:apphost
Playbook B: Linux server software
Playbook B: Linux server software (ProFTPD, Struts, BIND, Strapi, ONLYOFFICE) Prerequisites: root access; a maintenance window; a config backup (cp -a /etc/proftpd /etc/proftpd.bak). Reboot required: No. Services restart only. Rollback: restore the backed-up configuration and restart the service. For package upgrades, keep the previous package file for downgrade. ProFTPD (CVE-2015-3306, mod_copy): 1. Check: proftpd -vv | grep -i mod_copy 2. If present, comment out the module in the modules configuration (the file name varies by distribution, for example /etc/proftpd/modules.conf) by prefixing the LoadModule mod_copy.c line with #. 3. Restart: systemctl restart proftpd 4. Verify: proftpd -vv | grep -i mod_copy (no output) 5. Upgrade to a supported ProFTPD release; AA26-281A lists 1.3.5 as affected. Rollback: remove the leading # and restart. Apache Struts (CVE-2016-3081): 1. In struts.xml set: <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 2. Redeploy or restart the servlet container. 3. Upgrade to a supported Struts release; the affected ranges are 2.3.19 to 2.3.28 per AA26-281A. Rollback: restore the previous struts.xml and restart. ISC BIND (CVE-2015-5477): upgrade to 9.9.7-P2 or later (9.10.x: 9.10.2-P3 or later) or, better, a currently supported branch. Verify: named -v. Rollback: reinstall the previous package; this vulnerability is denial of service only, so rollback is rarely wanted. Strapi (CVE-2023-22894): upgrade past 4.5.5; do not expose the admin panel to the internet (restrict by firewall or reverse proxy allow-list). Rollback: redeploy the previous build. ONLYOFFICE Docs (CVE-2021-3199): upgrade beyond 5.6.2 to a supported release; place the document server behind an authenticated reverse proxy. Rollback: redeploy the previous container or package.
Playbook C: Attack surface reduction on Exchange servers
Playbook C: Microsoft Defender attack surface reduction on Exchange servers (audit first) Prerequisites: Microsoft Defender Antivirus is the active antivirus (not passive mode); Windows Server 2016 or later; test on one server. Reboot required: No. Rollback: set the rule action to Disabled with the same cmdlet, or remove the rule ID. Step 1. Audit mode: Add-MpPreference -AttackSurfaceReductionRules_Ids a8f5898e-1dc8-49a9-9878-85004b8a61e6 -AttackSurfaceReductionRules_Actions AuditMode (Block Webshell creation for Servers) Add-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25 -AttackSurfaceReductionRules_Actions AuditMode (Block executable files from running unless they meet prevalence, age or trusted list criteria) Step 2. Review events for 14 days (Microsoft-Windows-Windows Defender/Operational, event 1122). Step 3. Verify: (Get-MpPreference).AttackSurfaceReductionRules_Ids Step 4. Enforce one rule at a time after review: Set-MpPreference -AttackSurfaceReductionRules_Ids a8f5898e-1dc8-49a9-9878-85004b8a61e6 -AttackSurfaceReductionRules_Actions Enabled Rollback: Set-MpPreference -AttackSurfaceReductionRules_Ids a8f5898e-1dc8-49a9-9878-85004b8a61e6 -AttackSurfaceReductionRules_Actions Disabled
Playbook D: DCSync exposure review
Playbook D: Review directory replication rights (DCSync exposure)
Prerequisites: Domain admin or delegated read access; the ActiveDirectory PowerShell module. This playbook only reads.
Reboot required: No.
Rollback: none required, read-only. Any permission removal you make afterwards must be reverted from your own ACL backup.
Step 1. List principals holding replication rights on the domain root:
$dn = (Get-ADDomain).DistinguishedName
(Get-Acl "AD:$dn").Access | Where-Object { $_.ObjectType -in '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2','1131f6ad-9c07-11d1-f79f-00c04fc2dcd2' } | Select-Object IdentityReference,ObjectType,AccessControlType
(these GUIDs are DS-Replication-Get-Changes and DS-Replication-Get-Changes-All)
Step 2. Expect only domain controllers, Enterprise Domain Controllers and a short named list. Investigate anything else.
Step 3. Back up the ACL before any change: (Get-Acl "AD:$dn").Sddl | Out-File dc-root-acl-backup.txt
Containment Runbook
| Phase | Actions | Owner | Evidence to preserve |
|---|---|---|---|
| Isolate | Network-contain affected hosts in the endpoint console, keeping the sensor connection. For an exposed ProFTPD, ONLYOFFICE, Strapi or Struts server, remove it from the internet-facing path (firewall rule) before patching. Suspend, do not delete, suspect Entra app registrations and block the spraying source addresses at the edge. | IR lead + Infra on-call | Process tree and network connection export for each host; Entra sign-in and audit log export for the exposure window |
| Isolate: by platform | CrowdStrike: network-contain the host. SentinelOne: network quarantine (Disconnect from Network; confirm the label in your console version). | IR lead + Infra on-call | Process tree and network connection export for each host; Entra sign-in and audit log export for the exposure window |
| Eradicate | Remove renamed SoftEther clients (conhost.exe or dllhost.exe outside the system directories), DiagTrack.exe and live700_v1.exe, web shells, Curlc4 files and any cron or scheduled task that launches them. Revoke unknown Entra app secrets and consented applications. Rebuild any host with confirmed code execution as the web service account. | IR lead | Copies of every removed file with SHA-256; list of removed secrets and consents |
| Recover | Patch the five KEV products. Reset passwords for every account that appeared in a spray with a success, enforce MFA, and if a DCSync indicator was confirmed, rotate the krbtgt password twice and reset service-account secrets. Restore only verified-clean data. | Infra + Identity team | Post-change verification output (version commands, Conditional Access report, ACL review) |
| Report and learn | Report to FBI IC3 or CISA (the advisory gives both). Use CISA's Eviction Strategies Tool as the advisory suggests. Add exclusions learned from the baseline to Q4, Q5, Q6, Q8, Q12 and Q14. | IR lead + Legal/Privacy as applicable | Final timeline and scope statement |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | CrowdStrike coverage | SentinelOne |
|---|---|---|---|---|---|
| T1566.002 / T1568 Spearphishing Link, Dynamic Resolution | Contact with FishHub and Microscan domains | Q1, Q2 | N/A | Partial: retrospective only; the domains are seized and resolution after seizure is not described in the sources | Partial: same limit as CrowdStrike |
| T1071 Application Layer Protocol | Contact with named IPs | Q3 | N/A | Partial: two of three IPs are single-source; addresses can be reassigned | Partial: same limit as CrowdStrike |
| T1505.003 / T1190 Web shell, Exploit Public-Facing App (Exchange) | w3wp.exe child processes | Q4 | Exchange IIS Worker Spawns Shell or Recon Tool | Good: Windows sensor on the Exchange server required | Good, with assumptions |
| T1190 Exploit Public-Facing App (Struts) | Java or Tomcat child processes | Q5 | N/A | Partial: only if exploitation spawns a process; assumes a sensor on the host | Partial: same limit as CrowdStrike |
| T1190 Exploit Public-Facing App (Strapi, ONLYOFFICE, PHP) | Linux web and app tier child processes | Q6 | N/A | Partial: ONLYOFFICE process names unverified; no endpoint sensor on appliances or containers | Partial: same limit as CrowdStrike |
| T1190 Exploit Public-Facing App (ProFTPD CVE-2015-3306) | SITE CPFR / CPTO file copy | Q7 | N/A | GAP: the copy happens inside the daemon and the planted file is usually a script; Falcon does not type script-file writes, so Q7 sees only follow-on child processes. Use FTP logs (N5) and file search (N6) | GAP: same limit as CrowdStrike |
| CVE-2015-5477 ISC BIND | TKEY query denial of service | N/A | N/A | GAP: outside endpoint telemetry; denial of service only. Use BIND logs and patching | GAP |
| T1110.003 / T1110.001 Password Spraying (Exchange, AD) | Failed logon fan-out | Q8, Q9 | N/A | Partial: Windows and domain controller view only; behind a load balancer the source is masked | Partial: Q8 approximate, Q9 unavailable |
| T1110.003 Password Spraying (Microsoft 365 / Entra) | Cloud sign-in spraying | N/A | N/A | GAP: outside endpoint telemetry; native hunt N1 and N3 only | GAP |
| T1189 Drive-by (XSS credential harvest) | Malicious page content | N/A | N/A | GAP: web page content is outside endpoint telemetry | GAP |
| T1036.003 / T1204.002 Masquerading, User Execution | live700_v1.exe, DiagTrack.exe, conhost.exe, dllhost.exe | Q10, Q11 | System Binary Name Outside System Directories | Good: FishHub payload details beyond these two names are not public | Good, with assumptions |
| T1133 / T1572 External Remote Services (SoftEther) | Renamed VPN client and its tunnel | Q2, Q10, Q11, Q12 | N/A | Partial: known copies by hash and by name; a differently named SoftEther copy is missed | Partial: same limit as CrowdStrike |
| T1003.006 DCSync | dc.exe and replication requests | Q11 | N/A | Partial: hash only in CQL; behavioral DCSync detection is the Falcon Identity product and native hunt N4 | Partial: same limit as CrowdStrike |
| T1114.002 / T1074.001 / T1020 Mail collection and exfiltration (Curlc4, office-cli) | Curlc4 artifacts, office-cli hash, C2 contact | Q2, Q3, Q11, Q13 | N/A | Partial: Curlc4 can run on a host that is not a victim; mailbox-side access is visible only in Entra and Exchange audit logs | Partial: same limit as CrowdStrike |
| T1595.002 Vulnerability Scanning | Scanner tool execution on a host | Q14 | N/A | Partial: inbound Microscan scanning of your external addresses is visible only in firewall and web logs (N8) | Partial: same limit as CrowdStrike |
| T1566 Spear-phishing email | Message delivery | N/A | N/A | GAP: email gateway telemetry, outside endpoint telemetry (N7) | GAP |
Honest summary. Good coverage exists only for Exchange IIS child processes and the masquerade names, both of which depend on a sensor being present on the server. Five rows are labelled gaps because the activity is outside endpoint telemetry. Retrospective rows prove contact, not compromise. Validation gate status is in Section 11.
Hunt Summary Ticket
TITLE: Flax Typhoon / Integrity Technology Group Microscan and FishHub Hunt SEVERITY: High (state-sponsored, five KEV CVEs due 2026-10-11, mail theft and persistence) SCOPE: Exchange servers, Microsoft 365 tenant, Linux servers running ProFTPD / ONLYOFFICE Docs / Strapi / Struts / BIND, Windows endpoints, domain controllers HYPOTHESIS: Operators scanned with Microscan, got in through a KEV product or Exchange / Microsoft 365 password spraying, persisted with a renamed SoftEther client, and stole mail with Curlc4 or office-cli QUERIES: Q1-Q14 (Section 8); IOAs recommended for Q4 and Q10, detect only (Section 9) DO FIRST: 1. Patch or isolate ProFTPD, ONLYOFFICE Docs, Strapi, Struts and BIND exposed to the internet (Section 12) 2. Run Q1, Q2, Q3 and Q11 over 90 to 180 days of history (Section 8) 3. Run native hunts N1 to N3 for password spraying and app-secret abuse (Section 7) FINDINGS: [populate per engagement] GAPS: Microsoft 365 / Entra sign-ins, Exchange IIS logs, spear-phishing email and BIND crashes are outside endpoint telemetry; script-file writes (PHP, JSP) are not typed by the endpoint sensor; Linux hosts without a sensor are blind; seized-domain hits are retrospective only ACTIONS: Patch KEV products; block legacy authentication and enforce MFA; restrict ECP; deploy Q4 and Q10 as Detect-only IOAs; import the Section 10 CSV as detect only OWNER: [assign per engagement] VERSION: v0.1 (2026-10-10)
Changelog
References
Saved page text for sources 1 to 8 of Section 2 is in FlaxTyphoon-IntegrityTech-Microscan-Hunt-sources/.