目的
- 研究如何发现的这个漏洞
- 自己研究出来payload
- 思考问题的本质是什么
- 举一反三,是否有其他的组件同样存在相关的漏洞
CVE-2023-42820 简介:在jumpserver使用的 django-simple-captcha 模块作为验证码的校验模块,其在重置密码的环节当中,会存在一个问题:重置密码的code是来源于随机数的生成,然而随机数的种子我们能够进行查看。并且能够进行模拟该种子进行预测最后的随机数。
redis 连接不上
可以学习下 如何配置的 docker环境,我当初在这里一直没有完成 redis环境的配置
漏洞简述 : 分为几个阶段
- 随机数种子seed 曝光,生成图片 1
- 刷新使用验证码图片2
- 反复请求图片 1的地址
- 预测出 code
captcha的过程
- aptchaField内部会生成随机的验证字符串(challenge)和答案(response)
- challenge可以是传统的4个字符的文本,也可以是我博客或Jumpserver中使用的四则运算,这个通过配置来定义。
- hashkey = func(challenge,response),hashkey和验证码是对应存在的
- 开发者使用 hashkey + captcha_image 视图 --》 加入 url routers当中 == 最后生成的图片
- 用户看到图片之后,random.seed(key),key 为 hashkey
验证码的逻辑
- 用户进入页面之后,后台生成 challenge【计算的方式,可能是】和 response【直接就是答案】,根据这两个数又生成 hashkey,返回hashkey
- 用户传输hashkey到后台,后台通过hashkey 得到相关的 challenge和response,并且通过hashkey作为种子,再进行随机生成图片的噪点,最终返回一张图片。【但是实际上都是伪随机的】
- 用户得到一张图片之后,输入 answer 并和 hashkey一起进行提交,服务端拿到answer和challenge进行计算,最终进行比对。
在哪里进行创建并返回相关的 hashkey?
generate_key
fetch_captcha_store
CaptchaTextInput#render
#generator=None Class CaptchaTextInput
#self.generator = generator
Class CaptchaField
如何进行搭建docker docker-compose 和 env 的属性应当如何进行书写 我之前所进行纠结的 redis是什么问题
引申
- JumpServer 重置密码验证码可被计算推演的漏洞,CVE编号为CVE-2023-42820
- JumpServer 重置密码验证码可被暴力破解的漏洞,CVE编号为CVE-2023-43650
- JumpServer 认证用户跨目录任意文件读取漏洞,CVE编号为CVE-2023-42819
- JumpServer 全局开启公钥认证后,用户可以使用公钥创建访问Token的漏洞,CVE编号为CVE-2023-43652
- JumpServer 认证用户开启MFA后,可以使用SSH公钥认证的逻辑缺陷漏洞,CVE编号为CVE-2023-42818
- JumpServer 认证用户连接MongoDB数据库,可执行任意系统命令的远程执行漏洞,CVE编号为CVE-2023-43651
- Jumpserver Session录像任意下载漏洞,CVE编号为CVE-2023-42442
提问
这个漏洞是如何被发现的? 其漏洞引用的是第三方的 组件的漏洞,应当发现大家都使用到的第三方组件
其深层次的能力: 需要对 python 的django的项目的随机数的原理了解,或者在不了解的情况下,能够进行探索其中的伪随机漏洞
CVE-2023-42819 读取文件或者上传文件
python 任意文件读取的技巧
在Django等使用python语言进行开发的web平台上,如果使用 os.path.join 来连接目录和文件 例如
os.path.join(BASE_DIR, 'static', 'app.js')
当我们能够进行控制'app.js'这个位置的时候,即使前面对参数有判断其中是否存在 ./ .. 等符号,进行了限制。我们依旧可以使用 绝对路径进行覆盖,并且使用绝对路径的情况下,会忽略这个路径之前已经Join的所有内容。
举例
BASE_DIR="/ss/ss"
path="/etc/passwd"
if path.find('./') >= 0 or path.find('..') >= 0:
raise ValidationError('...')
path = os.path.join(BASE_DIR, 'static', path)
print(path)
CVE-2023-42442 目录权限被绕过导致的录像文件被下载
JumpServer的Core模块基于Django进行开发,包含两种类型的后端视图
- 基于原生Django与模板渲染的视图
- 基于Django Rest Framework DRF的API视图
DRF的Permission的基础权限类存在两个接口
- has_permission 判断列表相关方法的权限
- has_object_permission 判断数据库对象相关方法的权限
发现 展示 session列表的 接口,其可以获取所有的详情信息 但是只是做了 has_object_permission判断
当发现 path 是以 xpack/ 或 setting 开头的时候,直接返回True
所以payload 为此直接绕过权限校验 xpack/../
https://www.leavesongs.com/PENETRATION/jumpserver-sep-2023-multiple-vulnerabilities-go-through.html
csrf的防御 https://www.leavesongs.com/PENETRATION/think-about-cookie-form-csrf-protected.html