ErrTraffic: WordPress Infrastructure and Backdoor Maintenance
An adversary has compromised a WordPress server using harvested credentials and installed a PHP backdoor or malicious plugin to facilitate the delivery of ErrTraffic ClickFix lures.
Based on research by Sekoia 2026-09-20 9 steps · 3 queries T1078 T1190 T1505.003
Brief
Why hunt for ErrTraffic
Sekoia recently published research titled Unveiling ErrTraffic: inside a growing ClickFix malware distribution framework. The report describes a sophisticated ecosystem where attackers compromise legitimate WordPress sites to host ClickFix lures. These lures trick users into running malicious code, often leading to infostealer infections. While many detections focus on the final payload, this hunt looks for the engine: the compromised WordPress servers and the PHP backdoors that manage malicious injections.
How the hunt flows
The first phase narrows the investigation to relevant assets. The query identifies every host in the software inventory running WordPress. This step ensures that the subsequent, more resource-intensive queries only run against systems capable of hosting the targeted backdoor.
Next, the hunt gathers evidence from two distinct surfaces. It monitors web traffic for successful HTTP POST requests to the WordPress login page. It specifically flags status codes like 200 or 302 that indicate an account takeover. Simultaneously, the hunt scans file system activity in core directories like plugins, themes, and includes. It looks for the creation or modification of PHP files.
The hunt then baselines this file activity across the fleet. It filters for PHP files that appear on three or fewer hosts. Legitimate updates typically affect many servers at once, so these rare occurrences often represent manual attacker persistence or custom backdoor scripts.
Finally, a triage agent correlates these events. It links the successful login to the rare file modification on the same host. This connection provides a high-confidence indicator of a compromised administrator account being used to establish a foothold.
What the hunt cannot see
This hunt has two primary blind spots. First, incomplete file telemetry on Linux hosting servers might miss script injections if the system samples high-volume windows or ignores specific WordPress subdirectories. Second, depth of HTTP logging matters. If a web proxy only records status codes and not response bodies, it may miss successful logins that the application handles with a 200 OK but an internal error message.
How to run the hunt
This hunt is available as an open hunt.md playbook. This format allows you to import the logic directly into Huntbase or any runtime that supports the hunt.md standard. The playbook includes the SQL queries and the triage logic required to baseline your WordPress environment and identify ErrTraffic infrastructure.
Steps
-
Identify WordPress Servers
Query · scopingFind every host in the inventory running WordPress software to narrow the hunt scope.
reads hb_software_inventorysqlSELECT DISTINCT device_hostname, package_version, install_path FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%wordpress%'What a hit looks like. A list of hostnames acting as WordPress servers. Silence indicates no WordPress installations were detected by the inventory provider.
-
Successful WordPress Web Logins
Query · triageIdentify successful logins to WordPress via HTTP POST traffic, which may represent the use of harvested credentials.
reads hb_http_activitysqlSELECT device_hostname, url_path, src_endpoint_ip, user_agent, time FROM hb_http_activity WHERE LOWER(url_path) LIKE '%wp-login.php%' AND http_method = 'POST' AND status_code IN (200, 302) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Successful POST requests to wp-login.php. A 302 status often indicates a successful redirect to the dashboard.
-
Rare PHP File Modifications
Query · baselineStack-count PHP file changes in sensitive WordPress directories to find rare backdoors or malicious plugins.
reads hb_file_activitysqlSELECT file_path, file_name, GROUP_CONCAT(DISTINCT device_hostname) AS hosts, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_file_activity WHERE (LOWER(file_path) LIKE '%wp-content/plugins%' OR LOWER(file_path) LIKE '%wp-content/themes%' OR LOWER(file_path) LIKE '%wp-includes%') AND LOWER(file_name) LIKE '%.php' AND activity_id IN (1, 3, 5) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY file_path, file_name HAVING host_count <= 3What a hit looks like. Rare PHP file modifications in core WordPress directories. Legitimate updates usually touch many hosts; localized changes are suspicious.
-
Triage WordPress Compromise
Agent triageCorrelate authentication events with rare file system changes on the same host.
-
Route on Compromise Verdict
DecisionDecide whether to initiate containment based on the agent's findings.
-
Isolate WordPress Host
Response actionIsolate the compromised host to prevent further malware distribution.
-
Manual File and Backdoor Review
Analyst taskA human analyst reviews the rare files to confirm they are ErrTraffic backdoors.
-
Close Out
Analyst taskDocument findings and determine if the rare file patterns should be promoted to standing detection rules.
Coverage
Scenario coverage
| Stage | Covered | How, or why not |
|---|---|---|
| WordPress Credential Abuse T1190 · T1078 |
Yes | wp-login-activity |
| PHP Backdoor Installation T1505.003 |
Yes | rare-php-file-changes |
| JavaScript Framework Injection T1059.007 |
Out of scope | Belongs to another part of the 'Unveiling ErrTraffic: a growing ClickFix malware distribution framework' series. |
| Blockchain-based C2 Resolution T1102.001 · T1071 · T1090.003 |
Out of scope | Belongs to another part of the 'Unveiling ErrTraffic: a growing ClickFix malware distribution framework' series. |
| User-Driven PowerShell Execution T1059.001 · T1204.002 |
Out of scope | Belongs to another part of the 'Unveiling ErrTraffic: a growing ClickFix malware distribution framework' series. |
| Infostealer Credential Theft T1555 · T1115 |
Out of scope | Belongs to another part of the 'Unveiling ErrTraffic: a growing ClickFix malware distribution framework' series. |
Blind spots
- Needs hb_file_activity on Linux hosting servers. Some Linux servers sample file activity or ignore modifications in core WordPress directories, potentially missing a small PHP script injection. It would answer Did the backdoor installation occur during a high-volume file modification window?.
- Needs hb_http_activity with full response body. If the web proxy only logs status codes, it may miss successful logins handled via 200 OK responses with internal error messages, leading to false negatives. It would answer Was the login successful based on internal application logic?.
Parameters & data
Parameters
| Parameter | Type | Default | What it is |
|---|---|---|---|
lookback_days | number | 14 | Days of history to examine. |
scope_hosts | list[host] | — | Specific hostnames to focus on; leave empty to hunt across the entire estate. |
Telemetry
| Source | Category | Telemetry |
|---|---|---|
| Endpoint telemetry (hb_ surfaces) | endpoint | endpoint |
| Web server / proxy logs | siem | network |
Source
---
analysis: A rule might catch specific PowerShell payloads, but this hunt correlates
successful web-based logins with the subsequent creation of a rare PHP file in sensitive
WordPress directories using a fleet-wide prevalence baseline.
blind_spots:
- id: incomplete-file-telemetry
question: Did the backdoor installation occur during a high-volume file modification
window?
requires: hb_file_activity on Linux hosting servers
risk: Some Linux servers sample file activity or ignore modifications in core WordPress
directories, potentially missing a small PHP script injection.
stage: persistence-php-backdoors
- id: http-logging-depth
question: Was the login successful based on internal application logic?
requires: hb_http_activity with full response body
risk: If the web proxy only logs status codes, it may miss successful logins handled
via 200 OK responses with internal error messages, leading to false negatives.
stage: initial-access-wordpress-credentials
coverage:
- stage: initial-access-wordpress-credentials
status: covered
steps:
- wp-login-activity
- stage: persistence-php-backdoors
status: covered
steps:
- rare-php-file-changes
- reason: 'Belongs to another part of the ''Unveiling ErrTraffic: a growing ClickFix
malware distribution framework'' series.'
stage: execution-malicious-js-injection
status: out_of_scope
- reason: 'Belongs to another part of the ''Unveiling ErrTraffic: a growing ClickFix
malware distribution framework'' series.'
stage: c2-etherhiding-resolution
status: out_of_scope
- reason: 'Belongs to another part of the ''Unveiling ErrTraffic: a growing ClickFix
malware distribution framework'' series.'
stage: execution-clickfix-powershell
status: out_of_scope
- reason: 'Belongs to another part of the ''Unveiling ErrTraffic: a growing ClickFix
malware distribution framework'' series.'
stage: credential-access-infostealer-impact
status: out_of_scope
guardrails:
claims: no_unsupported
evidence: citation_required
missing_data: not_benign
telemetry: untrusted
hunt:
applicability: campaign-specific
handoff: keep-as-periodic-hunt
justification: Compromised WordPress infrastructure is the engine for ErrTraffic
malware distribution. Finding these backdoors early prevents the deployment of
ClickFix lures and subsequent infostealer infections.
methodology: model-assisted
trigger: intel-report
hypothesis: An adversary has compromised a WordPress server using harvested credentials
and installed a PHP backdoor or malicious plugin to facilitate the delivery of ErrTraffic
ClickFix lures.
labels:
- hunt
- attack.t1190
- attack.t1078
- attack.t1505.003
name: 'ErrTraffic: WordPress Infrastructure and Backdoor Maintenance'
parameters:
lookback_days:
default: '14'
description: Days of history to examine.
type: number
scope_hosts:
default: []
description: Specific hostnames to focus on; leave empty to hunt across the entire
estate.
type: list[host]
provenance:
authors:
- name: Huntbase hunt generation
org: huntbase.io
generated:
by: huntbase-hunt-generation
from: https://blog.sekoia.io/unveiling-errtraffic-inside-a-growing-clickfix-malware-distribution-framework
gates:
- dry-run
- lint
model: hb_google/gemini-3-flash-preview
rationale: Target systems identified as WordPress servers by hb_software_inventory
first. If inventory is missing, broaden scope to all web servers with active PHP
processes.
references:
- name: 'Unveiling ErrTraffic: inside a growing ClickFix malware distribution framework'
url: https://blog.sekoia.io/unveiling-errtraffic-inside-a-growing-clickfix-malware-distribution-framework
related:
- hunt: errtraffic-malicious-js-injection
reason: This hunt finds the infrastructure; the next hunt identifies the malicious
scripts being served to visitors.
relation: follows
scenario:
stages:
- name: WordPress Credential Abuse
observables:
- Harvested WordPress credentials used for unauthorized logins
slug: initial-access-wordpress-credentials
tactic: initial-access
techniques:
- T1190
- T1078
- name: PHP Backdoor Installation
observables:
- Malicious PHP backdoors on WordPress servers
- Malicious WordPress plugin facilitating framework deployment
slug: persistence-php-backdoors
tactic: persistence
techniques:
- T1505.003
- name: JavaScript Framework Injection
observables:
- Injected scripts referencing /cf.js
- Injected scripts referencing /api/css.js
- DNS-prefetch for llc-image-ico.click
- Base64-encoded and XOR-obfuscated JavaScript
slug: execution-malicious-js-injection
tactic: execution
techniques:
- T1059.007
- name: Blockchain-based C2 Resolution
observables:
- Polygon blockchain wallet 0x08207B087F61d7e95E441E15fd6d40BEfd6eD308
- Quicknode RPC endpoint connections
- C2 domains with .beer, .cfd, .club, .click, .cyou, .lat, .sbs, .shop, and .xyz
TLDs
- RC4 encrypted C2 traffic to /api/index.php
slug: c2-etherhiding-resolution
tactic: command-and-control
techniques:
- T1102.001
- T1071
- T1090.003
- name: User-Driven PowerShell Execution
observables:
- PowerShell command lines provided via ClickFix lures (fake BSOD, CAPTCHA)
- API calls to /api/index.php?a=ctx&os=windows
- Clipboard interaction to store malicious commands
slug: execution-clickfix-powershell
tactic: execution
techniques:
- T1059.001
- T1204.002
- name: Infostealer Credential Theft
observables:
- Vidar, Stealc, Remus, and Salat infostealer payloads
- Access to browser password storage and clipboard contents
slug: credential-access-infostealer-impact
tactic: credential-access
techniques:
- T1555
- T1115
summary: ErrTraffic is a Malware-as-a-Service framework that compromises WordPress
sites to inject malicious JavaScript and deploy the ClickFix lure. It utilizes
EtherHiding via Polygon smart contracts as a dead-drop resolver for its C2 infrastructure,
eventually tricking users into executing PowerShell commands that deliver infostealers
like Vidar and Stealc.
series:
index: 1
slug: unveiling-errtraffic-a-growing-clickfix-malware-distribution-framework
title: 'Unveiling ErrTraffic: a growing ClickFix malware distribution framework'
total: 2
severity: high
targets:
analyst:
name: Tier-2 analyst
role: analyst
endpoint:
category: endpoint
name: Endpoint telemetry (hb_ surfaces)
telemetry:
- endpoint
hunter:
agent: true
name: Hunt agent
web:
category: siem
name: Web server / proxy logs
telemetry:
- network
tlp: clear
type: investigation
---
# ErrTraffic: WordPress Infrastructure and Backdoor Maintenance
This hunt focuses on the initial access and persistence phases of the ErrTraffic framework. It identifies servers running WordPress, looks for successful administrative authentications via HTTP POST traffic to login pages, and correlates these with rare file system modifications in sensitive WordPress directories like plugins and themes. The goal is to detect the PHP backdoors used to manage malicious JavaScript injections and ClickFix lures as described in the Sekoia ErrTraffic research.
## identify-wordpress-servers
<!-- Identify WordPress Servers -->
Find every host in the inventory running WordPress software to narrow the hunt scope.
```sqlite target=endpoint role=scoping
~~~yaml
expected: A list of hostnames acting as WordPress servers. Silence indicates no WordPress
installations were detected by the inventory provider.
reads:
- device_hostname
- package_name
- package_version
- install_path
silence: not_evidence_of_absence
source: hb_software_inventory
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT DISTINCT device_hostname, package_version, install_path FROM hb_software_inventory WHERE LOWER(package_name) LIKE '%wordpress%'
```
## parallel-evidence-gathering
<!-- Parallel Evidence Gathering -->
parallel:
- → wp-login-activity
- → rare-php-file-changes
join: → triage-wordpress-compromise
## wp-login-activity
<!-- Successful WordPress Web Logins -->
Identify successful logins to WordPress via HTTP POST traffic, which may represent the use of harvested credentials.
```sqlite target=web role=triage params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: Successful POST requests to wp-login.php. A 302 status often indicates a
successful redirect to the dashboard.
reads:
- device_hostname
- url_path
- http_method
- status_code
- src_endpoint_ip
- user_agent
- time
silence: not_evidence_of_absence
source: hb_http_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, url_path, src_endpoint_ip, user_agent, time FROM hb_http_activity WHERE LOWER(url_path) LIKE '%wp-login.php%' AND http_method = 'POST' AND status_code IN (200, 302) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## rare-php-file-changes
<!-- Rare PHP File Modifications -->
Stack-count PHP file changes in sensitive WordPress directories to find rare backdoors or malicious plugins.
```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
baseline:
compare: first_seen
window: '{{lookback_days}}d'
expected: Rare PHP file modifications in core WordPress directories. Legitimate updates
usually touch many hosts; localized changes are suspicious.
prevalence:
by: device_hostname
key:
- file_path
- file_name
rare_below: 3
reads:
- device_hostname
- file_path
- file_name
- activity_id
- time
silence: not_evidence_of_absence
source: hb_file_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT file_path, file_name, GROUP_CONCAT(DISTINCT device_hostname) AS hosts, COUNT(DISTINCT device_hostname) AS host_count, MIN(time) AS first_seen FROM hb_file_activity WHERE (LOWER(file_path) LIKE '%wp-content/plugins%' OR LOWER(file_path) LIKE '%wp-content/themes%' OR LOWER(file_path) LIKE '%wp-includes%') AND LOWER(file_name) LIKE '%.php' AND activity_id IN (1, 3, 5) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY file_path, file_name HAVING host_count <= 3
```
## triage-wordpress-compromise
<!-- Triage WordPress Compromise -->
```agent target=hunter
cite: required
context:
- identify-wordpress-servers
- wp-login-activity
- rare-php-file-changes
max_iterations: 4
objective: Determine if the observed web logins and rare file modifications indicate
an unauthorized WordPress account takeover and subsequent PHP backdoor installation.
success_criteria: The agent identifies hosts where a successful admin login was followed
by a rare PHP file modification in a sensitive WordPress directory.
tools:
- endpoint
- web
```
## route-compromise
<!-- Route on Compromise Verdict -->
if~: "the triage verdict is malicious or highly suspicious for at least one host" (confidence: high, judge=hunter)
then: → contain-host
indeterminate: → manual-file-review
unavailable: → manual-file-review (blind_spot: incomplete-file-telemetry)
else: → close-out
## contain-host
<!-- Isolate WordPress Host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the identified host and reset WordPress administrative credentials. Capture the suspicious PHP files for forensic analysis.
```
→ manual-file-review
## manual-file-review
<!-- Manual File and Backdoor Review -->
```manual target=analyst
Inspect the content of the suspicious PHP files identified in 'rare-php-file-changes'. Look for XOR-obfuscated JavaScript, shell execution commands, or code that matches the ErrTraffic v3 patterns.
```
→ close-out
## close-out
<!-- Close Out -->
```manual target=analyst
Document the compromised hosts, the discovered PHP backdoors, and the associated WordPress accounts. Recommend updates to file monitoring policies for web servers.
```
→ end
Run it
Take this hunt into your environment.
Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.
Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.