Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-80099 — Newfold plugins (wp-module-data <= 2.9.7) Unauthenticated | Kitploit
Tools/GitHubGitHub/wayang1337/cve-2026-80099
Vulnerability ScannersPassword AttacksExploitationScripting & AutomationWeb Application ExploitationInformation GatheringPost-ExploitationWeb SecurityPenetration TestingRemote Access Tool
GitHubwayang1337/cve-2026-80099
7h 14m agoNot yet reviewed

CVE-2026-80099

Newfold plugins (wp-module-data <= 2.9.7) Unauthenticated

View Repository

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-80099 PoC

Unauthenticated authentication bypass and RCE exploit targeting Newfold WordPress plugins that bundle wp-module-data.

Overview

This tool exploits a Bearer token validation flaw in the Newfold wp-module-data module. When a WordPress site using an affected Newfold plugin is not connected to Hiive, HiiveConnection::get_auth_token() returns false. This value is passed through strrev() and then hashed, collapsing the secret salt to the public constant:

root@kitploit:~
sha256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Because every other component of the hashed payload (HTTP method, request URL, request body, timestamp) is fully attacker-controlled, a valid Bearer token can be computed offline. The vulnerable filter runs on rest_authentication_errors, so a forged token authenticates the caller as the for the entire WordPress REST API, including core routes. That access is then leveraged into full remote code execution.

first administrator

Affected Software

Plugin / ModuleAffected VersionsPatched
wp-module-data<= 2.9.72.9.8
bluehost-wordpress-plugin<= 4.19.0n/a
hostgator<= 3.2.0n/a
web<= 2.3.5n/a
crazy-domains<= 2.5.2n/a

Detection also covers the WordPress.org plugin slugs wp-plugin-web and crazy_blog.

Root Cause

In vendor/newfold-labs/wp-module-data/includes/Data.php:

root@kitploit:~
public function authenticate( $errors ) {        // hooked on rest_authentication_errors
    ...
    $data = array(
        'method'    => $_SERVER['REQUEST_METHOD'],
        'url'       => Url::getCurrentUrl(),
        'body'      => file_get_contents( 'php://input' ),
        'timestamp' => dataGet( getallheaders(), 'X-Timestamp' ),
    );
    $hash     = hash( 'sha256', wp_json_encode( $data ) );
    $salt     = hash( 'sha256', strrev( HiiveConnection::get_auth_token() ) );
    $is_valid = hash( 'sha256', $hash . $salt ) === $token;

    if ( $is_valid ) {
        ... wp_set_current_user( <first administrator> ); return true;
    }
}

On an unconnected site, strrev(false) coerces to strrev('') which yields '', and the salt becomes the well-known hash of the empty string. Every other input to the hash chain is attacker-controlled, so the token is fully predictable.

Features

  • Detection of affected Newfold plugins via static asset fingerprinting
  • Module presence detection through the newfold-data/v1/verify/<hex> REST route
  • Offline forgery of a valid Bearer token (no secret required)
  • Verification of the bypass by calling GET /wp/v2/users/me and inspecting roles
  • Full RCE chain with multiple fallback techniques:
    1. Theme editor write to 404.php / index.php
    2. Plugin upload via ZIP
    3. Editor write into an inactive plugin, REST activation, and restore
  • Optional persistent .fm.php file manager dropped in the webroot
  • Mass scanning mode with threaded workers, resume support, and throttled progress
  • Two authentication paths for post-exploitation: Newfold SSO magic-link login (bypasses ModSecurity blocks on wp-login.php) and classic wp-login.php form login

Requirements

  • Python 3.7+
  • requests
  • urllib3 (optional, only for suppressing TLS warnings)

Install dependencies:

root@kitploit:~
pip install requests urllib3

Usage

Single Target Check

Read-only detection and bypass verification:

root@kitploit:~
python3 exploit.py -u https://target.example

Single Target RCE

Full chain to a persistent shell:

root@kitploit:~
python3 exploit.py -u https://target.example --mode rce

Reset the first administrator's password instead of creating a new one:

