Théorie des graphes et social engineering

Auteur : Anonyme
Zine : Rafale #21


## INTRO

Généralement, quand on parle de réseaux sociaux, on pense tout de suite à 
Facebook, Twitter et autres services. Mais ce n'est pas la définition exacte. Un 
réseau social au sens large est en fait une modélisation d'un ensemble de 
personnes sous forme de nœuds (les gens) et d'arêtes (leurs relations entre 
eux).

Exemple, soient trois personnes A, B et C. Si A connaît B, B connaît C et C 
connaît A, alors on a le graphe:

A - B
 \ /
  C

À noter que la relation "connaître" est généralement bi-directionnelle: si A 
connaît B alors B connaît A. On dit alors que le graphe est *non-orienté*. Un 
bon exemple pratique de graphe non-orienté est celui de Facebook, où la relation 
"être ami" est bi-directionnelle.

Ce n'est pas toujours le cas, lorsque l'on choisit une autre relation entre les 
personnes que simplement "connaître". Un exemple trivial est celui de twitter, 
où les gens *suivent* d'autres gens sans que cela ne soit nécessairement 
réciproque.

On n'imagine pas à quel point l'exploration de ces-dits réseaux sociaux et leur 
cartographie peut apporter comme information utile. Bien plus en réalité que la 
simple information de "A connaît B". Cet article a pour but de sensibiliser le 
lecteur sur ce point-là, d'autant que je me doute que certains d'entre vous ont 
de bonnes raisons de s'intéresser aux techniques des RG pour faire tomber les 
têtes des réseaux.

Cependant cet article reste très superficiel. Si le sujet vous intéresse 
vraiment vous pouvez commencer à creuser avec l'article wikipedia sur le sujet 
qui est assez complet:

https://fr.wikipedia.org/wiki/Analyse_des_r%C3%A9seaux_sociaux

Et qui fournit des liens pour bien appronfondir le truc.

## I : LES DONNÉES

Il va de soi que déterminer les relations entre personnes membres d'un réseau 
social d'intérêt nécessite une grande quantité d'information. Il faut non 
seulement les données sur chaque nœud individuel mais aussi les données sur les 
relations entre ces personnes. Or, pour un réseau comptant n personnes, le 
nombre de relations possibles est proportionnel à n². Autant dire que ça fait 
beaucoup d'information à traiter.

Les agences de renseignements, que l'on commence à bien connaître, se focalisent 
généralement sur une cible (un terroriste ou toute personne suspecte) et 
explorent ses relations. La NSA irait jusqu'aux relations au 3ème degré, d'après 
les révélations de Snowden, c'est-à-dire qu'elle va incorporer dans ses bases de 
données les amis des amis des amis des terroristes.

Un peu violent, surtout quand on connaît le "théorème du petit monde", qui 
affirme qu'on peut trouver des connexions entre n'importe qui sur Terre en moins 
de 8 nœuds. En gros, les amis des amis des amis des amis des amis des amis des 
amis de vos amis sont juste tous les humains sur Terre...

Comment se procurer une telle masse de données ? Soit vous vous appelez Mark 
Zuckerberg et les gens vous les livrent de leur plein gré (« They "trust" me, 
dumb fucks » - Mark Zuckerberg), soit vous êtes une agence gouvernementale et 
vous payez Zuckerberg avec l'argent du contribuable pour avoir ces données, soit 
vous êtes dégourdis en python, motivés et patients (on va y venir).

Facebook représente donc évidemment une quantité de données et d'information 
inestimable, mais les agences ne s'en contentent pas. Elles utilisent également 
massivement les méta données des communications électroniques, emails, appels 
téléphoniques, SMS, etc. Une analyse du contenu n'est même pas nécessaire. 
L'information "A a appelé B" suffit pour établir une relation entre ces nœuds.

Ou alors vous pouvez jouer aux enquêteurs « old school » et agréger ces données 
à la main, en tenant un journal des intéractions de votre cible avec son 
entourage, en fouillant son identité numérique, etc. Je ne m'y connais 
personnellement pas assez dans ce genre de techniques, mais le web ne manque pas 
de ressources à ce sujet. L'image du panneau en liège avec des photos et des 
fils rouges les reliant vient à l'esprit, et c'est exactement de cela dont il 
s'agit.

Voilà, brièvement, les différents moyens pour acquérir les données qui vont nous 
servir. On va maintenant voir comment s'en servir.

## II : LES ATTAQUES

Comment faire parler les données ? Question intéressante à laquelle s'emploient 
d'innombrables ingénieurs, chercheurs et agents partout dans le monde. Je vais 
essayer de rester vulgaire et de ne pas trop rentrer dans les maths qu'il peut y 
avoir derrière.

### 1 : L'influence, la hiérarchie.

