27
déc.
'18

European Cybersecurity Challenge 2018

Publié le 27 décembre 2018

En octobre dernier se déroulait à Londres le challenge européen de cybersécurité, réunissant 17 pays de l'Union Européenne pour un CTF assez particulier. Chaque pays est représenté par une équipe de 10 participants et un ou plusieurs entraîneurs (sans compter les membres organisateurs de chaque pays), ce qui représentait ainsi plus de 200 personnes réunies pour cette compétition. J'ai ainsi eu le privilège d'être un des entraîneurs de l'équipe représentant la France lors de ce CTF, avec Heurs et Ack. Petit retour sur cette compétition hors-norme, et débriefing à froid.

Ce billet se veut être un compte-rendu de l'évènement tel que je l'ai vécu, et n'est en aucun cas un résumé de ce qu'est l'ECSC. Je vous invite à écouter l'épisode de NoLimitSecu dédié à cet évènement, auquel j'ai participé avec Maki, Anne-Charlotte et Ack, si vous souhaitez avoir plus de détails.

"Hey virtu, ça te dirait d'être coach de l'équipe de France de CTF?"

C'est un peu en ces termes que majinbooœ, président de l'association HZV, m'a apostrophé. En effet, suite au round de qualification qu'avait organisé l'ANSSI durant la Nuit du Hack 2018 (RIP), HZV devait participer à l'organisation de l'entraînement de l'équipe sélectionnée, à raison de la mise à disposition de 2 entraîneurs. Après quelques discussions, il fut décidé que Heurs et moi-même soyons désignés comme entraîneurs, aux côtés de personnes de l'ANSSI. L'aventure était lancée.

Il s'agissait de la première participation de la France à cette compétition, et cela signifiait plusieurs choses. La première, c'est que nous n'avions absolument aucune idée du type et du niveau de compétition de l'ECSC: aucun write-up n'a été publié, assez peu de retours techniques sur le contenu des épreuves ou le type de CTF. Le seul moyen de le savoir était de participer. La seconde, c'est que l'on allait être attendus par les autres équipes, et potentiellement ciblés en tant que bleus (dans tous les sens du terme). La dernière et non des moindres, c'est qu'une pression était présente de par l'envergure de l'évènement, que j'ai d'abord pris relativement à la légère.

De mon côté, j'ai participé mais aussi organisé plusieurs CTFs (dont certains de type attaque/défense, don't blame me) depuis plusieurs années, bien que cela fait désormais un certain temps que ma participation se limite à une modeste contribution dans une équipe qui n'a vocation qu'à s'amuser et non terminer dans le peloton de tête. Et encore, quand je trouve le temps de résoudre des épreuves et que celles-ci ne nécessitent pas trop de temps. Le fait d'avoir des minis-moi n'aide pas, j'en ai bien peur. Toujours est-il que je ne m'estime pas être un pourfendeur de CTF, et j'ai eu un peu de mal intérieurement à penser que je pourrais vraiment aider l'équipe à progresser.

Rendez-vous fut ainsi pris pour septembre afin d'organiser la session d'entraînement de l'équipe de France.

Premier contact avec l'équipe

