Skip to main content

Fetch the Flag CTF 2022 : solution du défi Containers are ACE

Écrit par
feature ctf containers are ace

9 novembre 2022

0 minutes de lecture

Merci d’avoir participé à Fetch avec nous !Félicitations aux milliers de participants qui nous ont rejoints pour Fetch the Flag CTF. Et un immense merci aux Snykers qui ont conçu, testé et présenté les défis !

Le niveau de difficulté du défi Containers are ACE de l’édition de cette année de Fetch the Flag CTF est assez faible. Il nécessite des connaissances de base de Burp et de quelques commandes système. Il faut également mener un travail d’analyse et d’enquête pour identifier le vecteur d’attaque.

Guide pas à pas

Enquête initiale

Avant de commencer l’enquête proprement dite, tout détective doit rassembler les indices et les relier. Ce défi nous fournit plusieurs indices précieux, comme vous pouvez le voir ci-dessous.

Indice n° 1 : installez la CLI Snyk https://docs.snyk.io/snyk-cli/install-the-snyk-cli

Rien de particulier ici. Il existe plusieurs façons d’installer la CLI Snyk. Pour notre part, nous allons l’installer avec NPM (assurez-vous que NPM est installé ; sinon, vous pouvez l’installer ici). 

Exécutez sudo npm install snyk -g et vous serez prêt pour l’étape suivante.

Indice n° 2 : exécutez cette commande : snyk container test pasapples/apjctf-todo-java-app:latest --app-vulns --exclude-base-image-vulns

C’est là que la CLI Snyk se révèle utile : l’exécution de la commande ci-dessus lance une série d’instructions (vous trouverez plus d’informations dans la documentation de la CLI Snyk) :

  1. Télécharge l’image si elle n’est pas déjà disponible localement dans votre daemon Docker

  2. Détermine les logiciels installés dans l’image

  3. Envoie cette nomenclature logicielle au service Snyk

  4. Renvoie la liste des vulnérabilités présentes dans votre image

Snyk analyse l’image à la recherche de vulnérabilités et vous présente les résultats ainsi qu’une correction recommandée.

La sortie du terminal répertorie les vulnérabilités de sécurité d’Apache Struts et recommande une mise à niveau de la version 2.3.20 vers la version 2.5.30.

Indice n° 3 : plus d’informations ici : https://docs.snyk.io/products/snyk-container/getting-around-the-snyk-container-ui/detecting-application-vulnerabilities-in-container-images#ap[…]lag

Cet indice fournit des informations utiles si vous souhaitez approfondir le fonctionnement de Snyk Container.

Indice n° 4 : Containers are ACE

Le titre contient également un indice qui sera essentiel pour résoudre ce défi. ACE est souvent l’abréviation de « Arbitrary Code/Command Execution » (exécution arbitraire de code ou de commandes).

Prendre du recul

Nous avons terminé la phase de collecte d’informations et allons maintenant chercher un vecteur d’attaque qui nous permettra de pénétrer dans l’application. À l’étape précédente, Snyk Container a détecté un grand nombre de vulnérabilités. Nous devons trouver un moyen de faire le tri !

Nous allons chercher les vulnérabilités de gravité élevée, comme CriticalET dont le type est Arbitrary Command/Code Execution. En appliquant nos critères, nous réduisons la liste aux vulnérabilités suivantes :

Sortie de terminal répertoriant des vulnérabilités de sécurité critiques dans Apache Struts 2.3.20, notamment l’exécution de code à distance et de code arbitraire.

Après une brève analyse de chacune d’elles, nous constatons que CVE-2017-5638 a un score CVSS de 10 et qu’il existe plusieurs exploits accessibles au public. Nous pouvons donc supposer que la probabilité d’exploiter cette vulnérabilité est assez élevée. Essayons donc !

Passons à la pratique

Nous pouvons exploiter la vulnérabilité en créant un script à partir des charges utiles disponibles publiquement, ou essayer de le faire avec Burp. Nous allons choisir la deuxième option, qui ne nécessite ni l’installation de bibliothèques ni la création de fichiers et qui est, dans l’ensemble, plus simple.

Après avoir lancé Burp, accédons à l’onglet Proxy, puis cliquons sur le bouton Open Browser et accédons à l’application Web vulnérable. À partir de maintenant, chaque requête sera d’abord transmise à Burp.

Accédons maintenant à la section de connexion de l’application Web et commençons à intercepter les requêtes. Essayer de se connecter avec une adresse e-mail et un mot de passe aléatoires ne fonctionnera évidemment pas. Envoyons plutôt cette requête au répéteur.

Fenêtre d’interception de Burp Suite affichant une requête POST de connexion capturée et le menu Action avec « Envoyer vers Repeater » en surbrillance.
Panneaux de requête et de réponse HTTP montrant une tentative de connexion échouée, avec une erreur d’adresse e-mail ou de mot de passe invalide dans le code HTML renvoyé

Modifions maintenant la requête POST en y intégrant une charge utile disponible publiquement, que vous trouverez sur GitHub.

Requête et réponse HTTP affichées côte à côte dans un outil de débogage web : une requête POST et une réponse 200 OK.

Bingo ! Nous avons reçu une réponse différente. En l’examinant de plus près, nous constatons que le résultat reçu provient de cette commande :

Extrait de code montrant une requête multipart/form-data contenant une charge utile d’exécution de commande OGNL et une chaîne User-Agent de Chrome

Nous pouvons maintenant modifier la commande et rechercher dans les fichiers et les répertoires pour voir si nous trouvons quelque chose. Mais nous arrivons à une impasse. 

Requête de connexion HTTP et réponse du serveur Apache Tomcat 8.5 affichées côte à côte dans un outil de développement

Puisque nous savons que le format du flag est SNYK{...}, nous pouvons lancer #cmd='grep -r -e SNYK' pour rechercher dans tous les fichiers. Nous avons trouvé le flag !

Extrait de code montrant un flag webapps/todolist contenant une chaîne de jeton SNYK.

Autre possibilité : rechercher les fichiers contenant le mot-clé flag en exécutant ​​#cmd='find . -name *flag*', puis lire le fichier avec #cmd='cat ./webapps/todolist/flag'

Interface de test de sécurité web affichant une requête POST de connexion avec ses en-têtes et données de formulaire, ainsi qu’une réponse 200 redirigeant vers une page de liste de tâches contenant un drapeau.

Comment nous avons réussi le défi ACE

  • Nous avons effectué une reconnaissance rapide de notre cible afin de préparer les étapes suivantes.

  • Nous avons identifié le vecteur d’attaque en triant les vulnérabilités selon leur

    Critical

    niveau de gravité.

  • Nous avons intercepté une requête valide et l’avons modifiée en y intégrant une charge utile malveillante.

  • Nous avons recherché le flag à l’aide de techniques d’énumération courantes.

Vous voulez savoir comment nous avons trouvé tous les autres flags ? Consultez notre page Solutions Fetch the Flag pour découvrir comment nous avons procédé.

La sécurité des conteneurs, pensée pour les développeurs

Snyk détecte et corrige automatiquement les vulnérabilités dans les images de conteneurs et les workloads Kubernetes.