漏洞描述

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。