ShinyHunters (UNC6240 / UNC6661 / UNC6671): Vishing-to-SaaS Data Theft and PeopleSoft Exploitation
Executive Summary
Attacker objective. ShinyHunters is a financially motivated extortion collective, active since at least 2019, that steals data and demands payment under threat of leaking it. It does not encrypt. Sekoia assesses the name now covers decentralised clusters sharing one brand and tied to The Com. [#1] [#8]
Google tracks the live intrusion work as three clusters. UNC6661 and UNC6671 gain access by voice phishing. UNC6240, the canonical ShinyHunters, runs the extortion and the 2026 Oracle PeopleSoft exploitation. [#2]
Track A: vishing to SaaS data theft. Operators call staff as IT support, send them to a victim-branded sign-in page, capture the SSO password and MFA code, then enroll an MFA device they control. [#2] Okta documents kits that let the caller steer the victim's browser in step with the call, which defeats push and number matching. [#6] Obsidian saw Okta FastPass enrolled from an emulated Android device named "Passkey". [#9] The actor then pulls data from SharePoint, OneDrive, Salesforce, Slack and similar platforms, and in one case authorized an add-on that deletes the "Security method enrolled" email. [#2]
Track B: PeopleSoft exploitation. UNC6240 exploited CVE-2026-35273 (CVSS 9.8) as a zero-day from 27 May to 9 June 2026, before Oracle's 10 June alert. [#3] In September it returned with a one-character URL-encoding trick that bypassed WAF rules and deployed web shells on dozens of systems. [#4] Post-exploitation used MeshCentral agents disguised as Azure services, an SSH credential-spray script, zstd archives and a Tor-hosted leak site. [#3] [#4]
Current status. Law enforcement reported detentions and arrests in September and October 2026. [#12] [#13] Nothing in the sources shows the extortion or exploitation stopping, and the brand reportedly changed hands during the arrests, so treat the threat as live.
Highest-value defensive angle. The first reliable signal is in the identity provider, not on an endpoint: an MFA factor change shortly after a failure-heavy sign-in. [#5] [#9] Patching PeopleSoft is the only reliable fix for Track B, because path-based WAF rules were already bypassed. [#4]
Defender priority: alert on every MFA activation, reset or device enrollment that follows failed sign-ins (Q8, Q9), and on any Java process on a PeopleSoft host that starts a shell (Q5). Patch CVE-2026-35273 and block /PSEMHUB and /PSIGW/HttpListeningConnector on the normalized path.
Source Review & Web Hunter Notes
| # | Tier | Source | Key finding | Carry forward |
|---|---|---|---|---|
| 1 | T1 | MITRE ATT&CK G1057 ShinyHunters (UNC6240, Bling Libra) | Canonical aliases, active since at least 2019, technique catalogue including T1190 on PeopleSoft CVE-2026-35273, MeshCentral masquerade, Tor DLS, extortion mailboxes. | yes |
| 2 | T1 | GTIG/Mandiant: Vishing for Access, Tracking the Expansion of ShinyHunters-Branded SaaS Data Theft (30 Jan 2026) | UNC6661/UNC6671/UNC6240 split, vishing and victim-branded SSO domains, ToogleBox Recall, PowerShell SharePoint theft, 19 source IPs, extortion mechanics. | yes |
| 3 | T1 | GTIG/Mandiant: ShinyHunters Targets Education Sector with Oracle PeopleSoft Exploit (11 Jun 2026) | CVE-2026-35273 zero-day window 27 May to 9 Jun, MeshCentral staging, masqueraded agents, fanout script, hashes, 6 network indicators. | yes |
| 4 | T1 | GTIG/Mandiant: ShinyHunters Renewed Mass Exploitation Campaign Targeting Oracle PeopleSoft (Sep 2026) | %50SEMHUB WAF bypass, fileless and web-shell exploitation, x.jsp/u.jsp, SIDEEYE (Ple64.exe), Neo-reGeorg, MeshAgent domains, hashes, 3 IPs, 1 domain. | yes |
| 5 | T1 | Mandiant: proactive hardening, logging and detection guide for ShinyHunters-branded SaaS intrusions | Containment, help-desk verification, IdP and SaaS hardening, logging requirements, detection logic. Primary source for Sections 12 to 14. | yes |
| 6 | T1 | Okta Threat Intelligence: Phishing kits adapt to the script of callers | Real-time session-orchestration vishing kits defeat push and number matching; FastPass and FIDO passkeys resist. Detailed IOCs are customer-gated. | yes |
| 7 | T1 | FBI IC3 PSA I-20260515-PSA: ShinyHunters Cyber Criminal Group Attacks Learning Management System (15 May 2026) | Government description of extortion pressure: harassment, threatening calls and texts, swatting, Tor leak site, false claims. | yes |
| 8 | T1 | Sekoia: Gotta Breach 'Em All, the journey of ShinyHunters | Group structure (decentralised clusters under a shared alias, link to The Com), 2025 to 2026 timeline, token-theft supply-chain pattern. | partial |
| 9 | T2 | Obsidian Security: Behind the breach, ShinyHunters' 2026 voice phishing campaign | Okta event sequences, FastPass enrollment from an emulated Android device named Passkey, Genymobile user agent, SSO burst, Slack and Drive bulk download. | yes |
| 10 | T3 | Huntress: ShinyHunters threat actor profile | Aggregated campaign timeline (token abuse, Aura exploitation, actor user-agent strings). Used only where a T1 source does not contradict it. | partial |
| 11 | T3 | Picus Security: The ShinyHunters Domino Effect | Background on the ecosystem-breach pattern. No indicators taken. | no |
| 12 | T2 | KrebsOnSecurity: ShinyHunters arrests and extortion (7 Oct 2026) | Current status: reported detentions and arrests, brand takeover, continued PeopleSoft mass exploitation and the WAF-bypass update. | yes |
| 13 | T2 | BleepingComputer: FBI arrests another suspected ShinyHunters hacker (Oct 2026) | Corroborates the October 2026 arrests and the PeopleSoft attribution. | partial |
Web Hunter decisions
- Atomic IOCs come from Tier 1 only. Every hash, address and domain shipped in Section 10 appears verbatim in a saved GTIG report (sources 2, 3 or 4). Each source is snapshotted under the pack's sources folder for the provenance gate.
- Dropped. Two further indicators appeared only in third-party aggregator pages and in no vendor report. They are not in the pack.
- Typo reconciled. MITRE lists one extortion mailbox as
shinycorp@tutonota[.]com. GTIG writesshinycorp@tutanota[.]com. The pack lists the GTIG spelling and keeps the MITRE variant as a hunt string. - No victim names. Victims named in sources are not repeated here. The pack is written around tradecraft so it ports to any environment.
- Related packs. The library already holds a PeopleSoft CVE-2026-35273 pack (v0.3, June 2026) with six endpoint queries for the June zero-day activity, plus packs for UNC6671 vishing and AiTM, a Teams-vishing cluster, a Salesloft-Drift OAuth campaign, and Scattered Spider. This pack covers ShinyHunters as one actor. It repeats the June PeopleSoft infrastructure so it stands alone, and adds the September renewed exploitation (the %50SEMHUB WAF bypass, web shells, SIDEEYE, Neo-reGeorg, new addresses and domains) and the full Okta, Microsoft 365, Google Workspace and Salesforce track. See the PeopleSoft pack for its June-specific detail.
Contradictions and gaps
- The June report lists five staging addresses and one mirror address. The September report lists three different addresses. They are different infrastructure generations, not a conflict.
- GTIG's 19 January source IPs are residential-proxy and VPN addresses from January 2026. They are perishable and shared, so the pack uses them for hunting only.
- Okta's indicator list and kit analysis are available only to Okta security contacts. This pack uses only what Okta published openly.
- GTIG says the x.jsp, tunnel.jsp and tunnel.jspx hashes vary per deployment. Hunt those by name and path, not by hash.
- Attribution is layered: UNC6661, UNC6671 and UNC6240 are separate clusters that GTIG links by shared extortion infrastructure. Do not assume one operator.
Overall confidence: High. At least two Tier 1 sources agree on every central claim. Perishability is high for the IP lists and low for tradecraft.
Hunt Brief & Attack Chain
Hunt hypotheses (ordered by fidelity)
| ID | Hypothesis | MITRE | Telemetry required | Expected FP | Confidence | Queries |
|---|---|---|---|---|---|---|
| H1 | Vishing-led account takeover: a failure-heavy sign-in ends in success, then the attacker enrolls their own MFA factor within minutes. | T1566.004 (inferred), T1078.004, T1098.005, T1556.006 | Okta System Log; Entra sign-in and audit logs | New hires and genuine device replacement | High | Q7, Q8, Q9, Q10 |
| H2 | Post-authentication bulk theft from SharePoint, OneDrive and Salesforce using scripts and native export features. | T1213.002, T1530, T1567, T1213.006 | Microsoft 365 Unified Audit Log; Salesforce Event Monitoring | Sanctioned migration, backup and Data Loader jobs | High | Q11, Q13 |
| H3 | Concealment: an add-on is authorized to delete the MFA-enrollment notification, and outbound phishing is deleted from the sent items. | T1070.008 (inferred) | Google Workspace OAuth and Gmail audit; Exchange mailbox audit | Deliberate add-on installs | High | Q12 |
| H4 | PeopleSoft CVE-2026-35273 exploitation: POST requests to the EMHub servlet (including the percent-encoded variant), then web shells or fileless shell execution from the WebLogic Java process. | T1190, T1505.003, T1059.003, T1059.004 | Web-server access logs; process creation | Java servers that shell out for admin scripts | High | Q5 plus native hunt N6 |
| H5 | Persistence through MeshCentral agents disguised as Azure services, calling home to Microsoft-lookalike domains. | T1219, T1036.005, T1583.001 | DNS lookups; network connections; process creation; file hashes | Sanctioned MeshCentral deployments | High | Q1, Q2, Q3 |
| H6 | Linux lateral movement and exfiltration staging: sshpass credential spray, a fanout script, zstd archives and SSH to the leak-site mirror. | T1110.003 (inferred), T1021.004 (inferred), T1560.002, T1048 | Process creation; network connections | Backup and admin automation | Medium | Q4, Q2 |
| H7 | Coercion and credential harvest from the PeopleSoft tier: outbound SMB to the internet and reads of psappsrv.cfg. | T1187 (inferred), T1552.001 | Network connections; web-tier file audit | Cloud file shares reached over TCP/445 | Medium | Q6 plus native hunt N7 |
| H8 | Stolen integration tokens (OAuth or API) reused to pivot into Salesforce, Snowflake and BigQuery from the attacker's own infrastructure. | T1528, T1550.001, T1530 | SaaS connected-app and API audit logs, outside endpoint telemetry | Normal third-party integrations | Medium | Partial: Q13, native hunt N5 |
Attack chain
| Step | Behavior | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | Lure infrastructure: victim-branded domains such as <org>sso, <org>internal, <org>support, registered mostly at NICENIC or Tucows. | DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); proxy and email gateway logs | Resolve and click events for new lookalike domains of your own brand name |
| 2 | Voice phish: caller poses as IT support, victim enters SSO password and MFA code on the lookalike page. | Identity-provider and SaaS audit logs (Okta System Log, Entra sign-in and audit logs, Microsoft 365 Unified Audit Log, Google Workspace audit, Salesforce Event Monitoring), outside endpoint telemetry | Failure-heavy sign-in chain, often about ten minutes long |
| 3 | MFA persistence: attacker enrolls Okta FastPass or another factor from an emulated Android device named Passkey. | Identity-provider and SaaS audit logs (Okta System Log, Entra sign-in and audit logs, Microsoft 365 Unified Audit Log, Google Workspace audit, Salesforce Event Monitoring), outside endpoint telemetry | MFA activation after failures; Genymobile user agent |
| 4 | SSO burst: the stolen session opens many connected applications quickly to find data. | Identity-provider and SaaS audit logs (Okta System Log, Entra sign-in and audit logs, Microsoft 365 Unified Audit Log, Google Workspace audit, Salesforce Event Monitoring), outside endpoint telemetry | Unusual count of distinct apps per session |
| 5 | Bulk theft: scripted SharePoint and OneDrive downloads, Salesforce bulk export, Slack and Drive downloads seconds apart. | Identity-provider and SaaS audit logs (Okta System Log, Entra sign-in and audit logs, Microsoft 365 Unified Audit Log, Google Workspace audit, Salesforce Event Monitoring), outside endpoint telemetry | PowerShell user agent; row counts; keyword searches such as poc, confidential, vpn |
| 6 | Concealment: ToogleBox Recall authorized; MFA-notification email deleted; phishing sent to contacts, then deleted. | Identity-provider and SaaS audit logs (Okta System Log, Entra sign-in and audit logs, Microsoft 365 Unified Audit Log, Google Workspace audit, Salesforce Event Monitoring), outside endpoint telemetry | OAuth authorization of the add-on; deletions of security emails |
| 7 | Extortion: email, texts and calls, 72-hour Bitcoin demand, Tox, Limewire samples, leak site, harassment, DDoS. | Mail gateway and phone-system records, outside endpoint telemetry | Inbound mail from the listed extortion mailboxes |
| 8 | Track B access: POST requests to /PSEMHUB/hub or /%50SEMHUB/hub, then JSP web shells or shell processes from Java. | Web-server access logs; Process creation with command line, path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Java parent with shell child; new JSP files under PSEMHUB.war |
| 9 | Track B tooling: MeshAgent from /tmp, SIDEEYE (Ple64.exe), Neo-reGeorg tunnel pages. | Process creation with command line, path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Azure-named agents; connections to C2 on TCP/3333 and 3334 |
| 10 | Track B movement and exit: psappsrv.cfg and config.xml reads, sshpass fanout, README marker file, zstd archive, SSH to the leak-site mirror. | Process creation with command line, path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | meshctrl RunCommand, sshpass, zstd, outbound SSH |
Items marked (inferred) are analyst mappings the cited sources do not state. Steps 8 to 10 follow GTIG's June and September reports; steps 1 to 7 follow GTIG's January report, Okta, Obsidian and Mandiant's guide.
Consolidated IOC Table
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| Domain | azurenetfiles.net | high | detect | MeshCentral C2 / staging, Microsoft-lookalike name (primary C2: wss://azurenetfiles.net:443/agent.ashx) |
| Domain | microsoft-entra.net | high | detect | MeshCentral C2 / staging, Microsoft-lookalike name |
| Domain | enroll.azuredevice.cloud | high | detect | MeshCentral C2 / staging, Microsoft-lookalike name |
| Domain | winmanage-me.network | high | detect | MeshCentral C2 / staging, Microsoft-lookalike name |
| IPv4 | 142.11.200.186 | high | detect | Staging host (Python SimpleHTTP :8888, MeshCentral) |
| IPv4 | 142.11.200.187 | high | detect | Staging host (Python SimpleHTTP :8888, MeshCentral) |
| IPv4 | 142.11.200.188 | high | detect | Staging host (Python SimpleHTTP :8888, MeshCentral) |
| IPv4 | 142.11.200.189 | high | detect | Staging host (Python SimpleHTTP :8888, MeshCentral) |
| IPv4 | 142.11.200.190 | high | detect | Staging host (Python SimpleHTTP :8888, MeshCentral) |
| IPv4 | 176.120.22.24 | high | detect | Clearnet mirror of the ShinyHunters data leak site; SSH exfil destination |
| IPv4 | 5.199.162.157 | high | detect | Attack controller, scanner and HTTP callback receiver |
| IPv4 | 104.219.234.138 | high | detect | Exfiltration staging and remote-management host |
| IPv4 | 162.219.30.165 | high | detect | C2 for SIDEEYE backdoor (TCP/3333 control, TCP/3334 data) |
| SHA-256 | f02a924c9ff92a8780ce812511341182c6b509d45bc59f3f7b522e37225d24fc | high | detect | meshagent64-azure-ops.exe |
| SHA-256 | d83fdb9e53c5ff03c4cb0451ea1bebd79b53f29eadc1e2fa394c7af13a86ce2f | high | detect | meshagent64-v2.exe |
| SHA-256 | c7e9332731b06644fc73e0046a2a89eaa59b09f54250e9bd622467187351711f | high | detect | meshagent32-azure-ops.exe |
| SHA-256 | 68257a6f9ff196179ec03624e849927f26599eb180a7c82e14ef5bc4e93bc309 | high | detect | meshagent (Linux, unconfigured) |
| SHA-256 | 3ba215692665513abfffd4e815c5c45f2d41e5dcc4283a2a3b740930c5c417c3 | high | detect | Ple64.exe (SIDEEYE loader) |
| SHA-256 | 2bee941fb40519d0d1ec52bd79a8f63fc65aac6455c8f2d6b668e3360dfdb5d7 | high | detect | u.jsp |
| SHA-256 | 48b4a0827da7bbfce9fb52464f8a659dea7a035189c52c506c0bfb4b1c3fe494 | low | hunt | x.jsp: GTIG says the hash varies per deployment; hunt by name and path |
| SHA-256 | 419c571ee38b7e7266d130c4b6bbc4dd0ef44d6e5f3bc02cc2cf73b762f07c86 | low | hunt | tunnel.jsp: GTIG says the hash varies per deployment; hunt by name and path |
| SHA-256 | ba14419beb2ec0bb94cab6298c14d7fb3e1d819366fe378290c0c2a4d97f7e07 | low | hunt | tunnel.jspx: GTIG says the hash varies per deployment; hunt by name and path |
| SHA-256 | 2ab684d93c1553fad87041b4dea97188a97e78589deee2a7bacff905564f3a35 | medium | enrich | .bash_history: attacker command history from the staging hosts |
| File name | x.jsp under PSEMHUB.war | high | detect | JSP web shell or Neo-reGeorg tunnel |
| File name | u.jsp under PSEMHUB.war | high | detect | JSP web shell or Neo-reGeorg tunnel |
| File name | u2.jsp under PSEMHUB.war | high | detect | JSP web shell or Neo-reGeorg tunnel |
| File name | tunnel.jsp under PSEMHUB.war | high | detect | JSP web shell or Neo-reGeorg tunnel |
| File name | tunnel.jspx under PSEMHUB.war | high | detect | JSP web shell or Neo-reGeorg tunnel |
| File name | Ple64.exe under PSEMHUB.war | high | detect | Trojanized installer delivering SIDEEYE |
| File name | README-IF-YOU-SEE-THIS-YOUVE-BEEN-HACKED.TXT | high | detect | Defacement and extortion marker copied to WebLogic and Process Scheduler directories |
| File name | <victim_abbreviation>_fanout.sh | high | detect | SSH credential-spray and marker-deployment script in /tmp |
| Linux paths | /tmp/meshagent, /tmp/meshagent.msh, /tmp/meshagent.db | high | detect | MeshAgent dropped under the PeopleSoft service account |
| URI | /PSEMHUB/hub, /%50SEMHUB/hub, /PSIGW/HttpListeningConnector | high | hunt | Exploitation path; assume any percent-encoded or mixed-case variant |
shinycorp@tutanota[.]com | high | hunt | Extortion contact (GTIG spelling) | |
shinygroup@onionmail[.]com | high | hunt | Extortion contact | |
shinycorp@tuta[.]com, shinygroup@tuta[.]com | medium | hunt | Extortion contacts listed by MITRE | |
| Domain pattern | <org>sso[.]com, <org>internal[.]com, <org>support[.]com, <org>okta[.]com, <org>access[.]com | medium | hunt | Victim-branded lookalikes; NICENIC (UNC6661) and Tucows (UNC6671) registrars |
| User agent | Genymobile / Geny Mobile (Okta Android client com.okta.android.auth) | high | detect | Emulated Android enrolling FastPass |
| Device name | Passkey | medium | hunt | Okta Verify / FastPass device name used in all three Obsidian incidents |
| User agent | WindowsPowerShell/5.1 against SharePoint or OneDrive | medium | hunt | Scripted bulk download |
| OAuth app | ToogleBox Recall | high | detect | Add-on that permanently deletes mail; authorized to hide the MFA-enrollment email |
| User agent | RapeForce, RapeFlake | medium | hunt | Actor strings reported for the Aura and earlier Snowflake campaigns (Tier 3 source) |
| IPv4 (19) | See the IdP/SaaS source-IP watchlist in Section 10 | medium | hunt | Residential proxy and VPN addresses from January 2026; perishable, hunt only |
Action vocabulary: detect alert or block, hunt search and review, enrich add context only. Sources: Tier 1 reports 2, 3, 4 and MITRE 1; Obsidian 9 for Okta behavior.
Affected Surface & Telemetry Matrix
| Surface | Telemetry | Priority | Gap |
|---|---|---|---|
| Identity providers: Okta, Entra ID, Google Workspace | Identity-provider and SaaS audit logs (Okta System Log, Entra sign-in and audit logs, Microsoft 365 Unified Audit Log, Google Workspace audit, Salesforce Event Monitoring), outside endpoint telemetry | Critical | Needs SIEM ingest of authentication, MFA-lifecycle and admin events; Okta indicator list is customer-gated |
| Microsoft 365: SharePoint, OneDrive, Exchange | Identity-provider and SaaS audit logs (Okta System Log, Entra sign-in and audit logs, Microsoft 365 Unified Audit Log, Google Workspace audit, Salesforce Event Monitoring), outside endpoint telemetry; Purview Audit must be on | Critical | User agent is captured only if the audit record carries it; retention varies by licence |
| Salesforce and Experience Cloud | Salesforce Event Monitoring (login, API, bulk-result and report-export events), outside endpoint telemetry | High | Event Monitoring is a licensed add-on; basic login history will miss bulk export |
| Other SaaS: Slack, Google Drive, DocuSign, Atlassian | Each product's audit log, outside endpoint telemetry | Medium | Often not ingested; retention windows are short |
| Help desk and phone system | Ticketing and call records; no endpoint telemetry | High | Process control, not a log source |
| Oracle PeopleSoft web tier on WebLogic (Linux and Windows) | Web-server access logs; Process creation with command line, path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); File hashes on process events (CrowdStrike: SHA256HashData. SentinelOne: process image SHA-256. Defender: SHA1 or SHA256) | Critical | Fileless exploitation leaves no file; web-log retention is often short |
| Linux application and database servers | Process creation with command line, path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse) | High | Sensor must be on the PeopleSoft hosts; many are unmanaged appliances |
| Staff endpoints | DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); browser and proxy logs | Medium | The call happens on a phone, so endpoints see only the later sign-in page |
Gaps: nothing in endpoint telemetry sees the phone call, the lookalike page rendered on a personal phone, or SaaS-native exports. Detection for Track A depends on identity-provider and SaaS log ingest.
ATT&CK Mapping
| Tactic | Technique | Name | Observed behavior | Query or control |
|---|---|---|---|---|
| Resource Development | T1583.001 | Acquire Infrastructure: Domains | Victim-branded SSO lookalikes; Microsoft-lookalike C2 names | Q1; N8 |
| Initial Access | T1566.004 (inferred) | Spearphishing Voice | Callers pose as IT support | Q9; process control |
| Initial Access | T1078.004 | Valid Accounts: Cloud Accounts | Stolen SSO credential plus MFA code | Q8, Q9, Q10 |
| Initial Access | T1190 | Exploit Public-Facing Application | CVE-2026-35273 against PeopleSoft EMHub | Q5; N6 |
| Persistence | T1098.005 (inferred) | Account Manipulation: Device Registration | FastPass enrollment from emulated Android | Q7, Q8 |
| Persistence | T1556.006 (inferred) | Modify Authentication Process: Multi-Factor Authentication | Attacker-controlled factor | Q7, Q8 |
| Persistence | T1505.003 | Server Software Component: Web Shell | x.jsp, u.jsp, tunnel.jsp under PSEMHUB.war | Q5; N6 |
| Persistence / C2 | T1219 | Remote Access Software | MeshCentral and ConnectWise | Q1, Q2, Q3 |
| Defense Evasion | T1036.005 | Masquerading: Match Legitimate Name or Location | meshagent64-azure-ops.exe, Azure-named domains | Q1, Q3 |
| Defense Evasion | T1070.008 (inferred) | Indicator Removal: Clear Mailbox Data | ToogleBox Recall deletes the MFA-notification email | Q12 |
| Execution | T1059.003, T1059.004 | Windows Command Shell, Unix Shell | Shells spawned by the WebLogic Java process | Q5 |
| Execution | T1059.007 | JavaScript | meshctrl.js RunCommand | Q4 |
| Credential Access | T1552.001 | Credentials In Files | psappsrv.cfg database credentials | N7 |
| Credential Access | T1187 (inferred) | Forced Authentication | Outbound SMB to capture NetNTLM hashes | Q6 |
| Credential Access | T1528, T1550.001 | Steal Application Access Token; Application Access Token | OAuth and API tokens from integrations | Q13; N5 |
| Discovery | T1083, T1082, T1016 | File and Directory, System Information, Network Configuration | psappsrv.cfg, config.xml, hostname and id | Q4 |
| Lateral Movement | T1021.004, T1110.003 (inferred) | SSH; Password Spraying | sshpass fanout script | Q4 |
| Collection | T1213.002, T1213.006 | SharePoint; Databases | Scripted SharePoint pull; Salesforce datasets | Q11, Q13 |
| Collection | T1560.002 | Archive via Library | zstd archive of exfil directory | Q4 |
| Command and Control | T1090.003, T1573.002 | Multi-hop Proxy; Asymmetric Cryptography | Tor leak site; SSH from staging host | Q2 |
| Exfiltration | T1567, T1048 | Web Service; Alternative Protocol | Limewire samples, SSH and rsync from the PeopleSoft tier | Q2, Q13 |
| Impact | T1657, T1491.001 | Financial Theft; Internal Defacement | 72-hour Bitcoin demand; README marker file | N9 |
Technique IDs come from MITRE G1057 (source 1) and GTIG (sources 2 to 4). Entries marked (inferred) are analyst mappings.
Native Audit-Log Hunts
These checks need no Falcon query. Run them in the product named in each row.
N1 · Okta System Log: MFA lifecycle and emulator
Where: Admin Console, Reports, System Log, or the System Log API.
eventType eq "user.mfa.factor.activate" or eventType eq "user.mfa.factor.reset_all" or eventType eq "device.enrollment.create"
Pivot on actor, client.ipAddress and client.userAgent.rawUserAgent. Look for Genymobile and for a device named Passkey.
N2 · Entra ID: security-info registration
Where: Entra admin center, Monitoring, Audit logs, filter Category = UserManagement.
Activity: User registered security info / User deleted security info
Compare the source IP to the user's normal sign-in locations and to Conditional Access results.
N3 · Microsoft 365: scripted SharePoint and OneDrive downloads
Where: Exchange Online PowerShell.
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-14) -EndDate (Get-Date) -Operations FileDownloaded,FileAccessed -ResultSize 5000 |
Where-Object { $_.AuditData -match 'WindowsPowerShell' } |
Select-Object CreationDate, UserIds, OperationsGroup by user and count. Mandiant's threshold was 50 documents of 3 or more types in 5 minutes.
N4 · Google Workspace: add-on authorization and mail deletion
Where: Admin console, Reporting, Audit and investigation, OAuth log events and Gmail log events.
OAuth log: App name contains ToogleBox Recall. Gmail log: event is delete or permanent delete and subject matches MFA enrollment wording.
A deleted 'Security method enrolled' message is the signal; check outbound mail deleted the same hour.
N5 · Salesforce: bulk export and connected-app token use
Where: Developer console or Workbench against EventLogFile.
SELECT EventType, LogDate, LogFile FROM EventLogFile WHERE EventType IN ('BulkApi','ReportExport','Login','RestApi') AND LogDate = LAST_N_DAYS:14Look for new connected apps, API calls from unfamiliar addresses, and Data Loader user agents. For Experience Cloud, review guest-user API volume.
N6 · PeopleSoft web tier: exploitation attempts and web shells
Where: Shell on each WebLogic node (check every node behind the load balancer).
PS_CFG_HOME=/u01/app/psoft/ps_config_homes/csprd # adjust to your install grep -Eih 'psemhub|%50semhub|psigw/httplisteningconnector' $(find "$PS_CFG_HOME"/webserv -name '*access*log*') | head -200 find "$PS_CFG_HOME"/webserv/*/applications/peoplesoft/PSEMHUB.war \( -name '*.jsp' -o -name '*.jspx' -o -name '*.exe' \) -ls find "$PS_CFG_HOME"/webserv/*/applications/peoplesoft/PSEMHUB.war/envmetadata -type f -ls
Any JSP, JSPX or EXE that is not part of the shipped product is hostile. Five to fifteen POSTs to the hub servlet from one address is target verification.
N7 · PeopleSoft hosts: credential and config reads
Where: Shell with auditd, or EDR file-read telemetry.
ausearch -i -f psappsrv.cfg ausearch -i -f config.xml
Reads of psappsrv.cfg and WebLogic config.xml by a shell or Java child are reconnaissance. Rotate every credential stored there if a web shell is found.
N8 · Proxy, DNS and mail: lookalike domains
Where: DNS, web proxy and mail gateway logs.
Match: ^(my-?)?<yourorg>(sso|internal|support|okta|azure|access)\.(com|net|support)$
Also match ticket-<yourorg>.support and on<yourorg>zendesk.com. Hits mean staff were sent to a lookalike page.
N9 · Mail gateway and phone system: extortion contact
Where: Mail gateway search and phone-system call records.
Sender or reply-to contains shinycorp@tutanota.com, shinygroup@onionmail.com, shinycorp@tuta.com or shinygroup@tuta.com
Brief executives and the help desk. Expect harassing texts and calls to staff and their families.
CrowdStrike LogScale CQL Hunt Queries
Q1 to Q6 run on Falcon sensor telemetry. Q7 to Q13 run on identity and SaaS logs ingested into Falcon Next-Gen SIEM. Their field names depend on your parser, so each carries a validate-in-tenant note. Run one against a sample row before relying on it.
Looks for: Endpoints resolving the four Microsoft/Azure-lookalike domains that front the actor's MeshCentral C2 and staging. FP: none expected: attacker-registered lookalikes with no legitimate use.
// HUNT: DNS resolution of ShinyHunters MeshCentral C2 and Microsoft-lookalike domains // MITRE: T1583.001, T1219, T1036.005 // CONF: high // FP: low // COST: low // REQUIRES: Falcon sensor DNS telemetry (DnsRequest) // FALSE POSITIVES: none expected -- attacker-registered lookalike domains with no legitimate use // LOOKBACK: 90d #event_simpleName=DnsRequest | DomainName=/(^|\.)(azurenetfiles\.net|microsoft-entra\.net|enroll\.azuredevice\.cloud|winmanage-me\.network)$/i | table([@timestamp, aid, ComputerName, DomainName, ContextBaseFileName]) | sort(@timestamp, order=desc)
Looks for: Outbound connections from any host to the nine GTIG-attributed staging, C2 and exfiltration addresses (including SIDEEYE on TCP/3333-3334). FP: none expected; confirm none of the ranges is a sinkhole or scanner you operate.
// HUNT: Connections to PeopleSoft-campaign staging, C2 and exfiltration hosts // MITRE: T1105, T1573.002, T1090, T1048, T1219 // CONF: high // FP: low // COST: low // REQUIRES: Falcon sensor network telemetry (NetworkConnectIP4) // FALSE POSITIVES: none expected -- GTIG-attributed attacker infrastructure // LOOKBACK: 90d #event_simpleName=NetworkConnectIP4 | in(RemoteAddressIP4, values=["142.11.200.186","142.11.200.187","142.11.200.188","142.11.200.189","142.11.200.190","176.120.22.24","5.199.162.157","104.219.234.138","162.219.30.165"]) | table([@timestamp, aid, ComputerName, UserName, RemoteAddressIP4, RemotePort, ImageFileName, CommandLine]) | sort(@timestamp, order=desc)
Looks for: Execution of the Azure-named MeshAgent binaries, the trojanized Ple64.exe installer, or any file with a published SHA-256. FP: a legitimately deployed MeshCentral agent that happens to be named meshagent64-v2.exe; the hash alternative removes the doubt.
// HUNT: Masqueraded MeshCentral agents and the SIDEEYE loader (name or SHA-256) // MITRE: T1036.005, T1219, T1105 // CONF: high // FP: low // COST: low // REQUIRES: Falcon sensor process telemetry (ProcessRollup2/SyntheticProcessRollup2) // FALSE POSITIVES: a sanctioned MeshCentral deployment that reuses the name meshagent64-v2.exe // LOOKBACK: 90d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | (ImageFileName=/(meshagent(32|64)-(azure-ops|v2)|Ple64)\.exe$/i or SHA256HashData=/^(f02a924c9ff92a8780ce812511341182c6b509d45bc59f3f7b522e37225d24fc|d83fdb9e53c5ff03c4cb0451ea1bebd79b53f29eadc1e2fa394c7af13a86ce2f|c7e9332731b06644fc73e0046a2a89eaa59b09f54250e9bd622467187351711f|68257a6f9ff196179ec03624e849927f26599eb180a7c82e14ef5bc4e93bc309|3ba215692665513abfffd4e815c5c45f2d41e5dcc4283a2a3b740930c5c417c3)$/i) | table([@timestamp, aid, ComputerName, UserName, ImageFileName, ParentBaseFileName, SHA256HashData, CommandLine]) | sort(@timestamp, order=desc)
Looks for: The attacker's documented Linux tradecraft on compromised PeopleSoft and WebLogic hosts: MeshCentral CLI remote commands, sshpass credential spray, zstd exfil archives, the fanout script and the defacement marker file. FP: sshpass and zstd are legitimate admin and backup tools; meshctrl.js RunCommand, the fanout script name and the marker file name are not.
// HUNT: Linux post-exploitation tooling (meshctrl RunCommand, sshpass spray, zstd staging, fanout, marker file) // MITRE: T1059.007, T1021.004, T1110.003, T1560.002, T1491.001 // CONF: medium // FP: medium // COST: low // REQUIRES: Falcon Linux sensor process telemetry (ProcessRollup2/SyntheticProcessRollup2) // FALSE POSITIVES: sshpass in admin automation; zstd in backup and log-rotation jobs // TUNING: split the alternation: treat meshctrl.js RunCommand, _fanout.sh and the README marker as high-confidence on their own, and require sshpass or zstd to run as the PeopleSoft/WebLogic service account or from /tmp before alerting // LOOKBACK: 30d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | CommandLine=/(meshctrl\.js\s+RunCommand|sshpass\s+-p|zstd\s+-3\s+-T0|_fanout\.sh|npm\s+list\s+global\s+authenticode|README-IF-YOU-SEE-THIS-YOUVE-BEEN-HACKED)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc)
Looks for: A java process launching cmd.exe, sh, bash or dash. GTIG documents this as how both the fileless POST-response command execution and the x.jsp/u.jsp web shells appear on the host. FP: WebLogic and other Java servers that legitimately shell out for admin or deployment scripts.
// HUNT: Java process (WebLogic/PeopleSoft) spawning a shell // MITRE: T1190, T1505.003, T1059.003, T1059.004 // CONF: high // FP: medium // COST: low // REQUIRES: Falcon sensor process telemetry (ProcessRollup2/SyntheticProcessRollup2), Linux and Windows // FALSE POSITIVES: Java application servers that shell out for deployment, backup or health-check scripts // TUNING: scope to PeopleSoft/WebLogic hosts with a Falcon host group or ComputerName filter, baseline 14 days, then exclude the specific scripts those hosts legitimately launch; keep alerts for base64 -d, curl, /dev/tcp, tasklist and start /b // LOOKBACK: 30d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(java|javaw)(\.exe)?$/i | FileName=/^(cmd\.exe|sh|bash|dash)$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc)
Looks for: Servers opening SMB connections to non-private addresses. Mandiant notes the PeopleSoft exploit chain may coerce the host into outbound SMB to capture machine-account NetNTLM hashes. FP: Azure Files and other cloud file services that legitimately use TCP/445 to public endpoints.
// HUNT: Outbound SMB (TCP/445) from a host to a public address // MITRE: T1187, T1190 // CONF: medium // FP: medium // COST: medium // REQUIRES: Falcon sensor network telemetry (NetworkConnectIP4) // FALSE POSITIVES: cloud file shares (for example Azure Files) reached over TCP/445 by design // TUNING: exclude the public ranges of your sanctioned cloud file services, then restrict to server host groups // LOOKBACK: 14d #event_simpleName=NetworkConnectIP4 | RemotePort=445 | !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","100.64.0.0/10"]) | table([@timestamp, aid, ComputerName, UserName, RemoteAddressIP4, RemotePort, ImageFileName, CommandLine]) | sort(@timestamp, order=desc)
Looks for: Any Okta event whose client user agent identifies a Genymobile/Genymotion Android emulator. Both GTIG and Obsidian saw the actor enroll Okta FastPass from an emulator. FP: none expected: emulator user agents have no business in a workforce IdP log. ⚠ Field unverified — validate in tenant
// HUNT: Okta events from an emulated-Android (Genymobile) client // MITRE: T1098.005, T1078.004, T1556.006 // CONF: high // FP: low // COST: low // REQUIRES: Okta System Log ingest (okta_system_log) -- field names are parser-dependent; ⚠ validate in tenant // FALSE POSITIVES: none expected; a QA or mobile-development team using an emulator against a test Okta org // LOOKBACK: 30d #repo=okta_system_log | "client.userAgent.rawUserAgent"=/Genymobile|Geny\s?Mobile/i | table([@timestamp, "actor.alternateId", eventType, "outcome.result", "client.ipAddress", "client.userAgent.rawUserAgent", "client.geographicalContext.country"]) | sort(@timestamp, order=desc)
Looks for: Every successful MFA factor lifecycle change and Okta Verify device enrollment. In this intrusion pattern MFA manipulation is the account-takeover step, so any hit needs a look at the same user's preceding sign-ins. FP: legitimate self-service enrollment, device replacement and new-hire onboarding. ⚠ Field unverified — validate in tenant
// HUNT: Okta successful MFA factor activation, reset or device enrollment (post-vishing signal) // MITRE: T1098.005, T1556.006 // CONF: medium // FP: medium // COST: low // REQUIRES: Okta System Log ingest (okta_system_log) -- field names are parser-dependent; ⚠ validate in tenant // FALSE POSITIVES: new-hire onboarding, self-service device replacement // TUNING: join to Q9 (failure-heavy sign-in) and to help-desk tickets; deprioritise users enrolled in the first 14 days of employment // LOOKBACK: 14d #repo=okta_system_log | eventType=/^(user\.mfa\.factor\.(activate|reset_all|update)|device\.enrollment\.create)$/ | "outcome.result"=SUCCESS | table([@timestamp, "actor.alternateId", eventType, "client.ipAddress", "client.userAgent.rawUserAgent", "client.geographicalContext.country", "debugContext.debugData.tunnels"]) | sort(@timestamp, order=desc)
Looks for: Users with five or more failed password or factor attempts and at least one MFA activation inside the search window. Obsidian saw prolonged, failure-heavy flows of about ten minutes before the actor succeeded and enrolled FastPass. FP: users who forget a password and then re-enroll a replacement phone in one session. ⚠ Field unverified — validate in tenant
// HUNT: Okta failure-heavy sign-in chain followed by MFA enrollment (run over a 1h-4h window) // MITRE: T1566.004, T1078.004, T1098.005 // CONF: medium // FP: medium // COST: medium // REQUIRES: Okta System Log ingest (okta_system_log) -- field names are parser-dependent; ⚠ validate in tenant // FALSE POSITIVES: forgotten-password plus device-replacement in one session // TUNING: raise the failure threshold to 8 for large tenants, and drop hits where the enrollment source IP matches the user's usual egress // LOOKBACK: 4h #repo=okta_system_log | eventType=/^(core\.user_auth\.login_failed|core\.user\.factor\.attempt_fail|app\.ad\.login\.bad_password|user\.mfa\.factor\.activate)$/ | case { eventType=/factor\.activate$/ | kind := "enroll"; * | kind := "fail"; } | groupBy(["actor.alternateId"], function=[count(as=Events), {kind="fail" | count(as=Failures)}, {kind="enroll" | count(as=Enrollments)}, min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=1000) | Failures >= 5 | Enrollments >= 1 | sort(Failures, order=desc, limit=100)
Looks for: Any Okta event from the 19 residential-proxy and VPN addresses GTIG published for the January 2026 SaaS intrusions. FP: residential and VPN addresses are shared and recycle; a hit is a lead to correlate, not a verdict. ⚠ Field unverified — validate in tenant
// HUNT: Okta activity from UNC6661/UNC6671 published source IPs // MITRE: T1078.004, T1090 // CONF: medium // FP: low // COST: low // REQUIRES: Okta System Log ingest (okta_system_log) -- field names are parser-dependent; ⚠ validate in tenant // FALSE POSITIVES: shared residential or VPN addresses reassigned to an unrelated subscriber since January 2026 // LOOKBACK: 90d #repo=okta_system_log | rename(field="client.ipAddress", as=SrcIP) | in(SrcIP, values=["24.242.93.122","23.234.100.107","23.234.100.235","73.135.228.98","157.131.172.74","149.50.97.144","67.21.178.234","142.127.171.133","76.64.54.159","76.70.74.63","206.170.208.23","68.73.213.196","37.15.73.132","104.32.172.247","85.238.66.242","199.127.61.200","209.222.98.200","38.190.138.239","198.52.166.197"]) | table([@timestamp, "actor.alternateId", eventType, "outcome.result", SrcIP, "client.userAgent.rawUserAgent"]) | sort(@timestamp, order=desc)
Looks for: Per-user, per-address counts of SharePoint and OneDrive file downloads or accesses whose user agent is PowerShell. GTIG observed the actor pulling SharePoint and OneDrive data this way. FP: sanctioned migration, backup and eDiscovery scripts that use PowerShell against SharePoint. ⚠ Field unverified — validate in tenant
// HUNT: Microsoft 365 scripted bulk SharePoint/OneDrive download (PowerShell user agent) // MITRE: T1213.002, T1530, T1059.001 // CONF: high // FP: medium // COST: medium // REQUIRES: Microsoft 365 Unified Audit Log ingest (SharePoint/OneDrive) with UserAgent captured -- field names are parser-dependent; ⚠ validate in tenant // ⚠ validate in tenant: Workload, Operation, UserAgent, UserId, ClientIP (Unified Audit Log fields; names vary by parser) // FALSE POSITIVES: sanctioned migration, backup and eDiscovery tooling // TUNING: exclude service accounts and automation IPs that run these jobs; raise the file-count threshold if your tenant has heavy scripted sync // LOOKBACK: 24h Workload=/^(SharePoint|OneDrive)$/ | Operation=/^(FileDownloaded|FileAccessed|FileSyncDownloadedFull)$/ | UserAgent=/PowerShell/i | groupBy([UserId, ClientIP], function=[count(as=Files), count(SourceFileName, distinct=true, as=DistinctFiles), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=1000) | Files >= 25 | sort(Files, order=desc, limit=100)
Looks for: Any record mentioning the ToogleBox Recall add-on. GTIG saw the actor authorize it to permanently delete the Okta 'Security method enrolled' notification so the victim would not see the new MFA device. FP: an administrator or user who deliberately installed the add-on; verify with the account owner. ⚠ Field unverified — validate in tenant
// HUNT: Google Workspace authorization of the ToogleBox Recall add-on // MITRE: T1070.008, T1098.003 // CONF: high // FP: low // COST: medium // REQUIRES: Google Workspace token/OAuth audit log ingest -- scope with #repo= to your Workspace repository; ⚠ validate in tenant // FALSE POSITIVES: deliberate installation by the account owner // LOOKBACK: 30d @rawstring=/ToogleBox\s*Recall/i | table([@timestamp, @rawstring]) | sort(@timestamp, order=desc)
Looks for: Salesforce event-log rows from Data Loader or from the user-agent strings reported in the Aura and earlier Snowflake campaigns. Salesforce is the actor's long-running data-theft target. FP: administrators and integration users who run Data Loader for legitimate loads and exports. ⚠ Field unverified — validate in tenant
// HUNT: Salesforce bulk-API / report-export / Data Loader activity and known actor user agents // MITRE: T1213.006, T1567, T1530 // CONF: medium // FP: medium // COST: low // REQUIRES: Salesforce Event Monitoring (EventLogFile or real-time) ingest -- field names are parser-dependent; ⚠ validate in tenant // FALSE POSITIVES: administrators and integration users running Data Loader on purpose // TUNING: allowlist named integration users and admin egress IPs, then alert on ROWS_PROCESSED outliers per user against a 30-day baseline // LOOKBACK: 14d #repo=salesforce_eventlogfile | EVENT_TYPE=/^(BulkApi|BulkApiResultEvent|ReportExport|RestApi|ApiEvent)$/ | USER_AGENT=/(data.?loader|RapeForce|RapeFlake)/i | table([@timestamp, USER_NAME, SOURCE_IP, EVENT_TYPE, USER_AGENT, ROWS_PROCESSED, CONNECTED_APP_NAME]) | sort(@timestamp, order=desc)
CrowdStrike Custom IOA Recommendations
| IOA name | Rule type | Pattern | Exclusions | Promotes | Deployment path |
|---|---|---|---|---|---|
| ShinyHunters MeshCentral C2 domain | Domain Name | DomainName matches (^|\.)(azurenetfiles\.net|microsoft-entra\.net|enroll\.azuredevice\.cloud|winmanage-me\.network)$ | None | Promote Q1 | Custom IOA in Detect for 14 days, then Prevent. Add the same domains to IOC Management. |
| ShinyHunters staging and C2 connection | Network Connection | Remote address in the nine Section 10 addresses, any port | None | Promote Q2 | Prefer IOC Management for plain addresses; use a Custom IOA only to add TCP/3333 and 3334 context. |
| Masqueraded MeshAgent or SIDEEYE loader | Process Creation | Image file name matches meshagent(32|64)-(azure-ops|v2)\.exe or Ple64\.exe | Hash allowlist for a sanctioned MeshCentral deployment | Promote Q3 | Detect for 7 days, then Prevent. |
| Java server spawning a shell | Process Creation (Linux and Windows) | Parent image matches java or javaw; image matches cmd.exe, sh, bash or dash | Host-group scope to PeopleSoft and WebLogic hosts; allowlist known admin scripts after a 14-day baseline | Promote Q5 | Detect in the PeopleSoft host group; move to Prevent after tuning. |
| Linux MeshCentral and sshpass tooling | Process Creation (Linux) | Command line matches meshctrl\.js\s+RunCommand or _fanout\.sh or README-IF-YOU-SEE-THIS-YOUVE-BEEN-HACKED | None for meshctrl and fanout; scope sshpass and zstd to service accounts | Promote Q4 (high-confidence terms only) | Detect only; keep sshpass and zstd in the hunt query. |
Q7 to Q13 are identity and SaaS detections. Deploy them as scheduled searches in Next-Gen SIEM rather than as endpoint IOAs.
Alert packages
Ready-to-paste alert text and triage steps for the three highest-fidelity detections.
Q3: Masqueraded MeshCentral agent executed
Subject: 🚨 HUNT ALERT 🚨 — Masqueraded MeshCentral Agent Executed (Possible Remote Access / C2)
A binary named like an Azure service, or carrying a published ShinyHunters hash, ran on this host. The actor uses MeshCentral agents to keep interactive access and to push scripts after exploiting PeopleSoft. Check whether Falcon blocked it or it ran, then look at the parent process and the install path. Any hit on a server in the PeopleSoft tier is a likely intrusion, not a lookalike.
Investigation checklist
- Blocked or executed? ProcessBlocked means Falcon stopped it; ProcessRollup2 means it ran.
- Read SHA256HashData and compare to the Section 10 list. A match is confirmed.
- Read ParentBaseFileName. A java, sh or bash parent on a PeopleSoft host points to web-shell activity.
- Read the install path in ImageFileName. Under PSEMHUB.war or /tmp is hostile.
- Pivot to DnsRequest and NetworkConnectIP4 on the same host for the C2 domains and TCP/3333 to 3334.
- Check frequency: how many hosts ran the same hash.
- Look for follow-on execution: shells, sshpass, zstd, tar, rsync.
- Isolate the host if execution is confirmed and the path or parent is hostile.
Pivot queries
// >> YOU NEED: ComputerName (from the alert) // >> FILL IN: ComputerName="REPLACE_WITH_HOSTNAME" // Host-scoped: what this host resolved and connected to #event_simpleName=/DnsRequest|NetworkConnectIP4/ | ComputerName="REPLACE_WITH_HOSTNAME" | table([@timestamp, DomainName, RemoteAddressIP4, RemotePort, ContextBaseFileName]) | sort(@timestamp, order=asc)
// >> YOU NEED: SHA256HashData (from the alert) // >> FILL IN: SHA256HashData="REPLACE_WITH_HASH" // Environment-wide: every host that ran the same binary #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | SHA256HashData="REPLACE_WITH_HASH" | groupBy([ComputerName], function=[count(as=Runs), min(@timestamp, as=FirstSeen)], limit=500) | sort(FirstSeen, order=asc, limit=100)
Q5: Java process spawned a shell on a PeopleSoft host
Subject: 🚨 HUNT ALERT 🚨 — Java Process Spawned a Shell (Possible PeopleSoft CVE-2026-35273 Exploitation)
A java process launched a shell. GTIG documents this as the host-side sign of both fileless exploitation of PeopleSoft CVE-2026-35273 and the x.jsp and u.jsp web shells. The alert fires whether or not the exploit left a file, so a clean file scan does not clear the host. Read the shell's command line first: hostname, whoami, uname, id, base64 -d, curl, /dev/tcp, tasklist and start /b are the documented commands.
Investigation checklist
- Read CommandLine on the shell event. Discovery commands or an encoded payload are hostile.
- Read UserName. A quarter of the actor's commands ran as root or SYSTEM.
- Check the web-server access log for POST to /PSEMHUB/hub or /%50SEMHUB/hub at the same time.
- Search PSEMHUB.war and PORTAL.war for unexpected .jsp, .jspx and .exe files on every WebLogic node.
- Pivot to NetworkConnectIP4 from the same host for the Section 10 addresses.
- Look for sshpass, zstd, tar and rsync started by the service account.
- Preserve the web directory and logs before cleanup.
- Isolate the host and rotate every credential in psappsrv.cfg if any step confirms compromise.
Pivot queries
// >> YOU NEED: ComputerName (from the alert) // >> FILL IN: ComputerName="REPLACE_WITH_HOSTNAME" // Host-scoped: everything the shell ran #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ComputerName="REPLACE_WITH_HOSTNAME" | ParentBaseFileName=/^(sh|bash|dash|cmd\.exe|java|javaw)(\.exe)?$/i | table([@timestamp, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=asc)
// Environment-wide: other hosts where a Java process started a shell in the window #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(java|javaw)(\.exe)?$/i | FileName=/^(cmd\.exe|sh|bash|dash)$/i | groupBy([ComputerName], function=[count(as=Spawns), min(@timestamp, as=FirstSeen)], limit=500) | sort(Spawns, order=desc, limit=100)
Q7: Okta event from an emulated Android client
Subject: 🚨 HUNT ALERT 🚨 — Okta Activity From an Emulated Android Device (Possible MFA Persistence After Vishing)
An Okta event came from a Genymobile emulator user agent. In the incidents Google and Obsidian describe, the actor enrolled FastPass from an emulator after a failure-heavy sign-in. Treat the user as compromised until proven otherwise, and check what factors were added and what the session touched afterward. Contact the user on a known number, never on a number the caller supplied.
Investigation checklist
- Read actor.alternateId and eventType. Is this an enrollment or a normal sign-in?
- List every MFA factor event for the user in the last 24 hours (pivot below).
- Read client.ipAddress and compare to the Section 10 watchlist and to the user's normal egress.
- Check the sign-in chain before the enrollment for repeated failures.
- Look at the downstream SaaS activity: SharePoint downloads, Salesforce exports, Slack and Drive downloads.
- Check Google Workspace for a ToogleBox Recall authorization and deleted security emails.
- Revoke sessions and tokens, remove the unknown factors, and reset the password through high-assurance verification.
- Escalate if any bulk download or export is confirmed.
Pivot queries
// >> YOU NEED: actor.alternateId (from the alert) // >> FILL IN: "actor.alternateId"="REPLACE_WITH_USER" // Host-scoped equivalent: the user's full Okta timeline #repo=okta_system_log | "actor.alternateId"="REPLACE_WITH_USER" | table([@timestamp, eventType, "outcome.result", "client.ipAddress", "client.userAgent.rawUserAgent"]) | sort(@timestamp, order=asc)
// >> YOU NEED: client.ipAddress (from the alert) // >> FILL IN: SrcIP="REPLACE_WITH_IP" // Environment-wide: every user seen from the same address #repo=okta_system_log | rename(field="client.ipAddress", as=SrcIP) | SrcIP="REPLACE_WITH_IP" | groupBy(["actor.alternateId"], function=[count(as=Events), min(@timestamp, as=FirstSeen)], limit=500) | sort(Events, order=desc, limit=100)
Machine-Readable IOC Appendix
The IdP source addresses are residential-proxy and VPN endpoints from January 2026. Mandiant advises hunting and correlating on them, not broad blocking. Use the CSV only for the nine infrastructure addresses, four domains and six hashes.
type,value,action,severity,expiration,description,tags domain,azurenetfiles.net,detect,high,2027-04-16,ShinyHunters MeshCentral C2 or staging domain,campaign:ShinyHunters domain,microsoft-entra.net,detect,high,2027-04-16,ShinyHunters MeshCentral C2 or staging domain,campaign:ShinyHunters domain,enroll.azuredevice.cloud,detect,high,2027-04-16,ShinyHunters MeshCentral C2 or staging domain,campaign:ShinyHunters domain,winmanage-me.network,detect,high,2027-04-16,ShinyHunters MeshCentral C2 or staging domain,campaign:ShinyHunters domain,REPLACE_WITH_ORG_SSO_LOOKALIKE,detect,high,2027-04-16,Your own brand lookalike found via Q1 or N8,campaign:ShinyHunters ipv4,142.11.200.186,detect,high,2027-01-16,Staging host,campaign:ShinyHunters ipv4,142.11.200.187,detect,high,2027-01-16,Staging host,campaign:ShinyHunters ipv4,142.11.200.188,detect,high,2027-01-16,Staging host,campaign:ShinyHunters ipv4,142.11.200.189,detect,high,2027-01-16,Staging host,campaign:ShinyHunters ipv4,142.11.200.190,detect,high,2027-01-16,Staging host,campaign:ShinyHunters ipv4,176.120.22.24,detect,high,2027-01-16,Clearnet mirror of the ShinyHunters data leak site,campaign:ShinyHunters ipv4,5.199.162.157,detect,high,2027-01-16,Attack controller, scanner and HTTP callback receiver,campaign:ShinyHunters ipv4,104.219.234.138,detect,high,2027-01-16,Exfiltration staging and remote-management host,campaign:ShinyHunters ipv4,162.219.30.165,detect,high,2027-01-16,C2 for SIDEEYE backdoor,campaign:ShinyHunters sha256,f02a924c9ff92a8780ce812511341182c6b509d45bc59f3f7b522e37225d24fc,prevent,critical,2027-04-16,meshagent64-azure-ops.exe,campaign:ShinyHunters sha256,d83fdb9e53c5ff03c4cb0451ea1bebd79b53f29eadc1e2fa394c7af13a86ce2f,prevent,critical,2027-04-16,meshagent64-v2.exe,campaign:ShinyHunters sha256,c7e9332731b06644fc73e0046a2a89eaa59b09f54250e9bd622467187351711f,prevent,critical,2027-04-16,meshagent32-azure-ops.exe,campaign:ShinyHunters sha256,68257a6f9ff196179ec03624e849927f26599eb180a7c82e14ef5bc4e93bc309,prevent,critical,2027-04-16,meshagent,campaign:ShinyHunters sha256,3ba215692665513abfffd4e815c5c45f2d41e5dcc4283a2a3b740930c5c417c3,prevent,critical,2027-04-16,Ple64.exe,campaign:ShinyHunters sha256,2bee941fb40519d0d1ec52bd79a8f63fc65aac6455c8f2d6b668e3360dfdb5d7,detect,high,2027-04-16,u.jsp,campaign:ShinyHunters # Not imported: hashes GTIG says vary per deployment (hunt by name and path) # x.jsp 48b4a0827da7bbfce9fb52464f8a659dea7a035189c52c506c0bfb4b1c3fe494 # tunnel.jsp 419c571ee38b7e7266d130c4b6bbc4dd0ef44d6e5f3bc02cc2cf73b762f07c86 # tunnel.jspx ba14419beb2ec0bb94cab6298c14d7fb3e1d819366fe378290c0c2a4d97f7e07 # .bash_history (attacker command history) 2ab684d93c1553fad87041b4dea97188a97e78589deee2a7bacff905564f3a35 # Do not import the IdP source IPs below: they are sources of sign-ins, not destinations of endpoint connections
# GTIG January 2026 SaaS-intrusion source IPs. Residential proxy and VPN. HUNT ONLY, do not block. # Pattern note: Mullvad, Oxylabs, NetNut, 9Proxy, Infatica and nsocks networks appear in these intrusions. 24.242.93.122 AS11427 UNC6661 23.234.100.107 AS11878 UNC6661 23.234.100.235 AS11878 UNC6661 73.135.228.98 AS33657 UNC6661 157.131.172.74 AS46375 UNC6661 149.50.97.144 AS201814 UNC6661 67.21.178.234 AS400595 UNC6661 142.127.171.133 AS577 UNC6671 76.64.54.159 AS577 UNC6671 76.70.74.63 AS577 UNC6671 206.170.208.23 AS7018 UNC6671 68.73.213.196 AS7018 UNC6671 37.15.73.132 AS12479 UNC6671 104.32.172.247 AS20001 UNC6671 85.238.66.242 AS20845 UNC6671 199.127.61.200 AS23470 UNC6671 209.222.98.200 AS23470 UNC6671 38.190.138.239 AS27924 UNC6671 198.52.166.197 AS395965 UNC6671 # CQL list for in(): "24.242.93.122","23.234.100.107","23.234.100.235","73.135.228.98","157.131.172.74","149.50.97.144","67.21.178.234","142.127.171.133","76.64.54.159","76.70.74.63","206.170.208.23","68.73.213.196","37.15.73.132","104.32.172.247","85.238.66.242","199.127.61.200","209.222.98.200","38.190.138.239","198.52.166.197"
OKTA SYSTEM LOG eventType: user.mfa.factor.activate | user.mfa.factor.reset_all | user.mfa.factor.update | device.enrollment.create failure chain: core.user_auth.login_failed | core.user.factor.attempt_fail | app.ad.login.bad_password (5+ then success) user agent: com.okta.android.auth/... Android/... Genymobile/Phone regex: Genymobile|Geny\s?Mobile device display name: Passkey (FastPass / Okta Verify enrollment) sign-in flow: about 10 minutes, repeated failures, then success, then enrollment MICROSOFT 365 SharePoint/OneDrive FileDownloaded or FileAccessed with UserAgent containing WindowsPowerShell threshold used by Mandiant: 50+ distinct files and 3+ extensions in 5 minutes per session SearchQueryPerformed regex: \bpoc\b|proposal|confidential|internal|salesforce|vpn Exchange SoftDelete|HardDelete|MoveToDeletedItems where subject matches new MFA / factor / method / device / security enrollment wording GOOGLE WORKSPACE OAuth authorize event for app name ToogleBox Recall (Gmail add-on and Apps Script scopes) SALESFORCE Data Loader activity; BulkApiResultEvent and ReportEventStream volume outliers user agents reported for related campaigns: RapeForce, RapeFlake PEOPLESOFT / WEBLOGIC POST /PSEMHUB/hub | POST /%50SEMHUB/hub | /PSIGW/HttpListeningConnector with loopback addresses in parameters 5 to 15 POSTs with a serialized Java object to one server = target verification new .jsp / .jspx / .exe under PSEMHUB.war or PORTAL.war; files under PSEMHUB.war/envmetadata/transactions/ XML files recently changed under envmetadata/data/environment/ (XMLDecoder on restart) java or javaw parent starting cmd.exe, sh, bash with base64 -d, curl, /dev/tcp, tasklist, start /b outbound TCP/445 from PeopleSoft hosts to the internet LINUX STAGING AND MOVEMENT node meshctrl.js RunCommand --id <agent> --run 'bash /tmp/<abbrev>_fanout.sh' sshpass -p ... ssh -o StrictHostKeyChecking=no pv ... | zstd -3 -T0 -o exfil.tar.zst npm list global authenticode ; MeshCentral 1.1.59 ; acme-client npm package /tmp/meshagent /tmp/meshagent.msh /tmp/meshagent.db marker file README-IF-YOU-SEE-THIS-YOUVE-BEEN-HACKED.TXT in WebLogic and Process Scheduler directories EXTORTION 72-hour Bitcoin demand; Tox negotiation; Limewire-hosted samples; Tor leak site named SHINYHUNTERS mailboxes: shinycorp@tutanota[.]com, shinygroup@onionmail[.]com, shinycorp@tuta[.]com, shinygroup@tuta[.]com harassing texts and calls to staff and family; DDoS; swatting (FBI PSA)
MeshCentral server 1.1.59 and MeshAgent (Windows, Linux) - legitimate RMM abused for C2 meshctrl.js (MeshCentral CLI) driven by node acme-client (npm) for Let's Encrypt certificates on the C2 name sshpass, ssh, pv, zstd - spray, copy, archive x.jsp (hex-encoded command web shell), u.jsp and u2.jsp (chunked upload and exec) Neo-reGeorg (tunnel.jsp, tunnel.jspx) - SOCKS over HTTP SIDEEYE backdoor delivered by trojanized installer Ple64.exe (EV-signed; GTIG requested revocation) ToogleBox Recall - Google Workspace add-on that permanently deletes email Genymobile / Genymotion Android emulator - used to enroll FastPass Bland AI - voice agent used to script vishing calls (MITRE, source 1) ConnectWise and other RMM tools for initial access (MITRE) TruffleHog - repository secret scanner (Huntress, source 10) S3 Browser, WinSCP, AWS CLI - cloud storage discovery and deletion (MITRE) Salesforce Data Loader; modified AuraInspector (Huntress, source 10) Limewire (proof samples), Tox (negotiation), Tor (leak site)
[ ] Oracle Security Alert for CVE-2026-35273 (issued 10 Jun 2026) applied on every PeopleSoft web tier [ ] EMHub service disabled, or PSEMHUB application removed [ ] /PSEMHUB and /PSIGW/HttpListeningConnector blocked on the NORMALIZED, case-insensitive path (not a literal string match) [ ] Credentials readable by the PeopleSoft service account rotated if any exposure is suspected [ ] Outbound TCP/445 from server networks to the internet denied [ ] Phishing-resistant MFA (FastPass, FIDO2 passkeys) enforced for all admins, then all users [ ] SMS, voice, email and push-only factors removed where phishing-resistant options exist [ ] MFA enrollment allowed only from managed devices or trusted networks, with re-authentication [ ] Help desk requires live video ID check, manager approval and callback to a number on file [ ] Okta ThreatInsight on; super admin restricted to corporate network zones [ ] Entra: Conditional Access covers Register security information and Global Administrator sign-in [ ] Google Workspace third-party API access restricted; alert on ToogleBox Recall [ ] Salesforce Event Monitoring on; Data Loader and API access limited to named profiles [ ] Microsoft Purview Audit on and PowerShell user agents captured for SharePoint and OneDrive [ ] Integration tokens inventoried, scoped, IP-restricted and rotated
Detection Validation Gates
| Gate | Check | Pass condition |
|---|---|---|
| Telemetry ready | Confirm each source feeds the SIEM: Process creation with command line, path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); Outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); and the identity and SaaS logs in Section 5. | A sample event from each source is searchable in the last hour. |
| Benign baseline | Run Q4, Q5, Q6, Q8, Q11 and Q13 over 14 days before alerting. | Fewer than 10 hits per week per query, each explained by a named job, user or integration. |
| Positive tests | Q1: resolve a listed domain from a lab host. Q3: run a harmless binary renamed to meshagent64-v2.exe on a lab host. Q5: from a lab Java program, start a shell that runs id. Q7 and Q12: replay a synthetic log line into a test repository. | Every test fires its query within the ingest delay. Never test with live malware or against production accounts. |
| Promotion | Promote Q1, Q2, Q3 first (high confidence, low FP), then Q5 after tuning, then Q7. | Detect for 14 days with no unexplained hits, then enable prevention where the platform supports it. |
Hardening — Tiered & Deployable
- Patch CVE-2026-35273 and disable EMHub. Apply Oracle's Security Alert, then disable the Environment Management Hub or remove PSEMHUB. WAF rules alone were bypassed with /%50SEMHUB/. Framework: MITRE M1051, M1042; Oracle Security Alert CVE-2026-35273; Mandiant (sources 3, 4). Verify: Playbook step 1.2.
- Block the EMHub and Integration Gateway paths on the normalized path. Deny /PSEMHUB and /PSIGW/HttpListeningConnector, case-insensitively, at the reverse proxy. Non-breaking for PIA users per Mandiant. Framework: MITRE M1030, M1050; Mandiant (source 4). Verify: Playbook step 1.1.
- Stop MFA enrollment from untrusted places. Require a managed device or trusted network, plus re-authentication, to register or change a factor. Framework: MITRE M1032, M1036; Mandiant hardening guide (source 5); Microsoft Conditional Access user action Register security information. Verify: Playbook 4 and 5.
- Verify callers by video and callback. Help desk requires a live video call with a government ID, manager approval and a callback to a number on file. Reject answers based on employee ID, SSN or manager name. Framework: Mandiant (source 5). ⚠ best-practice, no formal benchmark.
- Turn on identity-layer logging. Ingest Okta authentication and MFA-lifecycle events, Entra audit logs, Microsoft Purview Audit with user agent, Google Workspace OAuth and Gmail logs, and Salesforce Event Monitoring. Framework: MITRE M1047; Mandiant (source 5).
- Block the known infrastructure. Import the Section 10 CSV into Falcon IOC Management and DNS filtering. Framework: MITRE M1031, M1037.
- Enforce phishing-resistant MFA. Okta FastPass or FIDO2 passkeys for admins first, then all users. Remove SMS, voice, email and push-only factors where an alternative exists. Okta states FastPass and passkeys are not defeated by these kits. Framework: MITRE M1032; NIST SP 800-63B AAL3 guidance; Okta (source 6). Verify: Playbook 4, 5.
- Restrict sign-in sources. Okta network zones and ThreatInsight, Entra named locations, Workspace context-aware access. Limit super-admin access to the corporate network. Framework: MITRE M1036; Mandiant (source 5).
- Lock down third-party app consent. Restrict who can authorize OAuth apps and add-ons in Google Workspace and Entra; alert on ToogleBox Recall. Framework: MITRE M1047, M1026; Mandiant (source 5).
- Constrain Salesforce export paths. Remove API Enabled and bulk-export rights from profiles that do not need them; set Login IP ranges; secure Experience Cloud guest profiles. Framework: Mandiant Salesforce hardening guidance (source 5). ⚠ best-practice, no formal benchmark.
- Harden SSH on application servers. Key-only authentication, no root login, low retry count, so a credential-spray script has nothing to guess. Framework: MITRE M1032, M1027; CIS Distribution Independent Linux Benchmark, SSH server configuration section. Verify: Playbook 2.
- Deny outbound SMB from server networks. Framework: MITRE M1037; Mandiant (source 3). Verify: Playbook 3.
- Audit the PeopleSoft hosts. auditd rules for sshpass, zstd, and writes under PSEMHUB.war; file-integrity monitoring on the web directories. Framework: MITRE M1047, M1022; CIS Linux auditd guidance. Verify: Playbook 2.
- Replace long-lived credentials with workload identity. Move static keys and tokens to federated, short-lived identities; scope each credential to one resource; restrict source IPs. Framework: MITRE M1026, M1018; Mandiant (source 5).
- Inventory and govern integrations. Every connected app and API token has an owner, narrow scopes, an IP allowlist and a rotation date, since the actor reuses stolen integration tokens. Framework: MITRE M1018, M1026; Sekoia (source 8).
- Just-in-time admin. Remove standing Global Administrator and Okta super-admin; require approval and justification per activation. Framework: MITRE M1026; Mandiant (source 5).
- Put PeopleSoft administrative surfaces behind a path allowlist. Publish only the PIA paths users need and require VPN for everything else. Framework: MITRE M1030, M1035; Mandiant (sources 3, 4).
- Secret scanning with push protection. Block commits that contain tokens and scan history, because the actor mines repositories for credentials. Framework: MITRE M1013; Mandiant (source 5).
Verify after deployment. Over 14 days, confirm that Q5 and Q8 return only explained hits, that /%50SEMHUB/hub returns 403 from the proxy, and that no MFA factor was added from an untrusted network.
Deployable Playbooks
Each step carries its prerequisites, reboot requirement and rollback. Replace every REPLACE_WITH value before use, and test in non-production first.
Playbook 1 · PeopleSoft exposure reduction (T1190, T1505.003; M1051, M1042, M1030)
Step 1.1 · Deny the EMHub and Integration Gateway paths at the reverse proxy
What it does: Blocks /PSEMHUB and /PSIGW/HttpListeningConnector on the normalized, case-insensitive path, so the percent-encoded variant /%50SEMHUB/ is blocked too.
Prerequisites: A reverse proxy in front of the PIA web tier; confirm EMHub is not needed for your patching workflow (Mandiant calls the block non-breaking for PIA users).
Reboot required: No. Reload the proxy; no OS reboot.
Configuration
# nginx: add inside the server block that fronts PIA
location ~* ^/psemhub(/|$) { return 403; }
location ~* ^/psigw/httplisteningconnector { return 403; }
# Apache httpd equivalent
<LocationMatch "(?i)^/psemhub(/|$)">
Require all denied
</LocationMatch>
<LocationMatch "(?i)^/psigw/httplisteningconnector">
Require all denied
</LocationMatch>
# nginx: validate and reload
nginx -t && nginx -s reloadVerify
for p in /PSEMHUB/hub /%50SEMHUB/hub /psemhub/hub /PSIGW/HttpListeningConnector; do
printf '%s -> ' "$p"
curl -sk -o /dev/null -w '%{http_code}\n' "https://REPLACE_WITH_PIA_HOST$p"
done
# Expect 403 for all four linesRollback
# Remove the location blocks above, then reload nginx -t && nginx -s reload # Apache: remove the LocationMatch blocks, then apachectl configtest && apachectl graceful
Step 1.2 · Apply Oracle's Security Alert and disable EMHub
What it does: Fixes CVE-2026-35273 at the source. Path blocking alone was already bypassed.
Prerequisites: Change window; backup or snapshot of PS_CFG_HOME and the web tier; patch tested in non-production; Oracle Security Alert for CVE-2026-35273.
Reboot required: WebLogic domain restart; no OS reboot unless Oracle's alert says otherwise.
Configuration
# 1) Follow Oracle's Security Alert for CVE-2026-35273 (issued 10 Jun 2026). # 2) Multi-server: disable the Environment Management Hub service. # Single-server: remove the PSEMHUB application. # 3) Restart the WebLogic domain, then repeat the Step 1.1 verification.
Verify
# After restart, the EMHub servlet must not answer
curl -sk -o /dev/null -w '%{http_code}\n' "https://REPLACE_WITH_PIA_HOST/PSEMHUB/hub"
# Expect 403 or 404. Then confirm the applied patch level in the PeopleTools patch inventory.Rollback
# Restore the pre-change snapshot of PS_CFG_HOME and the web tier. # Oracle security patches are not individually uninstallable, so keep the snapshot until the change is accepted.
Playbook 2 · Linux application servers (T1110.003, T1021.004, T1560.002; M1032, M1027, M1047)
Step 2.1 · Key-only SSH with a low retry count
What it does: Gives the sshpass credential-spray script nothing to guess.
Prerequisites: Working key-based access for every admin and for break-glass. Keep a second session open. OpenSSH 8.2 or later reading /etc/ssh/sshd_config.d.
Reboot required: No. Reload sshd.
Configuration
# /etc/ssh/sshd_config.d/99-huntpack-hardening.conf PasswordAuthentication no KbdInteractiveAuthentication no PermitRootLogin no MaxAuthTries 3 # apply sshd -t && systemctl reload sshd
Verify
sshd -T | grep -Ei '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin|maxauthtries) ' # Expect: no, no, no, 3
Rollback
rm /etc/ssh/sshd_config.d/99-huntpack-hardening.conf sshd -t && systemctl reload sshd
Step 2.2 · auditd rules for the attacker's tools and the web directory
What it does: Records sshpass and zstd execution and any write under PSEMHUB.war, giving Q4 and Q5 a second source.
Prerequisites: auditd installed and running; the rules file is not in immutable mode (-e 2).
Reboot required: No, unless auditd is set immutable, in which case a reboot loads the rules.
Configuration
# /etc/audit/rules.d/99-huntpack-shinyhunters.rules -a always,exit -F arch=b64 -S execve -F exe=/usr/bin/sshpass -k sshpass_exec -a always,exit -F arch=b64 -S execve -F exe=/usr/bin/zstd -k zstd_exec -w /u01/app/psoft/ps_config_homes/csprd/webserv -p wa -k psemhub_write # adjust to your PS_CFG_HOME sudo augenrules --load
Verify
sudo auditctl -l | grep -E 'sshpass_exec|zstd_exec|psemhub_write' sudo ausearch -k sshpass_exec -ts today
Rollback
sudo rm /etc/audit/rules.d/99-huntpack-shinyhunters.rules sudo augenrules --load
Playbook 3 · Deny outbound SMB from servers (T1187; M1037)
Step 3.1 · Drop outbound TCP/445 to public addresses
What it does: Stops NetNTLM coercion and SMB exfiltration from the PeopleSoft tier. Do the same at the perimeter firewall for server networks.
Prerequisites: nftables active; no server uses SMB to a public service such as Azure Files.
Reboot required: No.
Configuration
sudo nft add table inet huntpack
sudo nft add chain inet huntpack out '{ type filter hook output priority 0; policy accept; }'
sudo nft add rule inet huntpack out ip daddr != { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } tcp dport 445 counter dropVerify
sudo nft list table inet huntpack # The counter increments on blocked attempts; Q6 should go quiet
Rollback
sudo nft delete table inet huntpack
Playbook 4 · Entra ID Conditional Access (T1098.005, T1556.006; M1032, M1036)
Step 4.1 · Block security-info registration from untrusted locations (report-only first)
What it does: Prevents an attacker from adding an MFA method from their own network after stealing a password and code.
Prerequisites: Microsoft Graph PowerShell with Policy.ReadWrite.ConditionalAccess; named locations configured with your trusted networks marked trusted; a break-glass group.
Reboot required: No.
Configuration
Connect-MgGraph -Scopes 'Policy.ReadWrite.ConditionalAccess','Policy.Read.All'
$params = @{
displayName = 'HuntPack - Block security info registration from untrusted locations'
state = 'enabledForReportingButNotEnforced'
conditions = @{
users = @{ includeUsers = @('All'); excludeGroups = @('REPLACE_WITH_BREAKGLASS_GROUP_ID') }
applications = @{ includeUserActions = @('urn:user:registersecurityinfo') }
locations = @{ includeLocations = @('All'); excludeLocations = @('AllTrusted') }
}
grantControls = @{ operator = 'OR'; builtInControls = @('block') }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $paramsVerify
Get-MgIdentityConditionalAccessPolicy -Filter "displayName eq 'HuntPack - Block security info registration from untrusted locations'" | Select-Object DisplayName, State # Review the report-only results in Entra sign-in logs for two weeks, then set state to 'enabled'
Rollback
$id = (Get-MgIdentityConditionalAccessPolicy -Filter "displayName eq 'HuntPack - Block security info registration from untrusted locations'").Id Remove-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId $id
Step 4.2 · Require phishing-resistant authentication for Global Administrators (report-only first)
What it does: Applies the built-in phishing-resistant authentication strength to the most valuable role.
Prerequisites: Admins registered with FIDO2 keys or passkeys first, or they will be locked out; a break-glass group.
Reboot required: No.
Configuration
$params = @{
displayName = 'HuntPack - Global Administrators require phishing-resistant MFA'
state = 'enabledForReportingButNotEnforced'
conditions = @{
users = @{ includeRoles = @('62e90394-69f5-4237-9190-012177145e10'); excludeGroups = @('REPLACE_WITH_BREAKGLASS_GROUP_ID') }
applications = @{ includeApplications = @('All') }
}
grantControls = @{ operator = 'OR'; authenticationStrength = @{ id = '00000000-0000-0000-0000-000000000004' } }
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $paramsVerify
Get-MgIdentityConditionalAccessPolicy -Filter "displayName eq 'HuntPack - Global Administrators require phishing-resistant MFA'" | Select-Object DisplayName, State
Rollback
$id = (Get-MgIdentityConditionalAccessPolicy -Filter "displayName eq 'HuntPack - Global Administrators require phishing-resistant MFA'").Id Remove-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId $id
Playbook 5 · Okta (T1098.005, T1078.004; M1032, M1036)
Step 5.1 · Tighten enrollment, network zones and admin access in the Admin Console
What it does: Limits where factors can be enrolled, blocks anonymizer networks, and restricts the admin console.
Prerequisites: Okta super administrator; a list of corporate egress ranges; FastPass or FIDO2 enrolled for admins; menu names can vary by release and SKU.
Reboot required: No.
Configuration
1. Security > General: set Okta ThreatInsight to log and enforce at the threat level you accept. 2. Security > Networks: add a zone for corporate egress ranges, and a dynamic zone for anonymizers and proxies if your SKU offers it; mark the anonymizer zone as blocked. 3. Security > Authenticators > Enrollment: edit the enrollment policy so Okta Verify and FastPass enrollment requires re-authentication and runs only from the corporate zone. 4. Security > Authentication policies: for the Okta Admin Console app, add a rule that requires a phishing-resistant authenticator and the corporate zone. 5. Record the previous value of each setting before saving.
Verify
System Log search, last 24 hours: eventType eq "user.mfa.factor.activate" # Every hit should come from the corporate zone and carry a managed device
Rollback
Reverse each console change using the previous values recorded in step 5. Blocking a zone can lock out remote staff; keep a super-admin session open while testing.
Playbook 6 · Salesforce and Google Workspace (T1213, T1567, T1070.008; M1047, M1026)
Step 6.1 · Limit Salesforce export paths and keep event logs
What it does: Reduces who can bulk-export and makes bulk activity visible.
Prerequisites: Salesforce admin; Event Monitoring licence; a list of integration users that need API access.
Reboot required: No.
Configuration
1. Setup > Event Monitoring Settings: enable the event types you ingest (login, API, bulk-result, report export). 2. Profiles and permission sets: remove API Enabled and Export Reports from profiles that do not need them. 3. Profiles: set Login IP Ranges for integration and admin profiles. 4. Digital Experiences: review each guest user profile and remove object and API access it does not need.
Verify
SELECT Profile.Name, COUNT(Id) FROM User WHERE IsActive = true AND Profile.PermissionsApiEnabled = true GROUP BY Profile.Name # Only profiles with a business need should appear
Rollback
Restore the previous profile permissions from the change record. Removing API Enabled can break integrations, so test with one profile first.
Step 6.2 · Restrict third-party app access in Google Workspace
What it does: Stops users authorizing add-ons such as ToogleBox Recall, which can permanently delete mail.
Prerequisites: Google Workspace super administrator.
Reboot required: No.
Configuration
Admin console > Security > Access and data control > API controls > Manage third-party app access: set unconfigured third-party apps to restricted for Gmail scopes, and allowlist only approved apps. Admin console > Reporting > Audit and investigation > OAuth log events: add an alert on app name containing ToogleBox.
Verify
Audit and investigation > OAuth log events, filter App name contains ToogleBox. Expect no authorization events.
Rollback
Set the access setting back to its previous value. Restricting apps can break approved add-ons, so allowlist them first.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate (identity, SaaS and PeopleSoft) | Revoke all sessions, tokens and OAuth grants for affected users in the IdP and every SaaS app. Disable compromised accounts. Pause MFA registration and self-service password reset. Limit VPN and VDI to compliant devices. Tell the help desk to move to manual verification. Network-contain affected PeopleSoft hosts. Block /PSEMHUB on the normalized path. Block the Section 10 domains and addresses. | IR lead; IdP admin; server team | IdP and SaaS audit exports; Falcon containment status; proxy configuration |
| Preserve | Snapshot every WebLogic node behind the load balancer. Copy PSEMHUB.war, PORTAL.war, access logs, /tmp and shell history. Export SaaS audit logs before retention expires. Record every MFA factor and OAuth grant found. | IR lead; forensics | Disk images; log exports; hash list |
| Eradicate | Remove web shells, Ple64.exe, Neo-reGeorg pages and MeshAgent. Remove attacker MFA factors and the ToogleBox Recall authorization. Rotate every credential readable from the PeopleSoft tier, including psappsrv.cfg database strings, Integration Broker and cloud keys. Revoke and reissue integration tokens. Apply the Oracle Security Alert. | Server team; IdP admin; app owners | Rotation ticket IDs; patch inventory |
| Recover | Re-enable MFA enrollment only with phishing-resistant methods and re-authentication. Restore access in stages. Monitor with Q1 to Q13 for 30 days. Prepare for extortion contact: verify demands through a known channel and do not send payment or respond to demands, as the FBI advises. Report to the FBI Internet Crime Complaint Center and brief legal and communications. | IR lead; legal; communications | Monitoring dashboard; IC3 report reference |
Containment order follows Mandiant's guidance (source 5): because these intrusions use valid credentials rather than malware, revoking sessions and restricting identity operations comes before host cleanup.
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1583.001 | Lookalike C2 and SSO domains | Q1 | Q1 | Good |
| T1566.004 | Voice phishing call and lure page on a personal phone | GAP | ||
| T1078.004, T1098.005, T1556.006 | Attacker-enrolled MFA after a failure-heavy sign-in | Q7, Q8, Q9, Q10 | Good | |
| T1190 | CVE-2026-35273 exploitation attempts | Q5 | Q5 | Partial |
| T1505.003 | JSP web shell on disk (file creation) | Partial | ||
| T1219, T1036.005 | MeshCentral agents and lookalike names | Q1, Q2, Q3 | Q1, Q2, Q3 | Good |
| T1059.007, T1110.003, T1560.002 | meshctrl, sshpass spray, zstd staging | Q4 | Q4 | Partial |
| T1187 | Outbound SMB coercion | Q6 | Partial | |
| T1213.002, T1530 | Scripted SharePoint and OneDrive theft | Q11 | Good | |
| T1213.006, T1567 | Salesforce bulk export and Data Loader | Q13 | Partial | |
| T1070.008 | ToogleBox Recall and mailbox cleanup | Q12 | Good | |
| T1528, T1550.001 | Stolen integration-token reuse | Q13 | Partial | |
| T1657 | Extortion contact | GAP |
Gaps. The phone call and the lure page on a personal phone are outside endpoint telemetry; only help-desk process and user training cover them. File creation of JSP web shells has no Falcon query in this pack, so N6 and the host auditd rule cover it. Extortion contact is covered by mail-gateway search (N9) and legal process. Integration-token reuse is partly outside endpoint telemetry and depends on SaaS audit ingest.
Validation. Run Section 11 before promoting: telemetry ready, 14-day baseline, safe positive tests, then staged promotion.
Hunt Summary Ticket
TITLE: ShinyHunters Vishing-to-SaaS Data Theft and PeopleSoft CVE-2026-35273 Exploitation
SEVERITY: High. Active data-theft extortion with exploited-in-the-wild zero-day and n-day
SCOPE: Identity provider and SaaS audit logs; PeopleSoft web tier and Linux servers; endpoint
DNS, network and process telemetry
HYPOTHESIS: Callers pose as IT support to steal an SSO password and MFA code, enroll their own
factor, and bulk-download SaaS data. Separately, the group exploits PeopleSoft EMHub,
installs MeshCentral agents and exfiltrates data over SSH.
QUERIES: 13 CQL queries (Q1-Q13): 6 on endpoint telemetry, 7 on identity and SaaS logs.
DO FIRST: 1) Run Q8 and Q9 over 14 days. 2) Check PeopleSoft hosts with Q5, N6 and Playbook 1.
3) Import the Section 10 CSV. 4) Brief the help desk on video and callback verification.
FINDINGS: [fill in after the hunt]
GAPS: The phone call and lure page on a personal phone are outside endpoint telemetry. JSP file
creation has no query here. Integration-token reuse depends on SaaS audit ingest.
ACTIONS: Patch CVE-2026-35273; block /PSEMHUB on the normalized path; enforce phishing-resistant
MFA; restrict MFA enrollment; revoke sessions on any hit.
OWNER: REPLACE_WITH_OWNER
VERSION: v0.1 (Draft) 2026-10-16Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| T1 | MITRE ATT&CK G1057 ShinyHunters (UNC6240, Bling Libra) | Canonical aliases, active since at least 2019, technique catalogue including T1190 on PeopleSoft CVE-2026-35273, MeshCentral masquerade, Tor DLS, extortion mailboxes. | 2026-10-16 |
| T1 | GTIG/Mandiant: Vishing for Access, Tracking the Expansion of ShinyHunters-Branded SaaS Data Theft (30 Jan 2026) | UNC6661/UNC6671/UNC6240 split, vishing and victim-branded SSO domains, ToogleBox Recall, PowerShell SharePoint theft, 19 source IPs, extortion mechanics. | 2026-10-16 |
| T1 | GTIG/Mandiant: ShinyHunters Targets Education Sector with Oracle PeopleSoft Exploit (11 Jun 2026) | CVE-2026-35273 zero-day window 27 May to 9 Jun, MeshCentral staging, masqueraded agents, fanout script, hashes, 6 network indicators. | 2026-10-16 |
| T1 | GTIG/Mandiant: ShinyHunters Renewed Mass Exploitation Campaign Targeting Oracle PeopleSoft (Sep 2026) | %50SEMHUB WAF bypass, fileless and web-shell exploitation, x. | 2026-10-16 |
| T1 | Mandiant: proactive hardening, logging and detection guide for ShinyHunters-branded SaaS intrusions | Containment, help-desk verification, IdP and SaaS hardening, logging requirements, detection logic. | 2026-10-16 |
| T1 | Okta Threat Intelligence: Phishing kits adapt to the script of callers | Real-time session-orchestration vishing kits defeat push and number matching; FastPass and FIDO passkeys resist. | 2026-10-16 |
| T1 | FBI IC3 PSA I-20260515-PSA: ShinyHunters Cyber Criminal Group Attacks Learning Management System (15 May 2026) | Government description of extortion pressure: harassment, threatening calls and texts, swatting, Tor leak site, false claims. | 2026-10-16 |
| T1 | Sekoia: Gotta Breach 'Em All, the journey of ShinyHunters | Group structure (decentralised clusters under a shared alias, link to The Com), 2025 to 2026 timeline, token-theft supply-chain pattern. | 2026-10-16 |
| T2 | Obsidian Security: Behind the breach, ShinyHunters' 2026 voice phishing campaign | Okta event sequences, FastPass enrollment from an emulated Android device named Passkey, Genymobile user agent, SSO burst, Slack and Drive bulk download. | 2026-10-16 |
| T3 | Huntress: ShinyHunters threat actor profile | Aggregated campaign timeline (token abuse, Aura exploitation, actor user-agent strings). | 2026-10-16 |
| T3 | Picus Security: The ShinyHunters Domino Effect | Background on the ecosystem-breach pattern. | 2026-10-16 |
| T2 | KrebsOnSecurity: ShinyHunters arrests and extortion (7 Oct 2026) | Current status: reported detentions and arrests, brand takeover, continued PeopleSoft mass exploitation and the WAF-bypass update. | 2026-10-16 |
| T2 | BleepingComputer: FBI arrests another suspected ShinyHunters hacker (Oct 2026) | Corroborates the October 2026 arrests and the PeopleSoft attribution. | 2026-10-16 |
| T1 | Oracle Security Alerts (CVE-2026-35273 advisory, referenced by GTIG) | Patch authority for Track B. Not fetched here; follow it directly. | 2026-10-16 |