¿Cómo descifrar las contraseñas de Jenkins de credentials.xml?


37

Me hice cargo del proyecto donde muchas credenciales de Jenkins tienen contraseñas o cadenas de frase de contraseña que necesito saber para avanzar con el proyecto, desafortunadamente no se documentaron en ninguna parte.

He comprobado el credentials.xmlarchivo donde se almacenan estas credenciales, pero no están en texto plano, por ejemplo:

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

Nota: lo he cambiado ligeramente por razones de privacidad.

¿Cómo puedo descifrar su contraseña original basada en la cadena anterior?


Recibo un error con la respuesta propuesta: println (hudson.util.Secret.decrypt ("{{xxx / wwww + aaaa / zzzz =}}")) El símbolo + está rompiendo el script. ¿Cualquier sugerencia?
Jay Bau

@JayBau Pruebe con corchetes individuales: "{...}"elimine el extra una vez.
kenorb

Respuestas:


46

Afortunadamente, hay una hudson.util.Secret.decrypt()función que se puede usar para esto, así que:

  1. En Jenkins, vaya a: /scriptpágina.
  2. Ejecute el siguiente comando:

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

    o:

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

    ¿Dónde {XXX=}está tu contraseña cifrada? Esto imprimirá la contraseña simple.

    Para hacer lo contrario, ejecute:

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

Fuente: gist attuxfight3r/jenkins-decrypt.groovy .


Alternativamente, verifique los siguientes scripts: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Para obtener más detalles, consulte: Almacenamiento de credenciales en Jenkins .


7

Aquí hay un breve fragmento que puede ejecutar desde la consola de script jenkins para volcar todas sus credenciales en texto sin formato.

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

Una versión más complicada que enumera los proveedores de credenciales que no son del sistema:

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)
    }
  }
}

¿Cómo modificar esto para obtener credenciales de todos los dominios, de todas las carpetas?
jmary

@jmary He agregado otro ejemplo
Magnus


1

Para el registro, el siguiente fragmento que se pegará en la consola también hace el trabajo:

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))
  }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.