Export de Telegram au format csv – introduction à BeautifulSoup

Export de Telegram au format csv – introduction à BeautifulSoup


Quand les petites mains ne suffisent plus pour parcourir des quantités monstrueuses de données.
Quand les expressions régulières sont hors-jeu face au html.
Quand l’agrégation de données dans un beau fichier csv ne semble qu’un rêve lointain.

BeautifulSoup (et Python dans sa globalité) est là !

Il y a quelques temps, la question de comment récupérer l’historique des messages Telegram pour les transférer dans un fichier au format csv a été posée par un des membres d’OpenFacto. Si la réponse vous intéresse, et que vous souhaitez apprendre quelques bases de programmation Python en chemin, vous êtes sur le bon article.

*****
TL;DR : voir le premier paragraphe pour l’export Telegram, le code python html → csv se trouve à la fin.
*****

Export de l’historique Telegram

La version bureautique de Telegram propose une fonctionnalité d’export des messages :

Export de l’historique Telegram

Il est possible de sélectionner les éléments à exporter parmi les messages texte seuls, photos, vidéos, messages vocaux, etc.

Options pour l’export du salon de discussion


A l’issue du téléchargement, on obtient un ensemble de fichiers au format html contenant l’historique récupéré. 
Vous vous apprêtez à sortir vos meilleures expressions régulières pour parser ces fichiers ? Retirez immédiatement vos doigts de ce clavier, malheureux ! Les expressions régulières, aussi élégantes soient-elles, ne sont pas adaptées pour parser du html (voir notamment cette fameuse réponse sur StackOverflow). Oui, c’est réalisable, mais le format d’une page html fait qu’en général vous passerez plus de temps à trouver la bonne regex qui matche la bonne balise à chaque fois, que si vous utilisiez un outil créé expressément pour cette tâche.
Ici nous allons faire usage de la librairie Python BeautifulSoup.

Quelques bases pour Python et BeautifulSoup

En programmation, il est recommandé d’utiliser un environnement de développement intégré (IDE en anglais), par exemple VSCodium, logiciel libre, ou Pycharm, spécifique à python. Un IDE est un éditeur de texte exclusivement utilisé pour coder, qui permet par exemple la coloration syntaxique du code, et facilite son écriture en soulignant notamment les librairies non installées, les variables non déclarées/mal orthographiées, etc. Oui, au vu de la taille du code, cela peut s’écrire bêtement sous Vim (ce qui a d’ailleurs été le cas). Cependant, à la longue, un IDE est objectivement appréciable. 

Pour pouvoir utiliser une librairie comme csv, permettant de créer/manipuler un fichier csv, on utilise le mot clé import suivi du nom de la librairie. Nous avons également besoin de os, pour la manipulation de noms de fichiers et dossiers. Et pour BeautifulSoup il suffit d’importer une partie seulement de la librairie, à savoir bs4. Si la librairie n’est pas déjà installée sur l’ordinateur, on l’installe via la commande pip install beautifulsoup4, à taper soit dans un terminal classique, soit dans le terminal intégré à l’IDE.

Note : il s’agit d’une simple copie d’écran. Le code complet se trouve à la fin de l’article.


Nous partons ici du postulat que nous plaçons le code dans un fichier (par exemple telegram.py) se trouvant dans le même dossier que l’ensemble des fichiers html récoltés. Nous définissons donc la variable directory, à laquelle on assigne le chemin vers le dossier contenant le fichier python (et donc les fichiers html voisins).

Ensuite, pour créer un tableau csv, avec des lignes, des colonnes, nous allons d’abord créer une liste python (cf. [ ], qui est une liste vide), elle-même constituée de listes : par exemple le n-ième élément de cette liste correspond à la n-ième ligne du tableau, et est implémenté sous la forme d’une liste  où le premier élément correspond à la première colonne, le deuxième élément à la deuxième colonne, etc.. En résumé, un tableau = une liste de listes.

