Challenge cybersécurité : Opération Brigitte Friang (Partie 1)

Publié par Mickael Alibert le

Temps de lecture : 14 minutes

L’an dernier, la DGSE proposait un challenge sur le thème de la cybersécurité, le challenge Richelieu. Il s’agit de résoudre une suite d’énigmes faisant appel à des connaissances dans de nombreux domaines tels que la cryptographie, le hacking, la stéganographie… Je n’ai pas participé, mais j’ai suivi le parcours de Pierre-Yves et Charles-Henri, consultants à Zenika Nantes, il me trottait donc l’envie de participer de manière active à une expérience semblable si l’occasion se présentait à nouveau.

Cette année, du 24 octobre au 11 novembre, en partenariat avec l’ESIEE Paris, un nouveau challenge est proposé, l’Opération Brigitte Friang. Pris par le quotidien, j’avais laissé de côté cette information, jusqu’à ce que le second confinement français vienne libérer de la place dans mon agenda. C’est donc comme cela que je me suis lancé dans ce challenge le 30 octobre. 

Ce retour d’expérience est composé de trois articles. Chacun d’entre eux vous permettra de suivre mon cheminement, mes succès et mes échecs sur les différentes épreuves du challenge. Il vous montrera également comment de petites négligences sur la sécurité peuvent avoir de lourdes conséquences, tels que des vols de données ou de l’impersonnalisation. En fin de chaque article, je ferai un retour sur quelques-unes de ces erreurs, qui sont bien plus répandues qu’on ne le pense, et sur ce qui aurait pu être mis en place pour concevoir une solution moins exploitable par des personnes malveillantes. 

Démarrage du challenge

L’adresse du challenge amène sur une page web assez simple, demandant de bien ouvrir les yeux. En inspectant le code source de la page, on tombe tout de suite sur une information intéressante.

Extrait du code source de la page

