Back to Intelligence

Operation Endgame Takedown: Detecting and Remediating Gootloader, CastleRAT, and StealC After the Seizure of 6.4M Stolen Logins

SA
Security Arsenal Team
November 14, 2026
13 min read

International law enforcement, coordinated under the ongoing Operation Endgame framework, took down server infrastructure supporting three distinct malware families this week: Gootloader (an initial-access loader), CastleRAT (a remote access trojan), and StealC (a commodity infostealer). According to Germany's Federal Criminal Police Office (BKA), investigators seized approximately 6.4 million stolen login credentials tied to more than 40,000 victims.

Let me be blunt about what this means for defenders: a takedown disrupts command-and-control, but it does not disinfect a single endpoint, and it does not un-steal 6.4 million credentials. Every one of those logins is already in criminal circulation — sold, aggregated into combolists, and queued for credential stuffing, session hijacking, and initial access brokerage. If your organization appears in that corpus, the takedown is the start of your incident, not the end.

Why Defenders Need to Act Now

These three tools represent a complete criminal kill chain:

  1. Gootloader gains initial access — historically delivered via SEO poisoning and malvertising that lure users to compromised WordPress sites hosting fake forum threads. Victims download a ZIP archive containing a heavily obfuscated JavaScript file, which executes via wscript.exe and stages follow-on payloads.
  2. CastleRAT establishes persistent remote access — hands-on-keyboard control, file exfiltration, and secondary payload delivery.
  3. StealC harvests credentials at scale — browser password stores, cookies/session tokens, cryptocurrency wallets, and FTP/VPN client credentials.

The BKA's own statement ties these tools to "encryption-based cyber incident attacks" — ransomware. Gootloader has historically been a precursor to ransomware deployment (Royal, BlackCat/ALPHV affiliates). If you find Gootloader artifacts on an endpoint, you treat it as a pre-ransomware intrusion with a 24–72 hour detonation window, not as a nuisance infection.

The takedown creates a false sense of safety. Dormant implants may beacon to dead C2 and go quiet — but the access was often already sold onward. Assume breach if you have telemetry hits.

Technical Analysis

Attack Chain: Gootloader (Initial Access)

  • Delivery: Search engine poisoning for business-document queries ("contract template," "agreement sample") redirects victims to compromised WordPress sites serving fake forum pages.
  • Payload: A ZIP archive (often named after the search query) containing a double-extension or misleadingly named .js file.
  • Execution: Victim double-clicks → wscript.exe executes the obfuscated JavaScript → second-stage JS is written to disk (frequently under %APPDATA% or %LOCALAPPDATA%) and persistence is established via a scheduled task pointing at the staged script.
  • Follow-on: Cobalt Strike beacons, RATs (including CastleRAT-class tooling), and ultimately ransomware affiliates.

Key observable behaviors:

  • wscript.exe or cscript.exe executing .js files out of Downloads, %TEMP%, or ZIP extraction paths
  • Scheduled tasks whose action references .js / .jse files in user-writable directories
  • wscript.exe spawning child processes (powershell.exe, rundll32.exe, regsvr32.exe)

StealC (Credential Theft)

StealC is a classic C/C++ infostealer sold as malware-as-a-service. Observable behavior:

  • Reads browser credential databases: Login Data, Cookies, Web Data, Local State under Chrome/Edge/Brave profile paths, and Firefox logins.json / key4.db
  • Uses the Windows DPAPI (CryptUnprotectData) to decrypt stored secrets, requiring access to the Local State AES key
  • Stages stolen data in a temp working directory before HTTP(S) exfiltration to C2
  • Frequently deletes its staging artifacts and sometimes self-deletes post-exfiltration

The single highest-fidelity endpoint signal for stealer-class malware is a non-browser process opening browser credential database files. Browsers access their own Login Data; almost nothing else legitimately does.

CastleRAT (Post-Compromise Access)

CastleRAT provides interactive remote control: command execution, file transfer, screenshot capability, and payload staging. Defender-relevant behaviors:

  • Beaconing from user-context processes (frequently masquerading under generic names in %APPDATA% or %PROGRAMDATA%)
  • Persistence via Run keys or scheduled tasks
  • Outbound connections from processes that have no business making network connections (script hosts, unsigned binaries in user profile paths)

