
Vulnérabilité RCE dans Apache Struts 2.0 - Permet à un attaquant d'injecter des commandes système dans une application web via l'en-tête content-type
Vulnérabilité RCE dans Apache Struts 2.0
Ceci est un script pour exploiter CVE-2017-5638 - Il permet à un attaquant d'injecter des commandes OS dans une application web via l'en-tête content-type Apache Struts 2 est un framework open-source de développement d'applications web Java EE. Il utilise et étend l'API Java Servlet pour encourager les développeurs à adopter une architecture modèle-vue-contrôleur (MVC).
Au cours de la dernière semaine de mars 2017, un hacker d'Apache Struts connu sous le nom de "Nike Zheng" a publié un exploit de preuve de concept public montrant avec quelle facilité on peut exécuter des commandes système à distance sur un serveur Apache Struts 2 vulnérable.
La vulnérabilité, CVE-2017-5638 - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5638, permet une exécution de code à distance (RCE) non authentifiée via une valeur Content-Type spécialement conçue dans une requête HTTP. Un attaquant peut créer une valeur invalide pour Content-Type qui entraînera une exception dans le logiciel vulnérable. Lorsque le logiciel prépare le message d'erreur pour l'affichage, un défaut dans l'analyseur Jakarta Multipart d'Apache Struts fait que la valeur malveillante du Content-Type est exécutée au lieu d'être affichée.
Depuis la publication de cet exploit public, un grand nombre de scans recherchant des serveurs Apache vulnérables ont été observés. Comme l'exploit est très facile à exécuter, n'importe qui peut exploiter des machines vulnérables à distance avec une facilité absolue. Ainsi, des exploits fréquents suivant le grand nombre de scans ont été signalés.
Un de nos clients souhaitait que nous scannions toutes ses IP car ils utilisaient largement le framework Apache Struts 2 vulnérable et n'avaient pas d'enregistrements précis des IP (serveurs web) qui exécutaient un framework Apache vulnérable. Il y avait près d'un millier d'IP à tester. Le client exigeait de soumettre tous les domaines vulnérables ainsi que l'information indiquant s'il s'agit d'un serveur Linux ou Windows. Afin d'éviter la tâche fastidieuse de scanner chaque IP individuellement, j'ai écrit un petit script.
Le script combine les fonctions/tâches suivantes :
Lire les noms de domaine vulnérables un par un depuis le fichier contenant la liste des domaines.
Utiliser l'exploit officiel pour vérifier les serveurs vulnérables.
Exécuter l'exploit et vérifier s'il s'agit d'un serveur Windows ou Linux.