• BLOG

  • Construire un lab Docker pour tester la CVE-2017-5638 Struts2 RCE (FR)

    Tue 14 March 2017 Dan Lousqui

    Share on: Twitter - Facebook - Google+

    Struts est un framework Java open source assez répandu, permettant de construire des applications web en Servlet/JSP en mode MVC (Model-View-Controller).

    Début mars 2017, une vulnérabilité critique est tombée dans la veille de tout bon InfoSec addict, impactant Apache Struts2 2.3.x (<2.3.32) et 2.5.x (<2.5.10.1).

    Il s'agit d'une vulnérabilité de type RCE (Remote Code Execution), c'est à dire qu'il est possible d'exécuter du code à distance sur un serveur possédant une version vulnérable, et j'avais envie de monter un environnement pour tester tout ça.

    Le but de ce billet est de voir comment utiliser Docker pour monter un lab de test de vulnérabilité.

    Pour cela on va créer un environnement Tomcat avec Docker, puis déployer un applicatif vulnérable pour enfin utiliser l'exploit sur cet environnement.

    Déploiement de l'application sur Docker

    Afin de générer un environnement de test, nous allons mettre en place une application Struts2 et l'installer dans un conteneur Docker.

    En ce qui concerne l'application Struts2, le plus reste d'utiliser le bootstrap Showcase. il s'agit d'un war avec une application de type Hello World en Struts2. Cette application est récupérable ici: https://mvnrepository.com/artifact/org.apache.struts/struts2-showcase

    $ wget http://central.maven.org/maven2/org/apache/struts/struts2-showcase/2.5.10/struts2-showcase-2.5.10.war

    Une fois le war récupéré, déployons l'application dans un Docker

    $ docker pull tomcat:latest
    $ docker run --name struts2 --rm -i -v $(pwd)/struts2-showcase-2.5.10.war:/usr/local/tomcat/webapps/struts.war tomcat
    

    Pour ceux qui ne connaissent pas Docker:

    • docker pull tomcat:latest sert à récupérer l'image de Tomcat
    • docker run --name struts --rm -i -v $(pwd)/struts2-showcase-2.5.10.war:/usr/local/tomcat/webapps/struts.war tomcat
      • docker run crée et démarre un conteneur
      • --name struts2 pour appeler le conteneur struts2
      • --rm supprime le conteneur une fois le process terminé
      • -i permet d'avoir la sortie standard dans le terminal
      • -v $(pwd)/struts2-showcase-2.5.10.war:/usr/local/tomcat/webapps/struts.war permet de mapper le war de showcase dans le conteneur afin de le déployer
      • tomcat c'est bien l'image tomcat qu'il faut lancer

    On récupère ensuite l'ip du conteneur :

    $ docker inspect struts2 | grep IPAddress

    On vérifie ensuite que l'application est bien déployée en utilisant son navigateur préféré: http://172.17.0.2:8080/struts/showcase.action

    Utilisation de l'exploit

    L'exploit est facilement récupérable sur Internet (rapid7/metasploit-framework#8064), il suffit de le récupérer et de l'enregistrer dans un fichier python (exploit.py)

    Et pour l'utiliser, rien de plus simple :

    $ python exploit.py http://172.17.0.2:8080/struts/showcase.action "whoami"
    [*] CVE: 2017-5638 - Apache Struts2 S2-045
    [*] cmd: whoami
    
    root
    

    L'exploit fonctionne donc bien, et permet d'illustrer simplement et facilement son fonctionnement ainsi que son potentiel (ce n'est pas le but de ce billet).

    Conclusion

    Sans rentrer dans l'éternel débat VM / Docker, dans notre cas, utiliser Docker pour confirmer une vulnérabilité est une méthode bien pratique, rapide et fonctionnelle.

    Elle ne nécessite pas d'installer de paquets, de configurer de serveur. Le lab se monte en deux lignes de commande (un wget et un docker run), de plus, il s'agit d'une solution extrêmement lightweight:

    • Un script d'installation tient dans un script de 2 lignes (<1ko)
    • Une fois installés, l'image Docker et le war font 375MB

    Ce qui est très faible comparé à des VM de plusieurs GBs que l'on peut trouver pour tester d'autres vulnérabilités.

  • Comments