Tech.Rocks Summit 2023

Quand l'efficacité nuit à la sécurité : Workshop d'attaque d'une application Cognito

Tech.Rocks Summit 2023 · 30 mai 2024 · 20 min · en français

Résumé

Atelier interactif du Tech.Rocks Summit 2023 construit autour d'un scénario. Thomas, CTO d'Hokla, refuse de souscrire à l'offre entreprise de Slack mais veut offrir à son équipe un chat privé sécurisé et exclusif. Il confie la tâche à Emile, son développeur le plus efficace, qui publie en deux jours seulement une copie de Slack grâce à AWS. Mais dans la précipitation, plusieurs principes de sécurité n'ont pas été respectés. Les participants mettent à profit leurs compétences en hacking pour détecter les vulnérabilités, s'introduire sur le chat privé et accéder au plan stratégique secret d'Hokla, en trois hacks successifs : - trouver l'endpoint URL caché ; - contourner l'authentification Cognito ; - usurper un rôle IAM dans AWS pour accéder aux ressources privées d'Hokla. La session se conclut par les bonnes pratiques à appliquer en matière de cybersécurité. Les participants avaient besoin d'un PC pour réaliser les hacks.

Summary

Interactive workshop from the Tech.Rocks Summit 2023, built around a scenario. Thomas, CTO of Hokla, refuses to pay for Slack's enterprise plan but wants to give his team a secure, exclusive private chat. He hands the job to Emile, his most efficient developer, who ships a Slack clone on AWS in just two days. But in the rush, several security principles were not followed. Participants use their hacking skills to spot the vulnerabilities, break into the private chat and reach Hokla's secret strategic plan, through three successive hacks: - find the hidden URL endpoint; - bypass Cognito authentication; - assume an IAM role in AWS to access Hokla's private assets. The session ends with the cybersecurity best practices to apply. Participants needed a PC to carry out the hacks.

Thèmes : Sécurité

Transcript complet

Transcription automatique, à relire : les noms propres peuvent être mal orthographiés.

Bonjour, merci à tous d'être venus. Je m'appelle Thibaut, je suis Head of Cyber Security chez PADOC. Je suis Thomas, je suis conférencier à la Cité au Docla et on fait partie du groupe Théodo. Alors aujourd'hui, petit cas pratique de cyberattaque. Alors, il faut se remettre un peu dans le contexte. Je viens de lancer au CLAT. En tant que CTO, je vais devoir me donner quelques outils à mes collaborateurs. Évidemment, il faut un chat en interne et puis il s'avère que je suis quand même une grosse pince, donc je n'ai pas envie de payer Slack. Et plutôt demander à Emile, notre stagiaire qui vient d'arriver, écoute Emile, c'est de faire des apps web, je te donne accès au compte AWS, tu vas faire un petit Slack, un truc qui ressemble. Tu peux même utiliser ChatGPT pour t'aider. Et il nous a fait un super Slack-like avec quelques vulnérabilités. Alors, à quoi ressemble notre chat? Ben voilà, il a une belle gueule. Il y a des channels, on peut envoyer des messages.

C'est la fonctionnalité principale d'ailleurs. Un peu magnifique. Et l'autocroque, super. Bon, en fait, c'est la seule. Bon, il n'a pas le temps de faire les channels. Mais on les a laissés parce que ça fait beau. On va quand même sécuriser un minimum. Donc, il a mis ça sur un endpoint un peu caché. Donc, une URL, vous ne pouvez pas la trouver tout seul. On s'est dit, on la donnera quand les nouveaux arrivants... Arrivant chez Oclat, pour la mettre dans leur favori s'ils veulent. Et puis, il a enlevé le bouton de sign-up. Comme ça, même si vous le trouvez, on ne pourra pas créer de compte. C'est nous qui allons le faire quand les nouveaux collaborateurs arriveront. Ben voilà, on a un petit sac, on est content. Du coup, Emile, c'est un stagiaire consciencieux. Il a fait un petit schéma d'archi, donc on vous le montre. C'est une appli toute classique, assez moderne, avec un front en Next, qui utilise GraphQL API pour stocker des messages en DB et stocker la future fonctionnalité de upload sur un bucket.