Pour une question d’esthétisme et de clarté, nous allons nommer nos colonnes. A cette fin, nous ajoutons (.append()) à la liste (vide) le nom de chaque colonne, la première ligne des fichiers csv étant généralement utilisée pour déterminer les noms des colonnes.


A titre de rappel, Python est un langage faisant usage de l’indentation (tabulation ou quatre espaces) afin de délimiter ses blocs de code (boucle, condition, fonction, classe, etc.). Ici nous allons parcourir (boucle for – ne pas oublier le caractère ‘:’ en fin de ligne, et l’incrémentation de l’indentation) l’ensemble des fichiers contenus dans le dossier directory. Puis si le fichier se termine par l’extension « .html » (condition « if », à nouveau ne pas oublier le caractère ‘:’ et l’incrémentation de l’indentation),  alors on l’ouvre en lecture simple.


Avant de nous plonger dans les fonctions offertes par BeautifulSoup, il faut jeter un œil aux fichiers html pour déterminer les informations que nous souhaitons extraire ainsi que leur emplacement.A titre d’exemple, voilà ce qu’un message Telegram peut donner :

     <div class="message default clearfix" id="message197514">
      <div class="pull_left userpic_wrap">
       <div class="userpic userpic2" style="width: 42px; height: 42px">
        <div class="initials" style="line-height: 42px">
        </div>
       </div>
      </div>
      <div class="body">
       <div class="pull_right date details" title="11.02.2020 09:03:59">
09:03
       </div>
       <div class="from_name">
Toto
       </div>
       <div class="text">
10:03: Hello world !
       </div>
      </div>
     </div>

On voit qu’un message est délimité par des balises <div> qui ont pour classe message default clearfix.
A l’intérieur de chaque message, l’heure et la date de réception par le serveur se trouvent dans une autre balise <div> dont la classe est pull_right date details, plus exactement en tant que valeur de l’attribut title. De manière similaire, l’expéditeur se trouve dans une balise <div> de classe from_name, à la différence que cette fois il s’agit du texte contenu dans la balise et non de la valeur d’un attribut de cette balise. 


Voyons maintenant comment récupérer tout cela avec BeautifulSoup : 

  • Pour récupérer toutes les balises html correspondant à un critère, on utilise la méthode findAll(). Il est possible de spécifier notamment le nom de la balise recherchée et la classe.
  • Si une seule balise doit être récupérée, on utilise la méthode find().
  • Le contenu d’un attribut de balise s’obtient, comme pour un dictionnaire, en spécifiant son nom dans .attrs .
  • Enfn le contenu d’une balise est lisible via .text .

Il s’agit ici d’une partie infinitésimale de toutes les fonctions offertes par BeautifulSoup. Sentez-vous libres de lire la documentation pour en découvrir plus !


On notera dans le code ci-dessous que l’heure et la date ont été séparés dans deux variables distinctes afin de créer deux colonnes toutes aussi distinctes. En outre, une condition a été rajoutée dans la récupération du contenu du message pour gérer un cas spécifique à l’historique étudié lors de l’écriture du code.


La méthode .append() permet d’ajouter une nouvelle colonne à la ligne courante row. Une fois la ligne complète, on l’ajoute à la liste de lignes output_rows.


A noter toutefois que ce code est simplifié au maximum et ne gère pas les erreurs (exceptions) pouvant être levées. Un bon programmeur prendra le temps de vérifier par exemple que la méthode find() ne retourne pas un None – lorsque l’élément cherché n’est pas trouvé – avant d’appliquer une autre méthode sur l’élément retourné, ce qui évitera au programme de planter.


Il ne reste alors plus qu’à écrire le contenu de output_rows dans notre fichier csv. Le fichier peut être ouvert avec le paramètre ‘a’ – et non ‘w’ – si l’on souhaite ajouter (append) de nouvelles données à celles déjà présentes dans le fichier plutôt que d’écraser celles déjà existantes.


