<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.jordan-lenuff.com/index.php?action=history&amp;feed=atom&amp;title=Outillage%2FJenkins%2FR%C3%A9cup%C3%A9rer_les_mots_de_passe</id>
	<title>Outillage/Jenkins/Récupérer les mots de passe - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.jordan-lenuff.com/index.php?action=history&amp;feed=atom&amp;title=Outillage%2FJenkins%2FR%C3%A9cup%C3%A9rer_les_mots_de_passe"/>
	<link rel="alternate" type="text/html" href="https://wiki.jordan-lenuff.com/index.php?title=Outillage/Jenkins/R%C3%A9cup%C3%A9rer_les_mots_de_passe&amp;action=history"/>
	<updated>2026-04-23T17:33:38Z</updated>
	<subtitle>Historique des révisions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>https://wiki.jordan-lenuff.com/index.php?title=Outillage/Jenkins/R%C3%A9cup%C3%A9rer_les_mots_de_passe&amp;diff=636&amp;oldid=prev</id>
		<title>Jordan : Page créée avec « == Présentation == Cette page a pour objet de décrire comment récupérer un mot de passe stockés dans Jenkins.  == Mise en œuvre == Procédure trouvée sur https://lo… »</title>
		<link rel="alternate" type="text/html" href="https://wiki.jordan-lenuff.com/index.php?title=Outillage/Jenkins/R%C3%A9cup%C3%A9rer_les_mots_de_passe&amp;diff=636&amp;oldid=prev"/>
		<updated>2020-06-02T16:08:45Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « == Présentation == Cette page a pour objet de décrire comment récupérer un mot de passe stockés dans Jenkins.  == Mise en œuvre == Procédure trouvée sur https://lo… »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Présentation ==&lt;br /&gt;
Cette page a pour objet de décrire comment récupérer un mot de passe stockés dans Jenkins.&lt;br /&gt;
&lt;br /&gt;
== Mise en œuvre ==&lt;br /&gt;
Procédure trouvée sur https://looselytyped.com/blog/2017/10/25/uncovering-passwords-in-jenkins/.&lt;br /&gt;
===Point de départ===&lt;br /&gt;
La première chose qui est nécessaire est d'avoir accès au serveur Jenkins lui-même.&lt;br /&gt;
&lt;br /&gt;
Commencer par se connecter en SSH sur le serveur Jenkins et localiser le home directory (&amp;lt;code&amp;gt;$JENKINS_HOME&amp;lt;/code&amp;gt;) de Jenkins avec la commande suivante :&lt;br /&gt;
 grep jenkins /etc/passwd|awk -F: '{print $6}'&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut déterminer où est stocké le mot de passe dans Jenkins. Jenkins utilise plusieurs emplacements différents pour stocker les informations d'identification, selon qu'elles sont au niveau du système ou spécifiques à un job. Quelques fichiers et répertoires qui stockent les informations d’identification sont :&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;$JENKINS_HOME/credentials.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
