Write-up

Write Up Medileak 3 - Finale

Bien peu de joueurs peuvent se prévaloir de savoir en quoi consiste une finale en présentiel. Exceptionnellement, je vais vous faire découvrir les coulisses de la finale de Médileak 3 qui a eu lieu le 4 juin à Limoges. Moi Sam, jeune stagiaire, avec mon regard innocent (gare au 1er qui en doute, de la jeunesse comme de l’innocence), je vais vous raconter le déroulé de ces quelques heures d’une expérience inoubliable.

Par un doux mercredi de juin, nous nous sommes retrouvés avec Tungst à midi. 11h30 pour être précis. Nous avions l’après-midi pour prendre connaissance des lieux, rencontrer le personnel qui serait présent lors de la finale le lendemain (un accueil et accompagnement sur place incroyablement chaleureux). Nous avions à faire des repérages, des photos, des choses à cacher, des consignes à donner. Nous avons fait notre petite séance de sport en parcourant le parc de long en large pendant tout l’après-midi.

À peine le temps de poser les valises à l’hôtel, que nous sommes repartis pour la soirée.

Rappelons que seules 4 équipes étaient qualifiées. Une seule équipe était présente au complet, les 3 autres équipes avaient 1 ou 2 membres restés en distanciel.

Nous avions convenu de retrouver les joueurs présents pour un repas tous ensemble. Faire connaissance, parler osint évidemment, mais de bien d’autres choses aussi. Bonne ambiance, toujours un peu teintée du stress de ce qui les attendait le lendemain. Nous n’avons évidemment pas trop tardé ce soir-là pour être en pleine forme le lendemain.

Au petit matin, nous nous sommes retrouvés au point de rdv pour prendre un mini-bus ensemble. Certaines équipes avaient mis le paquet…

8h30, tout le monde dans le bus.

Le lieu de la finale n’avait pas été annoncé. Pourtant, après la phase de qualification, des joueurs curieux auraient pu le connaitre. En effet, notre ami Henri-Pierre avait mis à jour son blog entre temps :

Direction donc : le stade Beaublanc de Limoges ! Bel ouvrage, malheureusement toujours incomplet, avec lequel j’ai un lien très particulier. Il nous a offert un cadre de travail agréable et original pour la journée.

Nous avions à notre disposition une vaste salle, dans laquelle chaque équipe a pu s’installer.

Laissant les joueurs entre les mains de Tungst pour les consignes du jour, je m’éclipsai discrètement pour aller cacher les derniers éléments à travers le parc des sports. Ma mission accomplie, je pouvais prendre ma place auprès des joueurs.

Final Countdown

Quand on arrive en ville

Installés, les joueurs ont donc reçu les consignes pour cette finale :

  1. Tous les déplacements devaient se faire à 2 personnes pour égalité entre équipes, toujours avec l’accompagnant de la métropole qui leur était dédié (saluons leur implication, car pour certain c’était très engageant physiquement, avec des équipes qui avaient décidé de faire des tours de stade en courant). Cet accompagnement permettait de suivre en temps réel les déplacements des joueurs, et le suivi de Dégun à distance qui pouvait lancer des séquences pré-établies suivant leur progression.
  2. Obligation d’utiliser les salons discord, écrit et vocal, pour avoir un regard et une oreille sur toutes les équipes : égalité entre les présents et distants, suivi des progressions
  3. Consigne importante : il était question de vie ou de mort. Donc exceptionnellement, levée de l’interdiction d’offensif, autorisation de faire les choses qu’on n’a habituellement pas le droit de faire. Sans en dire plus, aux joueurs de juger de la pertinence de leurs actions.
  4. Une instruction secrète non dévoilée aux joueurs : le temps de résolution des challenges clés était chronométré sur la plateforme, pour assurer une équité face aux “figures imposées” sur lesquelles ils n’avaient pas la main.

Coup d’œil sur la montre. Échanges de regards entre tension et excitation. Petit moment de silence, où chacun retient son souffle. Et le top fut donné avec le 1er flag…

🏴‍☠️ Flag : VOIRLIMOGESETMOURIR

Grâce à nos repérages de la veille, avec la participation d’un acteur talentueux, et le passage express au centre commercial du coin pour faire imprimer des photos : voici ce que les équipes avaient à disposition sur leur table pour commencer (chaque équipe ayant une photo différente).