Pour faire tourner ce bout de code, il suffit lancer la commande python suivie du nom du fichier (ici telegram.py) dans un terminal, et un fichier output.csv apparaîtra quelques secondes plus tard dans le même répertoire.

Code complet

Ici le code étudié ci-dessus :

from bs4 import BeautifulSoup
import csv
import os

# Placer le script dans le meme repertoire que les fichiers d'historique
directory = os.path.dirname(os.path.realpath(__file__))

# Creation du tableau et des noms de colonnes
output_rows = []
output_rows.append(("Date", "Time", "Sender", "Message"))

for html_file in os.listdir(directory):
    filename = os.fsdecode(html_file)

    if filename.endswith(".html"):
        html = open(filename).read()
        soup = BeautifulSoup(html, features="html.parser")

        msgs = soup.findAll("div", {"class": "message default clearfix"})
        for msg in msgs:
            row = []

            # Date et heure
            time = msg.find("div", {"class": "pull_right date details"}).attrs["title"]
            date, time = time.split()
            row.extend((date, time))

            # Expediteur
            row.append(msg.find("div", {"class": "from_name"}).text.strip())

            # Message
            date_msg = msg.find("div", {"class": "text"}).text
            if ": " in date_msg:
                msg_alone = date_msg.split(": ")[1].strip()
            else:
                msg_alone = date_msg.strip()
            row.append(msg_alone)

            output_rows.append(row)

with open("output.csv", "w") as csv_file:
    writer = csv.writer(csv_file)
    writer.writerows(output_rows)

Le code mis à jour est disponible sur le dépôt GitHub OpenFacto.

Pour aller plus loin

Scraper les internets

Si Telegram a pris le parti de faire usage du format html pour stocker ses historiques, il n’est pas le seul à l’utiliser :  Internet regorge de pages html ! (ce qui est sans doute le principal cas d’application visé au départ par BeautifulSoup, plus que les historiques Telegram…)

Alors pourquoi ne pas employer ces nouvelles connaissances en vue de parcourir (on dira « scraper ») la toile mondiale ?
La seule différence notable est qu’il faudra dans un premier temps récupérer la page html qui nous intéresse. Python met à disposition la librairie request, qu’il suffit d’importer comme précédemment avec le mot clé import. Nous obtenons le contenu de la page via la méthode request() à laquelle nous passons la variable contenant l’url ainsi que, astuce de sioux, un objet headers. Celui-ci permettra de contourner certaines vérifications qui s’assurent que les requêtes sont bien réalisées par un navigateur et non un robot.
Pensez également à mettre un temps de pause (via la méthode sleep()) entre deux requêtes pour éviter de surcharger le serveur requêté – et provoquer un DoS si ce dernier est un peu fragile.

import requests
from random import randint
from time import sleep

useragent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0'
headers = {
    'User-Agent': useragent
}
url = "" # url du site à requêter

sleep(randint(3,10))
response = requests.get(url, headers = headers)

Crontab

Quid si vous souhaitez aller toujours plus loin dans l’automatisation ? C’est le moment de passer à… cron ! Il s’agit du programme, sous Linux et Mac, permettant de programmer une tâche afin qu’elle soit exécutée de manière répétitive à un moment précis. L’équivalent Windows-ien est le Task Scheduler. Nous allons nous concentrer ici sur cron.

Pour lister les tables cron déjà disponibles, on lance la commande suivante :
crontab -l

Pour éditer les tables, on utilise l’option -e :
crontab -e

Un doute sur une commande ? On utilise man crontab afin d’afficher le manuel (appuyer sur la touche ‘q’ pour le quitter).
Une fois la commande d’édition lancée, vous vous trouvez dans un éditeur de texte (généralement Vi(m) ou Nano). Pour éditer (entrer dans le mode édition) de Vi(m), appuyez sur la touche ‘i’. Pour sortir de ce mode, appuyez sur la touche echap. Pour quitter le document sans sauvegarder (si, si, c’est possible de quitter Vi(m)), appuyez sur echap puis « :q! ». Pour sauvegarder, echap puis « :w ». Pour plus de commandes : .


