Top Rep · React pipeline · Security investigation

Malware Root Cause Analysis. topreptraining.com

Deep-dive investigation into why topreptraining.com has been repeatedly reinfected with ClearFake/ErrTraffic malware since June 2026 despite four rounds of cleanup by Mindbees. Identifies the persistence stack, the threat group, and the specific cleanup steps that were missed each round.

Owner: Paul (investigation) · Jet (review + remediation sign-off)  |  Investigated 2026-08-11  |  ClickUp 86e1wz7h1

Lists: Client Health · Clients

Active threat: ClearFake / ErrTraffic v3 / KongTuke This is a named, documented threat group, not a random script. Their persistence architecture is specifically designed to survive standard WordPress cleanup. Mindbees removed the visible payload each round but left all six persistence layers intact. The attacker re-injected the site from their dashboard minutes after each cleanup.

One-sentence root cause

The attacker gained access via a plugin CVE or credential stuffing in early June, installed a six-layer self-healing persistence stack including a ManageWP Worker backdoor connected to their dashboard, and Mindbees cleaned the visible script tag each round while leaving all delivery infrastructure intact.

Confirmed threat identity

Research sourced from Trend Micro, Sekoia, Rapid7, LevelBlue/SpiderLabs, and GoDaddy threat intelligence.

NameWhat it refers to
ClearFakeThe JavaScript web-inject framework injected into compromised WordPress sites. First documented 2023, still active 2026. Served as the delivery vehicle on topreptraining.com.
ClickFixThe social engineering technique: fake CAPTCHA overlay, silent clipboard poisoning, Win+R execution prompt. ClearFake adopted this technique in late 2024. This is what visitors saw.
ErrTraffic v3The backend PHP backdoor dropper and Polygon blockchain C2 (command-and-control) framework. v3 emerged early 2026. Handles persistence and domain rotation automatically.
KongTukeThe threat group operating the Traffic Distribution System using compromised WordPress sites as relay infrastructure.
Why blocking domains did not stop it The injected script does not hardcode the payload domain. It queries a Polygon smart contract (blockchain) at runtime to fetch the current live domain. When treviro[.]icu was blocked or cleaned, the script automatically fetched henriqueq[.]xyz from the blockchain. No attacker action was needed. The June 22 domain rotation was not a new infection. It was the blockchain C2 rotating automatically after the cleanup flagged the first domain.

How the site was used against visitors

  1. Injected script loads from the payload domain on every page visit
  2. Overlay displays a fake "Verify you are human" CAPTCHA (visually mimics Cloudflare Turnstile)
  3. navigator.clipboard.writeText() silently poisons the visitor's clipboard with a base64-encoded PowerShell command
  4. Visitor is told: "Press Win+R, then Ctrl+V, then Enter"
  5. Visitor executes the command; a stealer downloader runs
  6. Documented payloads: Vidar Stealer, SectopRAT, Lumma Stealer. The site's visitors are the final victims, not the site itself.

The six-layer persistence stack

All six layers were almost certainly present. Mindbees removed the surface injection each round but did not touch any of these.

#LayerWhat it doesWhy Mindbees missed it
1 mu-plugins PHP backdoor Files in wp-content/mu-plugins/ load on every WP page request and cannot be deactivated from the admin panel. They do not appear in the Plugins list. Primary persistence mechanism for ErrTraffic. Invisible from WP admin. File scanner must explicitly check this directory. No mention of it in any Mindbees cleanup report.
2 wp_options database payload Encoded script stored as a value in one or more wp_options rows. Re-injects into every page on load. Survives plugin removal and file scans entirely. File-only cleanup does not touch the database. Sucuri scanner misses database payloads. No DB audit mentioned in any cleanup round.
3 Phantom admin account Rogue admin account hidden from the WP Users screen via pre_user_query hooks. Survives all password resets. Provides re-entry independent of other layers. Not visible in WP Admin. Must be found by querying wp_users table directly.
4 db.php dropper Malicious wp-content/db.php drop-in that rebuilds the full infection from database-stored payloads on the next database call. Even if files and DB rows are cleaned, this file reconstructs them. Almost never checked in standard WordPress cleanup. Not part of Mindbees' documented steps.
5 ManageWP Worker plugin Legitimate remote management plugin connected to an attacker-controlled ManageWP dashboard. Grants full remote admin access: 1-click login, plugin install/delete, user creation, code execution, DB access. Communicates via HTTPS to managewp.com (legitimate domain). Survives file cleanup. Looks like a legitimate plugin. No malware signatures. Outbound traffic to a trusted domain. Not flagged until July 8, six weeks after the infection began.
6 Blockchain C2 (EtherHiding) Payload domain retrieved from a Polygon smart contract at runtime. Domain rotation is automatic and requires no attacker action. Makes domain-level blocking useless. Cannot be blocked at the DNS or URL level. Requires removing the injected script file at the source.

Attack and persistence flow

How the attacker got in and why cleanup kept failing. Scroll to zoom, drag to pan, or present full screen.

