JenkinsGitclient插件命令执行漏洞(CVE-2019-10392)
0x00 漏洞描述
Jenkins发布了官方安全公告:https://jenkins.io/security/advisory/2019-09-12/,Git客户端插件中的系统命令执行漏洞。
Git客户端插件接受用户指定的值作为调用的参数,git ls-remote以验证指定URL处是否存在Git存储库。
这是以允许具有Job/Configure权限的攻击者在Jenkins主服务器上执行任意系统命令作为Jenkins进程正在运行的OS用户的方式实现命令执行。
0x01 影响组件
Git client Plugin <= 2.8.4
0x02 原因分析
以官方描述https://jenkins.io/security/advisory/2019-09-12/,漏洞存在关键点在于git ls-remote
,参考Git 客户端官方文档,从给的参数中可以注意到--upload-pack=。看起来像是可以执行某些命令,而漏洞作者也是看到了这个参数的形式而采用了这个参数执行。
在远程主机上指定git-upload-pack的完整路径。这允许列出通过SSH访问的存储库中的引用,以及SSH守护程序不使用用户配置的PATH的位置。
以此可见,这个错误stderr: error: unknown switch v
除了打印Git的用法还有一条--upload-pack
可以直接执行命令。
我们可以使用以下Payload来运行命令:
--upload-pack="`id`"
代码:
0x03 环境搭建
漏洞复现版本:Jenkins 2.176.3
拉取docker 镜像
dockerrun -p8080:8080-p50000:50000jenkins/jenkins:lts-alpine
docker拉取镜像完成后打开localhost:8080
, 解锁密码在部署过程中可以看到。
安装推荐插件等待完成初始化配置后,创建一个非管理员用户。
并给予创建job权限。
由于官方已经升级了最高版本,所以需要手动上传插件存在漏洞版本得插件。
git客户端:http://updates.jenkins-ci.org/download/plugins/git-client/2.8.2/git-client.hpi
git插件:http://updates.jenkins-ci.org/download/plugins/git/3.12.0/git.hpi
导入完成后,重启Jenkins服务。
登陆创建的test用户并创建一个新的流水线任务。
0x04 漏洞利用
执行刚才分析得来的os命令。
--upload-pack="`ifconfig`"
反弹shell自然也是不在话下。
0x05 漏洞修复
升级Git client插件至2.8.4以上版本
0x06 其他说明
早在2014年,安识科技团队成员在安全脉搏发布过《知其一不知其二之Jenkins Hacking》https://secpulse.com/archives/2166.html,详细阐述了Jenkins的各种hacking技巧。
随着时间推移Jenkins后续也爆出了反序列化等漏洞,详情参见安全脉搏生态插件社区:https://x.secpulse.com//plugins
在【全局凭据】里面添加新的凭证:
类型选择【Username with password】,填入正确的用户名、密码、ID、和描述信息,ID不填的话会自动生成UUID,这个ID后面在流水线脚本代码里面会用到,尽量写得有意义好辨识:
然后我们再添加一个【SSH Username with private key】类型的凭据,还是拿拉取代码来举例,目前主流的代码托管平台都是支持 HTTPS 或者 SSH 方式访问拉取、提交代码,HTTPS 是使用账号密码的方式,SSH 是采用密钥的方式。所以我们这来添加一个【SSH Username with private key】类型的凭据,需要注意的是【SSH Username with private key】凭据不仅仅是适用于拉取代码,像之前介绍的还可以用于登录远程服务器。
我们这里添加一个【SSH Username with private key】类型的凭据,用于支持 SSH 方式拉取代码:
点击【Add】添加我们之前 maintainer 系统用户的密钥文件内容,也就是/home/maintainer/.ssh/maintainer私钥文件中的内容,然后将
我们在正式开始使用Jenkins之前还要先配置一些凭证,这些凭证的作用主要是用于认证,例如我们要从代码仓库拉取代码,就需要用到代码仓库的账号密码或者密钥;我Jenkins基础篇-凭证配置
运行管道
创建指向 Jenkins 文件的 Jenkins 管道作业类型(示例如下) :
单击 Build 时,您将在控制台日志中看到相应的输出:
结论
用配置作为代码设置Jenkins实例(使用Yaml配置)
本文介绍了如何使用yaml通过ConfigurationasCode插件设置Jenkins实例