
Snoopy: A distributed tracking and data interception framework
| || | | || || || || | | |
| _____|| |_| || _ || _ || _ || |_| |
| |_____ | || | | || | | || |_| || |
|_____ || _ || |_| || |_| || ___||_ _|
_____| || | | || || || | | |
|_______||_| |__||_______||_______||___| |___|
V0.1
« Amy, la technologie n’est pas intrinsèquement bonne ou mauvaise. C’est l’usage qu’on en fait. Comme le Rayon de la Mort. »
- Professeur Farnsworth
Bienvenue dans Snoopy ; un framework de pistage et de profilage distribué. Snoopy est un travail en cours, alors n’hésitez pas à soumettre des suggestions et/ou corrections. Ce document décrit l’utilisation de base. Pour mieux comprendre le contexte, jetez un œil aux éléments suivants :
Le logiciel côté client s’exécute sur ce que nous appelons des « Drones ». Un Drone peut être n’importe quel appareil sous Linux doté d’une interface WiFi (avec des pilotes d’injection) et d’une connectivité Internet sortante. Snoopy a été testé sur un Nokia N900 et un ordinateur portable exécutant BackTrack. Les Drones effectuent les deux opérations suivantes :
Les requêtes de sondage collectées (par exemple, l’iPhone de Bob cherchant BTHomeHub-4123) sont téléchargées vers le serveur Snoopy à intervalles réguliers. Tous les appareils qui s’associent au point d’accès Rogue voient leur Internet servi via le serveur Snoopy.
Le serveur peuple toutes les requêtes de sondage dans une base de données, utilise Wigle pour déterminer les coordonnées GPS, et Google Maps pour déterminer les adresses postales (et les photos Street View). Cela signifie que si vous sondez votre réseau domestique, je pourrais obtenir une photo de votre maison.
Chaque Drone se connecte au serveur via OpenVPN et possède son propre sous-réseau. Les clients associés reçoivent une adresse IP du Drone et acheminent le trafic via celui-ci. Cela signifie que sur le serveur, nous pouvons faire correspondre les adresses IP des clients (et donc leurs adresses MAC) à leur activité Internet.
Sur le serveur, les actions suivantes ont lieu :
Le schéma réseau est le suivant :
Client1 Drone1 Snoopy Server
+----------+ +-----------------------+ +-----------------------+
| wlan0-|<---WiFi--->|-at0 | | eth0|<-squid-sslstrip-mitmproxy->Internet
| | | | 10.2.0.1 | | 11.22.33.44| |
| dhclient | | | | | | Traffic inspection
| | | | tap0-|<-openvpn----->|-tap0 | Social media analysis
+----------+ | | 192.168.42.2 | +--/| 192.168.42.1 |
10.2.0.2 | +-----------------------+ | +-----------------------+
| |
| | route 10.2.0.0 via 192.168.42.2
| | route 10.3.0.0 via 192.168.42.3
Client2 | |
+----------+ | |
| wlan0-|<---+ |
| | |
| dhclient | |
| | |
+----------+ |
10.2.0.3 |
|
|
|
Client3 Drone2 |
+----------+ +-----------------------+ |
| wlan0-|<---WiFi--->|-at0 | |
| | | | 10.3.0.1 | |
| dhclient | | | | |
| | | | tap0-|<-openvpn--+
+----------+ | | 192.168.42.3 |
10.3.0.2 | +-----------------------+
|
|
|
Client4 |
+----------+ |
| wlan0-|<---+
| |
| dhclient |
| |
+----------+
10.3.0.3
Walter a écrit une interface web pour Snoopy. Elle est accessible depuis http://votre-serveur-snoopy.com:5000/
Plusieurs transformations Maltego existent pour explorer graphiquement les données collectées (voir ci-dessous pour plus d’informations).
INSTALLATION ================ L’installation du serveur devrait être simple. Elle n’a été testée que sur une installation standard d’Ubuntu 12.04 LTS 32 bits. Des modifications sont apportées à plusieurs composants du serveur, il est donc fortement recommandé d’exécuter le script d’installation sur une installation de base, et de ne pas faire grand chose d’autre sur cette machine (si possible). En cas de doute, parcourez le fichier install.sh et effectuez les modifications manuellement. Sinon, exécutez simplement l’installateur (./install.sh).
UTILISATION ======== Une fois l’installation terminée, vous devriez pouvoir taper 'snoopy' pour charger le menu du serveur. Sinon (ou en cas de doute), allez dans le répertoire personnel de l’utilisateur créé lors de l’installation. Dans le répertoire 'snoopy/server/', il y a un fichier 'snoopy.sh' que vous pouvez exécuter. Voici le menu :
+---------------------------------------------------------------+
| Bienvenue dans Snoopy V0.1 |
| CÔTÉ SERVEUR |
| |
| SensePost Security de l’information |
| [email protected] / www.sensepost.com |
+---------------------------------------------------------------+
Date: Thu Nov 1 16:37:08 CET 2012
Statut du serveur Snoopy : Arrêté
Drones connectés : 0
Utilisateur Wigle : setYourWigleAccount
Que souhaitez-vous faire :
[1] (Re)Démarrer les composants du serveur Snoopy
[2] Arrêter les composants du serveur Snoopy
[3] Gérer les packs de configuration des drones
[4] Configurer les options du serveur
[5] Définir la chaîne d’injection du trafic web
[6] Observer les journaux
[X] Quitter
[?] Aide
Création de packs drones L’option [3] du menu vous permettra de créer des « packs » côté client pour vos appareils Drone. Chaque Drone reçoit ses propres clés OpenVPN et SSH, ses plages DHCP et ses tables de routage. Une URL de téléchargement vous sera fournie pour chaque appareil Drone. Assurez-vous que votre serveur et votre drone ont l’heure correctement réglée, sinon la connexion VPN ne s’établira pas.
Chaque entité Snoopy peut avoir différentes transformations qui lui sont appliquées. Faites glisser l’entité « Snoopy » sur votre graphe pour commencer. Si vous ne spécifiez pas de date de début ou de fin dans les propriétés des entités, les résultats seront récupérés pour les 5 dernières minutes par défaut (cette valeur peut être modifiée dans le menu de configuration du serveur).
Les machines Snoopy vous permettent d’automatiser les séquences de transformations et de filtrer/supprimer des nœuds en fonction de critères. Les sources/commentaires devraient suffisamment expliquer leur fonctionnement.
CONSIDÉRATIONS LÉGALES ======================= Tout ou partie des composants de Snoopy peuvent être illégaux dans votre pays. Renseignez-vous avant d’utiliser le logiciel. Au Royaume-Uni, le composant de collecte de sondages est légal en raison de la nature diffusée du trafic. Cependant, le composant du point d’accès rogue est très probablement illégal dans la plupart des régions. SensePost décline toute responsabilité quant aux problèmes que vous pourriez rencontrer en utilisant cet outil.
CONSIDÉRATIONS DE SÉCURITÉ ========================== Chaque « pack Drone » contient des clés OpenVPN et SSH. Si un Drone est compromis (par vol ou autre), cela peut présenter un risque de sécurité pour votre serveur. Il est fortement recommandé que votre serveur Snoopy soit dédié à cette seule fonction. L’utilisateur créé sur le serveur a les éléments suivants automatiquement ajoutés au fichier .ssh/authorized_hosts, pour un peu plus de sécurité :
"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/bin/rsync ${SSH_ORIGINAL_COMMAND#* }""
TRAVAUX FUTURS =============== Il reste encore beaucoup de choses à faire / ajouter. Cette version est plutôt une preuve de concept.
Merci pour l’aide, les conseils et les contributions de :
Q. Nous savons qu’un espion étranger arrive à Heathrow le 11 novembre, mais nous ne savons pas quand ni sur quel vol. Nos renseignements suggèrent qu’il séjournera au Hilton après son arrivée et prendra un vol depuis l’aéroport de Luton le 14 (là encore, nous ne connaissons ni l’heure ni la destination). C’est un maître du déguisement. Comment pouvons-nous l’identifier ?
R. Déployez des drones Snoopy à Heathrow, au Hilton et à Luton. La transformation Maltego « CommonLocation » notera l’intersection de tous les appareils présents à ces trois endroits. Espérons qu’un seul résultat – notre cible humaine. Une fois découvert, nous pouvons examiner les cartes Google et les photos Street View des lieux où notre espion s’est rendu. Son identité pourrait être révélée si ses appareils sont amenés à se connecter au point d’accès rogue de Snoopy (par exemple, son Facebook, Twitter ou email).
Demandez à Snoopy de noter toutes les personnes qui se sont connectées à un point WiFi dans certains pays sablonneux^W indésirables.
Déployez Snoopy dans vos 10 magasins. Notez le trafic humain, les clients réguliers, les types de clients.
Injectez du code malveillant pour prendre le contrôle des appareils clients et installer des logiciels malveillants. Les exploits peuvent être déclenchés directement depuis le serveur vers les victimes connectées, grâce aux tables de routage.
TFL pourrait déployer un drone Snoopy dans chaque station du métro londonien. Ils pourraient surveiller le trafic humain, noter les heures et jours de pointe et de creux, et attribuer/réduire le personnel en conséquence.
Déployez 500 drones Snoopy dans tout Londres. Surveillez les déplacements des personnes lorsqu’elles passent près d’un drone. Des schémas de mouvement humain intéressants se manifesteront sûrement si cela est appliqué sur plusieurs semaines/mois.
Pour un ordinateur de bureau/portable sous Linux, la carte Alfa AWUS036H donne des résultats moyens. Une carte plus fiable est la Ubiquity SR-71. Tout retour sur ce qui fonctionne/ne fonctionne pas pour vous en termes de support des pilotes d’injection serait apprécié.
Pour le N900, vous remarquerez que le chargement des pilotes d’injection réduit considérablement l’autonomie de la batterie. Le pack de batteries TecNet 6600mAh a donné environ 6 à 8 heures lors des tests. Vous aurez cependant besoin d’un adaptateur pour brancher le N900 à un pack de batteries. Réduire (ou désactiver) la fréquence d’interrogation GPS améliorera également l’autonomie.
Des conseils pour connecter votre N900 à votre ordinateur portable via USB (dans le but d’utiliser SSH) sont disponibles ici
Je teste actuellement sur le RaspberryPi, l’Alfa R36 mini AP et le SheevaPlug. Résultats à suivre.
Vous pouvez créer vos propres transformations Maltego pour explorer les données collectées. Celles fournies sont principalement destinées à démontrer ce qui peut être fait. Consultez le code source et lisez :
Contactez [email protected] si vous avez des questions (ou demandez aux géniaux gars de Maltego).
Le code de l’interface web est accessible via ~user/snoopy/server/bin/snoopy/src/snoopy/
Les plug-ins se composent de deux parties :
Un plug-in est un appelable qui est chargé dynamiquement par l’application Snoopy. Commençons par un exemple :
from snoopy import db, pluginregistry
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
def ssid_list(mac):
with db.SessionCtx() as session:
query = session.query(
distinct(db.Probe.probe_ssid) # SELECT DISTINCT probe_ssid FROM probes
).filter_by(
device_mac=mac # WHERE device_mac=$mac
).order_by(
db.Probe.probe_ssid # ORDER BY probe_ssid
)
return query.all()
Passons maintenant à l’explication détaillée…
from snoopy import db, pluginregistry
Nous avons besoin de db pour accéder à la base de données Snoopy et de pluginregistry pour enregistrer notre plug-in.
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
C’est ainsi que nous enregistrons notre plug-in (qui peut être n’importe quel appelable). Le premier argument spécifie le nom du groupe auquel ce plug-in appartient. Nous avons spécifié client-data, car ce plug-in accepte une adresse MAC et renvoie des données à afficher dans une fenêtre de données client. En plus de client-data, il existe également le groupe de plug-ins session-data qui opère sur les sessions de proximité. Le deuxième paramètre est le nom du plug-in. Ce nom est à usage interne uniquement et doit être compatible JSON. Le troisième paramètre est le titre du plug-in. Essentiellement, c’est la même chose que le nom, mais le titre est affiché dans l’interface graphique. Plus précisément, c’est le titre de la section de données dans la fenêtre des données client.
Tous les arguments nommés après le titre sont sauvegardés comme options. Bien que le système de plug-ins n’exige aucune option, Snoopy supporte l’option js. Cette option spécifie l’URL (du côté du navigateur, pas du côté de Snoopy/du serveur) du composant JavaScript de ce plug-in.
def ssid_list(mac):
Ce plug-in est une simple fonction. Elle accepte une chaîne d’adresse MAC, comme défini pour les plug-ins client-data. Le nom de l’appelable n’est pas utilisé.Le corps de cet exemple de plug-in effectue simplement une requête SQLAlchemy qui fait essentiellement SELECT DISTINCT probe_ssid FROM probes WHERE device_mac=$mac et retourne les résultats sous forme de liste. Les valeurs de retour des plug-ins sont généralement ajoutées dans le cadre d'une réponse JSON. Par conséquent, les résultats ont la limitation de devoir être compatibles avec JSON (comme supporté par la fonction jsonify() de Flask).
Aussi simple que cela !
Les plug-ins front-end pour les données client sont appelés gestionnaires de données client. Ils sont enregistrés via la fonction Snoopy.registerPlugin(sectionName, dataHandler). sectionName est le nom de la section de données que le gestionnaire de données souhaite traiter. Ce nom est le même que le nom du plug-in back-end qui a généré les données. dataHandler doit être une fonction avec la signature suivante : function($section, clientData) {...}. $section est un objet jQuery de l'élément div où le gestionnaire de données peut afficher des données ou appliquer des modifications. Les données client (générées par le plug-in back-end) sont fournies dans le paramètre clientData.
Étant donné que la seule sortie autorisée du gestionnaire de données est les modifications apportées au div donné ($section), aucune valeur de retour n'est nécessaire.
Installation et exécution de Snoopy sur le Drone Vous pouvez avoir jusqu’à 100 drones (si vous en voulez plus, consultez le code source ou envoyez-moi un email, il n’y a pas de limitation réelle). L’installation consiste à télécharger le pack de configuration depuis l’étape précédente et à exécuter le script de configuration correspondant. Pour le Nokia N900, une icône sera placée sur votre bureau. Exemple :
haxor@drone001# wget http://snoopy-server.com/secretdir/drone001.tar.gz
haxor@drone001# tar xzvf drone001.tar.gz
haxor@drone001# cd snoopy && ./setup_n900.sh
Recherche des emplacements des SSID Créez un compte sur www.wigle.net et définissez vos identifiants via « Configurer les options du serveur »
Interface web Vous pouvez accéder à l’interface web via http://votre-serveur-snoopy:5000/. Vous pouvez écrire vos propres plugins pour parcourir et afficher les données. Walter a facilité les choses pour vous (consultez l’annexe de ce document).
Exploration des données avec Maltego Dans le menu du serveur Snoopy, allez dans « Configurer les options du serveur » > « Maltego ». Vous y trouverez des URL pour télécharger les entités, machines et transformations de Snoopy. Pour utiliser les transformations Maltego, vous devrez :