Début septembre, l'ANSSI avait organisé une session de deux jours pour que l'équipe et les entraîneurs puissent faire connaissance, et débutent comme il se doit une période d'entraînement. Je ne m'étais pas trop renseigné sur les heureux sélectionnés, et je decouvris le jour J les personnes composant cette équipe. Il y avait là 13 jeunes gens, membres de différentes équipes de CTFs françaises (Inshallhack, Aperi'kube, Hexpresso entre autres), des habitués des CTFs et de p0wnage en série, dont un millenial. Je crois que c'est à ce moment que j'ai pris conscience du temps qui a passé, et que je me suis senti vieux.

Ces deux jours ont été très instructifs et m'ont permis de faire connaissance avec l'équipe, de voir les points forts et faibles de chacun, avec toujours ce sentiment de ne pas parler le "djeun's" actuel. Une sensation de parent, pour être totalement honnête. Ce moment où tu te sens en décalage, un peu comme un père relou qui essaie de se la péter auprès de tes potes. Pour ne rien arranger, ma vie professionnelle m'a obligé à m'absenter à plusieurs moments tandis que l'équipe, composée majoritairement de pentesteurs juniors ou apprenti pentesteurs, profitait pleinement des réjouissances CTFesques prévues durant cette période. Néanmoins, un passage au bar a permis de faire plus ample connaissance autour de quelques bières, d'un diabolo menthe et de mojitos. On ne le dira jamais assez, mais rien ne vaut quelques boissons et des anecdotes de CTF ou de pentest pour souder une équipe de CTF !

Le reste de l'entraînement s'est déroulé en ligne et à distance, Ack, Heurs et moi-même distillant nos conseils et challenges maison afin de préparer au mieux l'équipe. Cette période nous a permis aussi de mieux comprendre leur fonctionnement, et de voir dans quelle mesure ces membres d'équipes habituellement concurrentes pouvaient s'entendre pour établir une organisation nouvelle et résoudre efficacement des challenges.

Départ et arrivée à Londres

Le voyage pour Londres s'est déroulé sans trop de problèmes (si ce n'est un bagage abandonné en gare du Nord), et nous arrivâmes à Londres à l'heure prévue. Le temps de prendre le Tube pour nous rendre aux Tobacco Docks, l'endroit où se déroule la compétition, et nous pûmes tester notre installation en conditions réelles. Vous vous souvenez, je mentionnais un peu plus tôt notre méconnaissance de ce challenge ? Eh bien ça n'a pas loupé: nous n'avions pas prévu de switch ni de point d'accès (faute de temps) et nous nous sommes retrouvés avec des services hébergés sur des Raspberry Pi connectés au réseau WiFi. Sans pouvoir nous connecter à ces derniers, le WiFi en place faisant de la ségrégation de clients. Merci CISCO. A côté de nous, les Allemands ont monté un joli point d'accès en mode bridge et ont câblé tous leurs laptops à ce dernier, avec bien sûr quelques Raspberry Pi pour les services de collaboration. Pourquoi n'y avions nous pas pensé...

L'équipe de France de CTF teste l'installation

Une fois les préparatifs effectués, direction l'hôtel pour poser les valises et rejoindre l'ensemble des participants et des organisateurs pour un repas de bienvenue. L'hôtel est superbe, juste en face du Tower Bridge et à deux pas de la Tour de Londres. Dommage que le temps soit si pluvieux. Nous nous retrouvons donc au repas, autour d'une tablée "France", tout au fond de la salle (en bons élèves que nous sommes). Et c'est à ce moment là que survint le premier moment awkward: les vidéos de présentation des équipes. L'organisation côté France a été informée du fait qu'il faille réaliser une vidéo de présentation de l'équipe, introduisant les participants et les entraîneurs, mais elle pensait à l'origine que ce n'était pas important. Devinez quoi ? Cela le fut. Car oui, la vidéo de présentation de chaque équipe fut projetée, et nous nous sommes rendus compte à quel point certaines d'entre elles avaient été imaginatives. Sans parler du budget ou de la réalisation elle-même. Je pense qu'il fut assez clair que notre participation était la première, mais elle a tout de même reçu un bon accueil. C'est juste que l'on a passé les jours suivants à essayer d'expliquer le pourquoi des avatars présents sur notre vidéo.

Les avatars de l'équipe de France (une partie du moins)

Une fois le repas terminé, j'organisais une petite session de rappel sur les attaques et exploitations hardware, car ce fut un des thèmes annoncés par les organisateurs de la compétition. L'organisation n'a eu de cesse de dire que tout ce dont on aurait besoin serait mis à disposition, j'en profitais pour faire un dernier point avec l'équipe sur les outils et logiciels requis. Puis ce fut l'heure d'aller dormir en vue de la compétition du lendemain.

