Jak odszyfrować hasła Jenkins z poświadczeń.xml?


37

Przejąłem projekt, w którym wiele poświadczeń Jenkinsa zawiera hasła lub ciągi hasła, które muszę znać, aby móc kontynuować projekt, niestety nie zostały one nigdzie udokumentowane.

Sprawdziłem credentials.xmlplik, w którym przechowywane są te poświadczenia, ale nie są one zwykłym tekstem, np .:

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

Uwaga: nieznacznie zmieniłem to ze względu na prywatność.

Jak mogę odszyfrować oryginalne hasło na podstawie powyższego ciągu?


Otrzymuję błąd w proponowanej odpowiedzi: println (hudson.util.Secret.decrypt ("{{xxx / wwww + rrrr / zzzz =}}")) Symbol + łamie skrypt. Jakieś sugestie?
Jay Bau

@JayBau Spróbuj z pojedynczymi nawiasami: "{...}"usuń dodatkowy raz.
kenorb

Odpowiedzi:


46

Na szczęście istnieje hudson.util.Secret.decrypt()funkcja, której można użyć do tego celu, więc:

  1. W Jenkins przejdź do: /scriptstrony.
  2. Uruchom następujące polecenie:

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

    lub:

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

    gdzie {XXX=}jest twoje zaszyfrowane hasło. Spowoduje to wydrukowanie zwykłego hasła.

    Aby zrobić odwrotnie, uruchom:

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

Źródło: gist attuxfight3r/jenkins-decrypt.groovy .


Alternatywnie sprawdź następujące skrypty: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Aby uzyskać więcej informacji, sprawdź: Przechowywanie poświadczeń w Jenkins .


7

Oto krótki fragment, który możesz po prostu uruchomić z konsoli skryptów Jenkins, aby zrzucić wszystkie dane uwierzytelniające do zwykłego tekstu.

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

Bardziej skomplikowana wersja z listą dostawców niesystemowych poświadczeń:

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

Jak to zmienić, aby uzyskać poświadczenia ze wszystkich domen, ze wszystkich folderów?
jmary

@jmary Dodałem kolejny przykład
Magnus

Wielkie dzięki :-)
jmary

1

Dla przypomnienia, następujący fragment kodu, który ma zostać wklejony do konsoli, również wykonuje zadanie:

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))
  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.