Exploitation Status

This is not a vulnerability story — there is no CVE here. This is confirmed, at-scale criminal operation status: 6.4 million stolen logins across 40,000+ victims is the seizure tally, which by definition understates true victim volume. All three families were in active in-the-wild distribution at the time of the takedown.

Detection & Response

Sigma Rules

YAML
---
title: Gootloader JavaScript Execution via Windows Script Host from User Directories
id: 3f9c2a71-8b4d-4e6a-9c15-7d2e5f8a1b03
status: experimental
description: Detects wscript.exe or cscript.exe executing JavaScript files from Downloads, Temp, or AppData paths, consistent with Gootloader's fake-forum ZIP delivery mechanism.
references:
  - https://thehackernews.com/2026/11/operation-endgame-takes-down-gootloader.html
  - https://attack.mitre.org/techniques/T1059/007/
author: Security Arsenal
date: 2026/11/14
tags:
  - attack.execution
  - attack.t1059.007
  - attack.t1204.002
logsource:
  category: process_creation
  product: windows
detection:
  selection_host:
    Image|endswith:
      - '\wscript.exe'
      - '\cscript.exe'
  selection_path:
    CommandLine|contains:
      - '\Downloads\'
      - '\AppData\Local\Temp\'
      - '\AppData\Roaming\'
      - '\Temp\'
  selection_ext:
    CommandLine|contains:
      - '.js'
      - '.jse'
  condition: selection_host and selection_path and selection_ext
falsepositives:
  - Rare; legitimate user-context script execution from these paths is uncommon in managed environments
level: high
---
title: Script-Based Scheduled Task Persistence in User-Writable Path
id: 8e1b4d62-3c7a-4f59-b208-9a6c1e4d7f52
status: experimental
description: Detects creation of scheduled tasks whose action executes script files (.js, .jse, .vbs) from user-writable directories, a documented Gootloader persistence mechanism.
references:
  - https://thehackernews.com/2026/11/operation-endgame-takes-down-gootloader.html
  - https://attack.mitre.org/techniques/T1053/005/
author: Security Arsenal
date: 2026/11/14
tags:
  - attack.persistence
  - attack.privilege_escalation
  - attack.t1053.005
logsource:
  category: process_creation
  product: windows
detection:
  selection_schtasks:
    Image|endswith: '\schtasks.exe'
    CommandLine|contains: '/create'
  selection_wsh_task:
    CommandLine|contains:
      - 'wscript.exe'
      - 'cscript.exe'
  selection_script_path:
    CommandLine|contains:
      - '\AppData\'
      - '\Users\Public\'
      - '\ProgramData\'
  condition: selection_schtasks and (selection_wsh_task or selection_script_path)
falsepositives:
  - Software updaters occasionally register tasks from ProgramData; validate the task action and signer
level: high
---
title: Non-Browser Process Accessing Browser Credential Stores
id: b47d2f90-6e1c-4a83-9d54-2c8f6a1e9b37
status: experimental
description: Detects processes other than the browser itself opening browser credential or cookie database files, a high-fidelity indicator of infostealer activity such as StealC.
references:
  - https://thehackernews.com/2026/11/operation-endgame-takes-down-gootloader.html
  - https://attack.mitre.org/techniques/T1555/003/
author: Security Arsenal
date: 2026/11/14
tags:
  - attack.credential_access
  - attack.t1555.003
logsource:
  category: file_event
  product: windows
detection:
  selection_files:
    TargetFilename|contains:
      - '\Google\Chrome\User Data\'
      - '\Microsoft\Edge\User Data\'
      - '\BraveSoftware\Brave-Browser\User Data\'
      - '\Mozilla\Firefox\Profiles\'
  selection_targets:
    TargetFilename|endswith:
      - '\Login Data'
      - '\Cookies'
      - '\Web Data'
      - '\Local State'
      - '\logins.json'
      - '\key4.db'
  filter_browsers:
    Image|endswith:
      - '\chrome.exe'
      - '\msedge.exe'
      - '\brave.exe'
      - '\firefox.exe'
  filter_backup:
    Image|endswith:
      - '\MsMpEng.exe'
  condition: selection_files and selection_targets and not filter_browsers and not filter_backup