On se rend donc sur la page indiquée dans le lien (https://challengecybersec.fr/static/message-secret.html), et on tombe sur une page web affichant le texte suivant :

Message secret

Ce texte ne ressemblant pas à un langage connu, il a probablement été généré par un outil à partir d’un message lisible. En regardant le titre de la page web, “Cesar”, on peut supposer que le message a été obfusqué par un code de César. Il existe une multitude d’outils déjà implémentés pour parvenir à trouver, dont le site Dcode, qui permet de brute-forcer le nombre utilisé pour les décalages de lettres. On peut donc essayer avec la première phrase:

Déchiffrement en brute force avec Dcode
Décallage avec un résultat lisible

Pour le nombre 7, on trouve un message qui parle de Brigitte Friang, la piste semble bonne ! Le message est donc obfusqué via un décalage de 7 lettres (a=>t, E=>X, O=>H…). Le message obtenu contient des informations sur la vie de Brigitte Friang, mais aussi des phrases concernant le challenge: 

Si vous parvenez a lire ce message, c’est que vous pouvez rejoindre l’operation «Brigitte Friang». Rejoignez-nous rapidement. […] Completez l’URL avec l’information qui est cachee dans ce message. […] D’autres agents sont sur le coup au moment ou je vous parle. Les meilleurs d’entre vous se donneront rendez-vous a l’European Cyberweek a Rennes pour une remise de prix. Resolvez le plus d’epreuves avant la fin de cette mission et tentez de gagner votre place parmi l’elite!

Une information est donc cachée dans le message. En regardant le code source la page web, on constate que certains caractères sont en gras dans le texte:

Format particulier

Si l’on décode la chaîne de caractères obtenue (/joha), on trouve le lien (/chat), qui nous amène aux premières épreuves du challenge.

Le Chat, nid d’espions

Service de messagerie entre agents

On arrive donc sur un logiciel de chat, dans lequel nous discutons avec 5 agents. L’agent de direction nous pose le contexte, en nous donnant l’occasion de placer quelques références à OSS 117 au passage (l’entièreté des dialogues est scriptée, les références aussi belles soientelles ne sont donc pas les miennes) .

Direction des agents

Armand nous apprend qu’Evil Gouv, le gouvernement d’Evil Country, s’apprête à passer à l’action pour un plan de grande envergure. C’est pour cela que l’agent 42 (moi) doit intervenir, en s’appuyant sur les pistes identifiées par nos 4 autres contacts, pour contrecarrer leur plan.

Chaque agent possède sa spécialité, et un chemin d’épreuves unique menant à la plateforme de l’étape deux. Je ne l’ai découvert que plus tard, mais il n’est donc nécessaire de résoudre qu’un seul des quatre chemins pour avancer à la prochaine étape. Je me suis donc lancé sur les quatres épreuves, voyant jusqu’où je pourrais aller sur chacune.

Antoine Rossignol – Service Crypto

Cryptologie

L’épreuve commence avec quatre fichiers. Le premier fichier texte contient un échange entre l’agent 40 (notre prédécesseur). On y apprend qu’un de nos agents a intercepté du matériel de chiffrement et un message chiffré émis par Evil Chems qui doit contenir des informations capitales sur la livraison de produits chimiques. Le matériel a donc été envoyé à Eve Descartes, une spécialiste des attaques matérielles d’ESIEE-Paris. Les trois fichiers suivants contiennent le rapport d’analyse de cette dernière, avec une archive chiffrée, un layout qui doit être le scan du matériel, et un compte rendu d’analyse en pdf.

Rapport d’analyse transmis par Eve Descartes

N’ayant aucun mot de passe pour retrouver les données obfusquées dans les autres documents, c’est de ce compte rendu d’analyse que nous allons partir. Après diverses scan du fichier pdf, il ne semble pas cacher de données. C’est donc sûrement l’une des données visibles qui nous permettra d’avancer.

En en cherchant un peu plus sur Eve Descartes, notamment sur son travail au sein de l’ESIEE, on ne la trouve que sur l’annuaire de l’école

Annuaire de l’ESIEE

On peut remarquer une chose étrange, alors que son numéro de téléphone est renseigné dans le document qu’elle nous a fourni, il n’apparaît pas sur l’annuaire de l’école. Est-ce un oubli de la part de l’école, ou le mot de passe caché dans le document par Eve ?

Pour en avoir le cœur net, j’essaie le téléphone en tant que mot de passe, sans séparation, avec des caractères entre chaque nombres, sans succès. Il ne me reste alors qu’une seule solution, appeler le numéro, et voir si Eve répond. Nous sommes le samedi 31, il est 23:45, et j’ai peu d’espoirs qu’une personne me réponde… Et j’avais raison, je suis accueilli par des bips stridents que j’attribue en premier lieu à un manque de réseau, mais qui s’avèrent en fait suivre un certain rythme, avec deux variations, long ou court. 

En lançant un enregistrement via Audacity, on découvre la forme du son lors de l’appel.

Visualisation de l’audio de l’appel

Nous entendons très probablement du Morse, que l’on peut décoder grâce au visuel créé par Audacity pour obtenir le mot “resistance”, qui est le mot de passe du fichier layout.pdf.

Extrait de layout.pdf

On obtient ainsi la photographie du matériel responsable du chiffrement. On pourra en déduire l’algorithme de chiffrement, et si ce dernier est réversible, retrouver la clé de chiffrement utilisée pour l’archive.
Ayant déjà passé beaucoup de temps sur une épreuve mêlant hardware et crypto lors d’un autre challenge, je décide de m’arrêter là.

Jérémy Nitel – Service Web

Web

Cette seconde épreuve démarre par une discussion sur la plateforme Web d’un entrepôt d’Evil Country, soupçonné d’être l’une des plaques tournantes d’une opération menée par Evil Gouv. La plateforme, Stockos, contiendrait des informations pouvant relier le gouvernement à des activités illégales. L’agent 32 ayant mangé une mauvaise blanquette, c’est à nous que revient la lourde tâche de trouver des informations compromettantes, et de réserver un billet d’avion sur le site de la compagnie AirEvil.

Page d’accueil de stockos

Le défi commence donc sur la page d’accueil de Stockos, qui demande un login. Heureusement, Jérémy nous a indiqué que les utilisateurs de Stockos n’utilisent pas de mots de passe très originaux. Voyons grand, et essayons directement de trouver un compte avec tous les droits, comme celui d’un administrateur. En essayant le couple très classique “admin”/”admin”, on parvient à se connecter avec l’utilisateur d’administration sur la plateforme.

Une fois connecté, on trouve sur le site plusieurs pages contenant quelques informations sur de la gestion de stock, des finances, mais rien de particulièrement incriminant. Nous allons donc passer à l’étape suivante d’investigation, jouer un peu avec les possibilités offertes par le site jusqu’à ce qu’il montre une faiblesse. 

Sur la page de gestion des stocks de Stockos, on trouve un champ de saisie permettant de filtrer les commandes. Rien de particulier à première vue (si on oublie les commande de la SCEP pour l’ensemble des ingrédients d’une blanquette), mais si ce champ n’est pas traité côté navigateur, il nous offre une possibilité d’interagir avec le serveur, et dans le cas d’une négligence sur l’aspect sécurité lors du développement de Stockos potentiellement d’obtenir très facilement des informations normalement inaccessibles.

Extrait des stocks sur Stockos

Pour le vérifier, rien de plus simple, nous allons passer des caractères spéciaux qui, s’ils ne sont pas correctement maîtrisés par l’application, devraient provoquer un problème dans notre requête et donc potentiellement une erreur sur la base de données.  

Message d’erreur lors d’une recherche

Avec le caractère ‘#’, correspondant à un commentaire dans une requête, on provoque une erreur sur la BDD, qui en plus nous est renvoyée. Nous sommes donc face à une application sensible aux injections SQL
L’étape suivante est de déterminer quelles sont les tables de la BDD auxquelles nous avons accès, via la recherche suivante: 

1111' 
UNION 
select table_name,TABLE_SCHEMA,TABLE_TYPE,version,TABLE_ROWS from information_schema.tables
#
  • Ligne 1 : chaîne de caractères aléatoires utilisée pour filtrer les colis et n’en retourner aucun
  • Ligne 2 : mot clé nous permettant d’effectuer une nouvelle requête de sélection
  • Ligne 3 : requête SQL permettant de lister les tables de la base de données
  • Ligne 4 : caractère utilisé pour signifier le début d’un commentaire, et ainsi ignorer tout ce qui peut venir à la suite de la requête

La requête SQL lancée par le logiciel côté serveur est probablement de la forme:

SELECT id,item_name,order_status,section,customer from orders where item_name=’recherche%’ 

Avec notre injection, elle devient alors la requête suivante :

SELECT id,item_name,order_status,section,customer from orders where item_name=’1111' UNION select table_name,TABLE_SCHEMA,TABLE_TYPE,version,TABLE_ROWS from information_schema.tables 

On obtient ainsi les informations suivantes:

Extrait de la liste des tables de la base

Il existe 4 tables qui nous intéressent, une table de clients, une table de commandes, une table sur les sections de stockage, et une table sur les fournisseurs. 

On veut essayer de déterminer si Evil Gouv a commandé des produits dangereux, c’est donc vers la table customer que l’on va se tourner.

En passant l’injection SQL 111' union select * from customer#, on obtient :

Extrait de la liste des clients de Stockos

Pour valider que le gouvernement trempe bien dans des affaires suspectes, on va ensuite lister les commandes pour cet utilisateur, avec l’injection 1111' UNION select id,concat(order_date,order_status),customer,supplier,item_name from orders#.

On découvre ainsi que certaines commandes sont  flaguées “confidentielles”, qu’elles n’apparaissent pas sur l’interface web, et qu’elles incriminent Evil Gouv par la nature des produits transportés.

Extrait des commandes confidentielles

Le lien identifié, il est désormais temps de passer à la commande du billet d’avion sur le site de la compagnie aérienne.

Page d’accueil de EvilAir

Après une simple recherche sur le site, on parvient à retrouver le vol dont il est question.

Vol ABDJI6

Cependant, la réservation nécessite de créer un compte, et la création de compte n’est validée qu’à la réception d’un e-mail avec un lien d’activation. Nous allons donc essayer de créer un compte, avec un e-mail jetable, afin de pouvoir se connecter. Après la création du compte avec un mail jetable, c’est l’échec pour Luc, qui ne peut réserver pour cette destination, qui n’est probablement accessible que pour les agents du gouvernement.

Luc échouant à reserver le vol

A ce stade, nous avons un vol potentiellement réservable seulement par des habitants d’Evil City, et le mail d’un agent d’Evil Gouv. Nous allons donc essayer d’utiliser le compte de ce dernier sur le site de la compagnie pour réserver un billet à sa place. Ne possédant ni son mot de passe sur le site d’Evil Air, ni l’accès à sa boîte mail, nous allons nous intéresser à la manière dont sont traités les mots de passe, notamment lors de la demande de renouvellement. 

Pour cela, avec le compte que nous avons créé, nous allons lancer la procédure d’oubli de mot de passe. Un lien est envoyé, qui nous amène sur une page nous indiquant notre mot de passe.

Si l’on relance la procédure d’oubli de mot de passe une seconde fois, le lien ne change pas, ce qui veut dire que ce lien est généré à partir d’une information liée à l’utilisateur, sans inclure dans la génération une donnée aléatoire empêchant un usage malveillant de la fonctionnalité. L’URL générée contient seulement des caractères alphanumériques, et connaissant la relation entre les logiciels d’Evil Gouv et la sécurité, il y a fort à parier qu’un encodage très simple a été utilisé pour le générer. 

En essayant de décoder la chaîne bHVjQHlvcG1haWwuY29t en Base64, on obtient luc@yopmail.com, qui est l’e-mail utilisé pour notre compte. Les liens de reset sont donc de la forme: https://challenge[…]/reset/base64(email).

En accédant à l’URL générée à partir de l’email trouvé sur Stockos, on arrive sur la page d’oubli de mot de passe de l’agent d’EvilGouv: 

Le mot de passe est maintenant trouvé, il suffit juste de se connecter et de commander le billet pour obtenir un QR code, qui dévoile notre premier flag, validation de notre avancée sur le défi:

DGSESIEE{2cd992f9b2319860ce3a35db6673a9b8}

Nous pouvons répondre à Jérémy, qui nous renvoie immédiatement un nouveau défi.

Deuxième défi de Jérémy Nitel – Service Web

Pour ce nouveau défi, nous recevons un fichier pcap, une capture réseau interceptée. Nous pouvons ouvrir ce fichier avec un utilitaire d’analyse réseau tel que Wireshark.

Extrait de la capture réseau sur Wireshark

Le trafic sauvegardé dans cette capture est du trafic HTTPS, qui n’est donc normalement pas visible en clair sans posséder la clé privée des échanges. Il est évident que quelque chose s’envoie depuis le client vers un serveur web, et que les certificats utilisés présentent des faiblesses, mais je ne suis toutefois pas parvenu à les exploiter et aller plus loin dans ce défi.

Alphonse Bertillon – Service Forensic

Forensic

Le challenge du service Forensic commence par une détection d’intrusion,  en explorant les logs d’un serveur web. Le fichier transmis contient 2000 lignes de log de la forme suivante:

66.194.89.135 - - [Nov 04 2020 11:05:43] "POST /login HTTP/1.1" 200 59 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20"174.231.146.50 - - [Nov 04 2020 11:06:33] "GET /js/script.js HTTP/1.1" 200 23 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
155.43.49.98 - - [Nov 04 2020 11:07:40] "GET /home HTTP/1.1" 200 201 "-" "Mozilla/5.0 (Android; Tablet; rv:19.0) Gecko/19.0 Firefox/19.0"
174.231.146.50 - - [Nov 04 2020 11:08:48] "POST /login HTTP/1.1" 200 48 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246"
184.2.142.43 - - [Nov 04 2020 11:10:25] "GET /contact HTTP/1.1" 200 400 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"
174.231.146.50 - - [Nov 04 2020 11:12:01] "GET /img/logo.ico HTTP/1.1" 200 228 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1"


De manière un peu automatique, je décide de lancer une recherche du mot “evil” dans le fichier, et tombe sur un résultat:

# grep -i evil access.log
179.97.58.61 - - [Nov 05 2020 16:22:20] "POST /login HTTP/1.1" 200 476 "-" "Evil Browser"

Dans cette ligne de log, nous voyons qu’un utilisateur a réussi à envoyer (POST) des identifiants valides (200) à la page de login(/login), avec son navigateur “Evil Browser”. Nous pouvons donc renvoyer l’IP identifiée à Alphonse.

Deuxième défi d’Alphonse Bertillon – Service Forensic

Il nous renvoie une image probablement liée à la résistance. Nous savons également que le gouvernement a perdu des baies de disques récemment, suite à une attaque sur leur réseau, on peut donc faire le lien entre les deux en imaginant que cette image contient les informations extraites par la résistance lors de leur cyber-offensive.

Dans un environnement isolé, nous allons télécharger cette image et l’inspecter en détail afin d’en ressortir de potentielles informations.

evil_country_landscape.jpg

L’image en elle-même est plutôt banale, et expose un paysage qu’on imagine être celui d’Evil Country. Par contre, la taille du fichier n’est pas cohérente avec son contenu, une petite image pesant plus de 300Mo cache forcément quelque chose. L’utilisation du logiciel binwalk, qui permet notamment d’identifier des fichiers cachés dans des images, nous permet d’extraire 7 fichiers, dont deux fichiers de types .img qui correspondent à des images de disques.

Fichiers extraits par Binwalk

En essayant de monter ces images disques, on se rend compte que ce sont les images de disques en RAID, et que le montage ne se fera pas en deux commandes. Face à la complexité de cette opération, j’ai préféré m’arrêter là pour la mission du Service Forensic.

Dans la deuxième partie de ce retour d’expérience sur l’Opération Brigitte Friang, je détaillerai ma progression sur la dernière mission disponible proposée par l’agent Blaise Pascal du service Algo.

Comment limiter/éviter ces attaques ? 

Jérémy Nitel – Service Web:
Stockos :
Quelle que soit la qualité et la sécurisation du code du cœur de l’application, la plus importante des erreurs ici est l’utilisation de mots de passe simples.  De nombreux gestionnaires de mots de passe gratuits sont disponibles (Keepass, Bitwarden …), les principaux navigateurs proposent quasiment tous un moyen de générer et d’enregistrer des mots de passe. Avoir accès à des ressources supposées privées est la pire chose qui puisse arriver à l’application.

Les attaques par injections SQL sont tellement courantes qu’aujourd’hui il est possible de lancer en quelques secondes un outil capable de les générer et les exécuter à notre place. La bonne pratique simple à appliquer est de traiter l’ensemble des données provenant d’un utilisateur comme malveillantes, et ainsi de sécuriser chacun des inputs. 

Evil Air:
La page d’oubli de mot de passe permet de retrouver le mot de passe saisi à l’inscription. Tout outil ou site vous permettant de retrouver votre mot de passe saisi à la connexion conserve ce dernier dans un format réversible, ce qui signifie que si quelqu’un a accès au stockage, il aura accès à votre mot de passe. Les exemples de cette pratique (illégale en France) sont nombreux (les Echos). Côté application, il est important de toujours stocker les mots de passe de manière non réversible. Côté utilisateur, pour vos mots de passe, utilisez toujours un mot de passe différent pour chaque outil ou site, afin de vous protéger en cas de fuite.

Le mot de passe stocké en clair est une erreur aux très lourdes conséquences dans le cas de ce site, puisque la génération de liens de secours est prévisible. Si il est possible d’obtenir les liens de rappels de mots de passe pour d’autres utilisateurs, il est également possible de se connecter avec l’ensemble des comptes connus. Pour pallier cela, il est simple de rajouter un critère aléatoire au lien de reset, tel que le timestamp de la demande. Cela découragera la majorité des utilisateurs malveillants.

Alphonse Bertillon – Service Forensic:
Les fichiers d’image disque d’Evil Gouv ont pu fuiter seulement grâce à l’attaque sur leur réseau interne. Pour peu que le réseau de l’entreprise ne soit pas complètement isolé et sécurisé, ce genre d’attaque peut provenir de n’importe quelle personne, et les moyens d’attaque sont extrêmement nombreux (fichier malveillant, lien dans un mail, clé usb par terre, PC seul déverrouillé dans un train, …). 

Si vous avez des questions sur cette article, ou que vous souhaiteriez plus de détails techniques sur l’un des sujets abordés, n’hésitez pas à me contacter sur Twitter @Alibert_m.

Catégories : Sécurité

Mickael Alibert

Practice leader - Lead SRE