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)

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.

La frontière gréco-turque, terrain d’affrontements physiques et virtuels

La frontière gréco-turque, terrain d’affrontements physiques et virtuels

La frontière gréco-turque, terrain d’affrontements physiques et virtuels

Thomas Eydoux / Antoine Hasday / Elie Guckert pour OpenFacto

Les forces turques et grecques face à face près du poste frontière de Kastanies-Pazarkule / Illustration : Elie Guckert / Source 

L’ouverture de la frontière gréco-turque par Ankara a généré de nombreuses images de violences entre les forces grecques et turques au poste frontière de Kastanies-Pazarkule. Des affrontements bien physiques qui ont été accompagnés d’une guerre des mots et des images livrée sur les réseaux sociaux par la fachosphère européenne. Entre les deux feux : des milliers de migrants qui le paient parfois de leurs vies.

Des échanges de grenades lacrymogènes, voire des tirs à balles réelles, à la frontière d’un État membre de l’Union européenne, et des migrants pris entre deux feux : ce sont parfois de véritables images de guerre qui ont été capturées à un point de passage entre la Grèce et la Turquie depuis l’ouverture de ce dernier aux migrants par Erdogan, en février dernier. 

Face à l’afflux de réfugiés à la frontière turco-syrienne et à ce qu’il considérait comme un manque de soutien de l’UE à sa campagne contre le régime syrien, le président turc Recep Tayyip Erdogan – dont le pays a déjà accueilli plus de trois millions de syriens – avait annoncé le 28 février qu’il n’empêcherait plus les migrants présents en Turquie de se rendre dans l’UE via la Grèce. Erdogan entendait ainsi faire pression sur l’Europe, à qui il demande un « juste partage du fardeau» pour faire face à l’afflux de réfugiés syriens provoqué par l’offensive d’Assad et de son allié russe à Idlib. La veille, au moins 33 militaires turcs avaient été tués en Syrie dans une frappe officiellement attribuée à l’armée arabe syrienne. 

Jusqu’à 13 000 migrants tentent alors de franchir la frontière entre la Turquie et la Grèce, selon l’organisation internationale pour les migrations (OIM). Parmi eux, des Syriens, mais aussi des Irakiens, des Afghans, des Pakistanais et des Iraniens. 

Le poste-frontière de Kastanies-Pazarkule, champ de bataille numéro 1

Cette décision unilatérale du président turc a causé de fortes tensions politiques et a conduit à des situations parfois très violentes avec les autorités grecques. Selon les services de renseignements allemands, les autorités turques auraient contraint des réfugiés à monter dans des bus pour les conduire à la frontière. Des membres des forces de sécurité se seraient même mêlés à la foule pour encourager les émeutes, rapporte Der Spiegel.

Sur cette vidéo de l’agence pro-Kremlin Ruptly, on peut voir des grenades lacrymogènes tomber du côté grec de la frontière, près du point de passage de Kastanies-Pazarkule.

Des violations des droits humains auraient aussi été commises par les forces de sécurité grecques : renvois illégaux à la frontière, tortures, détentions illégales, usage de grenades lacrymogènes potentiellement létales et tirs à balles réelles. Selon Amnesty, au moins deux migrants ont été tués.

De nombreuses images de ces incidents sont apparues sur les réseaux sociaux au cours du mois de mars. Sur cette vidéo on peut par exemple voir des policiers turcs tirer du gaz lacrymogène de l’autre côté de la frontière sous les encouragements des migrants. Sur une autre vidéo visiblement tirée d’images de caméras de vidéo surveillance, on peut apercevoir des policiers grecs utiliser un ventilateur géant pour repousser du gaz lacrymogène de l’autre côté de la frontière. Sur une troisième, on peut même voir un agriculteur grec pulvériser du lisier de l’autre côté de la frontière pour dissuader les migrants de passer. Enfin cette vidéo de l’Associated Press montre également des affrontements entre les forces grecques d’un côté, et turques de l’autre.

(Vidéo Associated Press)

Grâce à quelques bâtiments distinctifs, notamment la tour du poste frontière ou encore la position des chemins de terre par rapport à la clôture, ces images postées entre le 7 et le 12 mars peuvent être géolocalisées à un seul et même endroit : le poste-frontière de Kastanies-Pazarkule, l’un des principaux points de passage entre la Grèce et la Turquie :

Position du poste-frontière de Kastanies-Pazarkule sur Google Map.

Pour plus de clarté, nous avons utilisé cette vue aérienne du poste-frontière où la tour d’observation est bien plus visible :

Géolocalisation des trois vidéos près du poste-frontière de Kastanies-Pazarkule. Crédit : Elie Guckert

Cette vidéo de l’agence turque pro-Ankara TRT collectée par le site d’investigation Bellingcat où l’on peut entendre des coups de feu semble avoir elle aussi été tournée dans la même zone, là où le chemin de terre côté turc longe la clôture marquant la frontière :

Source : Bellingcat.

x

