Top Rep · React pipeline · Security investigation
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.
Lists: Client Health · Clients
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.
Research sourced from Trend Micro, Sekoia, Rapid7, LevelBlue/SpiderLabs, and GoDaddy threat intelligence.
| Name | What it refers to |
|---|---|
| ClearFake | The JavaScript web-inject framework injected into compromised WordPress sites. First documented 2023, still active 2026. Served as the delivery vehicle on topreptraining.com. |
| ClickFix | The 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 v3 | The backend PHP backdoor dropper and Polygon blockchain C2 (command-and-control) framework. v3 emerged early 2026. Handles persistence and domain rotation automatically. |
| KongTuke | The threat group operating the Traffic Distribution System using compromised WordPress sites as relay infrastructure. |
navigator.clipboard.writeText() silently poisons the visitor's clipboard with a base64-encoded PowerShell commandAll six layers were almost certainly present. Mindbees removed the surface injection each round but did not touch any of these.
| # | Layer | What it does | Why 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. |
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;
| Rank | Vector | Probability | Evidence |
|---|---|---|---|
| 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. |
| Endpoint | Status | Risk |
|---|---|---|
/xmlrpc.php | 403 BLOCKED | Fixed. Not an active vector. |
/wp-json/wp/v2/users | 200 EXPOSED | Returns usernames webmaster and noahw to unauthenticated requests. Attacker has both targets for credential stuffing. |
/wp-login.php | 200 EXPOSED | Standard login form, no rate limiting or CAPTCHA visible externally. Combined with enumerated usernames, a complete brute-force target. |
/wp-config.php | 403 BLOCKED | Fixed. |
/wp-content/uploads/ | 403 BLOCKED | Directory listing disabled. Fixed. |
/.htaccess | 403 BLOCKED | Fixed. |
/wp-media-recovery.php | 404 GONE | Suspicious file Paul flagged June 17 is no longer present on the server. |
| Plugin | CVE | Severity | Issue | Fix |
|---|---|---|---|---|
| wpDiscuz | CVE-2026-22191 | HIGH | Shortcode injection leads to RCE via comment email notifications | 7.6.47+ |
| wpDiscuz | CVE-2026-9148 | HIGH | Unauthenticated stored XSS via guest "Website" field | 7.6.57+ |
| ElementsKit Lite | CVE-2026-23693 | CVSS 10.0 | Unauthenticated REST endpoint exposes Mailchimp API credentials. No auth check. | Patch available |
| ACF | CVE-2026-8382 | HIGH | Unauthenticated post content overwrite via public ACF forms | 6.8.2+ |
| ManageWP Worker | CVE-2026-3718 | HIGH 7.2 | Stored XSS via MWP-Key-Name header (unauthenticated) | 4.9.32+ |
| ManageWP Worker | Auth bypass | CRITICAL | Shared global signing keys allow unauthenticated login on any site running the plugin (versions up to 4.9.2) | 4.9.3+ |
| WP Engine Site Migration | N/A | RISK | Active on site but migration is complete. Handles file uploads and DB operations. Should not be running. | Deactivate + delete |
| What they did | What they missed |
|---|---|
| Removed injected script tags from theme files | Did not audit wp-content/mu-plugins/ for PHP backdoors |
| Upgraded plugins on Jun 16 | Did 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 8 | Left attacker's management channel active for six weeks across all cleanup rounds |
| Did not block user enumeration via REST API | Usernames webmaster and noahw still publicly exposed today |
| Did not check server crontab | Possible cron-based reinfection job may still be running |
Did not check .htaccess / php.ini for auto_prepend_file | PHP-level loader could still be in place |
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
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
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
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
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
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
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)
Ask Jesse S. to run all of the following. These cannot be done without server SSH access:
ls -la wp-content/mu-plugins/ — list every file, delete anything Mindbees did not place therefind wp-content/uploads -name "*.php" — delete every result (PHP files have no legitimate reason to be in uploads)ls -la wp-content/db.php — if present and unrecognized, delete itgrep -r "auto_prepend_file" .htaccess wp-content/ — delete any match pointing to a non-WP filecrontab -l — look for any cron job fetching or executing external URLsxmlrpc.php and connections to managewp.com from June 1 onwardStep 8 — This week
Step 9 — This week — Jet / Chuck decision
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
curl https://topreptraining.com/wp-json/wp/v2/users returns 401 or emptyInvestigation 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.