Chaque ligne correspond à une tâche à exécuter et a le format suivant :

mm hh jj MM JJ tâche avec :

  • mm : les minutes (0-59) ;
  • hh : les heures (0-23) ;
  • jj : le jour du mois (0-31) ;
  • MM : le mois (1-12, ou les noms) ;
  • JJ : le jour de la semaine (0-7, 7 correspondant à dimanche, ou les noms) ;
  • tâche : la tâche à exécuter.

Les ranges sont acceptés, tel que 0-15 dans les minutes pour une exécution à chaque minute durant le premier quart d’heure. Le charactère spécial ‘*’ signifie « du premier au dernier », et peut être « divisé », comme avec « */2 » dans les heures pour signifier « toutes les deux heures ».

Par exemple, pour faire tourner un script tous les jours à 23h59 :
59 23 * * * /chemin/vers/mon_script.py

Ou toutes les 10 minutes :
*/10 * * * *  /chemin/vers/mon_script.py

IMPORTANT : ce code est donc exécuté automatiquement suivant la configuration dans la crontab. Il est essentiel que le fichier exécuté soit détenu et éditable par votre utilisateur et seulement votre utilisateur. Si le script est lancé en tant que root (ou autre équivalent à l’administrateur de la machine), il ne doit appartenir qu’à root (ou équivalent) et seulement éditable par lui. Autrement, si votre machine se fait compromettre, un attaquant pourra éditer le script et attendre tranquillement l’exécution automatique de son code malveillant avec les droits de votre utilisateur, ou, pire, ceux de root.

Prenez donc le temps de vérifier les droits sur votre script :

ls -la /chemin/vers/mon_script.py

Les droits inscrits doivent ressembler à quelque chose comme :
-rwxrw-r--.  1 nom_utilisteur nom_groupe taille date  mon_script.py

Ce qui signifie :

  • lecture (r), écriture (w), exécution (x) pour l’utilisateur nom_utilisateur ;
  • lecture, écriture pour l’ensemble des utilisateurs appartenant au groupe nom_groupe ;
  • lecture seule pour tous les autres utilisateurs.

Utilisez la commande chown nom_utilisateur: mon_script.py pour modifier l’utilisateur et le groupe propriétaires du script.

Utilisez la commande chmod 764 mon_script.py pour positionner les droits ci-dessus.

Au besoin, vérifiez que tous les dossiers parents appartiennent à l’utilisateur en question – ou un utilisateur plus privilégié comme root.

Trace Labs, CTF et tatouages

Trace Labs, CTF et tatouages


Samedi 11 avril 2020, 23h59.  Plus qu’une minute avant le début des recherches...

Si la gamification est un concept qui touche de plus en plus de domaines, c’est peut-être ici une des meilleures applications qui en découle. Dans moins de 60 secondes s’apprêtait à se tenir la quatrième édition du CTF (Capture The Flag) organisé par Trace Labs, une organisation visant à récolter un grand nombre d’informations sur des personnes disparues par le biais d’évènements comme celui-ci. 

Plateforme du CTF (source : vidéo de présentation de Trace Labs)

Une quinzaines de profils sont déposés sur la plateforme dédiée, donnant les informations de bases sur les disparus : nom, prénom, âge, date de naissance, taille, poids, date à laquelle la personne a été vue pour la dernière fois, et parfois des détails concernant sa disparition, comme les personnes avec qui elle est suspectée se trouver. De là, les participants ont 6 heures (de minuit à 6h du matin en France, horaires américains obligent) pour réunir un maximum d’informations sur ces profils, toutes accessibles exclusivement en sources ouvertes. Pas de prise de contact possible avec les membres de la famille et amis ; pas de hack ; pas de récupération d’informations via des sites de médias, légaux, ou en lien direct avec la disparition de la personne (faciles à trouver et pas de valeur ajoutée).