Et il n'est pas très fort en sécurité, Emile, donc il s'est dit je vais utiliser AWS Cognito pour gérer l'authent, tout ce qui est authentification, autorisation à ma place. Et ça lui a permis en deux jours de sortir quand même une application. Je pense qu'il va bientôt concurrencer Slack. C'est un bon stagiaire, oui. Niveau de... Vraiment assez élevé. Et en fait, il y a pas mal de problèmes. Vous allez pouvoir effectuer trois attaques pendant ce workshop de difficultés croissantes. La première, ça va être de trouver cette URL cachée dont Thomas parlait. L'URL, elle n'est pas devinable facilement, mais on va vous montrer comment faire. La deuxième attaque, ça va consister à vous créer un compte, même s'il n'y a pas le but. de création de compte en utilisant directement Cognito, sans passer par des boutons sur l'interface web. Et la troisième attaque un peu plus compliquée, vous allez utiliser Cognito pour assumer un rôle dans AWS et aller récupérer un flag sur un bucket S3.

Ça, ce sera pour les plus aguerris. On a caché une quatrième faille aussi. Si jamais vous êtes vraiment très très fort, il y en a une quatrième, on vous laissera la trouver. On est parti? Voilà, on vous résume ça rapidement. N'hésitez pas, si vous êtes chaud, ne nous attendez pas. Nous, on va y aller étape par étape. Pour que tout le monde arrive à pirater ce petit chat. Donc, premier objectif, trouver l'endpoint. Alors, on est sur un nom de domaine, vous ne voyez peut-être pas ici, mais c'est theodo-Tech.Rocks.net. On a pu mettre au clair, mais c'est le nom de l'entreprise, fictive. Et si on est observateur, on voit qu'on est sur un endpoint HTTPS. Donc c'est pas mal, Emile, il est quand même conscientieux. Il a sécurisé les échanges, les échanges sont chiffrés. Et donc, qui dit HTTPS dit certificat SSL pour authentifier que le serveur est bien celui qui prétend être. Et il s'avère que le certificat SSL, c'est des données publiques.

Effectivement, pour valider que le certificat est authentique, il y a toute une chaîne de tiers de confiance qui vont... vérifier ce certificat qui remonte jusqu'à des autorités connues. Et donc c'est une base de données publique. Et il s'avère qu'il y a un site qui s'appelle crt.sh qui permet de naviguer dans cette base de données. Je n'en dis pas plus. Essayez avec ça de trouver ce fameux endpoint. Et dès que vous avez... Trouvez, levez la main quand vous arrivez sur cette page. Ce qui est assez drôle, c'est que c'était un principe de sécurité à la base. Et en fait, les attaquants s'en servent pour trouver des endpoints cachés. Une fois que vous avez trouvé, n'hésitez pas aussi à aller voir votre propre URL d'entreprise. Vous aurez sûrement des surprises. Vous aurez sûrement des surprises, oui. Donc on vous laisse de petites minutes. Cette étape-là peut même se faire sur le téléphone.

Du coup, il suffit d'aller sur crt.sh. Et donc le domaine, c'est theodo-sistechrocks.net. Et ça, franchement, ça marche à tous les coups. Toutes les entreprises, dès que vous créez un certificat, ça apparaît dedans. Au bout d'une minute, c'est disponible. Et donc un attaquant qui cherche à vous nuire, il ne va pas passer par votre site vitrine, il va aller regarder tous ses endpoints. Le genre dev.backend.votre nom d'entreprise. C'est souvent par là que les attaquants vont rentrer. Donc voilà, vous avez vu, je rentre le nom de domaine theodotex.net et je trouve du coup tous les certificats qui sont enregistrés sur ce nom de domaine et on retrouve du coup l'URL cachée. De notre stagiaire. On en a déclaré plusieurs. Du coup, à chaque fois qu'il y en a un nouveau, il a un ID unique et il est rentré dans la DB.

Vous pouvez regarder sur ce site, il y a pas mal de choses assez marrantes, on voit les chaînes de certificat, ce genre de choses. On peut s'y perdre. Ok, on passe à la deuxième étape. Donc là, on a une mire d'authentification, on n'a pas de user mode pass, ça paraît être un peu une voie sans issue. Mais comme l'application utilise Conito, vous allez pouvoir regarder dans les sources. Du site, ou faire une tentative de connexion et regarder les trames réseau dans l'onglet Network du debugger. Vous faites Ctrl Shift C ou Pomme Shift C, je pense, sur Mac pour afficher les sources. Essayez de vous connecter, vous allez voir qu'il y a des informations qui vont apparaître à propos de Conito. Si on zoome un peu sur Conito, il y a deux concepts. Il y a les user pools dans lesquels vont être stockés les user mode pass et l'identity pool qui va permettre que les utilisateurs utilisent des services AWS. Pour cette attaque-là, on va se concentrer sur la user pool. Cette pool a un ID unique. Et on se rend compte que si on communique avec l'API d'AWS directement, par exemple ici en Python, on peut faire un appel à sign up pour s'inscrire, on choisit un mot de page sans choisir un username, et il faut fournir l'ID de la pool.