Ce poste-frontière a été l’un des points privilégiés par la Turquie pour forcer les migrants à traverser la frontière turque, tentant au passage de déstabiliser son voisin grec, avec qui les relations sont pour le moins tendues. Ankara n’a en effet pas poussé les migrants vers le poste-frontière avec la Bulgarie, un État avec lequel ses relations sont beaucoup plus cordiales, ni vers celui de Kipi qui est bien partagé avec la Grèce mais qui constitue une voie commerciale trop importante pour que la Turquie prenne le risque de sa fermeture. Le poste-frontière de Kastanies-Pazarkule est donc l’un des seuls points de passages terrestres possibles pour les migrants qui n’ont comme seules autres alternatives que de tenter de franchir l’Evros, où un migrant a été tué, ou de traverser la mer Égée pour poser le pied sur l’île grecque de Lesbos, option toute aussi périlleuse

Les réseaux sociaux et la fachosphère, champ de bataille numéro 2

De manière peu surprenante au vu de leur caractère impressionnant, les images des affrontements au poste-frontière de Kastanies-Pazarkule ont été instrumentalisés par tous les camps. Ainsi, l’agence de presse russe pro-Kremlin Ruptly a plutôt tourné des images vues depuis le côté grec de la frontière, tendant à présenter une Europe sous pression migratoire agressée par la Turquie. De son côté, l’agence turque pro-Ankara TRT World a plutôt filmé depuis le côté turc, insistant sur les violations commises par les forces grecques et sur la misère des migrants. 

Ces deux récits du même événement sont cohérents avec les vues respectives de Moscou et Ankara sur l’Europe et la crise migratoire en général. Mais la Russie et la Turquie ne sont pas les seuls acteurs à appliquer une grille de lecture partisane, si ce n’est mensongère, sur les affrontements à la frontière gréco-turque. En France, plusieurs responsables politiques d’extrême droite dénoncent sur Twitter ce qu’ils considèrent comme une « invasion migratoire » et affichent leur soutien à la Grèce, notamment via le hashtag #IStandWithGreece («je me tiens aux côtés de la Grèce»), qui a été utilisé 67445 fois entre le 1er mars et le 1er avril. Pour trouver ce chiffre, nous avons utilisé l’outil Twint, qui permet de collecter des données sur Twitter, via le langage informatique Python. 

Nous avons également pu voir combien de fois les utilisateurs ont utilisé le hashtag. Si certains ne s’en sont servis qu’une seule fois, d’autres en revanche l’ont tweeté des centaines de fois. 

Certains responsables politiques français comme le porte-parole du Rassemblement national, Jordan Bardella, se sont même rendus sur place, tout comme plusieurs personnalités issues de la mouvance identitaire, sans pour autant toujours utiliser le hashtag #IStandWithGreece :

Source : Newsy et Bellingcat

Dans un tweet posté le 1er mars 2020, la présidente du RN Marine Le Pen commente par exemple des images tournées au poste-frontière de Kastanies-Pazarkule, insistant sur le fait que les migrants sont « majoritairement des hommes » qui menaceraient d’arriver « bientôt dans les villes et villages de France », sans oublier de s’en prendre au passage au président Emmanuel Macron. 10 jours plus tard, Jordan Bardella intervient sur CNews – depuis la Grèce où il s’est rendu aux côtés d’autres personnalités d’extrême droite – pour prôner l’une des lubies du parti : la fermeture des frontières nationales face à ce qu’il qualifie de « véritable déclaration de guerre à l’Europe » par Erdogan.

Des vidéos montrant les affrontements entre forces turques et grecques au poste-frontière de Kastanies-Pazarkule sont aussi partagées par des membres du groupuscule Génération Identitaire. Le 12 mars, le porte-parole Romain Espino va jusqu’à dépeindre une guerre de civilisation entre la Grèce et des « envahisseurs » pour appeler à transformer la frontière en « barrage infranchissable ». Un concept que le groupuscule à déjà essayé d’appliquer en France de manière plus ou moins heureuse. Damien Rieu, cadre historique de l’organisation, assimile quant à lui les migrants à des islamistes – simplement parce qu’ils crient «Dieu est grand» – à la solde des forces Turques.

D’autres comptes influents de la fachosphère francophone – comme Damoclès et le «roi de l’intox» @tprincedelamour, se sont joints aux réjouissances. Tout comme des organisations plus radicales que le RN, mais pas forcément très influentes sur les réseaux, parmis lesquelles l’Action française ou encore la Dissidence française, 

Les incidents à la frontière gréco-turque ont donc été instrumentalisés par l’extrême droite française afin de nourrir son narratif global sur les migrations et l’Islam et promouvoir son projet politique, quitte à déformer les faits.

Migrants, toujours perdants

Cette rhétorique a priori réservée à l’extrême droite a pourtant trouvé des résonances au sein même des institutions européennes : le 3 mars, avec une mise en scène plutôt martiale, la présidente de la Commission Ursula von der Leyen, le président du Conseil Charles Michel et le président du Parlement David Sassoli se sont rendus à Kastanies (du côté grec du poste-frontière) pour affirmer le soutien de l’UE à la Grèce.  « Je remercie la Grèce d’être en ce moment notre bouclier européen », déclare alors Von Der Leyen, faisant ainsi écho à la logique de guerre invoquée par la fachosphère, et sans mentionner les violations des droits humains commises par la Grèce.

Tweet d’Ursula Von Der Leyen posté le 3 mars où elle s’affiche patrouillant à la frontière en hélicoptère.

