
Snoopy v2.0 - framework modular de seguimiento terrestre digital
SensePost presenta:
/$$$$$$
/$$__ $$
| $$ \__/ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$ /$$
| $$$$$$ | $$__ $$ /$$__ $$ /$$__ $$ /$$__ $$| $$ | $$
\____ $$| $$ \ $$| $$ \ $$| $$ \ $$| $$ \ $$| $$ | $$
/$$ \ $$| $$ | $$| $$ | $$| $$ | $$| $$ | $$| $$ | $$
| $$$$$$/| $$ | $$| $$$$$$/| $$$$$$/| $$$$$$$/| $$$$$$$
\______/ |__/ |__/ \______/ \______/ | $$____/ \____ $$
| $$ /$$ | $$
| $$ | $$$$$$/
|__/ \______/
Version: 2.0
Code: [email protected] // @glennzw
Visit: www.sensepost.com // @sensepost
License: Non-commercial use
¡Bienvenido a Snoopy Versión 2.0!
Para instalar y configurar Snoopy:
bash install.sh
Para guardar localmente los datos de los complementos inalámbricos, sysinfo y heartbeat:
snoopy -v -m wifi:mon=True -m sysinfo -m heartbeat -d myDrone -l London
Para sincronizar datos de un cliente a un servidor:
Servidor:
snoopy_auth --create myDrone # Create account
snoopy -v -m server # Start server plugin
Cliente:
snoopy -v -m wifi:mon=True -s http://<server>:9001/ -d myDrone -l London -k <key>
INTRODUCCIÓN Y VISIÓN GENERAL ============================= Snoopy es un framework distribuido de sensores, recopilación de datos, interceptación, análisis y visualización. Está escrito en un formato modular, lo que permite la recopilación de datos arbitrarios de diversas fuentes mediante complementos Python.
Arquitectura
Cada instancia de Snoopy puede ejecutar múltiples complementos simultáneamente. Un complemento recopila datos, que son consultados por el proceso principal de Snoopy y se escriben en una base de datos local. Snoopy puede sincronizar datos entre clientes (drones) y un servidor, y los clientes (drones) también pueden extraer réplicas de datos de un servidor. Cada instancia de Snoopy puede ejecutar los complementos adecuados para su posición en el panorama general. Aquí hay un diagrama que muestra una posible configuración:
Drone01 Server01
+---------------+ +--------------+
| Plugins: | | Plugins: |
| * WiFi | | *Server |
| * Bluetooth |====3G====>| |<=========================\
| * GSM | | | ||
| * FitBit | | | ||
+---------------+ +--------------+ ||
||
Drone02 Server02 Server03 ||
+---------------+ +--------------+ +-------------+ ||
| Plugins: | | Plugins: | | Plugins: | ||
| * WiFi | | * Server | | * Server | ||
| * Cookie |=====Xbee==>| * Heartbeat |==3G==>| * Wigle |<==\
| thief | || | | | * DataViz | ||
| * GPS | || | | | | ||
+---------------+ || +--------------+ +-------------+ ||
|| Internet
Drone03 || Laptop01 ||
+---------------+ || +--------------+ ||
| Plugins: | || | Plugins: | ||
| * Thermal | || | *RemotePull | ||
| * Camera |===/ | |====/
| * Heat | | Run: |
| | | *Maltego |
+---------------+ +--------------+
En la ilustración anterior, hay tres drones ejecutándose y sincronizando sus datos con dos servidores separados. Uno sincroniza vía 3G, los otros dos vía Xbee. El segundo servidor sincroniza sus datos con un tercer servidor. Finalmente, un cliente (portátil) extrae todos los datos del primer y tercer servidor, y ejecuta Maltego para explorar los datos.
Ejecutar 'sh install.sh' dentro del directorio snoopy-ng.git instalará todos los paquetes necesarios. Ofrece instalar aircrack desde el código fuente, lo cual es necesario para distribuciones sin este paquete (el conjunto de herramientas aircrack se usa para los complementos inalámbricos). No podemos recomendar Maltego lo suficiente para la exploración de datos; se puede descargar una edición comunitaria (con algunas restricciones) de forma gratuita desde el sitio web de Paterva en http://paterva.com.
Para ver todas las opciones y parámetros disponibles, hemos creado dos comandos para ti:
root@kali:~# snoopy --help (shorthand -h)
Este comando te da todas las opciones de ejecución, como el servidor con el que sincronizar, el nombre del dron y su ubicación. Además, también presenta cómo se ejecutarían los distintos complementos.
root@kali:~# snoopy --list (shorthand -i)
Este comando enumera todos los complementos disponibles y los parámetros que requiere cada complemento para funcionar correctamente. Para obtener información más detallada sobre cada complemento, usa '-ii' o '-iii'. Para obtener información sobre un complemento específico, usa '-i -m '.
Los complementos se pueden especificar con la opción --plugin (o su abreviatura -m). Se pueden especificar varios complementos, y se iniciarán en el orden en que se introduzcan. Cada complemento dispondrá de 60 segundos para indicar que está listo, tras lo cual expirará y se iniciará el siguiente complemento. Esto puede ser útil si los complementos posteriores dependen de las acciones de los anteriores.
Cada complemento puede aceptar numerosos parámetros (como se indica en la salida de --list) en forma de pares clave-valor separados por comas. A continuación usamos el complemento 'example', que simplemente genera números aleatorios.
snoopy --plugin example:x=1,v=True
Si no se proporcionan las opciones de dron / ubicación, se usan los valores predeterminados. Alternativamente, se pueden especificar como se muestra a continuación.
snoopy --plugin example:x=1,v=True --drone myDrone --location Cansas
Los datos se pueden sincronizar con una máquina remota proporcionando la opción --server (-s). La máquina remota debe estar ejecutando el complemento de servidor (--plugin server). Antes debe generarse una clave para un nombre de dron. Lo siguiente lo ilustra.
Servidor
root@server:~# snoopy_auth --create myDrone01 --verbose
[+] Creating new Snoopy server sync account
[+] Key for 'myDrone01' is 'GWWVF'
[+] Use this value in client mode to sync data to a remote server.
root@kali:~# snoopy --plugin server
[+] Running webserver on '0.0.0.0:9001'
[+] Plugin server caught data for 2 tables.
Cliente
root@client:~# snoopy --plugin example:x=1 --drone myDrone --key GWWVF --server http://<server_ip>:9001/ --verbose
[+] Starting Snoopy with plugins: example
[+] Plugin example created new random number: 21
[+] Snoopy successfully sunc 2 elements over 2 tables.
Extracción remota de datos
Los datos se pueden extraer de un servidor usando el complemento local_sync. Por ejemplo, supón que el servidor de arriba está en ejecución y realiza esta operación desde el cliente:
root@client:~# snoopy --plugin local_sync:server_url=http://<server_ip>:9001/ --drone myDrone --key GWWVF
[+] Plugin local_sync pulled 888 records from remote server.
El comportamiento predeterminado es almacenar todos los datos dentro de un archivo SQLITE snoopy.db. Esto se puede sobreescribir con el parámetro --dbms. Consulta la documentación de SQL Alchemy sobre cómo especificar diferentes motores de base de datos (http://docs.sqlalchemy.org/en/rel_0_9/dialects/index.html). Como ejemplo, a continuación usamos MySQL:
root@client:~# snoopy -v --plugin example --dbms=mysql://glenn:secret@localhost/snoopy_db
[+] Capturing local only. Saving to 'mysql://glenn:secret@localhost/snoopy_db'
Puede ser útil usar almacenamiento SQLITE en dispositivos más pequeños y hacer que el complemento de servidor guarde en MySQL (o similar). Otro ejemplo puede ser útil donde especificamos la ubicación del archivo para almacenar datos, como en un medio extraíble:
root@client:~# snoopy -v --plugin example --dbms=sqlite:////media/USB01/snoopy.db
Existe una opción --flush (-f) para 'purgar' los datos del almacenamiento local una vez que se han sincronizado con un servidor ascendente.
Snoopy se puede iniciar con un script upstart (consulta la carpeta ./setup/upstarts). En el mismo directorio se proporcionan otros scripts upstart de ejemplo, p. ej. uno para levantar una conexión PPP desde un módem 3G y otro para crear un canal remoto de comandos SSH.
Los sistemas basados en Debian (p. ej. Kali) no parecen soportar upstart. Mientras tanto, el archivo rc.local suministrado se puede usar para iniciar Snoopy y los servicios relacionados al arrancar.
Maltego es la herramienta preferida para realizar la visualización. Las instrucciones están a continuación:
Esto debería importar tanto las entidades como las transformaciones. Para empezar, arrastra la entidad 'Base of Operations' desde la pestaña Snoopy del menú Palette a un gráfico en blanco. Como ejemplo, realiza las siguientes operaciones sobre la entidad:
Existen transformaciones para obtener dominios y cookies (de la monitorización pasiva), buscar direcciones callejeras de SSID, y varias son bidireccionales (p. ej. puedes buscar clientes desde una ubicación, o ubicaciones desde un cliente). Lo mejor es experimentar.
Si no usas el formato sqlite predeterminado, edita el siguiente archivo para especificar la ubicación de los datos:
snoopy_ng/transforms/db_path.conf
El gráfico de Snoopy se puede compartir entre varios analistas simultáneamente usando la función de colaboración de Maltego. Selecciona Collaboration y 'Share Current Graph'.
USO COMERCIAL =================== La licencia bajo la que se distribuye Snoopy prohíbe obtener beneficios económicos (o de otro tipo) de su uso (consulta LICENSE.txt). Disponemos de una licencia aparte para uso comercial, que incluye funcionalidad adicional como:
Ponte en contacto ([email protected] / [email protected]) si quieres colaborar con nosotros.
Consulta el archivo plugins/example.py para entender cómo se deben escribir los complementos. Cualquier archivo colocado en la carpeta plugins se tratará como un complemento y debe tener las siguientes propiedades:
Por lo demás, el complemento puede hacer lo que quieras.
Snoopy se ejecutará en cualquier dispositivo Linux con soporte suficiente para instalar los archivos del archivo install.sh. Es decir, Python y paquetes relacionados. El soporte de hardware variará según los complementos necesarios, pero para el escenario más común de recopilar datos WiFi y subirlos vía 3G, se recomienda lo siguiente:
Se han probado Kali 1.05 y Ubuntu 12.04. Sistemas similares deberían funcionar.
Se produce una condición de error cuando se recopilan datos localmente, se sincronizan con un servidor remoto y luego se extrae una réplica del servidor. Por ejemplo:
Servidor
root@kali:~# snoopy -m server -m wigle:username=u,password=p,[email protected]
[+] Running webserver on '0.0.0.0:9001'
[+] Plugin server caught data for 2 tables.
Cliente
root@client:~# snoopy -m wifi -m local_sync:server_url=http://1.1.1.1:9001/ -d myDrone -l London -k secretkey -s http://1.1.1.1:9001/