Lucene search
+L

Open eClass RCE (CVE-2024-26503) Detection

🗓️ 26 Oct 2026 17:17:59Reported by KittySploitType 
kittysploit
 kittysploit
🔗 github.com👁 6 Views

Unrestricted badge icon upload in GUnet Open eClass leads to RCE.

Related
Refs
Code
ReporterTitlePublishedViews
Family
githubexploit
GithubExploit
Exploit for Unrestricted Upload of File with Dangerous Type in Openeclass
15 Mar 202413:01
–githubexploit
circl
Circl
CVE-2024-26503
14 Mar 202423:21
–circl
cnnvd
CNNVD
Open eClass Platform Security Vulnerability
14 Mar 202400:00
–cnnvd
cve
CVE
CVE-2024-26503
14 Mar 202400:00
–cve
cvelist
Cvelist
CVE-2024-26503
14 Mar 202400:00
–cvelist
exploitdb
Exploit DB
Open eClass 3.15 - RCE
21 Oct 202600:00
–exploitdb
kitploit
Kitploit
Exploit-CVE-2024-26503
26 Oct 202611:11
–kitploit
kittysploit
KittySploit
Open eClass 3.15 - Remote Code Execution (CVE-2024-26503)
26 Oct 202617:17
–kittysploit
nvd
NVD
CVE-2024-26503
14 Mar 202422:15
–nvd
packetstorm
Packet Storm
Open eClass 3.15 Shell Upload
22 Oct 202600:00
–packetstorm
Rows per page
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from kittysploit import *
from lib.protocols.http.http_client import Http_client
from bs4 import BeautifulSoup
import re


class Module(Scanner, Http_client):

    __info__ = {
        "name": "Open eClass RCE (CVE-2024-26503) Detection",
        "description": (
            "Detects GUnet Open eClass 3.15 instances potentially vulnerable to "
            "CVE-2024-26503 (unrestricted badge icon upload leading to RCE)."
        ),
        "author": ["KittySploit Team"],
        "severity": "critical",
        "cve": "CVE-2024-26503",
        "references": [
            "https://nvd.nist.gov/vuln/detail/CVE-2024-26503",
            "https://www.less-secure.com/2024/03/open-eclass-cve-2024-26503-unrestricted.html",
            "https://github.com/RoboGR00t/Exploit-CVE-2024-26503",
        ],
        "modules": [
            "exploits/http/openeclass_rce_cve_2024_26503",
        ],
        "tags": ["web", "scanner", "openeclass", "rce", "cve-2024-26503"],
        "agent": {
            "risk": "active",
            "effects": ["network_probe"],
            "expected_requests": 2,
            "reversible": True,
            "approval_required": False,
            "produces": ["tech_hints", "risk_signals", "endpoints"],
            "cost": 1.0,
            "noise": 0.5,
            "value": 1.0,
            "requires": {
                "min_endpoints": 0,
                "min_params": 0,
                "tech_hints_any": [],
                "tech_hints_all": [],
                "specializations_any": [],
                "risk_signals_any": [],
                "auth_session": False,
                "capabilities_any": [],
                "capabilities_all": [],
                "confidence_min": {},
                "confidence_min_any": {},
                "endpoint_pattern_any": [],
                "param_any": [],
                "api_surface_ready": False,
            },
            "chain": {
                "produces_capabilities": [{"capability": "rce", "from_detail": ""}],
                "consumes_capabilities": [],
                "option_bindings": {},
                "suggested_followups": [],
            },
        },
    }

    def _version_tuple(self, version: str) -> tuple:
        out = []
        for token in str(version).split("."):
            digits = "".join(ch for ch in token if ch.isdigit())
            out.append(int(digits) if digits else 0)
        while len(out) < 3:
            out.append(0)
        return tuple(out[:3])

    def _is_vulnerable_version(self, version: str) -> bool:
        major, minor, _patch = self._version_tuple(version)
        return major == 3 and minor == 15

    def _extract_version(self, content: str) -> str | None:
        version_match = re.search(r"Open\s+eClass\s+([\d\.]+)", content, re.IGNORECASE)
        if version_match:
            return version_match.group(1)

        soup = BeautifulSoup(content, "html.parser")
        generator = soup.find("meta", {"name": "generator"})
        if generator and "openeclass" in generator.get("content", "").lower():
            gen_match = re.search(r"([\d\.]+)", generator.get("content", ""))
            if gen_match:
                return gen_match.group(1)
        return None

    def run(self):
        try:
            response = self.http_request(method="GET", path="/")
            if not response or response.status_code != 200:
                return False

            content = response.text or ""
            lowered = content.lower()
            if "openeclass" not in lowered and "open eclass" not in lowered:
                return False

            version = self._extract_version(content)
            if version:
                print_info(f"Open eClass version {version} detected")
                if self._is_vulnerable_version(version):
                    self.set_info(
                        severity="critical",
                        cve="CVE-2024-26503",
                        reason=(
                            f"Open eClass {version} matches the affected 3.15 line "
                            "(CVE-2024-26503 unrestricted certbadge upload)."
                        ),
                    )
                    return True
                print_status(f"Open eClass {version} is outside the known CVE-2024-26503 range")
                return False

            self.set_info(
                severity="medium",
                cve="CVE-2024-26503",
                reason=(
                    "Open eClass detected but version unknown; CVE-2024-26503 affects "
                    "3.15 — verify before exploitation."
                ),
            )
            return False

        except Exception as e:
            print_error(f"Scanner failed: {e}")
            return False

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

26 Oct 2026 17:17Current
5.9Medium risk
Vulners AI Score5.9
CVSS 3.19.1
EPSS0.02961
SSVC
6