Comment décrypter les mots de passe Jenkins depuis credentials.xml?

37

J'ai repris le projet dans lequel de nombreuses informations d'identification Jenkins contiennent des mots de passe ou des chaînes de mots de passe que je dois connaître pour progresser dans le projet. Malheureusement, ils n'ont été documentés nulle part.

J'ai vérifié le credentials.xmlfichier dans lequel ces informations d'identification sont stockées, mais elles ne sont pas en texte brut, par exemple:

<passphrase>{AAAAAAAAAAAANzxft/rDzyt8mhxpn3O72dxvVqZksL5vBJ4jNKvAjAA=}</passphrase>

Remarque: je l'ai légèrement modifié pour des raisons de confidentialité.

Comment puis-je déchiffrer son mot de passe d'origine en fonction de la chaîne ci-dessus?

Kenorb
la source
Je reçois une erreur avec la réponse proposée: println (hudson.util.Secret.decrypt ("{{xxx / wwww + yyyy / zzzz =}}")) Le symbole + est en train de rompre le script. Toute suggestion?
Jay Bau
@JayBau Essayez avec des supports simples:, "{...}"supprimez extra une fois.
Kenorb

Réponses:

46

Heureusement, il existe une hudson.util.Secret.decrypt()fonction qui peut être utilisée pour cela, alors:

  1. Dans Jenkins, allez à: /scriptpage.
  2. Exécutez la commande suivante:

    println(hudson.util.Secret.decrypt("{XXX=}"))
    

    ou:

    println(hudson.util.Secret.fromString("{XXX=}").getPlainText())
    

    {XXX=}est votre mot de passe crypté. Cela imprimera le mot de passe en clair.

    Pour faire le contraire, lancez:

    println(hudson.util.Secret.fromString("some_text").getEncryptedValue())
    

Source: Gist attuxfight3r/jenkins-decrypt.groovy .


Vous pouvez également vérifier les scripts suivants: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Pour plus de détails, consultez: Stockage des identifiants dans Jenkins .

Kenorb
la source
7

Voici un court extrait que vous pouvez simplement exécuter à partir de la console de script jenkins, pour vider toutes vos informations d’identité en texte brut.

com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance().getCredentials().forEach{
  it.properties.each { prop, val ->
    println(prop + ' = "' + val + '"')
  }
  println("-----------------------")
}

Une version plus compliquée répertoriant les fournisseurs d'informations d'identification non-système:

import com.cloudbees.plugins.credentials.CredentialsProvider
import com.cloudbees.plugins.credentials.Credentials
import com.cloudbees.plugins.credentials.domains.Domain
import jenkins.model.Jenkins
def indent = { String text, int indentationCount ->
  def replacement = "\t" * indentationCount
  text.replaceAll("(?m)^", replacement)
}

Jenkins.get().allItems().collectMany{ CredentialsProvider.lookupStores(it).toList()}.unique().forEach { store ->
  Map<Domain, List<Credentials>> domainCreds = [:]
  store.domains.each { domainCreds.put(it, store.getCredentials(it))}
  if (domainCreds.collectMany{ it.value}.empty) {
    return
  }
  def shortenedClassName = store.getClass().name.substring(store.getClass().name.lastIndexOf(".") + 1)
  println "Credentials for store context: ${store.contextDisplayName}, of type $shortenedClassName"
  domainCreds.forEach { domain , creds ->
    println indent("Domain: ${domain.name}", 1)
    creds.each { cred ->
      cred.properties.each { prop, val ->
        println indent("$prop = \"$val\"", 2)
      }
      println indent("-----------------------", 2)
    }
  }
}
Magnus
la source
Comment modifier cela pour obtenir les informations d'identification de tous les domaines, de tous les dossiers?
Jmary
@jmary J'ai ajouté un autre exemple
Magnus
Merci
beaucoup
1

Pour mémoire, le fragment de code suivant à coller dans la console fait également le travail:

def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
    com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
    Jenkins.instance,
    null,
    null
)

for(c in creds) {
  if(c instanceof com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey){
    println(String.format("id=%s  desc=%s key=%s\n", c.id, c.description, c.privateKeySource.getPrivateKeys()))
  }
  if (c instanceof com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl){
    println(String.format("id=%s  desc=%s user=%s pass=%s\n", c.id, c.description, c.username, c.password))
  }
}
Jmary
la source