CVE-2026-56290 — Joomla "Page Builder CK" Unauthenticated Upload → Webshell RCE
Executive Summary
CVE-2026-56290 (CVSS 10.0) is an improper access control / unauthenticated arbitrary file upload vulnerability in Joomlack "Page Builder CK" (com_pagebuilderck), a popular Joomla page-builder extension. A front-end upload endpoint accepts files with no authentication and no permission check, and lets the caller choose the destination folder. An unauthenticated attacker uploads a PHP file into a web-served directory and requests it — direct remote code execution.
The flaw affects every version up to and including 3.5.10. It was fixed in 3.6.0 (released 2026-06-27), with back-ports to 3.1.1 (Joomla 3) and 3.4.10 (Joomla 4). Exploitation has been observed in the wild since 2026-06-27 to plant webshells, and CISA added it to the Known Exploited Vulnerabilities catalog on 2026-07-07 with a federal remediation deadline of 2026-07-10. The first confirmed webshell was dropped at /media/com_pagebuilderck/gfonts/bhup.php — an uploader shell keyed on the $_POST['_upl'] field.
Because the upload is unauthenticated, this is mass-scannable and mass-exploitable: any internet-facing Joomla site running a vulnerable Page Builder CK is a target. The detectable endpoint story is post-exploitation on the web server itself — a new PHP file appearing in an asset/upload directory, and the web server or a PHP worker spawning a shell.
Defender priority: (1) Patch Page Builder CK to 3.6.0 / 3.4.10 / 3.1.1 now. (2) Hunt the web hosts for a PHP file written under /media/com_pagebuilderck/ (esp. the gfonts/ folder) and for the named shell bhup.php. (3) Hunt for the web server / php-fpm process spawning a shell (Q1) — the highest-fidelity RCE signal. Treat any hit as a confirmed compromise: preserve the shell, then eradicate and rebuild.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Fwd |
|---|---|---|---|
| 1 | CISA KEV | Added 2026-07-07 as "Joomlack Page Builder Improper Access Control"; active exploitation; federal due 2026-07-10 | yes |
| 1 | NVD — CVE-2026-56290 | CVSS 10.0; improper access control → unauth arbitrary file upload → RCE | yes |
| 1 | mySites.guru | Exploitation since 2026-06-27; first confirmed shell /media/com_pagebuilderck/gfonts/bhup.php keyed on $_POST['_upl'] | yes |
| 1 | CCB Belgium advisory | Affected ≤3.5.10; fixed 3.6.0; back-ports 3.1.1 (J3) / 3.4.10 (J4); unauth upload endpoint, caller-chosen folder | yes |
| 2 | The Hacker News | KEV batch context (Adobe ColdFusion, SP Page Builder CVE-2026-48908, Langflow CVE-2026-55255) | partial |
Hunter note: Do not confuse this with the sibling KEV entry CVE-2026-48908 (JoomShaper SP Page Builder, also CVSS 10.0 file-upload) — different vendor/extension, similar tradecraft. This pack targets Joomlack Page Builder CK (com_pagebuilderck). The single published atomic IOC is the bhup.php shell name + path; attackers will vary the filename, so the durable hunt is any new PHP under Joomla asset/upload dirs (Q2/Q4) plus web-server shell spawns (Q1). No file hashes were published at pack time — the IOC CSV uses REPLACE_WITH placeholders rather than fabricated hashes.
Hunt Brief & Attack Chain
Hunt Hypotheses (fidelity-ordered)
- H1 (high): A web-server / PHP worker (
php-fpm,httpd,apache2,nginx,lsphp) spawns a shell/LOLBin (sh,bash,curl,python) — webshell command execution. low FP - H2 (high): A new
.phpfile is written under/media/com_pagebuilderck/(esp.gfonts/) — the webshell drop. low FP - H3 (high): The named shell
bhup.phpappears on disk or in a PHP command line. low FP - H4 (medium): Any new
.phpfile written into a Joomla static-asset/upload dir (/media/,/images/,/tmp/) that should hold no code. med FP - H5 (medium): A PHP command line containing webshell primitives (
shell_exec,system(,base64_decode,eval(,_upl). med FP - H6 (medium): A web-server-context process makes an outbound connection to a non-RFC1918 raw IP — reverse shell / second-stage pull. med FP
- H7 (medium): A LOLBin (
curl/wget) downloads a file into a web-served path — tooling staged into web root. med FP
Attack Chain
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · Recon | Mass-scan for Joomla sites with Page Builder CK ≤3.5.10 | Web/proxy logs | Endpoint hits on com_pagebuilderck |
| 2 · Initial Access | Unauthenticated POST to the front-end upload endpoint, caller-chosen folder | Web logs / n/a on EDR | Native web-log hunt (§7) |
| 3 · Persistence | PHP webshell written (e.g. gfonts/bhup.php, keyed on $_POST['_upl']) | FileWrite | PHP in asset dir (H2/H3/H4) |
| 4 · Execution | Attacker requests the shell → PHP executes attacker commands | ProcessRollup2 | Web server spawns shell (H1) |
| 5 · Defense Evasion | Obfuscated shell (base64_decode/eval); commands via $_POST['_upl'] | ProcessRollup2 | PHP webshell primitives (H5) |
| 6 · Ingress / C2 | Reverse shell or second-stage tool pull from the web host | NetworkConnectIP4 / ProcessRollup2 | Web-server egress + curl/wget (H6/H7) |
| 7 · Impact | Site defacement, data theft, pivot, cryptominer, or ransomware staging | ProcessRollup2 / FileWrite | Follow-on tooling on host |
Consolidated IOC Table
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| Webshell path | /media/com_pagebuilderck/gfonts/bhup.php | high | detect | First confirmed dropped shell (mySites.guru) |
| Filename | bhup.php | high | hunt | Named uploader shell; attackers may rename |
| Webshell key | $_POST['_upl'] | medium | hunt | Command/upload parameter of the shell |
| Drop directory | /media/com_pagebuilderck/ (esp. gfonts/) | high | hunt | Component media dir — should hold no PHP |
| Component | com_pagebuilderck (Joomlack Page Builder CK) | high | hunt | Vulnerable extension |
| Vuln version | Page Builder CK ≤ 3.5.10 | high | patch | Fixed 3.6.0 / 3.4.10 (J4) / 3.1.1 (J3) |
| Behavior | Unauthenticated file upload → PHP RCE | high | detect | Improper access control, no permission check |
| SHA256 | REPLACE_WITH_SHA256 (bhup.php / variant shells) | medium | detect | Populate when vendor hashes publish |
| IPv4 | REPLACE_WITH_SCANNER_IP | medium | detect | Exploit source / C2 — populate from your web logs |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Joomla web servers (Linux/Windows) | ProcessRollup2, file-write events, NetworkConnectIP4 | critical | Medium — Falcon Linux sensor coverage varies |
| Shared-hosting / cPanel web nodes | ProcessRollup2 (per-vhost php-fpm/lsphp), file-write | critical | High — sensor rarely on shared hosts |
| Reverse proxy / WAF / web logs | HTTP request logs (method, URI, status, UA) | high | Medium — needs NGSIEM/proxy ingestion |
| Network egress | NetworkConnectIP4, proxy logs | high | Medium — web hosts often allowed broad egress |
| File integrity of web root | FIM / file-write events on /media, /images, /tmp | high | Medium — non-PE writes not always captured |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1190 — Exploit Public-Facing Application | Unauth upload endpoint in Page Builder CK | §7 web-log hunt / patch |
| Persistence | T1505.003 — Server Software Component: Web Shell | PHP shell dropped in /media/com_pagebuilderck/ | Q2 / Q3 / Q4 |
| Execution | T1059.004 — Command and Scripting Interpreter: Unix Shell | PHP worker spawns sh/bash | Q1 |
| Execution | T1059.007 — JavaScript / server-side script | PHP webshell executes attacker commands | Q5 |
| Defense Evasion | T1027 — Obfuscated Files or Information | base64_decode/eval in the shell | Q5 |
| Command & Control | T1105 — Ingress Tool Transfer | curl/wget pulls second-stage into web root | Q7 |
| Command & Control | T1071.001 — Application Layer Protocol: Web | Reverse shell / beacon from web host | Q6 |
Native Audit-Log Hunts (non-CQL)
Web-root sweep for dropped PHP shells (run on every Joomla host)
# PHP anywhere it should not be (media/images/tmp are asset dirs, not code) find /var/www /home/*/public_html -type f -name "*.php" \ \( -path "*/media/*" -o -path "*/images/*" -o -path "*/tmp/*" \) 2>/dev/null # The named shell + component drop dir specifically find / -type f -name "bhup.php" 2>/dev/null ls -la /var/www/*/media/com_pagebuilderck/gfonts/ 2>/dev/null # PHP files newer than the patch window (likely attacker-dropped) find /var/www -type f -name "*.php" -newermt "2026-06-27" 2>/dev/null
Webshell content grep (uploader/eval primitives)
grep -rEln "_upl|shell_exec|passthru|system\(|eval\(|base64_decode|move_uploaded_file" \ /var/www/*/media /var/www/*/images 2>/dev/null
Version check + web-log triage
# Confirm installed Page Builder CK version (look for <= 3.5.10) grep -R "version" /var/www/*/administrator/components/com_pagebuilderck/*.xml 2>/dev/null # In your proxy/WAF logs: POST requests to com_pagebuilderck upload endpoints, # especially those immediately followed by a GET to a new /media/*.php path.
Note: The shell is unauthenticated to plant — absence of auth logs does NOT mean no compromise. A vulnerable version + any new PHP in an asset dir = treat as compromised until proven otherwise. Patch AND remove the shell; patching alone leaves the backdoor in place.
CrowdStrike LogScale CQL Hunt Queries
Looks for: a web-server or PHP worker process spawning a shell / LOLBin — the classic webshell command-execution signal, and the highest-fidelity catch for this RCE.
// HUNT: web server / php-fpm spawns a shell (webshell RCE) // MITRE: T1190, T1505.003, T1059.004 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 (Linux/Windows) // FALSE POSITIVES: rare CMS plugins/cron shelling out — verify the child + args #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(php|php-fpm|lsphp|httpd|apache2|nginx|w3wp|caddy)[0-9.-]*(\.exe)?$/i | ImageFileName=/(\/|\\)(sh|bash|dash|zsh|python[0-9.]*|perl|ruby|curl|wget|nc|ncat|whoami|id|uname)(\.exe)?$/i | table([ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine, SHA256HashData, aid], limit=200)
Looks for: a .php file written under the component's media directory — no PHP should ever live there. ⚠ validate in tenant — non-PE file-write telemetry varies by sensor/OS; confirm the event flows before relying on this query.
// HUNT: PHP webshell written under /media/com_pagebuilderck/ // MITRE: T1505.003 // CONF: high FP: low COST: medium | REQUIRES: FileCreateInfo (validate in tenant) // FALSE POSITIVES: none expected — component media dir holds fonts/images, not PHP #event_simpleName=/FileCreateInfo|NewScriptWritten/ | TargetFileName=/[\/\\]media[\/\\]com_pagebuilderck[\/\\].*\.php$/i | table([ComputerName, UserName, TargetFileName, ContextBaseFileName, aid], limit=200)
Looks for: the named atomic IOC bhup.php — either written to disk or referenced by a PHP process. High-fidelity but narrow (attackers rename); pair with Q2/Q4.
// HUNT: known bhup.php webshell (atomic IOC) // MITRE: T1505.003 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 or FileCreateInfo // FALSE POSITIVES: none — bhup.php is attacker-attributed #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2|FileCreateInfo|NewScriptWritten/ | CommandLine=/bhup\.php/i OR TargetFileName=/(\/|\\)bhup\.php$/i | table([ComputerName, UserName, ImageFileName, CommandLine, TargetFileName, aid], limit=200)
Looks for: any .php written into a Joomla static-asset/upload dir (/media/, /images/, /tmp/) — generalizes beyond the known filename. FP: a few extensions legitimately place PHP; inspect any hit's content for webshell primitives. ⚠ validate in tenant — file-write telemetry varies.
// HUNT: new PHP in Joomla asset/upload dirs (generalized shell drop) // MITRE: T1505.003 // CONF: medium FP: medium COST: medium | REQUIRES: FileCreateInfo (validate in tenant) // FALSE POSITIVES: rare legit PHP in media/images — inspect content (Q5 / §7 grep) // TUNING: baseline expected PHP paths per site; alert on net-new only #event_simpleName=/FileCreateInfo|NewScriptWritten/ | TargetFileName=/[\/\\](media|images|tmp)[\/\\].*\.php$/i | table([ComputerName, UserName, TargetFileName, ContextBaseFileName, aid], limit=200)
Looks for: a PHP process invoked with webshell/command primitives (shell_exec, system(, base64_decode, eval() or the shell's _upl parameter. FP: some CLI PHP tooling uses these; scope to web-server user context.
// HUNT: PHP process with webshell primitives / _upl key // MITRE: T1059.007, T1027 // CONF: medium FP: medium COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: legit CLI PHP using system()/eval — scope to www-data/apache user // TUNING: exclude known maintenance scripts by ParentBaseFileName / UserName #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ImageFileName=/(\/|\\)(php|php-fpm|lsphp)[0-9.-]*(\.exe)?$/i | CommandLine=/(shell_exec|passthru|system\(|eval\(|base64_decode|_upl)/i | table([ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine, aid], limit=200)
Looks for: a web-server / PHP / shell context process connecting outbound to a non-RFC1918 raw IP — reverse shell or beacon from a compromised web host. FP: web apps make legit outbound API calls; exclude known egress and focus on shell/php contexts.
// HUNT: web-server context outbound to raw external IP (reverse shell / C2) // MITRE: T1071.001, T1059.004 // CONF: medium FP: medium COST: medium | REQUIRES: NetworkConnectIP4 // FALSE POSITIVES: legit outbound API calls from the web app // TUNING: exclude RFC1918 + known API/CDN ranges; correlate with Q1 on aid #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^(php|php-fpm|lsphp|httpd|apache2|nginx|sh|bash|dash)[0-9.-]*(\.exe)?$/i | RemoteAddressIP4!=/^(10\.|127\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.)/ | table([ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort, aid], limit=200)
Looks for: curl/wget/python fetching a file into a web root or asset dir — second-stage tooling staged after the initial shell. FP: deploy/CI pipelines pull into web roots; scope to unexpected hosts/users.
// HUNT: LOLBin download into web-served path (staging) // MITRE: T1105 // CONF: medium FP: medium COST: medium | REQUIRES: ProcessRollup2 // FALSE POSITIVES: legit deploy/CI fetching into web root — exclude known pipelines // TUNING: correlate with Q1 (web server spawned the LOLBin) on the same aid #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ImageFileName=/(\/|\\)(curl|wget|python[0-9.]*|fetch)(\.exe)?$/i | CommandLine=/(\/var\/www|public_html|htdocs|[\/\\]media[\/\\]|[\/\\]images[\/\\])/i | CommandLine=/(https?:|ftp:|-O|-o )/i | table([ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine, aid], limit=200)
CrowdStrike Custom IOA Recommendations
| IOA Name | Pattern | Action | Exclusions |
|---|---|---|---|
| webserver-spawns-shell | Parent php-fpm/httpd/nginx spawning sh/bash/LOLBin | Detect (Critical) → Prevent after tuning | Known maintenance cron/deploy chains |
| php-in-media-dir | PHP file written under /media/com_pagebuilderck/ | Detect (Critical) | None expected |
| bhup-shell | File/command references bhup.php | Prevent (Critical) | None |
| php-webshell-primitives | PHP CLI with system()/eval()/_upl | Detect (High) | Baselined admin/maintenance scripts |
Promotion path: Q1, Q2, Q3 are strong IOA/Prevent candidates (attacker-specific, low FP). Q4–Q7 stay Investigate-only until per-site baselined, and are strongest correlated on the same aid.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,REPLACE_WITH_SHELL_SHA256,prevent,critical,2027-01-09,bhup.php / variant webshell,cve:CVE-2026-56290 domain,REPLACE_WITH_C2_DOMAIN,detect,high,2026-10-09,reverse-shell/C2 (populate from web logs),cve:CVE-2026-56290 ipv4,REPLACE_WITH_SCANNER_IP,detect,high,2026-10-09,exploit source / C2 (populate from web logs),cve:CVE-2026-56290
rce_shell := php-fpm|httpd|nginx -> sh|bash|curl|python shell_drop := *.php written under /media/com_pagebuilderck/** named_shell := bhup.php (keyed on $_POST['_upl']) asset_php := *.php in /media|/images|/tmp (should hold no code) primitives := php CLI with shell_exec|system(|eval(|base64_decode|_upl egress := php|httpd|sh -> outbound raw non-RFC1918 IP
Extension: Joomlack "Page Builder CK" (com_pagebuilderck) VULNERABLE: <= 3.5.10 FIXED (current Joomla): 3.6.0 (2026-06-27) FIXED (Joomla 4 branch): 3.4.10 FIXED (Joomla 3 branch): 3.1.1 CVE: CVE-2026-56290 CVSS: 10.0 KEV-added: 2026-07-07 Due: 2026-07-10 Sibling (different ext): CVE-2026-48908 SP Page Builder (JoomShaper) fixed 6.6.2
# 1. Patch Page Builder CK to 3.6.0 / 3.4.10 (J4) / 3.1.1 (J3) # 2. find /var/www -name "*.php" -newermt "2026-06-27" -path "*/media/*" # 3. Delete every attacker PHP shell (bhup.php + variants) from asset dirs # 4. Reset Joomla admin creds + secret; rotate DB creds + API keys on host # 5. Review configuration.php, .htaccess, and admin users for tampering # 6. Block/deny PHP execution in /media, /images, /tmp at the web-server config # 7. Rebuild the host if RCE (Q1/Q3) confirmed — a shell may have added others
Detection Validation Gates
| Gate | Check | Pass Criteria |
|---|---|---|
| Telemetry ready | ProcessRollup2 + NetworkConnectIP4 flowing from Joomla web hosts; confirm file-write events for Q2/Q4 | Event types present in last 24h |
| Inventory | Enumerate every Joomla host + Page Builder CK version (§7) | Version list built; ≤3.5.10 flagged for patch |
| Positive test | In a lab, drop a benign .php under /media/com_pagebuilderck/ and have php-fpm spawn id | Q1 & Q2 fire on the test artifacts |
| Benign baseline | Run Q4 & Q5 over 7d; catalog legit PHP in asset dirs / CLI PHP tooling | Known-good list built; exclusions added |
| Promotion | Q1/Q2/Q3 FP-clean for 7d | Promote to Custom IOA / Prevent |
Hardening — Tiered
- Patch: update Page Builder CK to
3.6.0/3.4.10(J4) /3.1.1(J3). (M1051 Update Software) - Remove shells: sweep asset dirs and delete every attacker PHP (§7); patching does not remove a planted backdoor. (M1050 Exploit Protection)
- Deny PHP execution in upload dirs: block
.phphandling in/media,/images,/tmp(see §13). (M1042 Disable or Remove Feature) - Rotate secrets: Joomla admin + secret, DB creds, and any API keys reachable from the host. (M1027 Password Policies)
- WAF virtual-patch: block unauthenticated POSTs to the
com_pagebuilderckupload endpoint and any request writing.phpto/media. (M1037 Filter Network Traffic) - Egress control: restrict web-host outbound to required destinations so reverse shells / tool pulls fail. (M1037)
- File integrity monitoring on the web root; alert on any new/changed PHP outside deploys. (M1022 Restrict File and Directory Permissions)
- Least-privilege web user: run PHP-FPM pools per-site as distinct low-priv users; read-only code, writable only where required. (M1026 Privileged Account Management)
- Extension governance: inventory Joomla extensions, subscribe to vendor security feeds, and auto-alert on new CVEs. (M1016 Vulnerability Scanning)
- Network segmentation: isolate public web tier from internal data/DB tiers so a webshell can't pivot. (M1030 Network Segmentation)
Deployable Playbooks
1 · Deny PHP execution in Joomla asset dirs (Apache)
# Drop into /var/www/<site>/media/.htaccess (and images/, tmp/) <FilesMatch "\.(php|phtml|php3|php4|php5|phar)$"> Require all denied </FilesMatch> php_admin_flag engine off
2 · Deny PHP execution in asset dirs (nginx)
location ~* ^/(media|images|tmp)/.*\.php$ {
deny all;
return 403;
}
3 · Find & quarantine dropped shells (bash)
#!/usr/bin/env bash
set -euo pipefail
WEBROOT="${1:-/var/www}"
Q="/root/quarantine_$(hostname)"
mkdir -p "$Q"
find "$WEBROOT" -type f -name "*.php" \
\( -path "*/media/*" -o -path "*/images/*" -o -path "*/tmp/*" \) \
-newermt "2026-06-27" -print 2>/dev/null | while read -r f; do
echo "[!] quarantining $f"
mv "$f" "$Q/"
done
find "$WEBROOT" -type f -name "bhup.php" -exec mv {} "$Q/" \; 2>/dev/null || true
4 · Confirm patched version
grep -R "version" /var/www/*/administrator/components/com_pagebuilderck/*.xml 2>/dev/null # Ensure the reported version is 3.6.0 / 3.4.10 / 3.1.1 or later
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain (Falcon RTR contain) any web host with Q1/Q2/Q3 hits; put the site behind maintenance / WAF-block the upload endpoint | SOC / IR | aid list, contain timestamps |
| Preserve | Capture the webshell(s), web/access logs, and process tree before deleting — establish scope + first-drop time | IR | Shell copy, log export |
| Eradicate | Patch Page Builder CK; remove all attacker PHP; kill any reverse-shell process; reset Joomla admin/secret + DB/API creds | IR / Web team | Patch version, file/credential list |
| Recover | Rebuild the host if RCE was confirmed (assume additional backdoors); restore code from a known-good deploy, not from the live disk | Web team / IT | Rebuild records |
| Recover | Re-expose only after PHP-exec denied in asset dirs + egress control; monitor Q1/Q6 for re-compromise | SOC | 7-day clean window |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 | Unauth upload exploit (request) | — | No | GAP — web/WAF logs only |
| T1505.003 | Shell dropped in media dir | Q2 | Yes | Good |
| T1505.003 | Named bhup.php shell | Q3 | Yes | Good |
| T1059.004 | Web server spawns shell (RCE) | Q1 | Yes | Good |
| T1505.003 | Generalized asset-dir PHP | Q4 | No | Partial — file-write telemetry varies |
| T1059.007 / T1027 | PHP webshell primitives | Q5 | No | Partial |
| T1071.001 | Reverse shell / beacon | Q6 | No | Partial |
| T1105 | LOLBin stages tooling | Q7 | No | Partial |
Endpoint coverage of the post-exploitation chain (drop → execute → egress) is strong (Q1/Q2/Q3). The initial unauthenticated upload itself is a web-log / WAF hunt (§7) — Falcon endpoint telemetry does not see the HTTP request, so pair this pack with proxy/WAF log detection. File-write queries (Q2/Q4) depend on non-PE file-write telemetry — validate it flows in your tenant (§11).
Hunt Summary Ticket
TITLE: CVE-2026-56290 Joomla Page Builder CK — unauth upload → webshell RCE hunt
SEVERITY: Critical (CVSS 10.0; CISA KEV; exploited in the wild since 2026-06-27)
SCOPE: Internet-facing Joomla web servers running Page Builder CK <= 3.5.10
HYPOTHESIS: An unauthenticated upload drops a PHP webshell in a web-served folder
(e.g. /media/com_pagebuilderck/gfonts/bhup.php) and yields RCE via the
web server / php-fpm spawning shells.
QUERIES: Q1 web server spawns shell | Q2 PHP under com_pagebuilderck media
Q3 bhup.php | Q4 asset-dir PHP | Q5 php webshell primitives
Q6 web-host egress | Q7 LOLBin into web root
DO FIRST: 1) Inventory Page Builder CK versions; patch <=3.5.10 (§7)
2) Run Q1/Q2/Q3 across web hosts; contain + preserve any hit
3) Deny PHP exec in /media,/images,/tmp; WAF-block the endpoint
FINDINGS: <fill: hosts, aids, shell paths, versions, creds exposed>
GAPS: Initial HTTP upload seen only in web/WAF logs, not on EDR
ACTIONS: Patch; remove shells; rotate Joomla/DB/API creds; rebuild if RCE
OWNER: <assign SOC/IR + web team lead>
VERSION: v0.2 · 2026-07-09 · HuntPack
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 | Access Date |
|---|---|---|---|
| 1 | CISA — KEV additions 2026-07-07 | KEV status, active exploitation, due date | 2026-07-09 |
| 1 | NVD — CVE-2026-56290 | CVSS 10.0, vuln class | 2026-07-09 |
| 1 | mySites.guru — PageBuilder CK RCE | In-the-wild shell path bhup.php, $_POST['_upl'], first-seen date | 2026-07-09 |
| 1 | CCB Belgium — CVE-2026-56290 advisory | Affected/fixed versions, endpoint behavior | 2026-07-09 |
| 2 | The Hacker News — CISA adds Adobe/Joomla/Langflow flaws | KEV batch context, sibling CVEs | 2026-07-09 |