Les données récoltées sont ensuite déposées sur la plateforme du CTF, qui permet d’attribuer des points suivant le contenu : informations sur les amis, 10 points ; informations sur la famille, 20 points ; réseaux sociaux du sujet, 50 points ; détails sur le jour de sa disparition, 500 points ; données trouvées sur le Dark Web, 1000 points, etc. . 

Si la conversion « données sur une vie humaine/points » surprend de prime abord, on comprend vite que le but derrière n’est pas de prendre à la légères ces vies. Il s’agit simplement de donner une dynamique aux recherches, motivées non seulement par la volonté de contribuer à un projet utile et de grande ampleur, mais aussi de trouver un maximum d’informations en un temps limité avec la volonté de se dépasser soi-même – et les autres – où chaque nouveau point gagné s’accompagne d’une montée d’adrénaline propre aux CTFs. Qui dit performance, dit plus de données de récoltées, dit plus de chances de retrouver les sujets disparus.

C’est  dans ce contexte que l’équipe d’OpenFacto a pris part à son premier CTF un dimanche matin en pleine période de confinement. 

Au cours de leurs recherches, un des membres de l’équipe s’est notamment heurté à une problématique à laquelle il n’avait pas l’habitude de se confronter : une des jeunes personnes dont il étudiait le profil présentait un tatouage dans le cou. Que faire du motif inscrit sur sa peau ?  Etait-il possible de faire le lien entre la disparue et une organisation quelconque ?

De l’identification des tatouages

Dans le cas étudié ici, un tatouage est visible dans le cou côté gauche du sujet. On peut observer le nombre « 112 » à l’encre noire, et ce qui pourrait apparaître comme le caractère ‘%’.

Photo floutée et retouchée de la personne portant le tatouage

Un tatouage pour les identifier tous


Si l’identité de la personne est connue dans le cas présent, lorsque l’on ne dispose que d’informations limitées sur un individu (ex : son physique), les tatouages font parti des signes distinctifs permettant d’aiguiller, parfois de manière significative, une enquête. On peut prendre ici l’exemple cité par Katelyn Bowden, fondatrice de la Badass Army qui se donne pour mission de lutter contre le revenge porn, narrant une de ses « premières expériences d’OSINT »  sur le podcast de la conférence d’OSINT et SE Layer 8.

Suite au vol de son sac à main par un homme portant un tatouage de mitrailleuse au visage, et du fait du manque de réactivité des autorités locales, elle décide de chercher par elle-même le malfaiteur. Pour ce faire, elle poste un message sur le groupe Facebook local de la ville. Toute l’astuce dans sa démarche est de ne pas avoir demandé de manière frontale si des gens connaissaient l’homme au visage tatoué. Au contraire, elle a pris le parti de simplement poster un message se lamentant des choix pathétiques de certaines personnes concernant le motif de leurs tatouages. Elle a ensuite demandé aux autres habitants si eux aussi avaient leurs propres exemples. Le commérage étant une activité particulièrement appréciée dans les petites communautés, Katelyn a rapidement reçu la réponse qu’elle attendait : une femme mentionnant le tatouage en forme de mitrailleuse sur le visage de son neveu. L’expérience décrite ici s’inscrit bien dans une démarche de récolte d’informations en source ouverte : le débat a certes été lancé par la victime du vol, mais l’agrégation de données s’est faite de manière passive, les gens postant d’eux-mêmes leurs messages sans qu’il n’y ait besoin de leur soutirer de manière active l’information.

Ce qu’il faut en retenir – outre le fait, comme le fait remarquer Katelyn, qu’un tatouage de mitrailleuse sur le visage n’est pas le meilleur moyen de rester discret – c’est que les tatouages sont clairement des signes distinctifs à prendre en compte dans une investigation. En plus de pouvoir plus facilement repérer la personne sur d’autres photos, ce détail permet, s’il est particulièrement original, d’identifier la personne – à condition de s’adresser à une communauté qui le connaît.