Donc si vous trouvez cette ID, vous pouvez théoriquement vous créer un compte. Dans la vraie vie, certaines API, l'inscription est vraiment interdite, mais ça arrive très souvent de tomber sur ce genre d'application. Pour vous éviter de faire du Python et de coder des scripts, on a créé un outil chez Padop qui s'appelle Conito Scanner. Vous pouvez l'installer directement en faisant pip install conitoscalar. Égal, égal, 1.0.3, c'est la dernière version. Et vous allez pouvoir vous en servir pour créer un compte. Vous fournirez la région, le client ID, c'est ça que vous devez aller chercher dans le code source. Et puis ensuite, vous choisissez un mot de passe et un email et vous allez pouvoir vous créer un compte et bypasser l'authent. Tout un programme. Le premier qui arrive à mettre un petit message sur le Slack, on attend les messages. On lui paiera peut-être une bière. On passe à la correction, puis peut-être que vous pouvez essayer, enfin on laissera le chat ouvert pour ceux qui veulent, qui vont tenter.

Donc vous avez vu, il y a plusieurs moyens d'aller chercher ce fameux client ID dont on a besoin. Une idée, ça peut être de regarder... En fait, le front, il fait des requêtes à Cognito, quand on essaie, par exemple, de se loguer, et il envoie nécessairement dans cette requête. Je vais essayer de mettre en grand, vous me dites si vous voyez bien. Donc je mets n'importe quoi, le sign-in. On voit qu'il a fait une requête à Cognito. Et dans le payload, on retrouve le client ID qu'on peut utiliser pour faire la requête. Donc, je triche un peu, j'ai préparé. Toute information comme ça, toute application de type Next ou qui est principalement basée sur des requêtes faites par le browser en front, forcément ces informations incognito vont être dans le code source, elles vont apparaître aussi dans les trames, donc un attaquant peut les récupérer. Ce n'est pas un secret. Donc voilà, ça a créé mon compte et ensuite je peux aller... Alors il faut effectivement mettre un vrai mail parce qu'il y a quand même une vérification d'email. On utilise ce bon vieux hopmail. Hop.

Et je peux... A noter que vous pouvez le confirmer soit comme ça, soit directement avec l'outil aussi Conito Scanner. Il y a un Confirm Sign Up qui a été codé. L'outil, vous pouvez vous en servir. un peu comme scanner aussi sur vos applis à vous pour vérifier qu'elle a bien été sécurisée. Et voilà, on arrive sur le chat. All right. Bon, là, c'était déjà... Il fallait travailler un peu plus, mais ça se fait bien. On va passer à la troisième étape qui est un peu plus complexe. Alors, la troisième étape, du coup, ce qui est intéressant, Conito, comme tout à l'heure, je vous disais, il y a les user pools et il y a les identity pools. Par exemple, toute application mobile qui va utiliser Conito, les développeurs veulent que les téléphones puissent être capables d'envoyer des données d'analytics, des stack traces d'erreurs, ce genre de choses. Donc les identity pools Conito, ça permet à n'importe quel user d'accéder à des services AWS, des buckets, des bases de données ou n'importe quel service, sans avoir à leur donner d'identifiant.

Il suffit d'être connecté sur Conito et on peut accéder à AWS. Et là, on remarque aussi souvent pendant les tests d'intrusion qu'il y a des erreurs qui sont faites. Les développeurs donnent beaucoup trop de droits au rôle lié à l'identity pool conito. Et du coup, on se retrouve à carrément pirater l'infrastructure AWS complète du client à partir de zéro. Donc là, on vous a mis un petit exemple où le rôle qui est lié à la poule conito, il va avoir des droits de lecture sur un bucket. Donc le nom du bucket, vous pouvez aussi le trouver dans les sources. Et c'est assez compliqué de... De vraiment assumer le rôle, etc. Donc encore une fois, Une fois, vous allez pouvoir utiliser l'outil qu'on a créé qui automatise ça. Ce n'est plus la commande à Cune Creation, c'est get identity pool keys. Donc il y a un peu plus d'infos à trouver. Il faut une pool ID, c'est ce que vous aviez tout à l'heure, mais il faut aussi une identity pool ID. Ah oui, tout à l'heure, vous aviez le client ID.