flowchart TD
  ENTRY["Initial access ~Jun 10 2026\nPlugin CVE or credential stuffing"]
  ENTRY --> ADMIN["WP admin access gained\n(webmaster or noahw account)"]
  ADMIN --> P1["mu-plugins PHP backdoor\nInvisible to admin panel"]
  ADMIN --> P2["wp_options DB payload\nRe-injects on every page load"]
  ADMIN --> P3["Phantom admin account\nHidden from Users screen"]
  ADMIN --> P4["ManageWP Worker plugin\nAttacker remote dashboard access"]
  ADMIN --> P5["Blockchain C2\nEtherHiding auto domain rotation"]
  P1 & P2 & P3 & P4 & P5 --> INJECT["Script injected into head of every page\nFetches payload domain from Polygon smart contract"]
  INJECT --> BC["Blockchain returns active domain\ntreviro.icu then henriqueq.xyz"]
  BC --> CLICKFIX["ClickFix fake CAPTCHA served to visitors\nClipboard poisoned with PowerShell"]
  CLICKFIX --> VICTIM["Visitor executes Win+R\nStealer malware installed on visitor PC"]
  CLEANUP["Mindbees cleanup rounds\nJun 16 · Jun 23 · Jun 30 · Jul 31"]
  CLEANUP -.->|Removes visible script tag only\nAll 6 persistence layers survive| P1
  P4 -.->|Attacker re-injects\nvia ManageWP dashboard| INJECT

  classDef persist fill:#fef2f2,stroke:#dc2626,color:#7f1d1d;
  classDef inject fill:#fef3c7,stroke:#b45309,color:#78350f;
  classDef victim fill:#fef2f2,stroke:#dc2626,color:#7f1d1d;
  classDef clean fill:#e0f2fe,stroke:#0ea5e9,color:#0c4a6e;
  class P1,P2,P3,P4,P5 persist;
  class INJECT,BC,CLICKFIX inject;
  class VICTIM victim;
  class CLEANUP clean;
  

Most likely initial entry point

RankVectorProbabilityEvidence
1 Compromised admin credentials (credential stuffing via residential proxies) 70-75% ErrTraffic's confirmed primary access method per Sekoia research. REST API /wp-json/wp/v2/users returns usernames webmaster (ID 1) and noahw (ID 2) to unauthenticated requests. Combined with an unprotected wp-login.php, this is a complete credential-stuffing target. The recurring reinfection after cleanup is the signature of a credential-based attack: attacker logs back in after each round.
2 Plugin CVE exploitation (wpDiscuz RCE or ElementsKit CVSS 10.0) 20-25% Mindbees attributed the June 10 infection to "outdated plugins." wpDiscuz CVE-2026-22191 (unauthenticated RCE via shortcode injection, fixed in 7.6.47) and ElementsKit CVE-2026-23693 (CVSS 10.0, unauthenticated Mailchimp credential exposure) were both present pre-cleanup. Either could have been the initial door. Plugin exploits do not explain the reinfection pattern. Once credentials were captured from the first compromise, subsequent reinfections are credential-driven.
3 ManageWP Worker auth bypass (CVE, versions up to 4.9.2) 5-10% ManageWP Worker versions up to 4.9.2 had an authentication bypass via shared global signing keys. An attacker could craft a request to auto-authenticate on any site running a vulnerable version without needing credentials. If the plugin was already installed (or installed by the attacker via another vector), this bypass could have been used independently.

Current attack surface (verified 2026-08-11)

EndpointStatusRisk
/xmlrpc.php403 BLOCKEDFixed. Not an active vector.
/wp-json/wp/v2/users200 EXPOSEDReturns usernames webmaster and noahw to unauthenticated requests. Attacker has both targets for credential stuffing.
/wp-login.php200 EXPOSEDStandard login form, no rate limiting or CAPTCHA visible externally. Combined with enumerated usernames, a complete brute-force target.
/wp-config.php403 BLOCKEDFixed.
/wp-content/uploads/403 BLOCKEDDirectory listing disabled. Fixed.
/.htaccess403 BLOCKEDFixed.
/wp-media-recovery.php404 GONESuspicious file Paul flagged June 17 is no longer present on the server.

Active plugin CVEs on the site

PluginCVESeverityIssueFix
wpDiscuzCVE-2026-22191HIGHShortcode injection leads to RCE via comment email notifications7.6.47+
wpDiscuzCVE-2026-9148HIGHUnauthenticated stored XSS via guest "Website" field7.6.57+
ElementsKit LiteCVE-2026-23693CVSS 10.0Unauthenticated REST endpoint exposes Mailchimp API credentials. No auth check.Patch available
ACFCVE-2026-8382HIGHUnauthenticated post content overwrite via public ACF forms6.8.2+
ManageWP WorkerCVE-2026-3718HIGH 7.2Stored XSS via MWP-Key-Name header (unauthenticated)4.9.32+
ManageWP WorkerAuth bypassCRITICALShared global signing keys allow unauthenticated login on any site running the plugin (versions up to 4.9.2)4.9.3+
WP Engine Site MigrationN/ARISKActive on site but migration is complete. Handles file uploads and DB operations. Should not be running.Deactivate + delete

