目录
JumpServer简介
原理
环境搭建
漏洞复现
修复
前端时间做项目的时候遇到这个漏洞,现复现一下。
JumpServer简介
Jumpserver是全球首款完全开源的堡垒机,它主要用于对运维人员的操作行为进行管控、审计,并有效管理服务器、网络设备等资产。
原理
这个漏洞原理是用户点击忘记密码时系统会生成一个随机字符串作为Token并发送到用户邮箱,但是由于某个安全问题导致这个Token可以被推算出来。这个安全问题时由于一个第三方库导致的,这个第三方库是django-simple-captcha库。这个库是Django生态张常用的验证码生成库。当你使用django-simple-captcha后你的Token将会泄露给用户。
首先在使用dojango-simple-captcha是,开发者需要在验证码的Django表单添加一个CaptchaField字段,在渲染表单的时候,在字段内部会生成随机的验证字符串和答案。然后验证字符串和答案会依照一种算法生成一个唯一的hashkey,然后这个hash将会返回给用户,用户可以通过这个hashkey和captcha_iamge视图(指的是在Web开发中用于生成和显示验证码图片的视图)生成验证码图片。django-simple-captcha提供了captcha_image视图,这个captcha_image视图只接受用户的hashkey参数。这个作用就是通过hashkey查找到数据库中对应的验证码。如果验证码存在则将key传给random.seed函数,然后就调用几次伪随机数相关函数,用于给验证码生成图片。但是使用random.seed(key)的目的是将后续操作的随机因素固定,保证key相同的情况下生成验证码图片完全相同。但是应为hashkey是用户已知的值,所以用户可以用户预测后续生成的伪随机数。这里可以预测伪随机数生成的结果不仅仅是django-simple-captcha后续生成的验证码,也包括jumpserver中其他使用了伪随机数的场景。
然后jumpserver内部使用伪随机数来生成找回密码的Token。
这里在python的官网中声明了不要以安全为目的使用random模块,并且在提供了secrets模块作为替代选项,但是在jumpserver依然使用random模块来生成Token。
环境搭建
在vulhub中有打包好的docker环境直接拉取即可
环境搭建好后页面如下
第一次登陆需要修改密码
漏洞复现
1、登陆
2、忘记密码,进入如下页面
3、点击验证图片进入图片链接
连接中有一串hash值,记录该值:0ff16a1909624642055e332de9cd2ab2e309c48e
4、返回修改密码界面,正确提交
5、进入邮箱验证界面,记录下url中的token的值:GEUuxyhzfIUGZ5NTrswMeyCwvBhYeFKiWiFp
6、执行脚本
获取验证码
7、将验证码填入页面,注意刚刚用的是那个token就用那个页面,绕过邮箱验证
7、修改密码
8、测试
登陆成功
复现成功
修复
将函数中的random模块换成secrets