🏴‍☠️ Flag : une photo

Trust me I’m Famous

Départ au pas de course de chaque équipe, pour tenter d’identifier le lieu de la photo, et mettre la main sur ce qui avait été caché.
Pour se représenter un peu les lieux : le parc fait environ 50 hectares. Plusieurs terrains de foot, rugby, tennis, une piste d’athlétisme, un skatepark, dans un environnement arboré. Idéal pour une partie de cache cache géante.

Pour l’exemple, voici ce qu’une des équipes devait trouver une fois le lieu approximatif de la photo identifié :

Vous ne voyez pas ? Là, au milieu du lierre et des feuilles mortes…

Une petite carte, perdue par un agent de Kydonia !

🏴‍☠️ Flag : carte d'accès

Les joueurs devaient alors se rappeler de cet espace qui n’avait pas été utilisé lors des qualifications :

🏴‍☠️ Flag : ops.kydonia.vip

En affichant le code source de la page du site, tout en bas, apparaissait ce fichier :

🏴‍☠️ Flag : main.js

https://ops.kydonia.vip/static/main.js

En l’ouvrant, on pouvait y lire :

🏴‍☠️ Flag : sepolia testnet

https://sepolia.etherscan.io/address/0x59b0e39dBd06e351716DCc1ceC87e3dfD2EAB5F4

Plusieurs transactions apparaissaient :

En analysant chacune d’elles, celle-ci https://sepolia.etherscan.io/tx/0xf2de582d02f54fb6bd1931de4b26d3955ec50e66f87ed0e3f9fdcea4e97663c5 devait sortir du lot car on pouvait y lire :

🏴‍☠️ Flag : 0xf2de582d02f54fb6bd1931de4b26d3955ec50e66f87ed0e3f9fdcea4e97663c5

🏴‍☠️ Flag : solignac.org/backup/202606/kydonia/

En se rendant sur la page https://solignac.org/backup/202606/kydonia/ les joueurs trouvaient :

🏴‍☠️ Flag : ops_console.db

Ils devaient alors utiliser le contenu présent sur le badge en NFC, et cette table pour trouver les identifiants et mot de passe de connexion.

🏴‍☠️ Flag : login_id

The hunt

Grâce à Cynthia, les joueurs découvraient alors la console de Kydonia, permettant de communiquer en temps réel avec leurs agents sur place.

Pour l’envers du décor : chaque équipe avait un accès dédié. Dégun, à distance, pouvait adapter chaque étape du scénario prévu suivant la progression personnalisée de chaque équipe.

A leur connexion, les joueurs pouvaient lire le message expliquant qu’un agent avait perdu son badge d’accès (celui qu’ils avaient donc trouvé), et la localisation des agents était indiquée en permanence.

🏴‍☠️ Flag : 45.849000, 1.238620

Les agents échangeaient avec des noms de code, que l’on pouvait évidemment deviner.

🏴‍☠️ Flag : Redhead

🏴‍☠️ Flag : Cynthia

Les agents donnaient les informations sur leur surveillance, permettant aux joueurs de suivre les événements en temps réel.

🏴‍☠️ Flag : tribune

🏴‍☠️ Flag 101, 102, 103, 104 (suivant l’équipe)

Cynthia ayant fui, les agents mentionnaient une autre cible. On devinait qu’il s’agissait de Henri-Pierre, puisqu’il devait justement retrouver Cynthia au stade.

🏴‍☠️ Flag : OldCreep

Redhead

Message in a bottle

Les joueurs repartaient en courant, devant trouver comment accéder aux tribunes.

Pour rappel, toute la journée dans des salons à côté de notre QG, se déroulaient les Rencontres de la cybersécurité organisées par Limoges Métropole. Donc plein de monde, la sécurité et organisateurs qui veillaient sur les visiteurs pour les empêcher de sortir du périmètre de l’évènement. Mais tout le monde était prévenu du CTF, et nos joueurs avaient carte blanche pour aller partout où ils voulaient. Les accompagnateurs d’équipe avaient pour consigne de ne pas donner d’aide, la seule information étant “tout ce qui est fermé à clef ne fait pas partie du jeu”.

Les équipes sont donc parties, chacune au fur et à mesure de sa propre progression. Depuis le QG on pouvait apercevoir les joueurs arpenter les gradins.