Deux jours de compétition

En tant qu'entraîneurs, Ack et moi-même avions seulement le droit de discuter avec le capitaine de l'équipe, Maki, pour faire le point et les guider en fonction des tâches à réaliser. Pour le reste, nous étions relégués dans une salle annexe, sans vue directe sur le score ni sur l'équipe. Nous n'avions évidemment pas accès à la plateforme du CTF, et donc aucun moyen de surveiller l'évolution du classement et du score des différentes équipes en direct. Cela fut résolu assez rapidement à l'aide d'un peu de scripting Python, le score fourni par le site web de l'évènement étant synchronisé sur les scores actuels des équipes. Nous ne disposions pas des informations concernant la validation des challenges ni l'historique, mais c'était déjà mieux que rien. Nous disposions par ailleurs de Red Bull à volonté (ce qui n'était définitivement pas une bonne chose), d'un accès Internet, de prises de courant et d'une salle (trop) chauffée agrémentée de (quelques) confortables fauteuils et canapés. Le minimum vital pour survivre.

La première journée s'est clôturée avec un score honorable pour notre équipe, et une troisième position plutôt encourageante. Il y a eu beaucoup de mouvement durant la dernière heure, plusieurs équipes ayant validé de nombreuses épreuves avant la clôture de la journée. Car oui, chaque journée avait son lot d'épreuves uniques, le CTF ne se déroulant pas la nuit. Après un repas bien mérité, ce fut l'heure d'aller se reposer afin de se préparer pour la seconde journée de compétition.

Cette seconde journée fut rude pour l'équipe et nous-même entraîneurs, pour plusieurs raisons. La première raison est que le matériel mis à disposition pour un challenge hardware basique était limité à un seul adaptateur FTDI. L'équipe a galéré sur ce qui se présentait comme une épreuve facile, et nous avons perdu du temps précieux à casser un identifiant et un mot de passe par défaut relativement bidons. L'équipe italienne quant à elle disposait d'un programmateur adéquat (dixit leur entraîneur), et a pu extraire le firmware et chercher les chaînes de caractères. 5 minutes montre en main. C'est à ce moment là que je m'en suis voulu d'avoir fait confiance aux organisateurs, sur le fait que "tout le nécessaire serait fourni". En ce qui concerne les épreuves hardware, il valait mieux venir équipé. On saura pour la prochaine fois. La seconde raison est propre à la plateforme de CTF, avec le souci bien connu du format de flag. Il se trouve que certaines (beaucoup ?) d'épreuves ne suivaient aucune règle quant à la structure des flags. Cela pouvait être un simple texte, ou bien une list d'adresses IP séparées par des virgules par exemple. Un autre flag devait être soumis sous forme de date/heure, mais le format donné en exemple (01/01/1970) ne permettait pas de déduire s'il s'agissait d'un format MM/DD/YYYY ou DD/MM/YYYY. Bref, il fallut se débrouiller et s'en remettre au guessing et à un poil de bruteforce pour se tirer de ces situations.

Il restait toutefois une épreuve particulière à passer: le bandstand. Aucune information n'a fuité sur cette épreuve (ou plutôt cette série d'épreuves), et nous stressions un peu à l'idée de devoir l'affronter. Une fois une partie des membres de l'équipe entrés, nous (entraîneurs) n'avions aucune information et l'impossibilité de communiquer avec eux. Cette épreuve était cruciale car elle permettait de remporter un nombre non-négligeable de points, dont nous avions besoin pour remonter dans le classement. Le stress était palpable, en particulier le mien qui a été augmenté par un certain nombre de Red Bulls que j'avais consommé durant les heures précédentes. En guise d'épreuve, il s'agissait d'un escape game cyberpunk plutôt cool d'après l'équipe, qui l'a terminé haut la main en battant le record de temps et du nombre d'épreuves terminées ! Nous nous sommes alors senti soulagés, et l'équipe a pris les devants de la compétition en remontant à la première place. Je dois dire que ce fut un soulagement, avec l'angoisse juste après de savoir si l'équipe allait réussir à maintenir cette position.