Des tatouages pour… en regrouper certains


C’est d’ailleurs aux communautés auxquelles nous allons nous intéresser dans cette partie. Suite aux interrogations concernant le tatouage cervical, un autre membre de l’équipe a rapidement aiguillé vers une page de l’ADL, Anti-Defamation League. Spécialisée dans les symboles utilisés par les suprémacistes blancs et autres hate groups, cette base de données regroupe ces symboles par catégorie (slogans, nombres, symboles neo-nazis, etc.), accompagnant parfois ces informations de photos illustratives. Constituée sous la forme d’un site disposant de filtres, cette page est particulièrement pratique pour la recherche de symboles très utilisés par ces groupes. A cela peut s’ajouter d’autres ressources, moins pratiques à utiliser car sous format PDF, mais qui ont le mérite de compléter la liste proposée par ADL. Le site de Public Intelligence met ainsi à disposition des documents publiés par diverses autorités américaines (et canadienne), certains portant sur les listes de tatouages surveillés par ces autorités. On trouve notamment :

Il est important toutefois de bien garder à l’esprit que ce genre de tatouage n’indique pas nécessairement l’appartenance d’une personne à un groupe quelconque à l’instant présent (cf. article de l’EFF, Electronic Frontier Foundation, au sujet de l’utilisation des tatouages en vue de l’identification d’un individu et de ses croyances/attachement à une organisation).

On notera au passage que si la culture populaire aurait tendance à associer les tatouages aux bandes criminelles organisées japonaises, les yakuzas, le port de tatouages n’a pas la même symbolique que dans des pays comme les États-Unis, le Mexique, etc.. Traditionnellement, les yakuzas n’ont pas de « tatouages de gangs » à proprement parler, il s’agit plus de la transcription d’expériences de vie à même la peau, comme l’explique un tatoueur interviewé par la BBC. L’article donne l’exemple d’un de ses contacts qui, ayant rencontré un certain nombre de difficultés dans sa jeunesse, a reçu un tatouage de carpe koï remontant le courant, témoignant de sa volonté et sa force à surmonter l’adversité. Ainsi, si les yakuzas avaient pour usage de se rencontrer dans les bains publics, ce n’était pas seulement pour s’assurer qu’aucun ne portait une arme sur lui – difficile de cacher une arme lorsqu’on ne porte pas de vêtements. Cela permettait également aux autres membres de voir les tatouages de chacun afin de se faire une idée de la personne qu’ils avaient face à eux. En bref : si les tatouages sur le sujet étudié vous donnent le sentiment qu’ils sont liés aux yakuzas, il s’agit de chercher la signification qui en découle plus que l’attachement à un gang particulier.

Retour sur le cas étudié


Via le site ADL, on peut voir que la chaîne de caractères « 112% » est affiliée à un motif suprémaciste blanc. Le « 100% » signifierait alors « 100% blanc », et le 12 correspondrait aux lettres « AB » comme « Aryan Brotherhood« . Cet élément a été soumis et accepté par les juges Trace Labs.

Retour d’expérience et conclusion

6h de recherches et quelques cannettes de boisson énergisante plus tard, l’équipe terminait 42ème sur 174 équipes, avec 56 soumissions de données.

Scoreboard final

Des enseignements les plus généraux que nos investigateurs ont pu tirer de cette expérience, il y a tout d’abord l’apprentissage de la gestion du bruit. En effet, si trouver des informations lorsque le sujet semble ne pas avoir de présence sur les réseaux sociaux s’avère ardue, évoluer dans un brouhaha de données l’est tout autant. Dans le cadre du CTF où les analyses portaient sur des personnes disparues, plusieurs profils nécessitaient en premier lieu de faire la part entre les comptes associés à la *disparition de la personne* et les comptes associés à la personne *elle-même*. A défaut de proposer une méthode pour écarter automatiquement ces comptes des recherches, l’équipe recommande de garder à l’esprit que certains comptes seront créés spécifiquement pour chercher la personne disparue. Si les commentaires sur ces comptes peuvent être regardés, une grande majorité ne sera que des expressions de compassion plus que des éléments utiles pour avancer dans l’enquête.