Quelque chose avait été habilement caché sous un siège par Tungst Cynthia :

Les joueurs trouvaient alors cette pochette :

🏴‍☠️ Flag : une pochette

🏴‍☠️ Flag : un code à trois chiffres

Certaines équipes ont longtemps gardé cette pochette fermée. A aucun moment de leur enquête numérique, ils n’étaient confrontés à un code à 3 chiffres. Plusieurs heures à l’observer sous toutes les coutures, à se retenir de tenter les codes au hasard. Et pourtant, tout était là, sous leurs yeux, depuis le début…

Au dos de la photo laissée par Cynthia à leur intention, la 1ère chose qu’ils avaient eu entre les mains, un message.

cones.hippy.eager    
shams.gala.dwelled    
double.option.drums

Trop facile me direz vous. Même sans être Rof, c’est tellement évident que ça semble ridicule pour une finale osint de ce niveau. Les joueurs ouvraient immédiatement https://what3words.com/ et entraient les coordonnées :

Mais restait à comprendre ce que Cynthia tentait de leur transmettre comme information. Pas si simple finalement n’est ce pas ? le numéro de rue du bâtiment ? ses coordonnées géographiques ? de la steg dans les 3 mots qui devaient en donner d’autres ? Steg is not osint obviously

Comment ces 3 adresses pouvaient permettre de trouver le code ?

Alors attention, pour ce chall, petit partage pour vous donner le niveau :

Rapidement suivi de :

La solution ? Miracle de l’architecture : il suffisait pourtant d’afficher la vue satellite pour, très littéralement, voir le code de la pochette apparaître. Aussi simple que chercher le compte LinkedIn d’une société !

🏴‍☠️ Flag : 084

Petite précision : les joueurs avaient la possibilité d’avancer différents rapports en parallèle suivant leurs découvertes. Pour ce write-up je fais le choix d’une progression qui privilégie la linéarité du scénario.

Le dossier Kydonia

Une fois ouverte, la pochette dévoilait son contenu : quelques photos, et une liasse de papier. Une trentaine de pages, recto verso, écrit tout petit, en anglais…

Les équipes ont réussi à accéder à ce contenu en début d’après midi, après déjà plusieurs heures de recherches, de footing, et un bon repas (voir 2 pour certains dont je ne dévoilerais pas le nom).

Autant vous dire qu’on a senti le poids de cette tâche qui a duré plusieurs heures sur le moral des troupes. Passer de la motivation sans faille, l’euphorie, à la fatigue, la lassitude. Observer la solidarité, le soutien entre coéquipiers, le désespoir. C’était beau…

Je ne détaillerai pas le contenu des documents ni de méthodologie. Il fallait juste lire, traduire, comprendre, répondre, à chaque question, une par une.

Note de Dégun : bah si en fait ils peuvent lire les documents ici : https://drive.proton.me/urls/WTNYR63YM0#xATIRKKTaKNZ

L’incident

🏴‍☠️ Flag : 24 avril 2025

🏴‍☠️ Flag : Kydonia Continental Security Holdings Ltd

🏴‍☠️ Flag : Insured Person 0247

🏴‍☠️ Flag : Kato Pyrgos

🏴‍☠️ Flag : d'activité sportive

🏴‍☠️ Flag : un téléphone et une montre

Le contrat

🏴‍☠️ Flag : Abu Dhabi

🏴‍☠️ Flag : The Founding Partnership

🏴‍☠️ Flag : Subject R

🏴‍☠️ Flag : K. P. Stavros

Le dossier personnel

🏴‍☠️ Flag : KCS-OP-0247

🏴‍☠️ Flag : Andriani Nikoletta Trichas

🏴‍☠️ Flag : 12 mars 1983

🏴‍☠️ Flag : Nicosie

🏴‍☠️ Flag : Senior Field Director

Le mandat fondateur

🏴‍☠️ Flag : 14 octobre 2021

🏴‍☠️ Flag : plateforme de santé

🏴‍☠️ Flag : A. N. Trichas

Sujet R

🏴‍☠️ Flag : 22 avril 2022

🏴‍☠️ Flag : étudiant en pharmacie

🏴‍☠️ Flag : 13 avril 2022

🏴‍☠️ Flag : Chief of Operations