root@kitploit:~
python3 exploit.py -u https://target.example --mode rce --takeover

Mass Scanning

Check-only across a list of targets:

root@kitploit:~
python3 exploit.py --list targets.txt

Full chain on every vulnerable host (requires explicit opt-in):

root@kitploit:~
python3 exploit.py --list targets.txt --mode rce --apply-rce

Pre-filter using static asset probes before touching the REST API:

root@kitploit:~
python3 exploit.py --list targets.txt --brand-filter

Stop after the first N vulnerable hosts:

root@kitploit:~
python3 exploit.py --list targets.txt --stop-after 5

Resume a previous run:

root@kitploit:~
python3 exploit.py --list targets.txt --resume

Options

FlagDescription
-u, --urlSingle target base URL
--listFile containing one target URL per line
--modecheck (detect only) or rce (full chain); default check
--takeoverReset first admin password instead of creating a new admin
--outputJSONL output path for mass mode; default cve_2026_80099_results.jsonl
--vuln-listBare URL list of vulnerable hosts; default vuln.txt
--threadsWorker count for mass mode; default 20
--timeoutRequest timeout in seconds; default 15
--fast-timeoutFast probe timeout in seconds; default 6
--retriesRetry attempts per request; default 1
--proxyHTTP(S) proxy URL
--all-outWrite all mass rows, not only vulnerable ones
--apply-rceRun the RCE chain on vulnerable hosts in mass mode
--brand-filterPre-filter using Newfold plugin static assets
--stop-afterStop mass scan after N vulnerable hosts; 0 means run all
--quietDisable per-target progress lines
--resumeAppend to output and skip targets already present

RCE Chain Details

Once an administrator context is confirmed, the tool attempts three techniques in order:

  1. Theme editor shell — writes a small PHP payload to the active theme's 404.php or index.php. The payload is triggered by requesting any non-existent URL (for 404.php) or the site root (for index.php).

  2. Plugin upload shell — builds a ZIP containing a minimal plugin, uploads it via wp-admin/update.php?action=upload-plugin, and accesses the plugin PHP file directly.

  3. Inactive plugin editor chain — lists plugins via the REST API, selects an inactive one, writes a cmd-shell into its main file via plugin-editor.php, activates it via PUT /wp/v2/plugins/<slug>, triggers the shell on any frontend URL, drops .fm.php into the webroot, then deactivates the plugin and restores the original file. This path is designed to survive hosts that block the theme editor, block direct access to wp-content, or revert edits through loopback health checks.

On success, a persistent .fm.php file manager is dropped in the webroot. It supports:

  • ?cmd=<shell command>
  • ?cat=<path> to read a file
  • ?put=<path>&data=<base64> to write a file
  • ?ls=<path> to list a directory

Output Files

  • cve_2026_80099_results.jsonl — JSONL records for each scanned target. Vulnerable entries include vuln: true, admin, admin_id, and, when RCE succeeds, shell (the URL of the dropped file manager or shell).
  • vuln.txt — one bare URL per line for every vulnerable or shelled target.

Notes

  • The tool ignores system and environment proxies via trust_env = False to avoid leaking mass scans through local proxies.
  • The Bearer token is computed against the exact URL the server will see (scheme, host, and request URI), matching Url::getCurrentUrl() behavior. The request is prepared first and the token is derived from the prepared URL.
  • The PHP-compatible JSON encoder replicates json_encode default behavior, including escaped forward slashes, \uXXXX non-ASCII escaping, and UTF-16 surrogate pairs for astral characters, so the hashed payload matches byte-for-byte.
  • A failed probe returning 401 typically means the target is patched (module >= 2.9.8), the site is connected to Hiive (real token, unknown salt), or an intermediary strips the Authorization header. 403 typically indicates another rest_authentication_errors filter interfered.

Disclaimer

This tool is provided for authorized security testing and research only. Use it exclusively against systems you own or have explicit written permission to test. Unauthorized access to computer systems is illegal in most jurisdictions and may result in severe civil and criminal penalties. The author assumes no responsibility for misuse or damage caused by this software.

Download Tool