Une logique de peur et de polarisation bien comprise par le président turc, qui avait déclaré le 3 mars : « Depuis que nous avons ouvert nos frontières, le nombre de ceux qui se sont dirigés vers l’Europe a atteint les centaines de milliers. Bientôt, ce nombre s’exprimera en millions ». Si Erdogan, qui ira jusqu’à comparer les gardes-frontières grecs aux nazis, est prompt à dénoncer les abus commis par son voisin grec, il n’a en réalité pas plus de considérations pour les droits fondamentaux des migrants et n’hésite pas non plus à les chasser sans ménagement lorsqu’il n’a plus besoin d’eux. Dans ces affrontements réels et virtuels autour de la frontière gréco-turque, chacun trouve donc son compte, mis à part des milliers de civils à la recherche d’un asile, réduits à l’état de moyens de pression et d’objets de propagande.

Retour sur enquête: monitorer un événement public sur les réseaux sociaux

Retour sur enquête: monitorer un événement public sur les réseaux sociaux

Dans une enquête pour Bellingcat, Sébastien s’intéressait à la présence d’un militant de l’extrême-droite française au festival néo-nazi “Asgardsrei” qui avait lieu en Ukraine en décembre 2019. A travers cet exemple, il fait ici un rappel des techniques basiques pour monitorer un événement public (concert, manifestation etc.) sur les réseaux sociaux.


L’unique point de départ de mon enquête était une photo diffusée via Telegram montrant un drapeau du Groupe Union Défense (GUD) brandi dans la foule lors du festival de “Black Métal National Socialiste” (NSBM) “Asgardsrei” qui avait lieu à Kiev, en Ukraine, le week-end du 14–15 décembre 2019. Celle-ci indiquait vraisemblablement qu’au moins un militant français avait fait le déplacement.

La photo diffusée via Telegram.

Bien évidemment, la personne apparaissant sur la photo avait pris soin de ne laisser apparaître aucun élément permettant de l’identifier, on voit simplement une main ainsi qu’une ombre à travers le drapeau. 

Dans un premier temps, j’ai donc décidé de collecter d’autres images du festival. Comme pour n’importe quel événement de ce type, le nombre important de vidéos, photos souvenirs et autres selfies publiés sur les réseaux sociaux multipliait la probabilité que ce militant français ait été capté par un objectif autre que le sien.

Récolter le maximum d’images du festival

Puisque je cherchais des images de l’événement, je me suis intéressé dans un premier temps à Instagram, réseau social par excellence en la matière. Pour essayer d’être le plus exhaustif possible, j’ai procédé selon deux approches différentes.

D’une part, quelques recherches rapides m’avaient appris que le festival avait eu lieu au “Bingo Club” à Kiev. J’ai donc cherché les photos et vidéos tagués comme ayant été prises dans cette salle. Comme souvent, il existait plusieurs geocodes liés à cette salle (Bingo Club, BingoClub Kyiv, Bingo Club Kiev…), et je les ai donc consultés les uns après les autres.

Les deux premiers geotags correspondent à la salle située à Kiev
Exemple d’une photo geo-taguée par un utilisateur au Bingo Club.

Pour récupérer l’ensemble des photos et vidéos, j’ai utilisé l’extension chrome “Downloader of Instagram + Direct Message” qui permet de télécharger automatiquement un grand nombre de publications. Si c’était à refaire aujourd’hui, j’utiliserais plutôt l’outil python “Instaloader” (pour les adhérents, voir l’excellent guide d’Hervé !) qui permet d’être plus précis, notamment en indiquant la date des photos et vidéos qui nous intéressent, ou bien de récupérer les commentaires associés à une publication.

Dans un second temps, j’ai cherché les publications contenant certains hashtags qui pouvaient être liés au festival. J’ai tout simplement commencé par #Asgardsrei, puis je me suis servi des autres hashtags associés par les utilisateurs à ce premier pour pivoter vers d’autres recherches.

Photos avec le #Asgardsrei.
En plus du #Asgardsrei, cette photo utilise d’autres # pouvant être utilisés pour multiplier les recherches.
Exemple d’une vidéo du festival que je n’aurais pas trouvé si j’avais simplement cherché avec le #Asgardsrei ou via les geotags.

Puisque j’ai effectué mes premières recherches alors que le festival avait encore lieu, j’ai également téléchargé toutes les stories (publications qui disparaissent au bout de 24h) associées aux différents hashtags, ainsi que celles géo-tagués au Bingo Club.

En suivant peu ou prou le même procédé, j’ai cherché des images du festival sur Facebook, Vkontakte, Twitter, Youtube, Snapchat… Je me suis également intéressé aux différentes pages en rapport avec le festival: événement sur VKontakte, pages sur les réseaux sociaux des groupes présents, site internet du festival etc.

L’analyse

Après avoir récupéré des centaines de photos et vidéos du festival, il s’agissait désormais de repérer dans la foule le drapeau du GUD ou bien un visage familier.

Puisque la plupart des images étaient prises dans l’obscurité de la salle de concert, seulement interrompue par quelques flashs lumineux liés à la mise en scène, j’ai essayé de situer dans l’espace la personne que je cherchais. La foule semblait relativement statique (mis à part un mosh vers le centre de la salle à certains moments), j’en ai donc conclu que l’individu qui m’intéressait devait probablement se situer en face de la scène, vers l’avant de la salle. Si un simple croquis et un œil attentif m’ont permis de le repérer assez rapidement (quelques heures tout de même), j’ai aussi envisagé la possibilité de synchroniser différentes vidéos du festival pour en reconstituer des parties sous plusieurs angles.