Quand vous savez qui appelle qui dans un réseau, qui communique avec qui, vous 
pouvez, avec les technologies modernes, visualiser cet ensemble d'informations, 
et en déduire assez efficacement quelles personnes sont centrales dans ce 
réseau. Le « chef » va typiquement se repérer par le fait qu'il met en relation 
plusieurs personnes, que c'est vers lui que remonte les informations ou de lui 
qu'émanent les ordres.

Ça peut sembler con, mais c'est ainsi que la NSA identife les têtes des réseaux 
islamistes, en se basant essentiellement sur les métadonnées des appels et des 
SMS.

Une idée intéressante pour mettre ceci en application serait de cartographier 
les échanges de mails de la campagne de Macron pour se faire une idée des 
personnages clefs de son réseau. Je ne l'ai pas fait (manque de temps) mais 
quelqu'un d'un peu dégourdi en parsing et en python devrait s'en sortir.

Voici le lien torrent du fameux dump qui a noirci des pixels pendant la 
campagne:

magnet:?xt=urn:btih:3053a8d59ef4b5380763bbaa5b3e942a7ab24a8f&dn=MacronLeaks
&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.
ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.
coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969

De manière générale, l'analyse d'influence à partir des métadonnées de 
communication est une technique primordiale des services de renseignements, et 
c'est une chose dont il faut se rappeler lorsque l'on organise un réseau ayant 
des activités potentiellement illégales. Il n'y a même pas besoin de 
s'intéresser au contenu des communications pour tirer des infos intéressantes 
sur un réseau.

### 2 : Les cercles sociaux.

On rentre ici dans le vif du sujet. À moins d'être parfaitement associable, vous 
avez certainement une dizaine d'amis et de connaissances. Vous avez connu 
chacune de ces personnes dans un contexte particulier. Vous connaissez Gisèle et 
Claudine de votre club de bridge, Kévin, Brandon et Morgan de votre club de 
foot, Jean-Édouard et Charles-Xavier de votre classe de prépa éco, etc.

Vos amis ne sont pour ainsi dire pas uniformément répartis, mais sont tous 
rattachés à certains contextes. En fait, il y a de fortes chances que Gisèle et 
Claudine se connaissent, ainsi que Kévin, Brandon et Morgan, mais il est peu 
probable que vous ayez présenté Kévin à Gisèle car celui-ci ne partage pas votre 
enthousiasme pour le bridge.

Maintenant, petite étude de cas de doxing sophistiqué.

Jean-Michel a la fâcheuse habitude de spammer des images de Booba sur votre 
forum anonyme de peintures rupestres Sri Lankaises préféré. Pour lui apprendre 
qu'on ne s'attaque pas à votre Club Secret impunément, vous décidez de le doxer.

Hop, petite recherche inversée de l'edit d'une de ses images de Booba, et bingo 
vous tombez sur son profil sur un obscur site québecois underground et edgy. 
Vous vous infligez la lecture de tous ses posts sur ce site infâme jusqu'au 
moment où vous vous apercevez qu'il a été assez stupide pour poster son vrai 
facebook.

Vous avez maintenant son nom complet, mais vous décidez de ne pas vous arrêter 
là. Vous voulez tout savoir sur lui.

Manque de bol, son profil facebook est complètement opaque. Juste la liste 
d'amis est visible.

Loin de vous décourager, vous lancez VIM, téléchargez quelques paquets python 
pour les requêtes web et la gestion des graphes (voir plus loin la section « 
Outils ») et vous ouvrez la console web de firefox pour commencer le reverse 
engineering de facebook.

Après quelques essais, vous parvenez à isoler la requête qui permet de récupérer 
des chunks de listes d'amis (vous avez tenté l'API officielle de facebook 
seulement pour constater à quel point elle est plus restrictive que la simple 
navigation). Quelques heures plus tard vous avez un bot fonctionnel qui 
télécharge la liste d'amis complète d'une cible et la stocke dans un graphe, et 
qui peut compléter le graphe en regardant comment les amis de la cible sont amis 
entre eux, en téléchargeant leur liste d'amis.

Vous vous servez donc de ce script pour :
    1. Télécharger la liste d'amis de la cible.
    2. Télécharger toutes les listes d'amis des amis de la cible.
    3. Établir des liens d'amitié entre les amis de la cible.
    4. Exporter le tout dans un fichier de graphes standard (au hasard graphml).

Vous ouvrez le fichier contenant toutes ces infos sympas dans un logiciel dédié 
à l'analyse de graphes, gratuit et open source (genre Gephi ou Cytoscape).

Vous lancez le calcul d'une disposition par clusters ("organic" sur Cytoscape 
par exemple), et ça vous donne l'image en figure 1, après un peu de bricolage à 
la main.



C'est beau. On voit apparaître clairement les cercles sociaux de la cible...

Maintenant, c'est bien sympa mais ça nous avance tout ça ?

