Làm cách nào để giải mã mật khẩu Jenkins từ thông tin đăng nhập?


37

Tôi đã tiếp quản dự án nơi có rất nhiều thông tin đăng nhập của Jenkins có mật khẩu hoặc chuỗi mật khẩu mà tôi cần biết để tiến hành với dự án, thật không may là những tài liệu này không được ghi lại ở bất cứ đâu.

Tôi đã kiểm tra credentials.xmltệp nơi các thông tin đăng nhập này được lưu trữ, nhưng chúng không ở dạng văn bản đơn giản, ví dụ:

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

Lưu ý: Tôi đã thay đổi nó một chút vì lý do riêng tư.

Làm thế nào tôi có thể giải mã mật khẩu ban đầu của nó dựa trên chuỗi ở trên?


Tôi gặp lỗi với câu trả lời được đề xuất: println (hudson.util.Secret.decrypt ("{{xxx / wwww + yyyy / zzzz =}}")) Biểu tượng + đang phá vỡ tập lệnh. Bất cứ đề nghị nào?
Jay Bau

@JayBau Hãy thử với dấu ngoặc đơn : "{...}", xóa thêm một lần.
kenorb

Câu trả lời:


46

May mắn thay, có một hudson.util.Secret.decrypt()chức năng có thể được sử dụng cho việc này, vì vậy:

  1. Trong Jenkins, đi đến: /scripttrang.
  2. Chạy lệnh sau:

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

    hoặc là:

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

    {XXX=}mật khẩu được mã hóa của bạn ở đâu Điều này sẽ in mật khẩu đơn giản.

    Để làm ngược lại, chạy:

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

Nguồn: ý chính tạituxfight3r/jenkins-decrypt.groovy .


Ngoài ra kiểm tra các kịch bản sau đây: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Để biết thêm chi tiết, hãy kiểm tra: Lưu trữ thông tin xác thực trong Jenkins .


7

Đây là một đoạn ngắn bạn chỉ có thể chạy từ bảng điều khiển kịch bản jenkins, để chuyển tất cả thông tin đăng nhập của bạn sang văn bản thuần túy.

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

Một phiên bản phức tạp hơn liệt kê các nhà cung cấp chứng chỉ phi hệ thống:

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

Làm thế nào để sửa đổi điều này để có được thông tin đăng nhập từ tất cả các tên miền, từ tất cả các thư mục?
jmary

@jmary Tôi đã thêm một ví dụ khác
Magnus

Cảm ơn rất nhiều :-)
jmary

1

Đối với bản ghi, Đoạn mã sau được dán vào bảng điều khiển cũng thực hiện công việc:

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))
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.