falsepositives:
  - Enterprise backup and DLP agents; EDR tooling itself; whitelist by signer and process path after validation
level: critical

KQL — Microsoft Sentinel / Defender

This query hunts the Gootloader execution chain and StealC-style credential store access in one pass. Run it across the last 30 days — loader implants often predate the visible intrusion by weeks.

KQL — Microsoft Sentinel / Defender
let lookback = 30d;
let scriptHosts = dynamic(["wscript.exe", "cscript.exe"]);
let suspiciousPaths = dynamic(["\\Downloads\\", "\\AppData\\Local\\Temp\\", "\\AppData\\Roaming\\", "\\Temp\\"]);
// Part 1: Gootloader-style JS execution from user directories
let GootloaderExec = DeviceProcessEvents
| where Timestamp > ago(lookback)
| where FileName has_any (scriptHosts)
| where ProcessCommandLine has_any (suspiciousPaths)
| where ProcessCommandLine has_any (".js", ".jse")
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName, SHA256
| extend Detection = "Gootloader JS execution";
// Part 2: Script host spawning follow-on tooling (payload staging)
let ScriptHostChildren = DeviceProcessEvents
| where Timestamp > ago(lookback)
| where InitiatingProcessFileName has_any (scriptHosts)
| where FileName in~ ("powershell.exe", "rundll32.exe", "regsvr32.exe", "cmd.exe", "mshta.exe")
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessCommandLine, SHA256
| extend Detection = "Script host child process";
// Part 3: StealC-style access to browser credential stores by non-browser processes
let StealerAccess = DeviceFileEvents
| where Timestamp > ago(lookback)
| where FileName in~ ("Login Data", "Cookies", "Web Data", "Local State", "logins.json", "key4.db")
| where FolderPath has_any ("Chrome\\User Data", "Edge\\User Data", "Brave-Browser", "Firefox\\Profiles")
| where not(InitiatingProcessFileName in~ ("chrome.exe", "msedge.exe", "brave.exe", "firefox.exe", "msmpeng.exe"))
| project Timestamp, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, InitiatingProcessCommandLine, FolderPath, FileName, InitiatingProcessSHA256
| extend Detection = "Browser credential store access";
union GootloaderExec, ScriptHostChildren, StealerAccess
| sort by Timestamp desc

A second query for persistence review — scheduled tasks pointing at scripts in user paths:

KQL — Microsoft Sentinel / Defender
DeviceProcessEvents
| where Timestamp > ago(30d)
| where FileName =~ "schtasks.exe"
| where ProcessCommandLine has "/create"
| where ProcessCommandLine has_any ("wscript", "cscript", "\\AppData\\", "\\Users\\Public\\")
| project Timestamp, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine
| sort by Timestamp desc

Velociraptor VQL

This hunt artifact sweeps for Gootloader staging artifacts (recently created .js files in Downloads), suspicious scheduled task registrations, and live script-host processes — the three artifacts most likely to survive a C2 takedown on infected endpoints.

VQL — Velociraptor
-- Operation Endgame post-takedown sweep: Gootloader staging, script persistence, live script hosts
-- Artifact 1: Recently created JavaScript files in user Downloads directories
SELECT FullPath, Size, Mtime, Btime
FROM glob(globs='C:/Users/*/Downloads/**/*.js')
WHERE Mtime > now() - 2592000

-- Artifact 2: Running Windows Script Host processes and their command lines
SELECT Pid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE Name =~ '(?i)wscript|cscript'
   OR CommandLine =~ '(?i)\.js|\.jse|\.vbs'

-- Artifact 3: Scheduled tasks whose actions reference script interpreters or user paths
SELECT Name, CommandLine, Exe, Username
FROM pslist()
WHERE CommandLine =~ '(?i)schtasks.*(/create|/change)'
   AND CommandLine =~ '(?i)wscript|cscript|appdata|users\\public'

For credential-theft scoping, this artifact enumerates browser credential database files and their last access context — useful for confirming whether stealer staging occurred on a specific host during the exposure window:

