飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3768|回复: 2

[漏洞相关] Jumpserver 任意命令执行漏洞分析报告

[复制链接]
  • TA的每日心情
    开心
    2019-3-15 11:00
  • 签到天数: 262 天

    [LV.8]以坛为家I

    发表于 2021-1-20 09:49:03 | 显示全部楼层 |阅读模式
    原文地址:https://cert.360.cn/report/detai ... d07698994f1b7f402ca
    • 报告编号:B6-2021-011803
    • 报告来源:360CERT
    • 报告作者:360CERT
    • 更新日期:2021-01-19

    1.png
    漏洞简述
    2021年01月18日,360CERT监测发现Jumpserver发布了远程命令执行漏洞的风险通告,漏洞等级:高危,漏洞评分:8.5。
    Jumpserver中存在一处受控服务器远程任意命令执行漏洞,该漏洞由多处漏洞导致。
    对此,360CERT建议广大用户好资产自查以及预防工作,以免遭受黑客攻击。
    > 本次漏洞出现的核心问题在于
    1. log文件的默认路径固定,且易知
    2. 存在 log 文件读取漏洞
    3. http GET 请求中存在 敏感参数被记录进 log
    4. websocket通信中无用户权限验证
    影响版本

    -< v2.6.2
    -< v2.5.4
    -< v2.4.5
    -= v1.5.9
    ->= v1.5.3
    漏洞详情
    漏洞原理log读取
    jumpserver中处理websocket的函数read_log_file中无用户权限校验,任意用户均可通过ws调用该功能。
    [AppleScript] 纯文本查看 复制代码
    ws->
    read_log_file
    ->
    wait_util_log_path_exist
    ->
    get_log_path(根据 type 调用设定好的两种函数)
    ->最终均调用
    get_task_log_path
    值得注意的是,read_log_file在处理文件读取是以4096bytes循环读取,直到断开websocket连接或文件读取完成。但每次读取有 0.2s 的间隔
    get_task_log_path中限定能够读取的文件后缀为.log且未对参数进行任何过滤。
    [AppleScript] 纯文本查看 复制代码
    rel_path = os.path.join(*task_id[:level], task_id + '.log')
    因此可以通过目录跳转或绝对路径的方式读取到gunicorn.log(gunicorn是python中实现 WSGI 的框架)
    该文件等于access.log,记录了http请求(请求源IP,时间,请求方式,url,响应码等)
    而由于jumpserver中存在一些特殊的接口,例如
    [AppleScript] 纯文本查看 复制代码
    api/v1/perms/asset-permissions/user/validate
    该系列接口以GET方式处理敏感的信息(用户uuid,资源uuid),导致这些敏感信息被记录在gunicorn.log中。
    token 生成
    jumpserver在处理 token 生成时使用的是
    [AppleScript] 纯文本查看 复制代码
    UserConnectionTokenApi->对应以下路由
    /api/v1/authentication/connection-token/
    /api/v1/users/connection-token/
    该接口使用(用户uuid,资源uuid)进行token的生成,因此通过上述的过程从gunicorn.log中获取到相应的值皆可进行token生成。
    命令执行
    最终因为jumpserver中以websocket的方式处理web_terminal相关功能,攻击者利用获得的(用户uuid, 资源uuid)便可通过websocket在对应的服务器上获得shell或执行命令等。
    这部分功能由jumpserver/koko项目进行实现
    koko中使用了 gin 框架
    路由:koko/ws/token
    [AppleScript] 纯文本查看 复制代码
    wsGroup.Group("/token").GET("/", s.processTokenWebsocket)
    由于 token 处理的特殊性(已完成认证),此处无法使用权限验证。并且利用token反查到对应的服务器资源和用户信息,进行命令行开启操作。
    [AppleScript] 纯文本查看 复制代码
    func (s *server) processTokenWebsocket(ctx *gin.Context) {
     tokenId, _ := ctx.GetQuery("target_id")
     tokenUser := service.GetTokenAsset(tokenId)
     ...
     currentUser := service.GetUserDetail(tokenUser.UserID)
     ...
     targetType := TargetTypeAsset
     targetId := strings.ToLower(tokenUser.AssetID)
        systemUserId := tokenUser.SystemUserID
     s.runTTY(ctx, currentUser, targetType, targetId, systemUserId)
    }
    远程未授权的攻击者通过构造特制的ws通信数据,导致攻击者利用jumpserver在其管理的服务器上执行任意命令。
    漏洞利用
    漏洞利用省略了获得 (用户uuid,资源uuid)的步骤。
    3.png
    影响面分析
    https://github.com/jumpserver/installer/blob/master/compose/docker-compose-app.yml
    在jumpserver的官方 installer 中,默认使用的日志路径为固定的/opt/jumpserver/logs
    [AppleScript] 纯文本查看 复制代码
        volumes:
          - ${CONFIG_DIR}/core/config.yml:/opt/jumpserver/config.yml
          - ${VOLUME_DIR}/core/data:/opt/jumpserver/data
          - ${VOLUME_DIR}/core/logs:/opt/jumpserver/logs
    所以使用官方 installer 的用户最容易被攻击成功,该类用户应当尽快更新。而其他手动配置jumpserver的用户,应当检查是否使用了相同的路径,或常规易猜解的路径。https://github.com/jumpserver/Dockerfile而在jumpserver历史快速构建项目中,同样存在该问题,使用了固定路径/opt/jumpserver/logs
    时间线
    • 2021-01-15 Jumpserver官方发布漏洞通告
    • 2021-01-18 360CERT发布通告
    • 2021-01-18 360CERT发布分析报告

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2021-2-20 11:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2021-2-20 11:37:10 | 显示全部楼层
    这个堡垒机软件在很多小型互联网公司用的比较多,有这个漏洞了,也够运维工程师们忙活的了
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-9-21 13:48
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2021-2-26 13:38:29 | 显示全部楼层
    不知道官方修复了没有?
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表