Donc, il y a trois infos à récupérer. Et en sortie, il va vous afficher des credentials AWS. Et après, vous pouvez les utiliser pour aller chercher le flag qui se trouve sur ce bucket. Là où tout à l'heure, en regardant les trams réseau, vous n'aviez que le client ID, ici, il va falloir que vous trouviez le user pool ID, l'identity pool ID. Ça va se passer dans le code source. De l'application. Comme tout à l'heure, ouvrez un debugger et allez voir dans les fichiers. C'est dans un fichier JS. Bon courage. On vous laisse chercher un petit peu. Il a déjà des droits sur AWS. Par défaut, il a très peu de droits, mais ça arrive souvent que des droits soient attribués aux users. C'est là où on fait la faille. Exactement. Là, typiquement, On a un peu inventé, mais ce n'est pas si loin de ce qui peut arriver.

On se dit qu'on va devoir uploader des fichiers depuis notre application. Donc on va donner des droits aux utilisateurs sur des buckets S3 pour pouvoir déposer ces fichiers. Et si on ne fait pas attention, on peut donner accès à tous les buckets, à ce genre de choses. On avait un client, on avait le droit de lire les buckets, il y avait un fichier de state terraform pour les plus techs, et à l'intérieur il y avait des clés à YAM, il y avait tout. Petite astuce, on peut faire... Il y a plein de fichiers, en fait, puisque c'est du JS compilé. On peut faire une recherche dans tous les fichiers. Mais bon, si on tape typiquement client ID... Ou conito, quoi. Ou conito, ce genre de choses. Il y a pas mal de trucs. Ça ne marche pas si bien. Mais ouais, il faut voir que... Si on regarde un peu tous les liens, on en trouve un qui s'appelle Page. Et dans le fichier, il y a toutes les infos nécessaires. Il y a même le nom du bucket, je crois. Et ça, c'est généré automatiquement.

Quand un développeur se met à utiliser Cognito, ça va se retrouver dans les fichiers. Il y a le même genre de faille avec Firebase aussi. Faire très attention. Firebase, par défaut, on peut se créer un compte. Donc si vous gérez toutes les autorisations via le web, quelqu'un s'inscrit sur Firebase et il a accès à tout. Ça, c'est catastrophique aussi. Pour la petite histoire, le chat, on l'a généré uniquement avec de l'UI générative, le design, tout ça. On l'a fait en une demi-heure, le code était pondu. C'est aussi un petit exercice pour nous de voir à quel point ça pouvait... Un chat GPT, c'est bien, mais ça ne crée pas du code sécurisé. Mais voilà, c'est aussi un peu le travers. C'est qu'on ne comprend pas forcément du coup ce qui nous génère si on ne maîtrise pas derrière Conito, les différents services qu'on va utiliser. On peut rapidement mettre des vulnérabilités. Donc c'est pas mal pour des dojos comme ça aujourd'hui. Mais attention en production. Il y a beaucoup de services qui, par défaut, ne sont pas très sécurisés.

Franchement, cette histoire de user pool, par défaut, on peut s'inscrire. Beaucoup de gens qui font ça, qui ne se posent pas la question, il faut le savoir qu'on peut aller taper directement l'API pour s'authentifier. Le code a l'air super propre quand on est dans Copilot. D'où l'idée de... De faire ce genre d'exercice avec vos équipes, pour qu'ils soient sensibilisés à... En fait, par la pratique, on se rappelle beaucoup plus que quand on fait un cours théorique, attention, on connecte, machin. Là, essayer d'attaquer soi-même une application, en fait, on comprend beaucoup mieux après ce qu'on manipule derrière en production. Donc si ça vous intéresse, on vous donnera accès au repo si vous voulez refaire chez vous dans vos boîtes. On le laisse jusqu'à ce soir le labo, vous pouvez tester. Donc pareil, je me suis préparé mes commandes. Et du coup là ce que j'ai récupéré, c'est... Voilà, il y a toutes les informations.