Ce travail m’a donc permis de repérer le drapeau du GUD à de multiples reprises lors du festival (principalement lors des passages des groupes “Baise Ma Hache” et “Goatmoon”), mais surtout d’apercevoir son porteur.

Captures d’écran d’une vidéo publiée sur Youtube.

Identifier le porteur du drapeau

Cette silhouette qui m’était familière, ainsi que d’autres indices publiés sur la page Facebook “Ouest Casual” (associée au canal Telegram) laissant penser que le militant s’étant rendu en Ukraine était lié au groupe “Zouaves Paris”, m’ont conduit à consulter le profil d’un certain Marc “Hassin”. Ancien membre du GUD et militant bien connu des Zouaves Paris, Marc avait récemment mis à jour sa photo de profil Facebook, indiquant que celle-ci avait été prise en Ukraine, le 21/10/2019.

La photo de profil Facebook de Marc “Hassin”.

Peu convaincu par la possibilité que Marc “Hassin” ait effectué un voyage en Ukraine presque deux mois jours pour jours avant Asgardsrei, et en partant du principe que la date indiquée pouvait contenir une faute de frappe (10 pour le mois au lieu de 12) ou bien avoir été volontairement modifiée, j’ai décidé d’effectuer des recherches sur ce championnat de kick-boxing.

Ayant peu de résultats convaincants via Google et Yandex, j’ai encore une fois utilisé Instagram et cherché des photos utilisant #kickboxing aux alentours du 21 décembre. Sur plusieurs d’entre-elles, j’ai remarqué un décor similaire à celui en arrière-plan sur la photo de Marc “Hassin”.

Photo du championnat auquel a participé Marc “Hassin” publiée sur Instagram avec le #kickboxing.

Après vérification, il s’agissait bel et bien du même événement, un championnat s’étant déroulé au “Спорткомплекс КПИ” à Kiev du 20 au 22 décembre. J’ai donc une fois de plus réuni le maximum de photos et vidéos du championnat, que ce soit via divers #hashtags ou bien le géotag.

Marc n’apparaissant visiblement pas sur celles-ci, j’ai consulté méthodiquement les profils Instagram des personnes ayant publié ces photos: autres photos publiées, photos sur lesquels le compte est identifié, stories “à la une” (stories archivées par l’utilisateur et donc en ligne au delà des 24h initiales).

Après de longues recherches, j’ai finalement identifié Marc sur plusieurs photos, notamment des stories archivées. Sur l’une d’entre elles, Marc posait avec le même drapeau que celui brandit à Asgardsrei.

Photo de Marc “Hassin” au championnat de kick-boxing à Kiev avec un drapeau du GUD, publiée sur Instagram et archivée en “stories à la une”.

Conclusion

Si d’autres informations sont venues compléter mon enquête, ce sont les deux éléments présentés ici (la silhouette du porteur du drapeau et la photo de Marc avec ce même drapeau à Kiev quelques jours plus tard) qui en ont formé la base.

En somme, donc, pas de recours à des techniques de sorcellerie très poussées en OSINT, mais un travail se voulant méthodique et exhaustif. Comme quoi multiplier ses recherches autours de différents hashtags ou geotags et compulser des dizaines de profils efficacement peut (parfois) suffire!

ivg.net, « Pour vous apporter un soutien dans le cadre d’un projet d’IVG ». Ou pas?

ivg.net, « Pour vous apporter un soutien dans le cadre d’un projet d’IVG ». Ou pas?

Un très bon référencement dans Google

Lorsque l’on tape « ivg » dans le moteur de recherche, le site ivg.net apparaît en troisième position.