Phase IV

🏴‍☠️ Flag : 12 juin 2025

🏴‍☠️ Flag : Limoges

🏴‍☠️ Flag : Strathaird

🏴‍☠️ Flag : l'île de Skye

Contre surveillance

🏴‍☠️ Flag : 4 mai 2026

🏴‍☠️ Flag : Cynthia

🏴‍☠️ Flag : Volkswagen Golf

Ah cette question…

L’emplacement à trouver devrait figurer parmi les plus ardus challenge de GEOINT de toutes les plateformes osint ! Une photo imprimée, de mauvaise qualité, dans un environnement sans beaucoup d’éléments d’accroche. Difficulté supplémentaire : la photo n’était pas tirée d’une vue Street View, il était impossible d’avoir des indices avec les nuages, la luminosité, la végétation.

Un des documents écrits donnait quelques informations pour délimiter une zone géographique. Et finalement tous les joueurs ont fini par trouver :

🏴‍☠️ Flag : 57.842060, -5.221782

🏴‍☠️ Flag : Manchester

🏴‍☠️ Flag : Limoges

🏴‍☠️ Flag : 5 mai 2026

Redhead Redemption

“C’est trop facile” a dit quelqu’un, à quelques heures de la finale. Alors ce rapport a fait son apparition.

On aurait bien voulu ajouter des cloches, mais on ne savait pas à quelle heure les joueurs accéderaient à ce challenge. C’est le problème quand on est trop attaché aux détails. Par exemple : il devait pleuvoir, vous noterez donc l’adaptation de la photo à la météo attendue. Mais finalement il a fait beau. Dommage pour la précision.

D’ailleurs, anecdote au passage : même la photo du geoint a causé un stress à quelques heures de la finale :

Bon là, on s’est dit que quand même, les joueurs n’iraient pas jusqu’à analyser la position du soleil au jour et horaire indiqués dans le texte pour vérifier la cohérence de ce chall.

Je m’égare. Revenons à la fuite de Cynthia. Les joueurs localisaient :

🏴‍☠️ Flag : 45.840878, 1.243669

Grâce à cette photo, les joueurs identifiaient un lieu d’urbex à proximité de la petite église. Confirmation possible par une vidéo youtube (c’est fou, ça n’a pas changé…)
https://www.youtube.com/watch?v=ROerSc7yd_w

🏴‍☠️ Flag : 45.837960, 1.240970

Partir de la clinique, trouver un bois à traverser, une petite maison en bois. Et voilà !

🏴‍☠️ Flag : 45.832873, 1.237735

OldCreep

No country for old men

Dans les échanges des agents Kydonia, un message informait des déplacements de HPG.

🏴‍☠️ Flag : vestiaire

Les joueurs devaient de nouveau partir en exploration dans le stade, afin de localiser la zone des vestiaires, puis trouver le seul vestiaire resté ouvert. Le n° donné dans les échanges leur indiquait alors dans quel casier regarder.

Ils y trouvaient un flacon contenant des comprimés.

Certains joueurs courageux ont envisagé, un instant, d’avaler un de ces comprimés pour en voir les effets et deviner sa composition. Nous leur avons alors signalé que nous n’avions pas l’accord pour perdre des joueurs en cours de finale, mais qu’en regardant autour d’eux, ils allaient bien trouver comment faire.

“vous analysez le contenu” => ANALYSE ?

Ce grand espace mis à notre disposition était vide. des placards et étagères nous entouraient. Vides aussi. Enfin, pas si vide : aux 4 coins de la pièce, 4 petits cartons : des tests urinaires pour détecter le taux de sucre.

Aucun joueur n’a respecté les indications d’usage de ce test urinaire. Ils se sont contentés de broyer quelques cachets, de les dissoudre dans un peu d’eau, et de faire l’analyse… même pas drôle…

🏴‍☠️ Flag : sucre

Le flacon étant du glyconatur, il fallait retourner sur le site de Medideal.

Ce sous-domaine n’avait pas non plus servi pendant les phases de qualification. À ce moment-là il prenait tout son sens. https://sledljivost.medideal24.eu/

Les joueurs entraient le code sur le flacon.

🏴‍☠️ Flag : OP-2R-2025