Donc là, la user pool ID ici. Et la identity pool ID ici, ce qui me permet de faire cette commande, qui va derrière, alors c'est en blanc, mais me donner en fait un token pour connecter à l'API. Access, secret et session token, parce que c'est un rôle. Je peux peut-être faire un STS get caller identity pour montrer. Ouais. Donc, au revoir. Je vais mettre la commande. C'est pas grave. STS. Et donc là, on peut voir qu'on a assumé un rôle. Assumed role, Amplify, Théodo, Tech.Rocks, Production. Et donc, on est authentifié sur AWS. Et donc ensuite, je peux utiliser les services AWS. Par exemple, on va donner les droits de lister des buckets. Et donc je peux voir les différents buckets auxquels j'ai accès. D'ailleurs, il y a un steak terraforme ici. Vous n'avez pas le droit de lire dedans.

Ce serait dommage de se faire pirater pendant un workshop. Par contre, ce bucket-là, vous avez accès. Et donc, on voit qu'il y a un dossier qui s'appelle Protected. Et sur ce bucket, on a le fameux flag.txt que derrière, je peux copier. Oula. Tu l'avais, tu l'as là, c'est bon, non? Je vais recommencer. Vous faites ta bille pour que ça aille vite. Flag contexté, espace, ouais. Voilà. Il m'a copié le flag. Et du coup, je peux voir. And a flag. Okay. Voilà. On pourra vous partager le code source si vous voulez. Quelques petits trucs à retenir pour conclure? Oui, donc dès que vous exposez quelque chose sur Internet, quelqu'un va y accéder.

Là, on vous a montré les attaques avec les certificats, mais même une IP. Instantanément, il y a des sites comme Shodan, S-H-O-D-A-N, Vous tapez le nom d'une entreprise ou n'importe quoi, ça va être scanné. Dans les 24 heures, vous pouvez être sûr que l'application que vous avez exposée a été scannée. Il y a eu des scanners de vulnes qui sont passés. Il y a plein de gens qui sont déjà allés voir. Les applis critiques, les failles critiques, c'est souvent côté API, ce n'est pas côté front. Donc là, par exemple, il n'y avait pas de bouton front pour s'inscrire. En fait, les attaquants, ils vont tout de suite chercher les URL des API. C'est là-dessus qu'ils vont faire leurs attaques. C'est assez classique chez les juniors de se dire, si on ne le voit pas, c'est protégé. Mais il faut vraiment comprendre ce qu'on manipule. En particulier sur les applis mobiles, c'est vraiment la même chose. Sur les applis mobiles, on se dit qu'il n'y a pas le bouton, mais on peut proxifier un téléphone, regarder toutes les requêtes qui passent et taper l'API. C'est là-dessus qu'on trouve le plus de failles aujourd'hui. Après, bien sûr, dès que vous utilisez des services managés, faites attention aux permissions que vous donnez et aux paramètres par défaut.

Typiquement, sur Conito, par défaut, il y a le sign-up d'activer. Et donc, en général, on a envie d'aller vite, donc on passe un peu tout. Mais en fait, on peut laisser passer des trucs. Et enfin, faites des tests d'intrusion parce qu'il y a des failles comme ça, il y en a plein, il y a beaucoup d'erreurs possibles. Si vous avez une appli sensible, n'hésitez pas à faire un test d'intrusion, ce serait dommage qu'un vrai attaquant en profite. Et puis on vous conseille de faire ce genre d'exercice. Donc nous, on s'est vraiment inspiré de ce qu'on avait vu pendant des pentests pour créer l'exercice. Et en fait, on fait ça sur les failles de sécu qu'on peut voir, mais aussi, par exemple, quand des développeurs font des bugs, on va se dire, tiens, on va pouvoir créer un petit exercice dessus et les faire jouer pour qu'eux-mêmes se rendent compte en pratiquant, ah bah, ok, ça c'est une mauvaise pratique et je vais m'en rappeler. Et puis maintenant avec ChatGPT, c'est hyper facile de faire. des applications comme ça. Si jamais vous êtes chaud, il y a une quatrième faille qu'on n'a pas mise. Si vous la trouvez, alors... Il y a deux failles sur GraphQL qu'on a laissées.

Si vous voulez regarder un peu les failles GraphQL, Voilà, j'espère que ça vous a plu. Merci beaucoup.