What Mindbees missed every round

What they didWhat they missed
Removed injected script tags from theme filesDid not audit wp-content/mu-plugins/ for PHP backdoors
Upgraded plugins on Jun 16Did not scan wp_options table for encoded script storage rows
Ran surface-level file scan (Sucuri)Did not check for wp-content/db.php dropper
Rotated WP admin password (Jun 16)Did not require 2FA; attacker regained access via credential stuffing or phantom account
Removed "Alea Rojo" user (Jun 30)Did not query wp_users table directly; phantom account may remain hidden in the DB
Did not flag ManageWP Worker until Jul 8Left attacker's management channel active for six weeks across all cleanup rounds
Did not block user enumeration via REST APIUsernames webmaster and noahw still publicly exposed today
Did not check server crontabPossible cron-based reinfection job may still be running
Did not check .htaccess / php.ini for auto_prepend_filePHP-level loader could still be in place

Remediation plan. In exact order.

Each step is a prerequisite for the one after it. A later step completed without an earlier one will result in another reinfection.

Step 1 — Today — Highest priority

Verify and kill the ManageWP Worker connection

In WP Admin, open ManageWP Worker plugin settings and copy the Connection Key. Jet and Mindbees must confirm which ManageWP account this key belongs to. If unrecognized: deactivate and delete the plugin immediately. Then run:

DELETE FROM wp_options WHERE option_name LIKE 'worker%';

Check outbound HTTPS connections to managewp.com in WP Engine server logs from June 10 onward. Frequency and timestamps will confirm whether this was being actively used to re-push malware.

Step 2 — Today — Do before password reset

Terminate all active admin sessions

In WP Admin, for every admin account: "Log Out Everywhere." A session survives a password change. An attacker with an active session retains access even after credentials are rotated. Sessions must be terminated first.

Step 3 — Today

Force password reset on ALL admin accounts

Every account, including webmaster, noahw, and any account created since June 1. Use a password manager, 20+ characters, unique. Useless without Step 2 first.

Step 4 — Today — Non-negotiable

Enable 2FA on all admin accounts

Wordfence 2FA is the fastest implementation (free tier works). Every admin account must have 2FA before this incident is considered closed. This is the single control that blocks credential-stuffing reinfection even if passwords leak again. The site should not be considered secured until 2FA is active on every admin.

Step 5 — Today

Block user enumeration via REST API

Add to functions.php or via Wordfence / WP Cerber (one-toggle option):

add_filter('rest_endpoints', function($endpoints) {
  if (!is_user_logged_in()) {
    unset($endpoints['/wp/v2/users']);
    unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
  }
  return $endpoints;
});

Verify: curl https://topreptraining.com/wp-json/wp/v2/users must return 401 or empty.

Step 6 — Urgent — Mindbees must run this

Direct database audit (not a file scan)

Run via phpMyAdmin or WP-CLI. Do not rely on Sucuri scanner for this step:

-- Find hidden admin accounts (bypasses the UI hiding hook)
SELECT ID, user_login, user_email, user_registered FROM wp_users
WHERE user_registered > '2026-06-01';

-- Find stored script payloads in wp_options
SELECT option_name, LEFT(option_value, 200) FROM wp_options
WHERE option_value LIKE '%script%' AND option_value LIKE '%src=%'
   OR option_value LIKE '%treviro%' OR option_value LIKE '%henriqueq%'
   OR option_value LIKE '%base64_decode%' OR option_value LIKE '%eval(%';

-- Check for rogue cron jobs
SELECT option_value FROM wp_options WHERE option_name = 'cron';

Delete any user account created after June 1 that Jet or Mindbees cannot recognize. Delete any wp_options row containing encoded script content.

Step 7 — Urgent — WP Engine ticket #8564933 reply (send today)

WP Engine server-side audit

Ask Jesse S. to run all of the following. These cannot be done without server SSH access:

Step 8 — This week

Update plugins to patched versions

Step 9 — This week — Jet / Chuck decision

WP Engine Global Edge Security (WAF)

Upgrading the WP Engine plan to include Global Edge Security adds a WAF (web application firewall) at the CDN level. This blocks known WordPress attack signatures, credential-stuffing volume, and exploit attempts before they reach the server. This is the infrastructure change that reduces the probability of a future initial compromise. Cost: Jet or Chuck needs to confirm.

Step 10 — After all steps above are complete

Verification

Research sources

Investigation for ClickUp 86e1wz7h1 (Resolve Website Malware Compromise). Conducted 2026-08-11 via parallel web research agents across attack surface, malware family, plugin CVEs, and ManageWP analysis. The site was clean at time of investigation; the above is an analysis of the reinfection root cause, not an active incident report.