Oh que oui. Si la cible a bien rendu privé toutes ses infos personnelles, ce 
n'est sans doute pas le cas de ses amis. Il vous suffit de choisir un paquet 
d'amis, de visiter chacun de leurs profils pour voir ce qu'ils ont en commun. 
S'ils viennent tous de la même fac par exemple, il y a fort à parier que c'est 
là que la cible les a connu.

Hop, vous connaissez la fac de la victime.

Vous remarquez tout un paquet avec le même nom de famille que la cible. Hop, 
vous avez toute sa famille, y compris les membres qui n'ont pas le même nom, 
mais qui sont quand même dans le paquet.

Encore mieux, regardez bien cette image.


 Vous voyez la cible en plein milieu, mais vous constatez aussi une autre 
personne qui partage beaucoup de ses amis dans un peu tous les cercles sociaux. 
Donc quelqu'un qui partage sa vie. Donc sa copine, par exemple (cette image 
n'est d'ailleurs pas issue d'un dox mais d'un test que j'ai réalisé sur un ami, 
donc je peux confirmer qu'il s'agit effectivement de sa copine).

Voilà comment, à partir des simples relations d'amitiés, on peut en apprendre 
vraiment beaucoup sur une cible. Imaginez qu'ici, on ne s'intéresse même pas aux 
contenus des messages ou des posts sur les murs publics. C'est 100% de l'analyse 
de métadonnées.

Imaginez maintenant que facebook disposent de toutes ces infos disponibles 
instantanément, qu'eux ne se privent pas de faire en plus de l'analyse 
sémantique des posts, qu'ils disposent de moyens de calcul inimaginables, etc, 
ça commence à vous donner une idée de la capacité de flicage que ces média 
offrent aux agences gouvernementales.

J'ai fait ici une petite description des attaques de base qu'on peut faire quand 
on connaît le réseau social d'une cible. Il en existe sûrement beaucoup 
d'autres, mais je me suis personnellement surtout focalisé sur les cercles 
sociaux car c'est quelque chose de relativement facile à mettre en place sur 
facebook.

À noter que j'ai testé tout ça il y a deux-trois ans et que facebook a sans 
doute implémenté des parades à ce genre de bots. J'ai notamment entendu parlé de 
blocage de comptes lorsque l'on visite trop de profils inconnus. À voir. Le 
principe n'en reste pas moins général, et on peu imaginer récupérer ce genre de 
données par un autre moyen.

## 3 : OUTILS

Petit topos sur les outils utilisés et que je recommande :
    - urllib2 : lib python pour les requêtes, assez bas niveau pour avoir un 
      peu de contrôle.
    - request : lib python pour les requêtes, vachement plus facile à utiliser
      que urllib, à voir si c'est pas mieux.
    - networkx : lib python pour gérer les graphes, simple d'utilisation et 
      fournit des fonctions pour exporter en .graphml.
    - threading : lib python pour gérer les threads. Si vous vous lancez dans 
      l'aventure, vous allez voir que télécharger les listes d'amis par chunk 
      de 20 (facebook est conçu comme ça...) prend un temps fou, d'où 
      l'intérêt de threader tout ça.
    - Cytoscape : logiciel de visualisation de graphes, gratuit et open source, 
      a une fonction de disposition "organique" qui permet de bien faire 
      apparaître les cercles sociaux.
    - Gephi : logiciel de visualisation de graphes, peut-être mieux foutu que 
      Cytoscape mais je ne l'ai découvert qu'après, je l'utilise pour un autre 
      projet, je le préfère globalement.

Voilà à quoi ressemblait mon script pour cartographier facebook, ça vous donnera 
une idée :



Un protip pour l'extraction des listes d'amis : ne pas désespérer si les listes 
d'amis sont cachées. On peut récupérer quelques amis à partir des commentaires 
et des likes sur les photos de profil, puis regarder les amis de ces amis, puis 
les amis des amis de ces amis pour voir si la cible n'apparaît pas dedans. En 
gros, bruteforcer la liste d'amis. C'est long (jusqu'à 4-5h avec une connexion 
pas top)  mais ça marche, j'ai testé et validé cette méthode.

Par exemple sur le screenshot ci-dessus, on voit que 138 amis ont été trouvés 
rien qu'à
partir des images...

## CONCLUSION

J'espère que cet article vous aura donné un peu de recul sur votre perception 
des réseaux sociaux. Si nos relations avec nos proches ont l'air opaques et 
confuses quand on n'y pense pas trop, elles sont en réalité très structurées et 
en disent beaucoup sur vous et sur vos proches.

Maintenant, on peut se demander comment structurer la chaîne d'information dans 
un réseau pour éviter ce genre d'attaque aux métadonnées dont les agences 
gouvernementatales semblent faire leur spécialité.

Ce qui ressort souvent dans la littérature, c'est l'importance de bâtir un 
réseau décentralisé, composé de petites cellules isolées, et de minimiser les 
contacts.

Il y a certainement d'autres méthodes, mais se poser la question constitue déjà 
une bonne moitié du chemin.