漏洞描述
JumpServer 是全球首款完全开源的堡垒机, 使用GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统。JumpServer 使用Python / Django 进行开发。
2021年1月15日,JumpServer发布更新,修复了一处远程命令执行漏洞。由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求获取到日志文件获取敏感信息,或者执行相关API操作控制其中所有机器,执行任意命令。建议相关用户尽快采取措施阻止漏洞攻击。
影响范围
JumpServer < v2.6.2
JumpServer < v2.5.4
JumpServer < v2.4.5
JumpServer = v1.5.9
漏洞分析
查看漏洞修复的代码更新部分
https://github.com/jumpserver/jumpserver/commit/f04e2fa0905a7cd439d7f6118bc810894eed3f3e
发现是在apps/ops/ws.py文件中加入了一段判断是否已经进行身份认证的代码。
下载源码包,更新的apps/ops/ws.py文件是一个TaskLogWebsocket类,搜索TaskLogWebsocket类的调用。
在apps/ops/urls/ws_urls.py调用了TaskLogWebsocket类,该类中定义了一个/ws/ops/tasks/log/的websocket请求接口,也就是说当发起ws://xxx/ws/ops/tasks/log/这个接口的请求时,都会调用TaskLogWebsocket类。
通过TaskLogWebsocket类中方法的调用关系,可以看出各方法的调用顺序如下。
继续跟进到apps/ops/celery/utils.py和apps/ops/ansible/utils.py中,发现它们都调用了ops.utils的get_task_log_path方法。
继续跟进,在该方法中,task_id参数是可控的,该方法可以读取.log后缀的文件。
从以上调用链中可以发现,在未修复漏洞时,ws://xxx/ws/ops/tasks/log/这个websocket接口是可以未授权访问的,可以读取.log后缀的文件。
漏洞复现
环境搭建
利用安装脚本可以快速进行安装
V2.6.1安装脚本:https://www.o2oxy.cn/wp-content/uploads/2021/01/quick_start.zip(参考https://www.o2oxy.cn/2921.html)
安装完成后启动JumpServer,访问http://192.168.210.37:8080,默认初始账户密码为admin/admin
修改初始密码后重新登录,进入主界面。
未授权文件读取漏洞复现
退出登录,使用chrome websocket插件进行未授权文件读取测试
ws://192.168.210.37:8080/ws/ops/tasks/log/
{"task":"/opt/jumpserver/logs/jumpserver"}
也可以使用poc脚本进行测试
https://github.com/Skactor/jumpserver_rce
远程命令执行漏洞复现
管理员登录,创建一个资产。
配置用户和权限,登录web终端。
读取gunicorn.log文件,获取asset_id、system_user_id、user_id三个参数值,搜索/asset-permissions/user/validate即可。
修改exp脚本中相应的参数,运行
修复建议
安全版本
>= v2.6.2
>= v2.5.4
>= v2.4.5
= v1.5.9 (版本号没变)
< v1.5.3
修复方案
将JumpServer升级至安全版本
临时修复方案
修改 Nginx 配置文件屏蔽漏洞接口
详情见官方主页:
https://github.com/jumpserver/jumpserver
声明:本文来自第59号,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。