VQL — Velociraptor
-- Enumerate browser credential stores and timestamps for stealer scoping
SELECT FullPath, Size, Mtime, Btime
FROM glob(globs=[
  'C:/Users/*/AppData/Local/Google/Chrome/User Data/*/Login Data',
  'C:/Users/*/AppData/Local/Microsoft/Edge/User Data/*/Login Data',
  'C:/Users/*/AppData/Roaming/Mozilla/Firefox/Profiles/*/logins.json'
])

Remediation & Triage Script

Run this PowerShell triage script on any host with telemetry hits. It identifies script-host persistence, staged Gootloader artifacts, and browser credential store access evidence, and it disables identified malicious scheduled tasks. Review output before the removal step in a production environment.

PowerShell
# Operation Endgame post-takedown endpoint triage
# Run elevated. Outputs findings to C:\IR-Triage\triage-<hostname>-<date>.txt

$outDir = "C:\IR-Triage"
New-Item -Path $outDir -ItemType Directory -Force | Out-Null
$log = Join-Path $outDir ("triage-" + $env:COMPUTERNAME + "-" + (Get-Date -Format 'yyyyMMdd-HHmm') + ".txt")

function Write-Find($msg) { $msg | Tee-Object -FilePath $log -Append }

Write-Find "=== Gootloader / StealC / CastleRAT triage: $env:COMPUTERNAME ===`n"

# 1. Scheduled tasks executing scripts or running from user-writable paths
Write-Find "--- [1] Suspicious scheduled tasks ---"
$susTasks = Get-ScheduledTask | ForEach-Object {
    $actions = $_.Actions | Where-Object {
        $_.Execute -match 'wscript|cscript|powershell' -or
        $_.Execute -match 'AppData|Users\\Public|ProgramData' -or
        $_.Arguments -match '\.js|\.jse|\.vbs'
    }
    if ($actions) {
        [PSCustomObject]@{
            TaskName = $_.TaskName; TaskPath = $_.TaskPath
            State = $_.State
            Execute = ($actions.Execute -join '; ')
            Arguments = ($actions.Arguments -join '; ')
        }
    }
}
if ($susTasks) {
    $susTasks | Format-List | Out-String | ForEach-Object { Write-Find $_ }
    # Disable (do NOT delete yet - preserve for forensics)
    foreach ($t in $susTasks) {
        Disable-ScheduledTask -TaskName $t.TaskName -TaskPath $t.TaskPath -ErrorAction SilentlyContinue
        Write-Find "DISABLED: $($t.TaskPath)$($t.TaskName)"
    }
} else { Write-Find "No suspicious scheduled tasks found.`n" }

# 2. JavaScript files staged in user Downloads/AppData (Gootloader staging)
Write-Find "`n--- [2] Recently modified .js files in user profile paths ---"
$cutoff = (Get-Date).AddDays(-45)
$jsFiles = Get-ChildItem -Path "C:\Users" -Recurse -Include *.js,*.jse -ErrorAction SilentlyContinue |
    Where-Object { $_.LastWriteTime -gt $cutoff -and $_.FullName -match 'Downloads|AppData' } |
    Select-Object FullName, LastWriteTime, Length
if ($jsFiles) { $jsFiles | Format-Table -AutoSize | Out-String | ForEach-Object { Write-Find $_ } }
else { Write-Find "No recent staged scripts found.`n" }

# 3. Running script-host processes
Write-Find "`n--- [3] Active script-host processes ---"
$wsh = Get-CimInstance Win32_Process -Filter "Name='wscript.exe' OR Name='cscript.exe'" |
    Select-Object ProcessId, Name, CommandLine
if ($wsh) { $wsh | Format-List | Out-String | ForEach-Object { Write-Find $_ } }
else { Write-Find "No active script hosts.`n" }

# 4. Run-key persistence referencing scripts or user paths
Write-Find "`n--- [4] Suspicious Run keys ---"
$runKeys = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',
    'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
)
foreach ($key in $runKeys) {
    if (Test-Path $key) {
        Get-ItemProperty $key | Get-Member -MemberType NoteProperty | ForEach-Object {
            $val = (Get-ItemProperty $key).($_.Name)
            if ($val -match 'wscript|cscript|\.js|\.vbs|AppData|Temp') {
                Write-Find "$key :: $($_.Name) = $val"
            }
        }
    }
}