Spontanément, et compte tenu de ce résultat, on pourrait penser que ce site est un site officiel qui va fournir les réponses objectives et factuelles aux questionnements liés à l’interruption volontaire de grossesse. Mais en réalité, ce site est ce site est très orientés « pro-life » et comporte notamment une section « Vidéos », qui relaie des témoignages provenant de deux comptes Youtube : « ivg.net » et « sos ivg ». Dans la section « A suivre » de la vidéo « témoignages de vécu de l’ivg » (https://www.youtube.com/watch?v=wKqL2BKxsts), on retrouve en médaillon une vidéo de « Boulevard Voltaire », exactement avec la même jeune femme (https://www.youtube.com/watch?v=cjHosWvylRQ) :

Sur la chaîne de Boulevard Voltaire, la description de la vidéo mentionne que le reportage est réalisé par Charlotte d’Ornellas, journaliste travaillant entre autres pour Valeurs Actuelles (https://www.valeursactuelles.com/historique/charlotte-dornellas) et Radio Courtoisie (https://www.radiocourtoisie.fr/patrons-emissions/auteur162/). On retrouve par ailleurs Charlotte d’Ornella et des séquences de cette même vidéo de Boulevard Voltaire sur la chaîne de    « sos ivg » :

Un numéro vert très bien implanté

Tout le monde n’ayant pas obligatoirement un accès facilité à Internet, le site ivg.net a mis en place un numéro vert, que l’on retrouve à de multiples endroits d’Internet, et souvent à côté d’institutions comme le Planning Familial ou le site officiel du gouvernement. Par exemple, sur un site d’aide à l’accueil juridique des populations roms :

De manière un peu plus insolite, on retrouve même ce numéro vert (ainsi que l’adresse du site) dans le livre « Vivre le deuil Pour les Nuls » :

Le présent article n’a pas vocation à apporter une contradiction aux propos et à la ligne directrice de ivg.net. Ceci a déjà été effectué efficacement par de nombreux articles ! Nous invitons le lecteur à se référer à la revue de presse suivante non exhaustive :

De multiples noms de domaine …

Sur whoisology.com, le contact administratif de ivg.net est :

Cette forme d’email est habituellement utilisée pour anonymiser l’organisation ou la personne qui a déposé un nom de domaine considéré, ce qui entraîne souvent l’investigateur OSINT dans une impasse.whoisology.com permet cependant de pivoter sur cette adresse email anonymisée !

Via le moteur de recherche de leaks intelx.io, on trouve par ailleurs une liste supplémentaire de noms de domaine éventuellement pertinents :

mais une seule association ?

Quand on renseigne ces sites dans Maltego, on constate que la plupart d’entre eux ont « SOS Détresse » comme organisation :

Sur avortement.net, les mentions légales précisent la domiciliation du siège social de l’association en question :

Exactement à la même adresse, on trouve les locaux de l’Ecole de Tarcisius, une « Ecole primaire indépendante en Essonne – Spiritualité catholique » (https://ecoledetarcisius.wixsite.com/monsite) :

Par contre, manifestement, les dons ne sont pas à adresser à la même adresse :

Pas obligatoirement !

Lorsqu’on parcourt les pages de sos-ivg.com, sur archive.org, on trouve un numéro de téléphone :

Ce même numéro est disponible dans l’annuaire du guide des activités sportives sociales et culturelles de la ville de Rambouillet :

Sur net1901.org on s’aperçoit que l’AFEDER est domiciliée … à la même adresse que pour les dons à adresse à SOS Détresse!

«Nous ne recevons pas de subventions, affirme M.P. Il s’agit exclusivement de dons privés, on ne donne pas les noms.» (https://www.liberation.fr/france/2017/02/17/ivgnet-une-famille-en-croisade_1549261)

En creusant encore plus loin, un front commun peut être retrouvé via archive.org :

Un site à l’allure officielle, mais pas de noms. Enfin, ça dépend...

Dans la revue de presse listée en début d’article, on retrouve de multiples noms, et certaines entreprises, dont celui d’un PDG. Quand on initie le process de réinitialisation du compte Twitter de ivg.net on contacte un étrange sentiment de familiarité :

Lorsque l’on regarde l’histoire WHOIS de ivg.net, on retrouve de nouveau ce même nom :

A l’adresse de domiciliation de l’AFEDER ainsi que d’envoi des chèques de dons à SOS Détresse, on retrouve toujours la même personne :

Sur avortement.net, on relève le nom d’un auteur dans les articles du site :

Avec le même nom de famille et un prénom commençant par la même lettre, on trouve un conseiller communautaire à la ville de Rambouillet :

Ce même conseiller communautaire comporte une fiche Wikipedia, qui nous permet d’établir un lien avec qui se trouve derrière le compte Twitter de ivg. (et anciennement derrière ivg.net) :

On retrouve par ailleurs ce conseiller communautaire sur une vidéo du Centre Billings, derrière lequel se trouvent les mêmes personnes gérant ivg.net (voir le paragraphe « De multiples noms de domaine » :

Pour conclure … quelques leviers d’action

On le voit, il s’agit là d’un système très bien organisé permettant de figurer en bonne place dans le ranking de Google:

  • achat de noms de domaine ciblés
  • achat probable (bien que non démontré) de mots-clefs

Ce classement, le fait que ce site soit également cité sur celui d’organismes sociaux, est largement susceptible de brouiller le message des autorités sanitaires sur le sujet, surtout auprès de populations fragiles ou peu outillées pour analyser le positionnement de ce site internet.

Parmi les noms de domaine découverts dans le cadre de cette enquête, l’un d’entre-eux est disponible à la vente :

Le lien suivant explique comment paramétrer une redirection :

https://docs.ovh.com/fr/domains/redirection-nom-de-domaine/

(Via la même recherche, on constate que ivg-lyon.com et ivg-medicamenteuse.com sont également disponibles à la vente.)

Selon ses appétences, le lecteur ayant acheté le nom de domaine pourra paramétrer une redirection vers l’un de ces sites :

https://www.planning-familial.org/fr

https://ivg.gouv.fr/

Concernant les autres sites non encore disponibles, rien n’empêche de surveiller les dates d’expiration des noms de domaine associés :

avortement.net :        Registry Expiry Date: 2021-04-26

  • avortement.pro : Registry Expiry Date: 2022-02-14
  • ivg-infos.biz : Registry Expiry Date: 2021-02-06
  • ivg-infos.com :        Registry Expiry Date: 2021-02-07
  • ivg-infos.info : Registry Expiry Date: 2021-02-07
  • ivg-infos.net :        Registry Expiry Date: 2021-02-07
  • ivg-infos.org :        Registry Expiry Date: 2021-02-07
  • ivg.net :        Registry Expiry Date: 2022-08-27
RADIOAMATEURS : une source méconnue de l’OSINT ?

RADIOAMATEURS : une source méconnue de l’OSINT ?

L’ami Gimli nous proposait un chouette challenge sur Twitter, de la géolocalisation à base de source radio-amateur.
L’occasion pour lui d’écrire l’article ci-dessous, mêlant, comme souvent ici, méthodologie et analyse technique!


De nombreux articles et méthodologies sont disponibles en ligne pour tracker les navires de commerce. Mais, qu’en est-il du suivi des navires de la marine de guerre russe ?

Bien avant l’apparition des satellites, de l’AIS ou tout simplement de l’OSINT, le monde des radioamateurs s’est investi dans cette thématique … et ils n’hésitent pas à partager !

Alors, pourquoi se priver de cette masse d’informations dans nos investigations ?

Par exemple, que pouvons nous dire de la position de ce bâtiment à la date du 14 avril 2020 ?

Via un module complémentaire installé sur Mozilla Firefox, (par ex : Search by image), nous trouvons facilement le nom de ce navire : le PM-82 via le site :

https://mil-avia.livejournal.com/379233.html

Le PM-82 (ПМ-82 en russe) semble être un « atelier flottant »…

Essayons donc plusieurs recherches via différents moteurs de recherche (Google et Yandex notamment).

Le site mil.ru nous indique que le PM-82 fait partie du projet 304 et qu’il est conçu pour réparer les navires, leurs armes et leurs équipements techniques dans des zones éloignées. Mais l’information intéressante est qu’il est en route pour la baltique au 31/03/2020.

Dans les résultats apparaît également ce post sur VK : https://vk.com/navyofrussia?w=wall-129663182_3276 (archivé ici, au cas où…) qui indique :

ПМ-82 возвращается в базу ДКБФ после службы в дальней морской зоне. 18.04.2020 г.

Avec comme traduction approximative de Google :

« Le PM-82 retourne à la base DCBF après avoir servi dans la zone de haute mer. 18/04/2020. »

En cherchant sur Google « ПМ 82 », une vidéo youtube est disponible mais là encore datée du 18 avril 2020.

Pour l’instant, aucune information ne correspond à la date souhaitée. Il faut peut-être changer d’axe de recherche et s’intéresser à une thématique pas assez connue et exploitée.

Les moyens de communication.

Préambule

Tout mobile a besoin de communiquer avec son état-major … alors pourquoi ne pas tenter des recherches de ce côté-là. Suivant la distance entre deux stations (Navire/Terre – Navire/Navire – Terre/Navire), les moyens de communications clairs ou chiffrés utilisés ne sont pas les mêmes.

Tout le monde a déjà entendu parler des communications par Satellite mais il existe d’autres moyens.

Deux stations proches (à portée d’horizon) peuvent par exemple utiliser des moyens de communications passant par des ondes directes (VHF-UHF) alors que des stations éloignées privilégieront la gamme HF (Haute Fréquence – 3 / 30 Mhz). En effet, suivant la propagation, cette dernière permet d’envoyer des messages sur des distances considérables (des milliers de kilomètres).

L’utilisation de cette gamme de fréquence reste incontournable pour les services maritimes et aériens notamment pour garantir la sécurité des liaisons océaniques, pour les liaisons fixes ou mobiles dans des zones sans infrastructure, ou en secours, en cas de catastrophe naturelle ou pour le trafic militaire. (Merci Wikipédia).

Info : saviez-vous que certains mails à destination de navires transitent par la gamme HF via un système nommé SAILMAIL. (https://sailmail.com/)

La Marine russe

La Marine russe est une des dernières de la flotte mondiale à encore utiliser la télégraphie Les matériels modernes coûtent chers et sont compliqués à entretenir alors que les systèmes de communications traditionnels comme la télégraphie font encore leur preuve.

Qui plus est, ils ont de nombreux avantages : fiabilité, simplicité d’utilisation, résistance au bruit …

OSINT et le monde des radios amateurs.

  • En Osint de nombreux passionnés veillent et « écoutent » ce qu’il se passe sur le web, sur les réseaux sociaux …
  • Chez les radioamateurs, il y a autant de passionnés qui écoutent ce qu’il se passe sur les ondes radioélectriques.

Ces passionnés (SWL : Short Wave Listener) écoutent les différentes transmissions transitant par ces ondes au moyen de simple récepteurs radio et d’antennes (appropriés à la bande de fréquence écoutée).

Les radioamateurs suivent les navires de la Marine russe depuis des décennies! Ils se sont concertés, ont croisés leurs interceptions et ont ainsi réussi à faire correspondre un grand nombre d’indicatifs à des noms de navires. Alors pourquoi ne pas n’essayer de trouver l’indicatif d’appel de ce navire ?

Pour communiquer, deux stations utilisent des identifiants qui sont appelés « indicatif ».

Donc sur Google, et sans trop se prendre la tête, à l’aide d’un googledork, on peut trouver ceci :

Nous obtenons ici, un résultat plus que prometteur! (Merci F5BJR!!!)

Nous avons donc, semble-t-il l’indicatif d’appel télégraphique de ce navire. Continuons notre investigation avec la requête suivante sur Google :

Cela nous confirme que nous sommes sur la bonne voie!

Une dernière requête sur notre moteur de recherche ; « rjs81 » + « russian navy » nous amène sur

En cherchant sur Log avril 2020 – passion-swl, nous arrivons sur ce qui semble être très intéressant mais sous forme codée. Heureusement, l’auteur a eu la bonne idée de mettre la position décodée sur Google maps.

La réponse à notre recherche :

12464.00 RJS81 : Russian Navy SHIP 1200z CW RJS81 Wkg RIW (QSO and QTC SML FOR RJH45 RJD38 = 14121 99569 10078 41/98 73214 10057 40186 57013 70220 8//// 2212 200140 14012 = = AR RJS81 K – LOCATION : https://goo.gl/maps/SQmfaMC5E15NVtw47) in Duplex – Qsx on 9145 14-APRIL-20 (F5JBR)

Aller plus loin

Depuis de nombreuses années certains des bâtiments de la Marine Russe transmettent à leur QG via la télégraphie (Code Morse) les conditions météorologiques qu’ils rencontrent en mer sous forme de messages « codés ».

Un autre Exemple (comme cela vous pourrez vous exercez à trouver la position, la route et la vitesse du PM-82):

RMFE Wkg RMP (QSO and QTC SML 363 16 14 0900 363 = FOR RJH45 RJD38 = 14061 99576 10108 44598 53506 10067 40150 52010 70311 85500 22232 00050 20201 14013 = AR RMFE K

Ce type de message a une structure connue et nous permet en le décodant d’obtenir la position du navire.

Comment obtenir ce résultat depuis le message codé ?

Suivez le guide. (Seules les parties nous intéressant seront explicitées. Pour de plus amples informations voir ici.)

RMFE = l’indicatif du navire qui transmet le message (l’identifiant « en ligne » du bâtiment)

14 = date 14 avril 2020

0900 = heure de rédaction du message

99576 10108 = position du navire … pour décoder cette partie, on fait comme ça :

1) La position actuelle du navire est codée de la façon suivante:
… 99LaLaLaQcLoLoLoLo

… 99576 10108 … Kézako?

  • 99 Annonce position navire
  • LaLaLa (576) Latitude en degrés et dixièmes de degré. Toujours codé avec trois chiffres, les deux premiers chiffres sont des degrés réels, le dernier chiffre pour les dixièmes de degré (57.6 donc 57.36)Qc (10) Quadrant du globe (spécifiez si la latitude est nord ou sud et la longitude est ou ouest). 

Si le navire est au nord de l’équateur (latitude nord):

– 1 à l’est du méridien de Greenwich (longitude est)

– 7 à l’ouest du méridien de Greenwich (longitude ouest)

Si le navire est au sud de l’équateur (latitude sud):

– 3 à l’est du méridien de Greenwich (longitude est)

– 5 à l’ouest du méridien de Greenwich (longitude ouest)

Si vous me suivez … passons à la longitude.

  • LoLoLoLo (108) Longitude en degrés et dixièmes de degré. Toujours codé avec quatre chiffres, avec le premier chiffre (des centaines) codé comme 0 ou 1. Les trois premiers chiffres sont des degrés réels, le dernier chiffre pour les dixièmes de degré (10,8 donc 10,48)

 les données de route et de vitesse des navires sont codées de la façon suivante:
… 222
DsVs

… 22232

  • 222 indicateur
  • Ds (3) cap vrai du navire pendant les trois heures précédant l’heure d’observation :
  • Vs (2) Vitesse moyenne du navire, en nœuds, au cours des trois heures précédant l’heure d’observation :
  • 0 0 nœud
DsVs
0  immobile0 0 nœud
1 NE1 1 à 5 nœuds
2 E2 6 à 10 nœuds
3 SE3 11 à 15 nœuds
4 S4 16 à 20 nœuds
5 SW5 21 à 25 noeuds
6 W6 26 à 30 noeuds
7 NW7 31 à 35 noeuds
8 N8 36 à 40 noeuds
9 Inconnu9 Plus de 40 noeuds
/ Non rapporté/ Non rapporté

Donc notre navire RMFE est situé au 57.36N 10.48 E en route au sud Est pour une vitesse de 6 à 10 Nœuds.

Et voilà pas si compliqué 😉.

Quelques sources d’intérêt « Sigint ».

Pour le suivi des communications RADIO :

ENIGMA2000 http://www.signalshed.com/ et leur newsletter http://www.signalshed.com/nletter05.html

NumberStations https://www.numbers-stations.com/ ou sur https://twitter.com/Spy_Stations

Priyom : http://priyom.org/

L’union international des radioamateurs https://www.iaru-r1.org/ et spécialement leur newsletter https://www.iaru-r1.org/spectrum/monitoring-system/iarums-r1-newsletters/ qui fait la part belle à la chasse aux « intruders » sur les bandes de fréquences réservées aux radioamateurs.

Pour la connaissance et le suivi des signaux électromagnétiques :

https://www.sigidwiki.com/wiki/Signal_Identification_Guide

Pour le suivi des forces (gouvernement / armée / police) et des fréquences radio HF

(documents un peu anciens mais très instructif)

Udxf : http://udxf.nl/ute-info.html

Signé : Gimli

La Corée du Nord a la fibre slave

La Corée du Nord a la fibre slave

Le Dimanche 1er Octobre 2017, un article du Washington Post rapporte la fin d’attaques informatiques menées par l’United States Cyber Command contre la Corée du Nord, dont l’accès Internet repose jusqu’alors sur l’opérateur China Unicom.

Entre le 1er et le 2 Octobre, deux chercheurs observent des variations dans le routage du trafic provenant de la Corée du Nord, avec l’apparition d’un nouvel opérateur : Transtelecom (TTK), une filiale de Russian Railways, dont l’activité repose entre autres sur l’installation de fibre le long des voies de chemin de fer.

Le pont de l’amitié

Sur le plan du tracé de son réseau, Transtelecom a semble-t’il une branche atteignant la frontière de la Corée du Nord :

Cette portion de plan peut éventuellement faire penser au Pont de l’Amitié Corée du Nord – Russie, un pont ferroviaire sur la frontière entre la Corée du Nord et la Russie. Franchissant le Tumen, il relie la ville de Khassan dans le kraï du Primorié en Russie et la ville de Tumangang située dans la zone économique spéciale de Rason en Corée du Nord.

On retrouve une trace du projet en 2006 lors de la signature d’un projet pilote pour rétablir le trafic sur la section ferrovière de 40 km Khassan-Radjin entre Vladimir Yakunin, président des chemins de fer russes et son homologue nord-coréen Kim Young Sam. Adossé au projet, le président de TransTelecom, filiale des chemins de fer russes, Sergey Lipatov, signe alors avec le Ministère des Communications un accord de coopération pour la construction et l’exploitation conjointe d’une ligne de transmission à fibre optique sur la section reconstruite du chemin de fer transcoréen. Avec les sanctions de l’ONU et les retards de chantier, il faudra plusieurs années à la société projet – RasonConTrans pour mettre en œuvre ce projet. La connexion de la Corée du Nord aux communications internet aurait eu lieu en 2007, inscrivant le pays dans une vaste infrastructure eurasienne.

Inauguration de la ligne en 2011

Un peu de vocabulaire : Autonomous System (AS)

Un Autonomous System (abrégé AS), est un ensemble de réseaux informatiques intégrés à Internet . Un AS est généralement sous le contrôle d’une entité ou organisation unique, typiquement un fournisseur d’accès à Internet. Chaque AS est identifié par un numéro de 16 bits (ou 32 depuis 2007, selon la RFC 48931) , appelé « Autonomous System Number » (ASN). Il est affecté par les organisations qui allouent les adresses IP, les Registres Internet régionaux (RIR). Les numéros d’AS (les ASN) sont utilisés par le protocole de routage Border Gateway Protocol (BGP) entre les systèmes autonomes (les AS).

Le principal AS de la Corée du Nord est AS131279, correspondant aux plages d’adresses IP suivantes :

  • 175.45.176.0/24
  • 175.45.177.0/24
  • 175.45.178.0/24
  • 175.45.179.0/24

(Pour une explication de la notion de /24, voir )

Chemins des données transitant vers et depuis AS131279

Pour transiter d’un machine locale à une machine connectée au réseau, les paquets IP sont acheminés vers la destination en passant d’un routeur à un autre. Via la commande système traceroute, il est possible de reconstituer l’intégralité de ce chemin, qui va également nous fournir les adresses IPs des équipements par lesquels le paquet de données va passer.

Cette commande peut également être lancée online, via des outils comme : https://hackertarget.com/online-traceroute/. En choisissant arbitrairement des adresses IP sur chacune des plages listées au paragraphe précédent, on constate que les paquets venant/allant de/vers 175.45.176.0/24, 175.45.178.0/24 et 175.45.179.0/24 semblent transiter via China Unicom.

Par contre, ceux venant/allant de/vers 175.45.177.0/24 semblent transiter via TransTelecom :

On pourra éventuellement postuler que dans le sous-domaine Korea-Posts-gw.transtelecom.net, le « gw » signifie gateway (en français : passerelle).

Quelques recherches sur virustracker

Le site virustracker.net est une base de données qui permet de procéder à des recherches d’infections par des botnets, en renseignant une adresse IP ou une plage d’adresses IP. Ainsi, sur 175.45.177.0/24, on trouve 1000 « Infection Records » :

Le site permet de télécharger l’intégralité des enregistrements trouvés dans un fichier au format .csv, lesquels sont horodatés. En les regardant plus en détail, on constate qu’ils commencent au 2 Juin 2015, s’interrompent au 19 Mars 2016 et reprennent le 13 Octobre 2017 pour courir jusqu’au 6 Mars 2020. Les observations faites par Dyn autour de TransTelecom sont datées au début d’Octobre 2017.


Les informations récupérées dans le cadre de cet article ne permettent pas forcément de tirer des conclusions fortes quant aux liens entre la Corée du Nord et TransTelecom. Cependant, rien n’empêche non plus de trouver interpellante la concomitance de dates entre les logs VirusTracker et l’apparition de TransTelecom comme fournisseur d’accès de la Corée du Nord. Dans un futur proche, il pourra être tout à fait pertinent de surveiller de plus belle le trafic provenant de Corée du Nord et transitant via la Russie.

Pour aller plus loin