Petit point d’arrêt dans l’enquête : impossible d’accéder à l’information directe de l’identité de l’opérateur, même si on pouvait se douter que c’était Raoul.

Après avoir essayé tous les trucs habituels, les joueurs arrivaient à la conclusion que c’était probablement le moment de faire ce qu’on ne fait normalement pas pendant un ctf osint.

Ils allaient sur https://sledljivost.medideal24.eu/admin

Et cliquaient sur “mot de passe oublié”…

Et hop, confirmation pour Raoul. Mais pas de mail en clair.

🏴‍☠️ Flag : Raoul Reidid

Comme on anticipait la fatigue, et la difficulté de pousser encore les challenges techniques, le reste de l’adresse se devinait dans le code source :

🏴‍☠️ Flag : [email protected]

Et soudain…

Les joueurs recevaient un message d’alerte, accompagné d’une sirène dans leur espace vocal…

🏴‍☠️ Flag : TARGET DOWN

Tungst s’approchait mystérieusement de l’équipe inquiète, et leur demandait de le suivre.

Les quelques minutes avant la première alerte étaient emplies d’une légère impatience de tous les organisateurs et accompagnants présents. On croisait nos regards, un petit sourire entendu en coin. Nous avions l’ordre de passage établi pendant la journée. Nous observions les joueurs, tranquillement plongés dans l’étude laborieuse de la documentation de la pochette.

Comment allaient-ils réagir ? Est ce qu’on aurait finalement un mort sur Médileak ?

On s’était inquiété au matin de voir l’ambulance-école s’installer pile devant nos fenêtres, cassant un peu l’effet de surprise dès qu’une équipe serait confrontée à ce challenge. Jouant de son charme légendaire, Tungst a fait déplacer l’ambulance juste avant notre passage. Et tout s’est passé comme prévu.

Accompagnés par un formateur, les joueurs révisaient rapidement quelques principes de secourisme. Puis se retrouvaient face à notre pauvre Henri-Pierre, victime d’un arrêt cardiaque !

Une fois réanimé, il pouvait leur dévoiler le dernier flag.

The end of Medileak

Ce mannequin très réaliste, reprenait conscience, et leur demandait de transmettre toutes leurs informations à un grand journal local.

🏴‍☠️ Flag : Le Limousin Libéré

Et voilà. Fin.

3 équipes ont totalement terminé les challenges de la finale.

La 4ème équipe a fait preuve de beaucoup de ténacité, mais l’analyse longue et fastidieuse des documents a eu raison d’eux. Il ne leur manquait pas grand-chose, mais à 17h on a sonné la fermeture de l’enquête.

Retour à l’hôtel, petite pause bien méritée, puis de nouveau soirée tous ensemble. Cette fois bien plus sereine mais aussi avec tout le monde bien bien fatigué de la journée.

Le lendemain matin 9h, retour sur site pour l’annonce des résultats et la remise des récompenses.

Au revoir et chacun est reparti chez lui.

Voilà donc à quoi peut ressembler une finale d’un CTF osint, en présentiel. Un savant dosage de challenges en ligne, de sorties réelles, et d’expériences en tout genre. Le tout très humain, passionné et passionnant.

Je peux à présent partager avec vous les secrets des meilleures équipes d’osint : pas d’outils miraculeux, pas de techniques ou de stratégies impressionnantes. Une bonne structuration de la réflexion, une communication efficace, savoir s’appuyer sur les forces de chacun, et beaucoup de motivation et de curiosité.

Une expérience incroyable qui ne peut maintenant que vous encourager pour que la prochaine fois, ça soit VOTRE équipe qui participe à la finale !

Histoire de terminer sur Médileak : pendant l’annonce des résultats, les journalistes du Limousin libéré mettaient en ligne l’article dévoilant enfin toute l’histoire de ces 3 dernières années. Et oui, c’était Gizem la vraie méchante.

https://le-limousin-libere.fr/

L’article complet, pour le jour où le journal n’existera plus :

Peu de temps après, la banque Briance et Vienne publiait également un communiqué de presse sur son LinkedIn :

À lire aussi

Dans la même rubrique

Write-up

WU - MEDILEAK 2

Le Write Up de Medileak 2 est disponible en Markdown ici même : https://md.oscarzulu.org/share/p3vydij90c/p/write-up-medileakv2-qlMwFP1DUl

Lire le write-up →