Salt Typhoon / UAT-9244 — TernDoor · PeerTime · BruteEntry
Executive Summary
Since 2024, UAT-9244 — a China-nexus APT that Cisco Talos assesses with high confidence as closely overlapping FamousSparrow and Tropic Trooper — has been compromising telecommunications infrastructure (Windows endpoints, Linux servers, and edge/embedded devices) in South America for long-term espionage. The cluster proliferates access with three custom implants that together cover the IT estate end-to-end.
- TernDoor — a Windows backdoor descended from CrowDoor → SparrowDoor. Delivered by DLL side-loading (
wsprint.exe→BugSplatRc64.dll→ encryptedWSPrint.dll), decrypted in memory and injected intomsiexec.exe. Ships a kernel driver (WSPrint.sys, device\Device\VMTool) that suspends/terminates processes for defense evasion. Persists via theWSPrintscheduled task and/or a Run key, hiding the task by editing the TaskCache registry tree. - PeerTime — a cross-architecture (ARM, AArch64, MIPS, PPC) ELF backdoor that uses the BitTorrent protocol for resilient peer-based C2 and payload delivery. Loader runs the payload in memory and renames its process; uses Docker and BusyBox as living-off-the-land helpers. C/C++ and newer Rust variants exist; tracked in VirusTotal as
angrypeer. - BruteEntry — a GoLang brute-force agent dropped on Linux edge devices to make them Operational Relay Boxes (ORBs). Registers with a C2, pulls target lists, and brute-forces SSH, Postgres (5432), and Tomcat (
/manager/html) with embedded credentials, reporting cracks back.
WSPrint scheduled-task/Run-key persistence, msiexec injection, and rogue driver are the highest-fidelity, lowest-FP catches. Treat the Linux/edge implants as a coverage problem first: PeerTime and BruteEntry live on routers, embedded systems, and appliances that frequently carry no EDR sensor — pair the host queries with network egress controls and perimeter IOC blocking.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Fwd |
|---|---|---|---|
| Primary | Cisco Talos — UAT-9244 | Full technical breakdown of all three implants, attack chain, persistence, driver, complete IOC set, ClamAV/Snort coverage (SID 65551) | Yes |
| Primary | ESET — FamousSparrow / SparrowDoor | TernDoor lineage CrowDoor → SparrowDoor; cluster overlap | Yes |
| Primary | Trend Micro — Earth Estries | CrowDoor context; shared China-nexus tooling | Partial |
| Secondary | The Hacker News | Corroborates targeting, implant roles, ORB tradecraft; no new IOCs | Partial |
| Secondary | BleepingComputer | Corroborates campaign scope and severity | Partial |
| Tertiary | Malpedia — UAT-9244 | Actor tracking, cross-references | Partial |
Confidence: HIGH — anchored on a single authoritative vendor primary (Talos) with full reverse-engineered behavior and atomic IOCs; trade press corroborates without adding indicators. "Salt Typhoon" link to UAT-9244 is unconfirmed per Talos and is retained only as the requested label.
Hunt Brief & Attack Chain
Working hypothesis: If UAT-9244 is present, we expect (a) a side-loaded wsprint.exe/msiexec.exe chain executing from C:\ProgramData\WSPrint\, (b) a WSPrint onstart-SYSTEM scheduled task and/or Run key with matching TaskCache hiding, (c) a rogue kernel driver exposing \Device\VMTool, (d) TLS beacons to the shared self-signed-cert C2 set on 443, and on Linux/edge (e) Docker/BusyBox-assisted ELF execution and outbound brute-force scanning to SSH/Postgres/Tomcat.
Attack Chain
| # | Step | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 | Initial access via brute-forced edge service or side-loaded delivery | Linux auth logs, NetworkConnect | Failed→success auth burst; new ORB outbound scanning |
| 2 | TernDoor delivery: wsprint.exe side-loads BugSplatRc64.dll → decodes WSPrint.dll in memory | ProcessRollup2, PeFileWritten | Implant filenames written outside System32; exec from ProgramData (Q1/Q2) |
| 3 | Inject final payload into msiexec.exe | ProcessRollup2, NetworkConnectIP4 | msiexec with no MSI making 443 egress (Q3) |
| 4 | Persistence: WSPrint onstart SYSTEM task + Run key | ProcessRollup2, AsepValueUpdate | schtasks /create … WSPrint … onstart; Run → ProgramData\WSPrint (Q4/Q4b) |
| 5 | Hide task by editing TaskCache tree (delete SD, Index 1→0) | RegGenericValueUpdate | SD/Index writes under Schedule\TaskCache\Tree\ (Q5) |
| 6 | Load process-killer driver WSPrint.sys (device \Device\VMTool) | Registry service, driver load | Service ImagePath → WSPrint.sys; rogue VMTool device (Q6) |
| 7 | TernDoor C2 over TLS/443 (shared self-signed cert, CN=8.8.8.8) | NetworkConnectIP4 | Connections to the 22-IP C2/infra set; cert pivot (Q7) |
| 8 | PeerTime on Linux/embedded: Docker+BusyBox staging, BitTorrent C2 | Linux ProcessRollup2, DnsRequest | docker running ELF from /tmp; busybox cp; angrypeer (Q8/Q10) |
| 9 | BruteEntry ORB: register with C2, brute SSH/Postgres/Tomcat | Linux ProcessRollup2, NetworkConnect | Outbound 22/5432/8080 fan-out; /tasks polling (Q9) |
Hunt Hypotheses (Priority Order)
| # | Hypothesis | MITRE | Conf. | FP Risk |
|---|---|---|---|---|
| H1 | TernDoor implant files (loader/payload/driver) written to a Windows host | T1574.002, T1014 | HIGH | LOW |
| H2 | WSPrint onstart-SYSTEM scheduled task / Run-key persistence present | T1053.005, T1547.001 | HIGH | LOW |
| H3 | Rogue driver service (WSPrint.sys / \Device\VMTool) installed | T1543.003, T1014 | HIGH | LOW |
| H4 | Host beaconing to confirmed UAT-9244 C2 IPs / PeerTime domains | T1071.001, T1573 | HIGH | LOW |
| H5 | msiexec.exe with no MSI argument making 443 egress (injection) | T1055, T1071.001 | MED | MED |
| H6 | TaskCache SD/Index manipulation hiding a scheduled task | T1562.001, T1564 | MED | MED |
| H7 | Linux edge host fan-out brute-forcing SSH/Postgres/Tomcat (ORB) | T1110, T1090 | MED | MED |
| H8 | PeerTime/BruteEntry Docker+BusyBox staging from temp paths | T1059.004, T1610 | MED | MED |
Consolidated IOC Table
Talos-attributed indicators. Bulk quick-copy blocks and full JSON are in §10.
| Type | Value | Conf. | Action | Context |
|---|---|---|---|---|
| IP (C2) | 154.205.154.82:443 | HIGH | Detect | TernDoor C2 |
| IP (C2) | 207.148.121.95:443 | HIGH | Detect | TernDoor C2 |
| IP (C2) | 207.148.120.52:443 | HIGH | Detect | TernDoor C2 |
| IP (C2/host) | 212.11.64.105 | HIGH | Detect | TernDoor C2; loader + PeerTime/BruteEntry host |
| Domain | bloopencil.net | HIGH | Detect | PeerTime C2 |
| IP (C2) | 185.196.10.38 | HIGH | Detect | PeerTime C2 |
| IP (infra) | 185.196.10.247 | HIGH | Detect | PeerTime remote + BruteEntry infra |
| Domain | xtibh.com · xcit76.com | HIGH | Detect | PeerTime remote locations |
| TLS cert (SHA256) | 0c7e3668…fdbdecc8 | HIGH | Hunt | Self-signed cert shared across TernDoor C2 (CN=8.8.8.8) |
| IP set (18) | 149.28.25.33 + 17 more (cert pivot) | MED | Hunt | Suspected UAT-9244 infra — corroborate before blocking |
| File path | C:\ProgramData\WSPrint\WSPrint.exe | HIGH | Hunt | TernDoor persistence path |
| File names | BugSplatRc64.dll · WSPrint.dll · WSPrint.sys | HIGH | Hunt | Side-load loader / payload / driver |
| Sched task | WSPrint (onstart, /ru SYSTEM) | HIGH | Detect | TernDoor persistence |
| Device | \Device\VMTool | HIGH | Hunt | Rogue driver device object |
| Decode key | qwiozpVngruhg123 | MED | Enrich | WSPrint.dll payload decode key |
| Hash (driver) | 2d2ca7d2…dc8f0538 | HIGH | Detect | WSPrint.sys process-killer driver |
| VT config tag | malware_config:angrypeer | HIGH | Hunt | PeerTime VirusTotal pivot |
detect +6mo but re-validate against Talos/VT monthly. The 18-IP suspected set is a cert pivot: hunt and enrich, do not auto-block without corroboration (some may be shared hosting).Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk if Missing |
|---|---|---|---|
| Windows endpoints/servers (TernDoor) | Falcon ProcessRollup2, PeFileWritten, AsepValueUpdate, RegGenericValueUpdate, NetworkConnectIP4 | CRITICAL | Low — strong native coverage |
| Linux servers (PeerTime/BruteEntry) | Falcon Linux sensor: ProcessRollup2, ElfFileWritten, NetworkConnect, DnsRequest | HIGH | Medium — only if sensor deployed |
| Routers / embedded / appliances (PeerTime ARM/MIPS, BruteEntry ORB) | NetFlow, firewall egress logs, appliance syslog, NDR | HIGH | High — typically NO EDR sensor |
| Network egress (all C2) | Firewall / proxy logs, TLS metadata (JA3/cert), DNS logs | HIGH | Medium — depends on egress visibility |
| BitTorrent C2 (PeerTime) | NDR / flow analytics for P2P patterns | MEDIUM | High — peer-based, no fixed domain |
ATT&CK Mapping
| Tactic | Technique ID | Technique Name | Observed Behavior |
|---|---|---|---|
| Initial Access / Cred Access | T1110 / T1133 | Brute Force / External Remote Services | BruteEntry hits SSH/Postgres/Tomcat with embedded creds |
| Execution | T1059.004 / T1610 | Unix Shell / Deploy Container | Shell scripts stage ELF; Docker runs PeerTime loader |
| Defense Evasion | T1574.002 | DLL Side-Loading | wsprint.exe loads BugSplatRc64.dll |
| Defense Evasion | T1055 | Process Injection | Payload injected into msiexec.exe |
| Defense Evasion | T1036 | Masquerading | WSPrint mimics print spooler; PeerTime renames process |
| Defense Evasion | T1014 / T1543.003 | Rootkit / Windows Service | WSPrint.sys driver suspends/terminates processes via \Device\VMTool |
| Defense Evasion | T1562.001 / T1564 | Impair Defenses / Hide Artifacts | TaskCache SD deletion / Index 1→0 to hide task |
| Persistence | T1053.005 | Scheduled Task | WSPrint onstart SYSTEM task |
| Persistence | T1547.001 | Registry Run Key | HKCU…\Run → ProgramData\WSPrint |
| Command & Control | T1071.001 / T1573 | Web Protocols / Encrypted Channel | TLS/443 to shared self-signed cert C2 |
| Command & Control | T1095 | Non-Application Layer (P2P) | PeerTime BitTorrent C2 |
| Resource Development | T1584.005 | Botnet / ORB | Edge devices converted to relay boxes |
| Discovery | T1082 | System Information Discovery | TernDoor collects host/user/IP/OS bitness |
Native Audit-Log Hunts (Non-CQL)
For surfaces where EDR is blind (edge/embedded devices, appliances) — run these in SIEM, firewall, and NDR logs.
| Hunt | Source | Logic | Response |
|---|---|---|---|
| Edge brute-force inbound | SSH (auth.log), Postgres, Tomcat access logs | High-rate auth failures from one source then a success; Tomcat /manager/html POST bursts | Lock account, reset creds, isolate source |
| ORB outbound scanning | Firewall / NetFlow | Internal edge host initiating wide fan-out to external 22/5432/8080 | Block egress, image device, treat as compromised relay |
| C2 beacon to IOC set | Firewall / proxy / DNS | Any traffic to §4 IPs/domains; resolution of bloopencil.net / xtibh.com / xcit76.com | Block, pivot on all hosts that touched it |
| Self-signed cert pivot | TLS metadata / Zeek x509 | Cert SHA256 0c7e3668… or CN=8.8.8.8 / O=Internet Widgits on 443 egress | Hunt all peers presenting the cert |
| BitTorrent from servers | NDR / flow | BitTorrent handshake/DHT from telecom servers or edge devices (no business reason) | Investigate as PeerTime C2 |
CrowdStrike LogScale CQL Hunt Queries
Looks for: the TernDoor loader, payload, and driver filenames being written outside System32. Accomplishes: catches delivery/staging at step 2 before execution.
// HUNT: TernDoor loader/payload/driver file write // MITRE: T1574.002, T1014 | CONF: high FP: low COST: low // REQUIRES: PeFileWritten / NewExecutableWritten telemetry // FALSE POSITIVES: none expected (filenames are implant-specific) #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\(WSPrint\.(exe|dll|sys)|BugSplatRc64\.dll)$/i | table([@timestamp, aid, ComputerName, UserName, TargetFileName, SHA256HashData, ContextBaseFileName], limit=200)
Looks for: any execution or write of the seven Talos Windows hashes. Accomplishes: deterministic confirmation of TernDoor presence.
// HUNT: TernDoor hash match (Windows set) // MITRE: T1574.002, T1055, T1014 | CONF: high FP: low COST: low // REQUIRES: SHA256HashData on process/file events #event_simpleName=/^(ProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | in(SHA256HashData, values=[ "711d9427ee43bc2186b9124f31cba2db5f54ec9a0d56dc2948e1a4377bada289", "3c098a687947938e36ab34b9f09a11ebd82d50089cbfe6e237d810faa729f8ff", "f36913607356a32ea106103387105c635fa923f8ed98ad0194b66ec79e379a02", "a5e413456ce9fc60bb44d442b72546e9e4118a61894fbe4b5c56e4dfad6055e3", "075b20a21ea6a0d2201a12a049f332ecc61348fc0ad3cfee038c6ad6aa44e744", "1f5635a512a923e98a90cdc1b2fb988a2da78706e07e419dae9e1a54dd4d682b", "2d2ca7d21310b14f5f5641bbf4a9ff4c3e566b1fbbd370034c6844cedc8f0538"]) | table([@timestamp, aid, ComputerName, UserName, #event_simpleName, ImageFileName, SHA256HashData], limit=max)
Looks for: msiexec.exe making outbound 443 connections with no install package on the command line. Accomplishes: catches TernDoor's injected payload (step 3) when the C2 IP is unknown.
.msi//i//x argument, which is abnormal; exclude software-deployment hosts.// HUNT: msiexec outbound 443 with no MSI argument // MITRE: T1055, T1071.001 | CONF: medium FP: medium COST: low-medium // REQUIRES: NetworkConnectIP4 + ProcessRollup2 command line // TUNING: exclude msiexec with .msi // /i // /x // /update; exclude deployment hosts #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^msiexec\.exe$/i | RemotePort=443 | join(query={ #event_simpleName=ProcessRollup2 | ImageFileName=/\\msiexec\.exe$/i | CommandLine!=/(\.msi|\s\/i\b|\s\/x\b|\s\/update)/i }, field=[aid, ContextProcessId_decimal], key=[aid, TargetProcessId_decimal], include=[CommandLine, ParentBaseFileName]) | table([@timestamp, aid, ComputerName, RemoteAddressIP4, RemotePort, CommandLine, ParentBaseFileName], limit=200)
Looks for: schtasks /create registering the WSPrint task to run from ProgramData as SYSTEM at startup. Accomplishes: catches persistence (step 4) — one of the highest-fidelity signals.
// HUNT: WSPrint onstart SYSTEM scheduled task creation // MITRE: T1053.005 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 command line #event_simpleName=ProcessRollup2 | ImageFileName=/\\schtasks\.exe$/i | CommandLine=/\/create/i | CommandLine=/WSPrint/i | CommandLine=/(onstart|ProgramData\\WSPrint)/i | table([@timestamp, aid, ComputerName, UserName, CommandLine, ParentBaseFileName], limit=200)
Looks for: a Run key whose value resolves into ProgramData\WSPrint. Accomplishes: catches the secondary login persistence the actor sets alongside the task.
// HUNT: Run-key persistence -> ProgramData\WSPrint // MITRE: T1547.001 | CONF: high FP: low COST: low // REQUIRES: AsepValueUpdate / RegGenericValueUpdate #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate)$/ | RegObjectName=/\\CurrentVersion\\Run$/i | RegStringValue=/ProgramData\\WSPrint/i | table([@timestamp, aid, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue], limit=200)
Looks for: writes to SD / Index under Schedule\TaskCache\Tree\. Accomplishes: catches the task-hiding evasion (step 5), including for renamed variants of the WSPrint task.
// HUNT: TaskCache SD/Index manipulation (hidden task) // MITRE: T1562.001, T1564 | CONF: medium FP: medium COST: low // REQUIRES: RegGenericValueUpdate // TUNING: exclude sanctioned RMM/MDM parents; focus on SD deletions + Index=0 #event_simpleName=/^Reg.*Update$/ | RegObjectName=/\\Schedule\\TaskCache\\Tree\\/i | RegValueName=/^(SD|Index)$/ | table([@timestamp, aid, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue], limit=200)
Looks for: a service whose image path references WSPrint.sys, or registry artifacts of the VMTool device. Accomplishes: catches the process-killer driver (step 6) used for defense evasion.
// HUNT: TernDoor driver service install // MITRE: T1543.003, T1014 | CONF: high FP: low COST: low // REQUIRES: registry service-key telemetry // FALSE POSITIVES: none expected (driver name is implant-specific) #event_simpleName=/^(RegGenericValueUpdate|RegSystemConfigValueUpdate)$/ | RegObjectName=/\\Services\\/i | RegStringValue=/(WSPrint\.sys|\\Device\\VMTool)/i | table([@timestamp, aid, ComputerName, RegObjectName, RegValueName, RegStringValue], limit=200)
Looks for: any host connecting to the confirmed C2 IPs and the suspected-infra set. Accomplishes: catches C2 (steps 3/7) across all three implants.
// HUNT: UAT-9244 C2 / infra outbound // MITRE: T1071.001, T1573 | CONF: high (confirmed) / medium (suspected) FP: low COST: low // REQUIRES: NetworkConnectIP4 // TUNING: confirmed IPs -> alert; suspected IPs -> investigate only #event_simpleName=NetworkConnectIP4 | in(RemoteAddressIP4, values=[ "154.205.154.82","207.148.121.95","207.148.120.52","212.11.64.105", "185.196.10.38","185.196.10.247", "149.28.25.33","154.205.154.194","154.205.154.65","154.205.154.70", "154.223.21.130","154.223.21.194","158.247.238.240","216.238.112.222", "216.238.123.242","216.238.94.37","38.54.125.134","38.60.199.34", "45.32.106.94","45.77.34.194","45.77.41.141","47.76.100.159", "64.190.113.170","64.95.10.253"]) | table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=max)
Looks for: resolution of the PeerTime C2 / remote-location domains. Accomplishes: catches PeerTime hosts that still use DNS bootstrap before falling back to BitTorrent peers.
// HUNT: PeerTime C2 domain resolution // MITRE: T1071.001, T1095 | CONF: high FP: low COST: low // REQUIRES: DnsRequest #event_simpleName=DnsRequest | DomainName=/^(bloopencil\.net|xtibh\.com|xcit76\.com)$/i | table([@timestamp, aid, ComputerName, DomainName, ContextBaseFileName], limit=200)
Looks for: a single Linux host opening many outbound connections to SSH/Postgres/Tomcat ports across many distinct destinations. Accomplishes: catches a host turned into a BruteEntry relay (step 9). Requires the Linux sensor.
// HUNT: BruteEntry ORB outbound scanning // MITRE: T1110, T1090, T1584.005 | CONF: medium FP: medium COST: medium // REQUIRES: Linux NetworkConnectIP4 // TUNING: exclude known scanner aids; raise distinct-IP threshold to fit environment #event_simpleName=NetworkConnectIP4 | event_platform=Lin | in(RemotePort, values=["22","5432","8080","8443"]) | groupBy([aid, ComputerName, RemotePort], function=count(RemoteAddressIP4, distinct=true, as=distinct_targets)) | distinct_targets >= 50 | sort(distinct_targets, order=desc)
Looks for: Docker or BusyBox being used to launch/copy an ELF from a temp/world-writable path. Accomplishes: catches PeerTime/BruteEntry living-off-the-land staging (step 8). Requires the Linux sensor.
/tmp, /dev/shm, /var/tmp and busybox cp into system paths; exclude CI/build hosts.// HUNT: PeerTime/BruteEntry Linux LOLbin staging // MITRE: T1059.004, T1610, T1036 | CONF: medium FP: medium COST: medium // REQUIRES: Linux ProcessRollup2 command line // TUNING: exclude CI/build hosts; require temp-path execution #event_simpleName=ProcessRollup2 | event_platform=Lin | CommandLine=/((\bdocker\b\s+[^\s]*\/(tmp|dev\/shm|var\/tmp)\/)|(\bbusybox\b\s+cp\b)|(\bpgrep\b\s+\/(tmp|var)\/))/i | table([@timestamp, aid, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName], limit=200)
CrowdStrike Custom IOA Recommendations
| IOA Name | Field Patterns | Benign Exclusions | Deployment Path |
|---|---|---|---|
| DETECT — WSPrint onstart SYSTEM task | Process schtasks.exe; CommandLine /create.*WSPrint.*(onstart|ProgramData\WSPrint) | None expected | Custom IOA → Process Creation; Detect/Block, Critical (Q4) |
| DETECT — Run key → ProgramData\WSPrint | Registry value write; data contains ProgramData\WSPrint under a Run key | None expected | Custom IOA → Registry Operation; Detect/Block (Q4b) |
| DETECT — WSPrint.sys driver service | Service/registry ImagePath contains WSPrint.sys or device VMTool | None expected | Custom IOA → Registry; pair with Vulnerable Driver Blocklist (Q6) |
| DETECT — msiexec no-MSI 443 egress | msiexec.exe network 443 with no .msi//i//x arg | Software-deployment servers (exclude by host group) | Custom IOA → Network Connection; Detect→tune→Block (Q3) |
| BLOCK — TernDoor/driver hash | SHA256 in the 7-hash Windows set (§10) | None | IOC Management → Hashes → Block + Detect (Q2) |
Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click plaintext blocks for Falcon IOC ingestion, firewall/proxy blocklists, or TIP watchlists.
154.205.154.82 207.148.121.95 207.148.120.52 212.11.64.105 185.196.10.38 185.196.10.247
149.28.25.33 154.205.154.194 154.205.154.65 154.205.154.70 154.223.21.130 154.223.21.194 158.247.238.240 216.238.112.222 216.238.123.242 216.238.94.37 38.54.125.134 38.60.199.34 45.32.106.94 45.77.34.194 45.77.41.141 47.76.100.159 64.190.113.170 64.95.10.253
bloopencil.net xtibh.com xcit76.com
711d9427ee43bc2186b9124f31cba2db5f54ec9a0d56dc2948e1a4377bada289 3c098a687947938e36ab34b9f09a11ebd82d50089cbfe6e237d810faa729f8ff f36913607356a32ea106103387105c635fa923f8ed98ad0194b66ec79e379a02 a5e413456ce9fc60bb44d442b72546e9e4118a61894fbe4b5c56e4dfad6055e3 075b20a21ea6a0d2201a12a049f332ecc61348fc0ad3cfee038c6ad6aa44e744 1f5635a512a923e98a90cdc1b2fb988a2da78706e07e419dae9e1a54dd4d682b 2d2ca7d21310b14f5f5641bbf4a9ff4c3e566b1fbbd370034c6844cedc8f0538
# PeerTime instrumentor c9fc2af30f769d856b88b3051f19fdb663b3e0a0916279df9bbcba93c6a110c9 # PeerTime malware (16) 34d64b3cd9430e85edefcb883973a086dd5de9917e05fabec89b1f4ab9627e91 1cedf01dd4b7e50181d0e781825c66957b862941395d77c8bd7705114f319c80 bfc35f12d00fa4b40c5fbce9e37d704e12a52262709bcbdf09f97890bc40cad5 f3e899789b56429f483e5096e1f473335024f1f763e2d428132338e30352b89e 6ec070457d1f6f239cb02c5e1576a3660cca98f3a07eec6e4e107f698d7fe555 15d937803f90c2b9e277ff94d3e98ff30015ecc7f4623a158e3c98861e5cb278 7b70cd956f082b1029d02b4cb7608893f2de7fa9c500d7d7febdd0f745ac3cb6 d78b3c6df8f3756a7e310cf7435fdba201dd03ec9f97420a0db683489a01a7c9 3fcadde4b414a18b2fed56c1ec59d97977123615fbbf411a1c78425445a6e71c 3d9fbfc2c056eac857ba54e5ed134aa45a4b8322ee9f9353ba32e5b2ca71b0e3 c9a42423ef08bd7f183915780d39530eba5e4e25968c51965ff8bb3026965a28 38eeaa4eaad72feb3f8e6993565fcc548d8e7bb93642590f00fa24aacc0e2862 56bead2933e91366e4a0d5761daf5b238a7f2c22e597664ef67b3ecae20ab326 6a2d23cc8746a83e9a3b974788fce0e414706b8e75ff390426dd7e10b19967b3 9a7225c17e4bad3ffe7f080530d36f4f8aca5c116b913caa91ab9b0cee85638e 870e791af14caaf395c56028176a9c3f4c1ff0318ef3112d57ecd3d4a1be2ef9 # BruteEntry instrumentor + agent + install script 66ce42258062e902bd7f9e90ad5453a901cfc424f0ea497c4d14f063f3acd329 d5eb979cb8a72706bfa591fa57d4ebf7d13cecdc9377b0192375e2f570f796df 66adeedfb739774fcc09aa7426c8fad29f8047ab4caee8040d07c0e84d011611 66bdce93de3b02cf9cdadad18ca1504ac83e379a752d51f60deae6dcbafe4e31 1fcdd5a417db31e5e07d32cecfa69e53f0dce95b7130ad9c03b92249f001801d
C:\ProgramData\WSPrint\WSPrint.exe # persistence path BugSplatRc64.dll / WSPrint.dll / WSPrint.sys # loader/payload/driver Scheduled task: WSPrint (onstart, /ru SYSTEM) Device: \Device\VMTool # rogue driver Decode key: qwiozpVngruhg123 TLS cert SHA256: 0c7e36683a100a96f695a952cf07052af9a47f5898e1078311fd58c5fdbdecc8 VT pivot: malware_config:angrypeer Snort SID: 65551
Structured JSON
{
"actor": "UAT-9244 (Talos) ~ FamousSparrow / Tropic Trooper; telecom overlap with Salt Typhoon (unconfirmed)",
"source": "Cisco Talos, 2026-03-05",
"generated": "2026-06-10",
"indicators": [
{"type":"ipv4","value":"154.205.154.82","port":443,"confidence":"high","action":"detect","context":"TernDoor C2"},
{"type":"ipv4","value":"207.148.121.95","port":443,"confidence":"high","action":"detect","context":"TernDoor C2"},
{"type":"ipv4","value":"207.148.120.52","port":443,"confidence":"high","action":"detect","context":"TernDoor C2"},
{"type":"ipv4","value":"212.11.64.105","confidence":"high","action":"detect","context":"TernDoor C2 + loader/PeerTime/BruteEntry host"},
{"type":"ipv4","value":"185.196.10.38","confidence":"high","action":"detect","context":"PeerTime C2"},
{"type":"ipv4","value":"185.196.10.247","confidence":"high","action":"detect","context":"PeerTime remote + BruteEntry infra"},
{"type":"domain","value":"bloopencil.net","confidence":"high","action":"detect","context":"PeerTime C2"},
{"type":"domain","value":"xtibh.com","confidence":"high","action":"detect","context":"PeerTime remote location"},
{"type":"domain","value":"xcit76.com","confidence":"high","action":"detect","context":"PeerTime remote location"},
{"type":"x509_sha256","value":"0c7e36683a100a96f695a952cf07052af9a47f5898e1078311fd58c5fdbdecc8","confidence":"high","action":"hunt","context":"Shared self-signed TernDoor C2 cert (CN=8.8.8.8)"},
{"type":"ipv4_suspected","value":["149.28.25.33","154.205.154.194","154.205.154.65","154.205.154.70","154.223.21.130","154.223.21.194","158.247.238.240","216.238.112.222","216.238.123.242","216.238.94.37","38.54.125.134","38.60.199.34","45.32.106.94","45.77.34.194","45.77.41.141","47.76.100.159","64.190.113.170","64.95.10.253"],"confidence":"medium","action":"hunt","context":"Cert-pivot suspected infra — corroborate before blocking"},
{"type":"sha256_windows","value":["711d9427ee43bc2186b9124f31cba2db5f54ec9a0d56dc2948e1a4377bada289","3c098a687947938e36ab34b9f09a11ebd82d50089cbfe6e237d810faa729f8ff","f36913607356a32ea106103387105c635fa923f8ed98ad0194b66ec79e379a02","a5e413456ce9fc60bb44d442b72546e9e4118a61894fbe4b5c56e4dfad6055e3","075b20a21ea6a0d2201a12a049f332ecc61348fc0ad3cfee038c6ad6aa44e744","1f5635a512a923e98a90cdc1b2fb988a2da78706e07e419dae9e1a54dd4d682b","2d2ca7d21310b14f5f5641bbf4a9ff4c3e566b1fbbd370034c6844cedc8f0538"],"confidence":"high","action":"detect","context":"TernDoor loader/payload/driver"},
{"type":"sha256_linux","value":["c9fc2af30f769d856b88b3051f19fdb663b3e0a0916279df9bbcba93c6a110c9","34d64b3cd9430e85edefcb883973a086dd5de9917e05fabec89b1f4ab9627e91","66adeedfb739774fcc09aa7426c8fad29f8047ab4caee8040d07c0e84d011611","1fcdd5a417db31e5e07d32cecfa69e53f0dce95b7130ad9c03b92249f001801d"],"confidence":"high","action":"detect","context":"PeerTime/BruteEntry — full set in quick-copy block + Talos report"},
{"type":"filepath","value":"C:\\ProgramData\\WSPrint\\WSPrint.exe","confidence":"high","action":"hunt","context":"TernDoor persistence path"},
{"type":"scheduled_task","value":"WSPrint","confidence":"high","action":"hunt","context":"onstart /ru SYSTEM"},
{"type":"device_object","value":"\\Device\\VMTool","confidence":"high","action":"hunt","context":"Rogue driver device"},
{"type":"vt_config","value":"malware_config:angrypeer","confidence":"high","action":"hunt","context":"PeerTime VirusTotal pivot"},
{"type":"snort_sid","value":"65551","confidence":"high","action":"detect","context":"Talos Snort coverage"}
]
}
Detection Validation Gates
| Gate | Requirement | Evidence |
|---|---|---|
| 1 — Telemetry ready | Falcon sensor on Windows + Linux servers; registry/network events flowing; SIEM ingesting edge/appliance logs | Event volume for ProcessRollup2, AsepValueUpdate, NetworkConnectIP4, DnsRequest (Win+Linux) |
| 2 — Benign baseline | Run Q3/Q5/Q9/Q10 for one cycle; record FP rate and build exclusions | Exclusion lists for deployment hosts, RMM agents, sanctioned scanners, CI/build boxes |
| 3 — Positive tests | Lab-simulate WSPrint task creation, a Run-key write to ProgramData, and 443 egress to a test IOC IP | Q4/Q4b/Q7 fire on the simulated activity |
| 4 — Promotion | Convert Q1/Q2/Q4/Q4b/Q6/Q7(confirmed)/Q8 to scheduled detections + IOAs; keep Q3/Q5/Q9/Q10 as tuned hunts | Scheduled searches live; IOAs in Detect→Block; IOCs ingested |
Hardening — Tiered & Deployable
The prevent half. Controls anchored to MITRE mitigations + platform authority. Telecom touches Windows/AD, Linux, and network/embedded — all three are first-class.
- Block all confirmed IOCs (§10 IPs, domains, 7 Windows + ELF hashes, Snort SID 65551) at EDR, firewall, proxy, and DNS. M1031 / M1037
- Enable the Microsoft Vulnerable Driver Blocklist + HVCI / Memory Integrity on all Windows hosts to blunt the WSPrint.sys process-killer driver and BYOVD. M1051 · MS Baseline · CIS Win 18.x
- Restrict internet exposure of SSH / Postgres / Tomcat-manager; bind management to internal/VPN and disable the Tomcat
/managerapp where unused. M1035 - Enforce account lockout + kill embedded/default credentials on SSH/Postgres/Tomcat (BruteEntry relies on credential brute-force). M1027 · M1032 · CIS Linux 5.x
- Deploy the §8 detections + §9 IOAs in Detect mode immediately.
- WDAC / AppLocker to block DLL/EXE execution from user-writable paths (
C:\ProgramData\*,%TEMP%) — breaks the WSPrint side-load chain. M1038 - Enable ASR rules: block executable content from email/webmail, block credential stealing, block persistence via WMI/registry; turn on tamper protection. M1040 · MS Baseline
- Centralize scheduled-task + driver-load + 4688 auditing to SIEM so TaskCache hiding and service installs are visible even where IOAs miss. M1047
- SSH hardening on Linux/edge: keys-only auth,
fail2ban, restrict source IPs; TLS/IP allow-listing for Postgres; remove default Tomcat manager roles. CIS Linux · DISA STIG - Egress default-deny from server/edge segments — denies ORB outbound scanning and unknown C2. M1037
- Rotate all credentials on any host that touched an IOC; assume edge devices that brute-forced out are fully compromised.
- Extend EDR / NDR coverage to Linux servers and supported edge; where embedded devices can't run a sensor, wrap them in NetFlow + flow analytics. ⚠ best-practice, no formal benchmark
- Segment the management plane of telecom edge/embedded devices off the user/server network; zero-trust access to management interfaces. M1030
- Firmware lifecycle program for routers/appliances (signed firmware, patch cadence, integrity monitoring) — PeerTime's preferred home. M1051 · vendor guidance
- NDR for P2P/BitTorrent detection from server segments, since PeerTime's peer-based C2 has no stable domain to block. ⚠ best-practice, no formal benchmark
Deployable Playbooks
# 1) Microsoft Vulnerable Driver Blocklist ON reg add "HKLM\SYSTEM\CurrentControlSet\Control\CI\Config" /v VulnerableDriverBlocklistEnable /t REG_DWORD /d 1 /f # 2) HVCI / Memory Integrity ON (requires reboot) # HVCI needs VBS enabled as well -- the scenario key alone is inert and the # control silently never activates. All three values are required. reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1 /f reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v RequirePlatformSecurityFeatures /t REG_DWORD /d 1 /f reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" /v Enabled /t REG_DWORD /d 1 /f # Prereqs: UEFI + Secure Boot + virtualization extensions. Reboot required. # PILOT FIRST -- incompatible legacy drivers can block boot under HVCI. # Verify AFTER reboot (SecurityServicesRunning must contain 2): # (Get-CimInstance Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning # Rollback: set both DeviceGuard values and the scenario Enabled back to 0, then reboot. # If the host will not boot, revert from Safe Mode or WinRE. # 3) Verify after reboot Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard | Select-Object -ExpandProperty SecurityServicesRunning # expect 2 (HVCI) present
# Scheduled task
Get-ScheduledTask -TaskName "WSPrint" -ErrorAction SilentlyContinue | Format-List *
# Run key
Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -ErrorAction SilentlyContinue |
Select-Object * | Where-Object { $_ -match "WSPrint" }
# Artifacts + driver service
Get-ChildItem "C:\ProgramData\WSPrint" -Force -ErrorAction SilentlyContinue
Get-CimInstance Win32_SystemDriver | Where-Object { $_.PathName -match "WSPrint\.sys" }
# --- Eradicate (only after confirmation + IR sign-off) ---
# Unregister-ScheduledTask -TaskName "WSPrint" -Confirm:$false
# Remove-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "Default" -Force
# sc.exe stop WSPrint ; sc.exe delete WSPrint
# Remove-Item "C:\ProgramData\WSPrint" -Recurse -Force
# SSH: keys only, no root sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config systemctl restart sshd apt-get install -y fail2ban && systemctl enable --now fail2ban # Postgres: do not listen on the world sed -i "s/^#\?listen_addresses.*/listen_addresses = 'localhost'/" /etc/postgresql/*/main/postgresql.conf systemctl restart postgresql # Tomcat: remove manager app if unused rm -rf $CATALINA_HOME/webapps/manager $CATALINA_HOME/webapps/host-manager
from falconpy import IOC
falcon = IOC(client_id="...", client_secret="...", base_url="https://api.crowdstrike.com") # set per cloud
indicators = (
[{"type":"sha256","value":h,"action":"prevent","severity":"high","platforms":["windows","linux"],
"applied_globally":True,"description":"UAT-9244 (Talos)"} for h in [
"711d9427ee43bc2186b9124f31cba2db5f54ec9a0d56dc2948e1a4377bada289",
"2d2ca7d21310b14f5f5641bbf4a9ff4c3e566b1fbbd370034c6844cedc8f0538"]] # extend with §10 set
+ [{"type":"domain","value":d,"action":"detect","severity":"high","applied_globally":True,
"description":"UAT-9244 C2"} for d in ["bloopencil.net","xtibh.com","xcit76.com"]]
+ [{"type":"ipv4","value":ip,"action":"detect","severity":"high","applied_globally":True,
"description":"UAT-9244 C2"} for ip in ["154.205.154.82","207.148.121.95","207.148.120.52","212.11.64.105","185.196.10.38","185.196.10.247"]]
)
print(falcon.indicator_create(body={"indicators":indicators,"comment":"UAT-9244 hunt pack"}))
Containment Runbook
Confirm a hit (Q1/Q2/Q4/Q6/Q7). Scope blast radius: every host that touched an IOC IP/domain or ran a matching hash/task. Owner: SOC L2. Evidence: query results, host list, timeline.
Network-contain affected Windows/Linux hosts in Falcon. For edge/embedded devices with no sensor: block at firewall, pull from routing, treat as compromised ORB. Block all IOCs globally. Owner: SOC + Network. Evidence: containment tickets, firewall rules.
Remove WSPrint task/Run key/driver/files (P2). Reimage edge devices and rebuild from trusted firmware. Hunt for PeerTime ELF + BruteEntry agents on all Linux hosts (hashes §10). Kill msiexec-injected sessions. Owner: IR. Evidence: removal logs, reimage records.
Rotate every credential reachable from compromised hosts — SSH keys, Postgres, Tomcat, service + domain accounts. Assume embedded creds harvested by BruteEntry are burned. Owner: IAM + IR. Evidence: rotation evidence.
Restore from known-good, re-enable services behind hardened config (§12). Deploy detections/IOAs in Block mode. Monitor for re-entry on the same TTPs for 30 days. If a regulated telecom, evaluate breach-notification obligations. Owner: IT + SOC / IR lead. Evidence: restore validation, monitoring dashboard, final IR report.
Detection Coverage Map
| Attack-chain behavior | Primary Detection | Fallback | Known Gap |
|---|---|---|---|
| TernDoor delivery / side-load | Q1 (file write), Q2 (hash) | WDAC block (§12) | Covered |
| msiexec injection + C2 | Q3, Q7 | Q2 hash | Q3 needs tuning; unknown C2 only via Q3 |
| Persistence (task / Run key) | Q4, Q4b, IOA | Native task audit (§7) | Covered |
| Task hiding (TaskCache) | Q5 | Audit logs | FP-prone; medium conf |
| Process-killer driver | Q6 + Driver Blocklist | HVCI | Driver-load event detail varies by sensor config |
| C2 (TernDoor TLS) | Q7, cert pivot (§7) | Firewall IOC block | Covered |
| PeerTime C2 (BitTorrent) | Q8 (DNS bootstrap) | NDR P2P detection | GAP — peer C2 has no fixed domain; needs NDR |
| PeerTime on embedded (ARM/MIPS) | Q10 (if sensor) | NetFlow, firmware integrity | GAP — no EDR on routers/embedded |
| BruteEntry ORB scanning | Q9 (if Linux sensor) | NetFlow fan-out (§7) | GAP — edge devices often unmanaged |
Hunt Summary Ticket
TITLE: Hunt — UAT-9244 (TernDoor / PeerTime / BruteEntry) telecom espionage toolkit
SEVERITY: High (nation-state espionage; long-dwell access)
SCOPE: Windows endpoints/servers, Linux servers, network edge/embedded; egress
HYPOTHESIS: UAT-9244 implants present: WSPrint side-load + msiexec injection + task/Run-key
persistence + rogue driver (Windows); BitTorrent-C2 ELF backdoor (Linux/embedded);
GoLang brute-force ORB on edge (SSH/Postgres/Tomcat).
QUERIES RUN: Q1-Q10 (see §8). Promote Q1/Q2/Q4/Q4b/Q6/Q7(confirmed)/Q8; keep Q3/Q5/Q9/Q10 tuned.
DATA SOURCES: Falcon ProcessRollup2, PeFileWritten, AsepValueUpdate, RegGenericValueUpdate,
NetworkConnectIP4, DnsRequest (Win+Linux); SIEM edge/appliance logs; NetFlow/NDR.
FINDINGS: <pending analyst execution>
GAPS: BitTorrent C2 (PeerTime) and unmanaged edge/embedded devices — covered by network
controls + NDR, not EDR. Q3/Q5/Q9/Q10 require environment tuning.
ACTIONS: Block IOCs (§10); deploy IOAs (§9); apply Immediate hardening (§12); see Containment (§14).
ATTRIBUTION: Talos UAT-9244 ~ FamousSparrow / Tropic Trooper. "Salt Typhoon" link unconfirmed.
OWNER: HuntPack
VERSION: v0.3 (Draft) - 2026-06-10
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For | Accessed |
|---|---|---|---|
| 1 | Cisco Talos — UAT-9244 | Primary intel: behavior, attack chain, IOCs, coverage (SID 65551) | 2026-06-10 |
| 1 | ESET — FamousSparrow / SparrowDoor | Lineage and cluster overlap | 2026-06-10 |
| 1 | Trend Micro — Earth Estries | CrowDoor context | 2026-06-10 |
| 2 | The Hacker News | Corroboration | 2026-06-10 |
| 2 | BleepingComputer | Corroboration | 2026-06-10 |
| 2 | Malpedia — UAT-9244 | Actor tracking | 2026-06-10 |
HuntPack v0.2 (Draft) · UAT-9244 (Salt Typhoon entry point) · Generated 2026-06-10 · Defensive use only. Validate field names and tune FP exclusions in your own tenant before promoting any query to Block. Indicators sourced from Cisco Talos; re-validate network IOCs monthly.