L’autre leçon à retenir s’est dévoilée en fin de parcours, quand la fatigue commençait à se faire sentir…


– J’ai trouvé ! J’ai trouvé son profil Linkedin, s’écria l’un des membres.
– Sérieux ? Bien joué, j’ai pas du tout eu le réflexe de chercher. En même temps, pour une jeune de 16 ans…
– Comment ça 16 ans ? Non, non, vu sa tête, elle a la trentaine bien tassée.
– Ah ? Pourtant sur sa fiche c’est noté 16 ans…


Même nom, même prénom, les deux photos représentant une femme typée hispanique… mais pas la même personne.
Le biais de confirmation, qui consiste à privilégier les informations qui nous confortent dans nos hypothèses, a été expérimenté par l’équipe ce soir-là. Rien de critique, puisque la confrontation des avis a permis de se dégager rapidement de ce biais cognitif. Il s’agit donc ici de se souvenir de l’importance de prendre du recul par rapport à ses recherches, soit en *adoptant* soi-même un autre point de vue, soit en *demandant* à une tierce personne son point de vue.


Enfin, concernant le CTF à proprement parler, les retours d’expériences principaux sont les suivants :

  • il semblerait que la réponse de base en cas de refus d’une donnée par les juges soit « manque de contexte« . L’équipe a interprété ce message comme étant signe que l’information n’était pas intéressante en soit, et pas nécessairement comme un élément à prendre au pied de la lettre – qui impliquerait la « recherche de plus de contexte » pour l’information considérée ;
  • bien penser à préparer son matériel avant le CTF, ce qui inclut notamment :
    • création de comptes dédiés (mails, Linkedin, Twitter, Facebook, TikTok, etc.) ;
    • environnement de travail dédié (VM, navigateur nettoyé des 1500 onglets ouverts en permanence le reste du temps, etc.) ;
    • outils et plugins fonctionnels sur l’environnement de travail ;
    • avoir sous la main des sites spécifiques aux US (@technisette propose sur sa page start-me un certain nombre de bases de données et moteurs de recherches dédiés à chaque pays) ;
  • bien communiquer avec le reste de l’équipe, et ne pas hésiter à être à deux sur un même sujet, afin de permettre un « jeu de ping-pong d’informations » ;
  • suivant ce à quoi l’investigateur carbure : prévoir plus de Guinness au frais, mais moins de boisson énergisante;
  • si le sujet reste moralement lourd (recherche de personnes disparues), l’aspect ludique choisi par Trace Labs permet de mettre cet aspect de côté pour se dédier entièrement aux recherches. L’expérience est enrichissante, et permet même aux novices de s’entraîner sur des cas réels, allant un peu plus loin dans leur formation OSINT. On peut mentionner à ce titre, moins « gamifié » mais également accessible à tous, la plateforme d’Europol « Stop child abuse – Trace an object », qui propose de chercher des informations sur des objets (vêtements, détails de décors) afin d’aider à faire avancer les enquêtes visant à retrouver à la fois les enfants abusés mais aussi les criminels.

Dimanche 12 avril, 6h01. Les membres de l’équipes se déconnectèrent un à un en vue d’aller trouver le repos après ces quelques heures de recherches intensives. Fatigués mais satisfaits de cette expérience, ils étaient unanimes quant à un objectif  : participer au prochain CTF de Trace Labs, en vue de récolter encore plus d’informations et contribuer à l’effort collectif  – et international – investi dans ces campagnes de recherches.

Merci à Mélanie d’avoir pointé à l’auteure le site de Public Intelligence qui s’est avéré bien utile pour la rédaction de cet article.