
Snoopy: Ein verteiltes Tracking- und Datenabfang-Framework
| || | | || || || || | | |
| _____|| |_| || _ || _ || _ || |_| |
| |_____ | || | | || | | || |_| || |
|_____ || _ || |_| || |_| || ___||_ _|
_____| || | | || || || | | |
|_______||_| |__||_______||_______||___| |___|
V0.1
"Amy, Technologie ist nicht von Natur aus gut oder böse. Es kommt darauf an, wie sie verwendet wird. Wie der Todesstrahl."
-Professor Farnsworth
Willkommen bei Snoopy; einem verteilten Tracking- und Profiling-Framework. Snoopy ist ein Werk in Arbeit, also zögern Sie nicht, Vorschläge und/oder Korrekturen einzureichen. Dieses Dokument beschreibt die grundlegende Verwendung. Um den Hintergrund etwas besser zu verstehen, werfen Sie einen Blick auf Folgendes:
Die Client-Software läuft auf sogenannten „Drohnen" (Drones). Eine Drohne kann jedes Linux-basierte Gerät mit einer WLAN-Schnittstelle (mit Injektionstreibern) und ausgehender Internetverbindung sein. Snoopy wurde auf einem Nokia N900 und einem Laptop mit BackTrack getestet. Die Drohnen führen die folgenden beiden Vorgänge aus:
Gesammelte Probe Requests (z. B. Bobs iPhone, das nach BTHomeHub-4123 sucht) werden in regelmäßigen Abständen zum Snoopy-Server hochgeladen. Allen Geräten, die sich mit dem Rogue AP verbinden, wird der Internetzugang über den Snoopy-Server bereitgestellt.
Der Server trägt alle Probe Requests in eine Datenbank ein und verwendet Wigle, um GPS-Koordinaten zu bestimmen, sowie Google Maps, um Straßenadressen (und Street-View-Fotos) zu ermitteln. Das bedeutet: Wenn Sie nach Ihrem Heimnetzwerk suchen, könnte ich ein Foto Ihres Hauses erhalten.
Jede Drohne verbindet sich über OpenVPN mit dem Server und besitzt ein eigenes Subnetz. Verbundene Clients erhalten eine IP-Adresse von der Drohne und leiten ihren Datenverkehr über sie. Das bedeutet, dass wir auf dem Server Client-IP-Adressen (und damit MAC-Adressen) der Internetaktivität zuordnen können.
Auf dem Server passiert Folgendes:
Das Netzwerkdiagramm sieht wie folgt aus:
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 hat eine Weboberfläche für Snoopy geschrieben. Sie ist unter http://your-snoopy-server.com:5000/ erreichbar.
Es gibt mehrere Maltego-Transforms, um gesammelte Daten grafisch zu untersuchen (weitere Informationen siehe unten).
INSTALLATION ================ Die Serverinstallation sollte unkompliziert sein. Sie wurde nur auf einer Standardinstallation von Ubuntu 12.04 LTS 32bit getestet. Es werden Änderungen an mehreren Serverkomponenten vorgenommen, daher wird dringend empfohlen, das Installationsskript auf einer Basisinstallation auszuführen und auf dieser Maschine nichts Weiteres zu betreiben (falls überhaupt). Im Zweifelsfall gehen Sie die Datei install.sh durch und nehmen Sie die Änderungen manuell vor. Andernfalls führen Sie einfach das Installationsprogramm (./install.sh) aus.
VERWENDUNG ======== Sobald die Installation abgeschlossen ist, sollten Sie einfach 'snoopy' eingeben können, damit das Servermenü geladen wird. Falls nicht (oder im Zweifelsfall), gehen Sie in das Home-Verzeichnis des Benutzers, der während der Installation angelegt wurde. Im Verzeichnis 'snoopy/server/' befindet sich eine Datei 'snoopy.sh', die Sie ausführen können. Unten sehen Sie das Menü:
+---------------------------------------------------------------+
| Welcome to Snoopy V0.1 |
| SERVER SIDE |
| |
| SensePost Information Security |
| [email protected] / www.sensepost.com |
+---------------------------------------------------------------+
Date: Thu Nov 1 16:37:08 CET 2012
Snoopy Server Status: Stopped
Connected Drones: 0
Wigle User: setYourWigleAccount
Would you like to:
[1] (Re)Start Snoopy server components
[2] Stop Snoopy server components
[3] Manage drone configuration packs
[4] Configure server options
[5] Set web traffic injection string
[6] Observe logs
[X] Exit
[?] Help
Drohnen-Pakete erstellen Mit Option [3] im Menü können Sie clientseitige 'Pakete' für Ihre Drohnen-Geräte erstellen. Jede Drohne erhält ihre eigenen OpenVPN- und SSH-Schlüssel, DHCP-Bereiche und Routing-Tabellen. Für jedes Drohnen-Gerät erhalten Sie eine Download-URL. Stellen Sie sicher, dass Server und Drohne die Uhrzeit korrekt eingestellt haben, da sich sonst die VPN-Verbindung nicht aufbaut.
Auf jede Snoopy-Entität können verschiedene Transforms angewendet werden. Ziehen Sie die Entität 'Snoopy' auf Ihren Graphen, um zu beginnen. Wenn Sie in den Eigenschaften der Entität kein Start- oder Enddatum angeben, werden standardmäßig die Ergebnisse der letzten 5 Minuten abgerufen (dieser Wert kann im Serverkonfigurationsmenü geändert werden).
Die Snoopy-Maschinen ermöglichen es Ihnen, Transforms automatisch zu sequenzieren und Knoten basierend auf Anforderungen zu filtern/löschen. Der Quellcode/die Kommentare sollten ausreichend beschreiben, wie sie funktionieren.
RECHTLICHE HINWEISE ======================= Einige oder alle Snoopy-Komponenten könnten an Ihrem Wohnort illegal sein. Bitte informieren Sie sich, bevor Sie die Software verwenden. Im Vereinigten Königreich ist die Probe-Sammelkomponente aufgrund des Broadcast-Charakters des Datenverkehrs legal. Die Rogue-Access-Point-Komponente jedoch ist in den meisten Regionen höchstwahrscheinlich illegal. SensePost übernimmt keine Verantwortung dafür, wenn Sie durch die Nutzung dieses Tools in Schwierigkeiten geraten.
SICHERHEITSHINWEISE ========================== Jedes 'Drone-Paket' enthält OpenVPN- und SSH-Schlüssel. Wenn eine Drohne kompromittiert wird (durch Diebstahl oder anderweitig), kann dies ein Sicherheitsrisiko für Ihren Server darstellen. Es wird dringend empfohlen, dass Ihr Snoopy-Server ausschließlich für seinen Zweck betrieben wird. Dem auf dem Server angelegten Benutzer wird für ein wenig zusätzliche Sicherheit automatisch Folgendes zur Datei .ssh/authorized_hosts hinzugefügt:
"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/bin/rsync ${SSH_ORIGINAL_COMMAND#* }""
ZUKÜNFTIGE ARBEITEN =============== Es gibt noch viele Dinge zu tun / hinzuzufügen. Diese Version ist eher ein PoC.
Dank für Hilfe/Ratschläge/Input an:
F. Wir wissen, dass ein ausländischer Spion am 11. November in Heathrow ankommt, aber wir wissen nicht, wann oder mit welchem Flug. Unseren Erkenntnissen zufolge wird er nach der Ankunft im Hilton übernachten, und am 14. einen Flug vom Flughafen Luton nehmen (auch hier wissen wir weder Zeit noch Ziel). Er ist ein Meister der Verkleidung. Wie können wir ihn identifizieren?
A. Setzen Sie Snoopy-Drohnen in Heathrow, Hilton und Luton ein. Der Maltego-Transform 'CommonLocation' erfasst die Schnittmenge aller Geräte, die an diesen drei Orten vorhanden sind. Hoffentlich gibt es nur ein Ergebnis – unser menschliches Ziel. Sobald er entdeckt ist, können wir Google Maps und Street-View-Fotos der Orte untersuchen, an denen unser Spion unterwegs war. Seine Identität könnte aufgedeckt werden, wenn sein(e) Gerät(e) dazu verleitet werden, sich mit dem Snoopy-Rogue-Access-Point zu verbinden (z. B. über sein Facebook, Twitter oder seine E-Mail).
Bitten Sie Snoopy, alle Personen zu erfassen, die sich in bestimmten sandigen^W unerwünschten Ländern mit einem WLAN-Hotspot verbunden haben.
Setzen Sie Snoopy in Ihren 10 Kaufhäusern ein. Erfassen Sie Personenverkehr, Stammkunden und Kundentypen.
Fügen Sie bösartigen Code ein, um Client-Geräte zu übernehmen und Malware zu installieren. Exploits können aufgrund der Routing-Tabellen direkt vom Server an verbundene Opfer gesendet werden.
TfL könnte in jeder Londoner U-Bahn eine Snoopy-Drohne einsetzen. Sie könnten den Personenverkehr überwachen, Spitzen- und Nebenzeiten/-tage erfassen und das Personal entsprechend zuweisen bzw. reduzieren.
Setzen Sie 500 Snoopy-Drohnen in ganz London ein. Überwachen Sie die Bewegungen von Menschen, wenn sie an einer Drohne vorbeigehen. Über Wochen/Monate angewendet, werden sich sicherlich interessante Bewegungsmuster von Menschen manifestieren.
Für einen Linux-basierten Desktop/Laptop ist die Karte Alfa AWUS036H durchschnittlich. Eine zuverlässigere Karte ist die Ubiquity SR-71. Rückmeldungen darüber, was bei Ihnen in Bezug auf die Injektionstreiber-Unterstützung funktioniert oder nicht, wären willkommen.
Beim N900 werden Sie feststellen, dass das Laden der Injektionstreiber die Akkulaufzeit erheblich reduziert. Das TecNet 6600mAh-Akkupack hielt im Test etwa 6-8 Stunden. Sie benötigen jedoch einen Adapter, um das N900 an ein beliebiges Akkupack anzuschließen. Auch die Reduzierung (oder Deaktivierung) der GPS-Abfragefrequenz verbessert die Akkulaufzeit.
Tipps zum Verbinden Ihres N900 mit Ihrem Laptop über USB (für SSH) finden Sie hier.
Ich teste derzeit auf dem RaspberryPi, dem Alfa-R36-Mini-AP und dem SheevaPlug. Ergebnisse folgen.
Sie können eigene Maltego-Transforms erstellen, um gesammelte Daten zu untersuchen. Die mitgelieferten dienen hauptsächlich zur Veranschaulichung der Möglichkeiten. Sehen Sie sich den Quellcode an und lesen Sie:
Kontaktieren Sie [email protected], wenn Sie Fragen haben (oder fragen Sie die großartigen Maltego-Leute).
Der Code der Web-UI ist über folgenden Pfad zugänglich: ~user/snoopy/server/bin/snoopy/src/snoopy/
Plug-ins bestehen aus zwei Teilen:
Ein Plug-in ist ein aufrufbares Objekt, das von der Snoopy-Anwendung dynamisch geladen wird. Beginnen wir mit einem Beispiel:
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()
Nun zur Schritt-für-Schritt-Erklärung...
from snoopy import db, pluginregistry
Wir benötigen db, um auf die Snoopy-Datenbank zuzugreifen, und pluginregistry, um unser
Plug-in zu registrieren.
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
So registrieren wir unser Plug-in (das ein beliebiges aufrufbares Objekt sein kann). Das erste
Argument gibt den Namen der Gruppe an, in die dieses Plug-in fällt. Wir
haben client-data angegeben, da dieses Plug-in eine MAC-Adresse akzeptiert und
Daten zur Anzeige in einem Client-Datenfenster zurückgibt. Neben client-data gibt es
auch die Gruppe session-data von Plug-ins, die mit Näherungssitzungen
arbeiten. Der zweite Parameter ist der Plug-in-Name. Dieser Name dient nur
internen Zwecken und sollte JSON-freundlich sein. Der dritte Parameter ist der Plug-in-Titel.
Im Wesentlichen entspricht er dem Namen, aber der Titel wird in der GUI angezeigt.
Genauer gesagt ist dies der Titel des Datenbereichs im Client-Daten-
fenster.
Alle Schlüsselwortargumente nach dem Titel werden als Optionen gespeichert. Obwohl das Plug-in-
System keine Optionen erfordert, unterstützt Snoopy die Option js. Diese
Option gibt die URL (aus Sicht des Browsers, nicht aus Snoopys-/der
Serverseite) der JavaScript-Komponente dieses Plug-ins an.
def ssid_list(mac):
Dieses Plug-in ist eine einfache Funktion. Es akzeptiert eine MAC-Adresszeichenfolge, wie
in der Definition der client-data-Plug-ins. Der Name des aufrufbaren Objekts wird nicht verwendet.Der Hauptteil dieses Beispiel-Plug-ins führt einfach eine SQLAlchemy-Abfrage aus, die im Grunde SELECT DISTINCT probe_ssid FROM probes WHERE device_mac=$mac ausführt, und gibt die Ergebnisse als Liste zurück. Die Rückgabewerte von Plug-ins werden normalerweise als Teil einer JSON-Antwort hinzugefügt. Daher unterliegen die Ergebnisse der Einschränkung, dass sie JSON-kompatibel sein müssen (wie von der jsonify()-Funktion von Flask unterstützt).
So einfach ist das!
Frontend-Plug-ins für Client-Daten werden als Client-Daten-Handler bezeichnet. Sie werden über die Funktion Snoopy.registerPlugin(sectionName, dataHandler) registriert. sectionName ist der Name des Datenabschnitts, den der Daten-Handler verarbeiten möchte. Dieser Name ist derselbe wie der Name des Backend-Plug-ins, das die Daten erzeugt hat. Der dataHandler muss eine Funktion mit der folgenden Signatur sein: function($section, clientData) {...}. $section ist ein jQuery-Objekt des Div-Elements, in dem der Daten-Handler Daten anzeigen oder Änderungen vornehmen darf. Die Client-Daten (vom Backend-Plug-in erzeugt) werden im Parameter clientData übergeben.
Da die einzige erlaubte Ausgabe des Daten-Handlers Änderungen am übergebenen Div ($section) sind, ist kein Rückgabewert erforderlich.
Snoopy auf der Drohne installieren und ausführen Sie können bis zu 100 Drohnen betreiben (wenn Sie mehr möchten, sehen Sie in den Quellcode oder schreiben Sie mir eine E-Mail; es gibt keine echte Begrenzung). Die Installation besteht daraus, das Konfigurationspaket aus dem vorherigen Schritt herunterzuladen und das zugehörige Setup-Skript auszuführen. Beim Nokia N900 wird ein Symbol auf Ihrem Desktop platziert. z. B.:
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
SSID-Standorte nachschlagen Erstellen Sie ein Konto auf www.wigle.net und hinterlegen Sie Ihre Zugangsdaten über 'Configure server options'.
Weboberfläche Sie können die Weboberfläche über http://your-snoopy-server:5000/ aufrufen. Sie können eigene Plug-ins schreiben, um Daten zu durchsuchen und anzuzeigen. Walter hat es Ihnen leicht gemacht (siehe Anhang zu diesem Dokument).
Daten mit Maltego untersuchen Gehen Sie im Snoopy-Servermenü zu 'Configure Server Options' > 'Maltego'. Dort sehen Sie URLs zum Herunterladen von Snoopy-Entitäten, -Maschinen sowie URLs für Transforms. Um Maltego-Transforms zu verwenden, müssen Sie: