Informations de base sur Jenkins
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
AccĂšs
Nom dâutilisateur + mot de passe
La façon la plus courante de se connecter Ă Jenkins est avec un nom dâutilisateur et un mot de passe.
Cookie
Si un cookie autorisĂ© est volĂ©, il peut ĂȘtre utilisĂ© pour accĂ©der Ă la session de lâutilisateur. Le cookie sâappelle gĂ©nĂ©ralement JSESSIONID.*. (Un utilisateur peut terminer toutes ses sessions, mais il devra dâabord dĂ©couvrir quâun cookie a Ă©tĂ© volĂ©).
SSO/Plugins
Jenkins peut ĂȘtre configurĂ© via des plugins pour ĂȘtre accessible via un SSO tiers.
Tokens
Les utilisateurs peuvent générer des tokens pour donner accÚs à des applications afin de les impersonner via le CLI ou le REST API.
Clés SSH
Ce composant fournit un serveur SSH intĂ©grĂ© pour Jenkins. Câest une interface alternative pour le Jenkins CLI, et des commandes peuvent ĂȘtre invoquĂ©es de cette façon avec nâimporte quel client SSH. (Extrait des docs)
Autorisation
Dans /configureSecurity il est possible de configurer la mĂ©thode dâautorisation de Jenkins. Il existe plusieurs options :
- Anyone can do anything : MĂȘme lâaccĂšs anonyme peut administrer le serveur.
- Legacy mode : Identique Ă Jenkins <1.164. Si vous avez le rĂŽle âadminâ, vous obtiendrez le contrĂŽle total du systĂšme, et sinon (y compris les utilisateurs anonymous) vous aurez un accĂšs en lecture.
- Logged-in users can do anything : Dans ce mode, chaque utilisateur connectĂ© obtient le contrĂŽle total de Jenkins. Le seul utilisateur qui nâaura pas le contrĂŽle total est lâutilisateur anonymous, qui nâobtient que lâaccĂšs en lecture.
- Matrix-based security : Vous pouvez configurer qui peut faire quoi dans un tableau. Chaque colonne reprĂ©sente une permission. Chaque ligne reprĂ©sente un utilisateur ou un groupe/role. Cela inclut un utilisateur spĂ©cial âanonymousâ, qui reprĂ©sente les utilisateurs non authentifiĂ©s, ainsi que âauthenticatedâ, qui reprĂ©sente tous les utilisateurs authentifiĂ©s.
.png)
- Project-based Matrix Authorization Strategy: Ce mode est une extension de la âMatrix-based securityâ qui permet de dĂ©finir une matrice ACL supplĂ©mentaire pour chaque projet sĂ©parĂ©ment.
- Role-Based Strategy: Permet de définir les autorisations via une stratégie basée sur les rÎles. Gérez les rÎles dans
/role-strategy.
Security Realm
Dans /configureSecurity il est possible de configurer le security realm. Par défaut, Jenkins inclut la prise en charge de quelques Security Realms différents :
- Delegate to servlet container : Pour dĂ©lĂ©guer lâauthentification Ă un servlet container exĂ©cutant le controller Jenkins, comme Jetty.
- Jenkinsâ own user database: Utiliser le magasin dâutilisateurs intĂ©grĂ© de Jenkins pour lâauthentification au lieu de dĂ©lĂ©guer Ă un systĂšme externe. Ceci est activĂ© par dĂ©faut.
- LDAP : DĂ©lĂ©guer toute lâauthentification Ă un serveur LDAP configurĂ©, incluant Ă la fois les utilisateurs et les groupes.
- Unix user/group database : DĂ©lĂšgue lâauthentification Ă la base dâutilisateurs du systĂšme Unix sous-jacent sur le controller Jenkins. Ce mode permettra Ă©galement la rĂ©utilisation des groupes Unix pour lâautorisation.
Les plugins peuvent fournir des security realms additionnels qui peuvent ĂȘtre utiles pour intĂ©grer Jenkins dans des systĂšmes dâidentitĂ© existants, tels que :
Jenkins Nodes, Agents & Executors
DĂ©finitions dâaprĂšs les docs :
Nodes sont les machines sur lesquelles tournent les agents de build. Jenkins surveille chaque node attachĂ© pour lâespace disque, lâespace temporaire libre, le swap libre, la synchronisation/heure de lâhorloge et le temps de rĂ©ponse. Un node est mis hors ligne si lâune de ces valeurs dĂ©passe le seuil configurĂ©.
Agents gĂšrent lâexĂ©cution des tĂąches au nom du controller Jenkins en utilisant des executors. Un agent peut utiliser nâimporte quel systĂšme dâexploitation qui supporte Java. Les outils requis pour les builds et les tests sont installĂ©s sur le node oĂč lâagent tourne ; ils peuvent ĂȘtre installĂ©s directement ou dans un conteneur (Docker ou Kubernetes). Chaque agent est en pratique un processus avec son propre PID sur la machine hĂŽte.
Un executor est un slot dâexĂ©cution de tĂąches ; en pratique, câest un thread dans lâagent. Le nombre dâexecutors sur un node dĂ©finit le nombre de tĂąches concurrentes qui peuvent ĂȘtre exĂ©cutĂ©es sur ce node en mĂȘme temps. En dâautres termes, cela dĂ©termine le nombre de stages Pipeline concurrents qui peuvent sâexĂ©cuter sur ce node en mĂȘme temps.
Jenkins Secrets
Chiffrement des secrets et des credentials
DĂ©finition dâaprĂšs les docs : Jenkins utilise AES pour chiffrer et protĂ©ger les secrets, les credentials, et leurs clĂ©s de chiffrement respectives. Ces clĂ©s de chiffrement sont stockĂ©es dans $JENKINS_HOME/secrets/ ainsi que la master key utilisĂ©e pour protĂ©ger ces clĂ©s. Ce rĂ©pertoire doit ĂȘtre configurĂ© de sorte que seul lâutilisateur systĂšme sous lequel tourne le controller Jenkins ait les droits de lecture et Ă©criture sur ce rĂ©pertoire (par exemple chmod 0700 ou en utilisant des attributs de fichier appropriĂ©s). La master key (parfois appelĂ©e âkey encryption keyâ en jargon crypto) est stockĂ©e unencrypted sur le systĂšme de fichiers du controller Jenkins dans $JENKINS_HOME/secrets/master.key, ce qui ne protĂšge pas contre des attaquants ayant un accĂšs direct Ă ce fichier. La plupart des utilisateurs et dĂ©veloppeurs utiliseront ces clĂ©s de chiffrement indirectement via soit lâAPI [Secret] pour chiffrer des donnĂ©es secrĂštes gĂ©nĂ©riques, soit via lâAPI des credentials. Pour les cryptocurieux, Jenkins utilise AES en mode cipher block chaining (CBC) avec padding PKCS#5 et IVs alĂ©atoires pour chiffrer des instances de [CryptoConfidentialKey] qui sont stockĂ©es dans $JENKINS_HOME/secrets/ avec un nom de fichier correspondant Ă leur identifiant CryptoConfidentialKey. Les identifiants de clĂ© courants incluent :
hudson.util.Secret: utilisé pour les secrets génériques ;com.cloudbees.plugins.credentials.SecretBytes.KEY: utilisé pour certains types de credentials ;jenkins.model.Jenkins.crumbSalt: utilisé par le CSRF protection mechanism ; et
AccĂšs aux credentials
Les credentials peuvent ĂȘtre scopĂ©s Ă des providers globaux (/credentials/) qui peuvent ĂȘtre accessibles par nâimporte quel projet configurĂ©, ou peuvent ĂȘtre scéés Ă des projets spĂ©cifiques (/job/<project-name>/configure) et donc uniquement accessibles depuis le projet concernĂ©.
Selon les docs : Les credentials qui sont dans le scope sont disponibles pour le pipeline sans limitation. Pour Ă©viter une exposition accidentelle dans le log de build, les credentials sont masquĂ©s dans la sortie normale, donc une invocation de env (Linux) ou set (Windows), ou des programmes affichant leur environnement ou paramĂštres ne les rĂ©vĂ©leront pas dans le log de build Ă des utilisateurs qui nâauraient pas autrement accĂšs aux credentials.
Câest pourquoi, pour exfiltrer les credentials, un attaquant doit par exemple les encoder en base64.
Secrets dans les configs de plugin/job sur le disque
Ne supposez pas que les secrets se trouvent uniquement dans credentials.xml. De nombreux plugins conservent des secrets dans leur propre XML global sous $JENKINS_HOME/*.xml ou dans le $JENKINS_HOME/jobs/<JOB>/config.xml par job, parfois mĂȘme en clair (le masquage UI ne garantit pas un stockage chiffrĂ©). Si vous obtenez un accĂšs en lecture au systĂšme de fichiers, Ă©numĂ©rez ces XML et recherchez des balises Ă©videntes contenant des secrets.
# Global plugin configs
ls -l /var/lib/jenkins/*.xml
grep -R "password\\|token\\|SecretKey\\|credentialId" /var/lib/jenkins/*.xml
# Per-job configs
find /var/lib/jenkins/jobs -maxdepth 2 -name config.xml -print -exec grep -H "password\\|token\\|SecretKey" {} \\;
Références
- https://www.jenkins.io/doc/book/security/managing-security/
- https://www.jenkins.io/doc/book/managing/nodes/
- https://www.jenkins.io/doc/developer/security/secrets/
- https://www.jenkins.io/blog/2019/02/21/credentials-masking/
- https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery
- https://www.jenkins.io/doc/developer/security/secrets/#encryption-of-secrets-and-credentials
- https://www.jenkins.io/doc/book/managing/nodes/
- https://www.nccgroup.com/research-blog/story-of-a-hundred-vulnerable-jenkins-plugins/
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