**Ce fichier est utilisé par le plugin [https://wiki.jenkins.io/display/JENKINS/Credentials+Plugin Credentials] utilise pour stocker les informations d'identification.&lt;br /&gt;
*&amp;lt;code&amp;gt;$JENKINS_HOME/jobs/&amp;lt;/code&amp;gt;&lt;br /&gt;
**C'est le répertoire dans lequel Jenkins stocke tous les jobs qui ont été configurés, ainsi que leurs fichiers ''config.xml'' respectifs. Dans ces fichiers se trouveront toutes les informations d'identification qui ont été fournies dans le cadre de la configuration du job.&lt;br /&gt;
**Par exemple, le plug-in [https://wiki.jenkins.io/display/JENKINS/Artifactory+Plugin Artifactory] permet de remplacer les informations d'identification par défaut pour chaque job. De tels remplacements sont stockés dans la configuration des jobs et ils sont localisés (chiffrés bien entendu) ici.&lt;br /&gt;
&lt;br /&gt;
Généralement, un grep dans &amp;lt;code&amp;gt;$JENKINS_HOME&amp;lt;/code&amp;gt; avec le nom d'utilisateur dont on souhaite découvrir les informations d'identification est le moyen le plus rapide de déterminer où chercher.&lt;br /&gt;
&lt;br /&gt;
===Détermination de la classe utilisée pour le cryptage / décryptage===&lt;br /&gt;
Une fois le fichier dans lequel rechercher à été trouvé, l'étape suivante consiste à déterminer comment déchiffrer le mot de passe. Heureusement, Jenkins stocke la quasi-totalité de sa configuration dans des fichiers XML. La visualisation du fichier peut donc se faire via un &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ou un &amp;lt;code&amp;gt;less&amp;lt;/code&amp;gt;, ou simplement via un &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt; du fichier sur la machine locale et le lire avec un éditeur de texte.&lt;br /&gt;
&lt;br /&gt;
Par exemple, si le nom d'utilisateur est jenkins-user@mycompany.com et que les informations d'identification recherchées sont effectivement stockées dans &amp;lt;code&amp;gt;credentials.xml&amp;lt;/code&amp;gt;, le fichier peut contenir un extrait comme celui-ci :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;username&amp;gt;jenkins-user@mycompany.com&amp;lt;/username&amp;gt;&lt;br /&gt;
&amp;lt;password&amp;gt;{AQAAABAAAAAgyqp9mI73xTYaYkaMRNolxwxR+X0qev7q6Hb3KcchbM9VA5ERj0RG1Nrl/aFw7haU}&amp;lt;/password&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*L'extrait de code peut être différent de celui de l'exemple, mais tant que le nom d'utilisateur correspond, cela signifie qu'on est au bon endroit.&lt;br /&gt;
&lt;br /&gt;
La balise &amp;lt;code&amp;gt;&amp;lt;password/&amp;gt;&amp;lt;/code&amp;gt; apparaît. Il reste donc à décrypter son contenu.&lt;br /&gt;
&lt;br /&gt;
Remonter ensuite dans la hiérarchie des balises jusqu'à la rencontre d'une balise ressemblant à un nom de classe Java pleinement qualifié. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl&amp;gt;&lt;br /&gt;
  &amp;lt;scope&amp;gt;SYSTEM&amp;lt;/scope&amp;gt;&lt;br /&gt;
  &amp;lt;id&amp;gt;5dc3bbe5-e5a6-496e-a616-199a207d8122&amp;lt;/id&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;This is a user&amp;lt;/description&amp;gt;&lt;br /&gt;
  &amp;lt;username&amp;gt;jenkins-user@mycompany.com&amp;lt;/username&amp;gt;&lt;br /&gt;
  &amp;lt;password&amp;gt;{AQAAABAAAAAQ5Qp/KX1Ibliy/23sM6e3Lepwa/OObLtGHC5svihnTr4=}&amp;lt;/password&amp;gt;&lt;br /&gt;
&amp;lt;/com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cela permet de connaître la classe que Jenkins instancie pour prendre en charge cette propriété.&lt;br /&gt;
&lt;br /&gt;
Il faut donc maintenant trouver le code source et déterminer le mécanisme utilisé par cette classe pour chiffrer / déchiffrer le mot de passe. Utiliser un [https://www.google.com/search?hl=en&amp;amp;q=com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl&amp;amp;aq=f&amp;amp;oq= moteur de recherche] pour trouver le code source. Dans ce cas précis, il suffit de chercher &amp;lt;code&amp;gt;com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Un rapide examen du code source fait ressortir ce [https://github.com/jenkinsci/credentials-plugin/blob/3b9555eca6cfa02fca8e5163235f5abbe057865f/src/main/java/com/cloudbees/plugins/credentials/impl/UsernamePasswordCredentialsImpl.java#L65-L73 constructeur] :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@DataBoundConstructor&lt;br /&gt;
@SuppressWarnings(&amp;quot;unused&amp;quot;) // by stapler&lt;br /&gt;
public UsernamePasswordCredentialsImpl(@CheckForNull CredentialsScope scope,&lt;br /&gt;
                                       @CheckForNull String id, @CheckForNull String description,&lt;br /&gt;
                                       @CheckForNull String username, @CheckForNull String password) {&lt;br /&gt;
    super(scope, id, description);&lt;br /&gt;
    this.username = Util.fixNull(username);&lt;br /&gt;
    this.password = Secret.fromString(password);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ainsi, &amp;lt;code&amp;gt;com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl&amp;lt;/code&amp;gt; utilise &amp;lt;code&amp;gt;hudson.util.Secret&amp;lt;/code&amp;gt; pour chiffrer le mot de passe. Lors de la recherche suivante, le code source &amp;lt;code&amp;gt;hudson.util.Secrets&amp;lt;/code&amp;gt; indique à son tour une méthode de déchiffrement :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@CheckForNull&lt;br /&gt;
public static Secret decrypt(@CheckForNull String data) {&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La classe est utilisée pour chiffrer / déchiffrer le mot de passe est donc &amp;lt;code&amp;gt;Secret&amp;lt;/code&amp;gt;. Il faut ensuite découvrir comment l'utiliser. Il pourrait être possible d'essayer de simplifier l’implémentation et d’arriver en quelque sorte à l’exécuter de façon isolée, peut-être dans une classe de test avec une méthode principale, mais cela serait compliqué, surtout si cette classe a des dépendances sur d’autres classes.&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'avoir un environnement d'exécution où il sera possible charger cette classe, ainsi que toutes ses dépendances, et de simplement appeler &amp;lt;code&amp;gt;hudson.util.Secret#déchiffrer&amp;lt;/code&amp;gt; en passant le mot de passe trouvé dans &amp;lt;code&amp;gt;credentials.xml&amp;lt;/code&amp;gt;. Jenkins fourni cet environnement d'exécution.&lt;br /&gt;
&lt;br /&gt;
===Utiliser la console de script pour découvrir le mot de passe===&lt;br /&gt;
Jenkins est livré avec une [http://myjenkinsserver:8080/script console de script] qu'il est possible utiliser pour exécuter arbitrairement des scripts Groovy. Dans cette console, exécuter le code suivant permettra de révéler un mot de passe :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
import hudson.util.Secret;&lt;br /&gt;
&lt;br /&gt;
println Secret.decrypt(&amp;quot;{AQAAABAAAAAQ5Qp/KX1Ibliy/23sM6e3Lepwa/OObLtGHC5svihnTr4=}&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Résultat : jenkins&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mot de passe est ainsi retrouvé.&lt;/div&gt;</summary>
		<author><name>Jordan</name></author>
		
	</entry>
</feed>