# 5. Verify JS file association hardening status (defense-in-depth)
Write-Find "`n--- [5] .js file association check (should be txtfile/notepad, NOT WScript) ---"
$jsAssoc = (Get-ItemProperty 'HKLM:\SOFTWARE\Classes\.js' -ErrorAction SilentlyContinue).'(default)'
Write-Find ".js default class: $jsAssoc"

Write-Find "`n=== Triage complete. Preserve $log and any staged scripts for forensics before reimaging. ==="

Remediation

1. Treat the seized credential corpus as a live breach notification

The 6.4 million seized logins are the single most urgent item in this story.

  • Check exposure: BKA typically coordinates victim notification for German-affected data; internationally, monitor Have I Been Pwned and your threat intel feeds for the corpus surfacing. If your domain appears, assume every listed credential is burned.
  • Force resets: For any affected accounts, force password resets — and critically, revoke active sessions and refresh tokens. StealC steals cookies, which means password reset alone does not evict an attacker holding a valid session token.
  • Kill password reuse: Any credential recovered from a stealer log will be tested against your VPN, SSO, O365, and RDP exposure within days. Enforce MFA everywhere, prioritize phishing-resistant MFA (FIDO2/passkeys) on remote access, and block legacy authentication protocols.

2. Scope for historic infection — the takedown does not clean your estate

  • Run the KQL queries and VQL hunts above across at least the last 90 days. Gootloader victims frequently sat dormant or were handed off to ransomware affiliates before C2 disruption.
  • Any host with confirmed Gootloader execution: isolate, acquire memory and triage images, and assess for lateral movement and follow-on payloads. A Gootloader hit is a pre-ransomware intrusion — investigate it at IR severity, not malware-cleanup severity.
  • Any host with confirmed browser-store access by a non-browser process: rotate all credentials stored in that browser profile, revoke sessions for every service logged into from that host, and check for authentication anomalies from those accounts.

3. Harden against the delivery mechanism

Gootloader's entire model depends on a user double-clicking a JavaScript file. That is an architectural weakness you can close:

  • Re-associate .js/.jse/.vbs with Notepad via GPO (HKLM\SOFTWARE\Classes\.js default → txtfile) so double-clicks open scripts as text instead of executing them.
  • Enable Attack Surface Reduction rules, specifically "Block JavaScript or VBScript from launching downloaded executable content" (GUID d3e037e1-3eb8-44c8-a917-57927947596d).
  • Block or tightly control Windows Script Host for standard users where business process allows.
  • Filter SEO-poisoning lures at the proxy: block archive downloads (.zip) from uncategorized/newly-registered domains, and alert on WordPress-hosted download pages serving archives in response to document-template search queries.
  • Email and web gateway detonation: Gootloader ZIPs contain only a .js — trivial to detonate and verdict in a sandbox. Confirm your gateway actually inspects archive contents.

4. Expect reconstitution

Operation Endgame's earlier waves (May 2024 onward) demonstrated the pattern: infrastructure seizures impose real cost on operators, but loader and stealer ecosystems reconstitute under new domains and C2 within weeks to months. The families' developers and affiliates are largely unindicted. Your detections above target behaviors — script-host execution from user paths, task-based script persistence, browser-store access — which survive any infrastructure rebuild. Keep them deployed permanently, not as a 30-day response measure.

5. Reporting and coordination

  • If you confirm compromise tied to these families, report to your national CERT/law enforcement channel (BKA and Europol are actively collecting victim data tied to this seizure — your telemetry may help attribution and may connect you to notification of your own stolen credentials).
  • Preserve forensic images of any confirmed infected host before remediation; law enforcement requests for artifacts in Endgame-linked cases are common.

Bottom Line

Takedowns make headlines; stolen credentials make breaches. The 6.4 million logins now in evidence bags were in criminal hands first — some for months. Assume a subset of your users' credentials are in that corpus, hunt your estate for the loader artifacts that delivered them, and close the script-host execution path that made Gootloader profitable in the first place.

Related Resources

Security Arsenal Incident Response Services AlertMonitor Platform Book a SOC Assessment incident-response Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.