Plusieurs fois les allemands et les anglais ont chamboulé le classement de tête, mais notre équipe arrivait fièrement à contrecarrer cela et revenir en tête, le tout se jouant à quelques milliers de points (ce qui était peu vu les scores atteints à ce moment de la compétition). Pour au final se faire coiffer au poteau par l'équipe allemande, qui a validé à quelques minutes de la fin une épreuve lui donnant la victoire. Le match fut au final très serré, et la tension lors de la dernière demi-heure atroce, les deux équipes étant relativement proche au classement mais aussi physiquement: les allemands occupaient la tablée d'à côté. Cloture du score, pas d'annonce des résultats. Angoisse. Heureusement, le site de l'évènement affichait les derniers scores (vous vous souvenez, la synchronisation ;) et nous avons pu avoir le classement final: la France en seconde position. L'équipe était déçue de s'être fait déchoir de la première place à si peu de temps de la fin de la compétition, mais nous en avons profité pour débriefer avec les allemands et faire plus ample connaissance.

L'après-compétition

l'annonce du classement final a été faite durant la soirée, dans un bar roof-top où l'ensemble des participants et des entraîneurs ont pu se remettre de leurs émotions (et les équipes enchaîner sur un concours de cul-sec avec des représentants de chaque pays, on s'amuse comme on peut). L'Allemagne a ainsi fini en première position, suivie de la France et du Royaume-Uni.

Le lendemain se déroulait la cérémonie de remise des prix, organisée sur un bateau vogant sur la Tamise, où notre équipe s'est vue remettre un trophée et un prix par participant. Nous avons aussi pris la photo de l'équipe, et avons pu profiter de cette ballade pour admirer London by night. Pour enchaîner avec le CTF de Hack.lu une fois rentré à l'hôtel. Je me suis acharné sur une épreuve de stéganographie qui s'est révélée être infaisable (comme nous l'avait indiqué un des membres de l'équipe allemande proche de FluxFingers), mais que voulez-vous, j'avais trouvé un chunk bizarre dans un fichier ZIP et était persuadé d'être sur une piste (merci à Ange Albertini pour ses infos préciseuses sur les formats de fichiers divers et variés, c'est toujours d'un grand secours).

Remise des prix (crédits: ANSSI)

Puis taxi, Eurostar, Paris, et le retour au boulot. Cette parenthèse londonienne s'est terminée aussi vite qu'elle a commencée, mais j'en garde un bon souvenir. J'ai rencontré des types futés, qui ont été capables de s'entendre et de collaborer au sein d'une équipe soudée, capables de poncer des challenges et de persévérer, de représenter la France durant cette compétition et de terminer à la seconde place du podium alors que c'était notre première participation. A ceux-là, je leur tire mon chapeau. En tant qu'entraîneur, je n'ai pas senti que ma présence sur place ait été d'une quelconque utilité quant à la résolution technique des épreuves (pour ma part j'ai souvent servi de canard lors de duck debugging), mais j'ai le sentiment d'avoir été utile quand à la préparation de l'équipe. Le rôle d'entraîneur dans le contexte de cette compétition consiste à travailler en amont, et les dés sont quasimment jetés au moment où se déroule la compétition. L'équipe fait le reste, et elle l'a très bien fait.

On remet ça en 2019 ?



Les contenus disponibles sur ce blog sont publiés sous licence Creative Commons BY-NC-SA.
Vous pouvez réutiliser tout ou partie de ces contenus à condition de citer l'auteur et l'origine, vous ne pouvez en faire une utilisation commerciale, et enfin vous devez partager tout travail ou œuvre dérivée sous les mêmes conditions — c'est-à-dire avec la même licence d'utilisation Creative Commons.