SocGholish (FakeUpdates) — JavaScript Loader & Access Broker
wscript.exe → system profiling, WebDAV/SCF NTLM coercion, a Python backdoor, and hand-off to RansomHub affiliates. Defensive hunt & harden pack — no malicious code.Executive Summary
SocGholish (a.k.a. FakeUpdates, operated by TA569 / Mustard Tempest) is one of the longest-running drive-by access-broker operations. Victims browsing a compromised legitimate website are served a counterfeit browser-update prompt and download a ZIP containing a heavily-obfuscated JavaScript loader executed by wscript.exe. The loader profiles the host (whoami, net, nltest, systeminfo), and — depending on the operator's intent — deploys a Python-based backdoor, abuses WebDAV + Shell Command File (SCF) over SMB to coerce and harvest NTLM credentials, and hands off to ransomware affiliates.
In 2025 SocGholish's deployment directly facilitated RansomHub ransomware. RansomHub itself hasn't been observed on leak sites since March 2025, but the affiliates who deploy SocGholish's pre-encryption payloads remain active — left undetected these intrusions still progress toward ransomware. The durable detection target is the wscript.exe JS-loader chain and the recon/credential-coercion behaviors that follow it.
wscript.exe running a .js from a browser-download path) and Q2 (recon binaries parented by wscript.exe). The WebDAV/SCF NTLM coercion (Q3) and Python backdoor (Q4) indicate the intrusion is escalating — escalate immediately.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry |
|---|---|---|---|
| 1 · Vendor research | Trend Micro — SocGholish facilitates RansomHub | JS loader → recon → Python backdoor → RansomHub; WebDAV/SCF NTLM credential harvest | yes |
| 1 · Vendor research | Red Canary — SocGholish Threat Detection | wscript.exe JS loader chain; recon lineage; detection analytics | yes |
| 2 · Vendor | eSentire / Darktrace — Socket Puppet / RansomHub | Python backdoor archive; RansomHub affiliate hand-off; loader/C2 activity | yes |
| 2 · Vendor | LevelBlue / Cyberpress | FakeUpdates delivery mechanics; WebDAV/SCF over SMB credential abuse | partial |
Decisions: behavior-first (compromised-site infrastructure rotates constantly); detection anchored on the wscript.exe JS-loader lineage + recon + the newer WebDAV/SCF NTLM-coercion technique; framed as a ransomware precursor (RansomHub link), so hits are treated as active intrusions.
Hunt Brief & Attack Chain
Working hypothesis: A user on a compromised site downloads a fake-update ZIP; wscript.exe runs the obfuscated JS loader, which profiles the host, coerces NTLM via WebDAV/SCF, drops a Python backdoor, and stages affiliate hand-off toward ransomware.
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · Drive-by | Compromised site → fake browser-update prompt → ZIP download | Proxy; file write | N1 |
| 2 · JS loader | wscript.exe runs an obfuscated .js from Downloads/Temp | ProcessRollup2 | Q1 |
| 3 · Profiling | whoami / net / nltest / systeminfo parented by wscript | ProcessRollup2 | Q2 |
| 4 · NTLM coercion | WebDAV / SCF over SMB to harvest authentication | NetworkConnectIP4; file write | Q3 |
| 5 · Backdoor | Python-based backdoor dropped/executed | ProcessRollup2 | Q4 |
| 6 · Hand-off | C2 beacon; affiliate access → RansomHub deployment | NetworkConnectIP4/DnsRequest | Q5 / Q6 |
Affected surface & telemetry
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows user endpoints | Process lineage + command line (ProcessRollup2) | Critical | Low — standard sensor |
| NTLM / SMB egress | NetworkConnectIP4 445; WebDAV (HTTP) telemetry | High | Medium — external SMB/WebDAV |
| Drive-by delivery | Proxy / SWG; browser-download path file writes | Medium | Medium — needs proxy logging |
| Ransomware follow-on | Process + service telemetry on servers/DCs | High | Low — covered by ransomware detections |
Consolidated IOC Table
wscript JS-loader chain) is the durable signal. Copy-ready blocks in §9.| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| Behavior | wscript.exe runs *.js from Downloads/Temp (fake-update ZIP) | high | detect | JS loader execution — flagship signal |
| Behavior | whoami/net/nltest/systeminfo parented by wscript.exe | high | detect | SocGholish host profiling |
| Behavior | WebDAV/SCF over SMB → NTLM coercion (outbound 445) | medium | hunt | Credential-harvest stage |
| Behavior | python.exe backdoor dropped by wscript | medium | hunt | RansomHub-affiliate backdoor |
| File | *.zip → *.js named like Update/Chrome/Edge | medium | hunt | Fake-update delivery artifact |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1189 — Drive-by Compromise | Fake browser-update on a compromised site | N1; web filtering (§10) |
| Execution | T1059.007 — JavaScript (wscript) | Obfuscated JS loader run by wscript.exe | Q1 |
| Discovery | T1087 / T1016 / T1082 — Account / network / system discovery | whoami, net, nltest, systeminfo | Q2 |
| Credential Access | T1187 — Forced Authentication (WebDAV/SCF) | NTLM coercion over SMB | Q3 |
| Command & Control | T1071.001 — Web protocols | JS loader / Python backdoor C2 beacon | Q4, Q5 |
| Impact (downstream) | T1486 — Data Encrypted (RansomHub) | Affiliate hand-off to ransomware | Q6; ransomware detections |
Native Audit-Log Hunts
| Hunt | Source | Logic | Response |
|---|---|---|---|
| N1 · Fake-update ZIP download | Proxy / browser download history | ZIP from a non-vendor site immediately after a "browser update" page; extracted .js | Block domain; sweep host |
| N2 · wscript JS execution | EID 4688 / Sysmon EID 1 | wscript.exe with a .js arg from \Downloads\ or \Temp\ | Isolate; pull the script (pairs with Q1) |
| N3 · NTLM coercion | Security 4624/4625 (NTLM); proxy WebDAV | Outbound NTLM auth to external hosts; WebDAV GET of an .scf/icon path | Reset coerced creds; block egress |
| N4 · RansomHub precursors | Endpoint / DC process logs | Post-SocGholish recon, RMM install, or pre-encryption staging on servers | Treat as active ransomware intrusion |
CrowdStrike LogScale CQL Hunt Queries
SyntheticProcessRollup2. Q1/Q2 are the strong keepers; the WebDAV/SCF and Python stages (Q3/Q4) vary per intrusion — correlate with a same-host Q1 hit.Looks for: wscript.exe/cscript.exe running a .js from Downloads/Temp. Accomplishes: catches the SocGholish loader at execution — the flagship signal.
// HUNT: SocGholish JS loader (wscript runs .js from a browser-download path) // MITRE: T1189, T1059.007 | CONF: high FP: low COST: low // FP NOTES: legit .js automation rarely runs from Downloads/Temp via wscript #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(wscript|cscript)\.exe$/i | CommandLine=/\.js("|\s|$)/i | CommandLine=/\\(Downloads|Temp|AppData\\Local\\Temp)\\/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, CommandLine], limit=200)
Looks for: host-profiling binaries whose parent is wscript.exe. Accomplishes: catches SocGholish's recon stage — a script host has no business spawning nltest/systeminfo.
// HUNT: SocGholish host profiling (recon parented by wscript) // MITRE: T1087, T1016, T1082 | CONF: high FP: low COST: low // FP NOTES: script hosts rarely spawn nltest/systeminfo/whoami in normal use #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(wscript|cscript)\.exe$/i | FileName=/^(whoami|nltest|systeminfo|net|net1|ipconfig|hostname|qwinsta|wmic)\.exe$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Looks for: outbound SMB (445) to an external host shortly after a Q1/Q2 hit (WebDAV/SCF NTLM coercion). FP: cloud SMB — exclude sanctioned CIDRs; correlate to same host.
// HUNT: SocGholish WebDAV/SCF NTLM coercion (outbound SMB to external host) // MITRE: T1187 | CONF: medium FP: medium COST: medium // TUNING: exclude RFC1918 + sanctioned cloud-SMB; correlate to a same-host Q1/Q2 hit #event_simpleName=NetworkConnectIP4 | RemotePort=445 | RemoteAddressIP4!=/^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|169\.254\.|127\.)/ | table([@timestamp, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: python.exe parented by wscript/cscript/mshta, or running a script from a user-temp path. Accomplishes: catches the RansomHub-affiliate Python backdoor.
// HUNT: SocGholish Python backdoor // MITRE: T1059.006, T1071.001 | CONF: med-high FP: low-med COST: low // TUNING: legit python is common; require a script-host parent or temp-path script #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^python[0-9.]*\.exe$/i | (ParentBaseFileName=/^(wscript|cscript|mshta)\.exe$/i or CommandLine=/\\(Temp|AppData\\Local\\Temp)\\.+\.py/i) | table([@timestamp, ComputerName, UserName, ParentBaseFileName, CommandLine], limit=200)
Looks for: wscript/cscript initiating outbound web connections. Accomplishes: surfaces loader C2 beaconing. FP: some logon/admin scripts — correlate with Q1 + external destination.
// HUNT: SocGholish loader C2 beacon (script host outbound web) // MITRE: T1071.001 | CONF: medium FP: medium COST: medium // TUNING: exclude internal/admin-script destinations; correlate to Q1 on same aid #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^(wscript|cscript)\.exe$/i | RemoteAddressIP4!=/^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|169\.254\.|127\.)/ | table([@timestamp, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: shadow-copy deletion / RMM install / mass file activity on a host with a recent SocGholish hit. Accomplishes: catches the escalation toward ransomware. FP: correlate strictly with a same-host Q1/Q2.
// HUNT: Ransomware precursor after SocGholish (recovery inhibition / RMM) // MITRE: T1490, T1219 | CONF: medium FP: medium COST: low // TUNING: scope to hosts with a recent Q1/Q2 hit; allow-list sanctioned RMM/backup admin #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | CommandLine=/vssadmin(\.exe)?\s+delete\s+shadows|wmic\s+shadowcopy\s+delete|(screenconnect|anydesk|atera|splashtop|tightvnc)/i | table([@timestamp, ComputerName, UserName, FileName, CommandLine], limit=200)
CrowdStrike Custom IOA Recommendations
| IOA Name | Field Patterns | Benign Exclusions | Deployment Path |
|---|---|---|---|
| SocGholish — wscript .js from Downloads/Temp | Image *\wscript.exe; CmdLine *.js + \Downloads\/\Temp\ | Rare legit JS automation from temp (allow-list) | Endpoint Security → Custom IOA → Process Creation |
| SocGholish — recon parented by wscript | Parent *\wscript.exe; Child nltest/systeminfo/whoami/net.exe | None expected | Custom IOA → Process Creation, Detect+Block |
Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click blocks for detection, proxy rules, and IOC import. Compromised-site infrastructure rotates constantly — behavior is the durable signal.
type,value,action,severity,expiration,description,tags domain,REPLACE_WITH_C2_DOMAIN,detect,high,2026-08-12,SocGholish loader/C2 (rotates fast),campaign:SocGholish sha256,REPLACE_WITH_JS_LOADER_SHA256,detect,high,2026-09-12,SocGholish JS loader,campaign:SocGholish sha256,REPLACE_WITH_PYBACKDOOR_SHA256,prevent,critical,2027-06-12,SocGholish Python backdoor,campaign:SocGholish
wscript.exe runs *.js from \Downloads\ or \Temp\ (fake-update ZIP loader) whoami / nltest / systeminfo / net.exe parented by wscript.exe (host profiling) Outbound SMB (445) to a public IP shortly after the loader (WebDAV/SCF NTLM coercion) python.exe parented by wscript/cscript/mshta, or running a .py from %TEMP% (backdoor) Recovery inhibition / RMM install on a host with a recent SocGholish loader hit (RansomHub precursor) Fake browser-update ZIP named Update*/Chrome*/Edge* downloaded from a compromised site
SocGholish = FakeUpdates # the JS loader / access-broker operation Operator: TA569 / Mustard Tempest # injects fake-update JS into compromised sites Downstream: RansomHub (ransomware affiliate hand-off; quiet on leak sites since Mar-2025) Adjacent fake-update clusters: Scarlet Goldfinch, Amber Albatross (see sibling packs) Credential coercion: WebDAV + SCF (Shell Command File) over SMB -> NTLM theft
# Cut the JS-loader chain at the endpoint: Change default .js/.jse handler from WScript to Notepad (disable double-click execution) ASR D3E037E1-3EB8-44C8-A917-57927947596D # Block JS/VBScript launching downloaded executables WDAC/AppLocker: block wscript/cscript for standard users Block outbound SMB (445) from workstations to the internet (kills WebDAV/SCF NTLM coercion) Web filtering + browser update via managed channels only (kills the fake-update lure)
Hardening — Tiered & Deployable
SocGholish needs wscript to run the .js and outbound SMB for NTLM coercion — removing those breaks the chain.
- Change the default
.js/.jsehandler from WScript to Notepad — M1042. Double-clicking a fake-update.jsopens it harmlessly instead of executing. - ASR: Block JS/VBScript from launching downloaded executables — M1042 (ID
D3E037E1-3EB8-44C8-A917-57927947596D). - Block outbound SMB (445/139) from workstations — M1037. Kills WebDAV/SCF NTLM coercion (Q3).
- Web filtering; browser updates via managed channels only — M1021. Cuts the fake-update lure at delivery.
- WDAC/AppLocker: block
wscript/cscriptfor standard users — M1038. - PowerShell + WSH script-block / AMSI logging — M1040 / M1049. Feeds Q1/N2.
- SMB signing + disable NTLM to external; LDAP channel binding — M1037 / M1027. Blunts coerced-NTLM relay.
- Application allowlisting enterprise-wide — M1038. Blocks unsigned loaders & Python backdoors.
- Restrict/monitor RMM tooling — M1038. Disrupts the RansomHub affiliate hand-off.
- Immutable backups + ransomware IR runbook — M1053. SocGholish is a ransomware precursor — be ready for the follow-on.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host; preserve the fake-update ZIP + .js loader | SOC L2 | Containment timestamp; Q1/Q2 events |
| Triage | Pull the wscript tree, recon output, any WebDAV/SCF egress + Python backdoor; assess how far toward ransomware | SOC L2 | Process tree; staging artifacts |
| Eradicate | Remove loader/backdoor + persistence; block C2; reset any NTLM-coerced credentials | IR | Removal log; cred reset |
| Recover | Rebuild if a backdoor ran; rotate creds; verify no RMM/ransomware foothold spread to servers/DCs | IR + IT | Rebuild ticket; lateral-movement review |
| Harden | Change .js handler; ASR + block outbound SMB; promote Q1/Q2 IOAs | Detection Eng | Control status; IOA enabled |
Detection Coverage Map & Validation
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1189 | Fake-update drive-by | — | — | GAP proxy/web filtering (N1) |
| T1059.007 | JS loader execution | Q1 | IOA-1 | Good |
| T1087 / T1016 / T1082 | Host profiling | Q2 | IOA-2 | Good |
| T1187 | WebDAV/SCF NTLM coercion | Q3 | — | Partial correlate; needs egress visibility |
| T1059.006 / T1071.001 | Python backdoor / loader C2 | Q4, Q5 | — | Partial correlate to Q1 |
| T1490 / T1219 | RansomHub precursor | Q6 | — | Partial + ransomware detections |
Validation gates: (1) confirm ProcessRollup2 w/ command line fleet-wide + SMB/proxy visibility for Q3/Q5; (2) baseline legit wscript automation; (3) lab-test a benign wscript benign.js from \Downloads\ (Q1) and a benign wscript→whoami (Q2); (4) promote Q1/Q2 to Custom IOA Detect+Block; keep Q3–Q6 as correlated hunts.
Hunt Summary Ticket
TITLE: Hunt — SocGholish (FakeUpdates) JS loader / RansomHub precursor
SEVERITY: High (ransomware precursor; access broker)
SCOPE: Windows user endpoints browsing compromised sites
HYPOTHESIS: Fake-update ZIP -> wscript runs obfuscated .js -> host profiling ->
WebDAV/SCF NTLM coercion -> Python backdoor -> RansomHub affiliate hand-off.
QUERIES RUN: Q1 wscript .js from Downloads (IOA) | Q2 recon parented by wscript (IOA) |
Q3 outbound SMB/NTLM coercion | Q4 Python backdoor | Q5 script-host C2 |
Q6 RansomHub precursor
+ Native N1-N4 (ZIP download, 4688 wscript, NTLM 4624/4625, ransomware precursors)
DO FIRST: Q1, Q2 — treat any hit as an active pre-ransomware intrusion
FINDINGS: <pending analyst execution>
GAPS: Drive-by delivery + NTLM coercion need proxy/SMB telemetry
ACTIONS: Change .js handler; ASR; block outbound SMB; promote Q1/Q2; ransomware readiness
OWNER: HuntPack
VERSION: v0.4 - 2026-06-12
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 |
|---|---|---|
| 1 | Trend Micro — SocGholish facilitates RansomHub | Full chain, WebDAV/SCF NTLM, Python backdoor, RansomHub |
| 1 | Red Canary — SocGholish Threat Detection | wscript JS-loader lineage, recon analytics |
| 2 | eSentire — Socket Puppet (RansomHub affiliates) · Darktrace — SocGholish to RansomHub | Python backdoor archive; affiliate hand-off |
| 2 | Cyberpress — WebDAV & SCF abuse | NTLM credential-coercion technique |
HuntPack v0.3 · SocGholish (FakeUpdates) · Generated 2026-06-12 · Defensive use only. Compromised-site infrastructure rotates constantly — these behavioral detections (wscript JS loader + recon + NTLM coercion) are the durable signal. Validate field names in your tenant before promoting any query.