
Snoopy: Un framework distribuido de seguimiento e interceptación de datos
| || | | || || || || | | |
| _____|| |_| || _ || _ || _ || |_| |
| |_____ | || | | || | | || |_| || |
|_____ || _ || |_| || |_| || ___||_ _|
_____| || | | || || || | | |
|_______||_| |__||_______||_______||___| |___|
V0.1
"Amy, la tecnología no es intrínsecamente buena ni mala. Depende de cómo se use. Como el Rayo de la Muerte."
-Profesor Farnsworth
Bienvenido a Snoopy; un framework distribuido de seguimiento y perfilado. Snoopy es un trabajo en curso, así que no dudes en enviar sugerencias y/o correcciones. Este documento describe el uso básico. Para entender un poco más los antecedentes, echa un vistazo a lo siguiente:
El software del lado del cliente se ejecuta en lo que llamamos "Drones". Un Drone puede ser cualquier dispositivo basado en Linux que tenga una interfaz WiFi (con controladores de inyección) y conectividad saliente a Internet. Snoopy ha sido probado en un Nokia N900 y en una laptop con BackTrack. Los Drones realizan las siguientes dos operaciones:
Las solicitudes de sonda recolectadas (p. ej., el iPhone de Bob buscando BTHomeHub-4123) se suben al servidor Snoopy a intervalos regulares. Todos los dispositivos que se asocian al Rogue AP reciben su Internet a través del servidor Snoopy.
El servidor introduce todas las solicitudes de sonda en una base de datos, y usa Wigle para determinar las coordenadas GPS, y Google Maps para determinar direcciones de calles (y fotografías de street view). Esto significa que si estás sondeando tu red doméstica, podría obtener una fotografía de tu casa.
Cada Drone se conecta al servidor a través de OpenVPN y tiene su propia subred. Los clientes asociados reciben una dirección IP del Drone y enrutan su tráfico a través de él. Esto significa que en el servidor podemos asociar las direcciones IP de los clientes (y por tanto las direcciones MAC) con la actividad de Internet.
En el servidor ocurre lo siguiente:
El diagrama de red se ve así:
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 escribió una interfaz web para Snoopy. Se puede acceder a ella desde http://your-snoopy-server.com:5000/
Existen varias transformaciones de Maltego para explorar gráficamente los datos recopilados (ver más abajo para más información).
INSTALACIÓN ================ La instalación del servidor debería ser sencilla. Solo se ha probado en una instalación estándar de Ubuntu 12.04 LTS 32bit. Se realizan cambios en varios componentes del servidor, por lo que es muy recomendable ejecutar el script de instalación en una instalación base, y no ejecutar mucho más en esa máquina (si acaso algo). En caso de duda, revisa el archivo install.sh y haz los cambios manualmente. De lo contrario, simplemente ejecuta (./install.sh) el instalador.
USO ======== Una vez que la instalación haya terminado, deberías poder escribir 'snoopy' para que se cargue el menú del servidor. Si no es así (o en caso de duda), ve al directorio de inicio del usuario creado durante la fase de instalación. Dentro del directorio 'snoopy/server/' hay un archivo 'snoopy.sh' que puedes ejecutar. A continuación se muestra el 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
Creación de paquetes de drone La opción [3] del menú te permitirá crear 'paquetes' del lado del cliente para tus dispositivos Drone. Cada Drone recibe sus propias claves OpenVPN y SSH, rangos DHCP y tablas de enrutamiento. Se te proporcionará una URL de descarga por cada dispositivo Drone. Asegúrate de que el servidor y el drone tengan la hora configurada correctamente, o la conexión VPN no se establecerá.
Cada entidad de Snoopy puede tener diferentes transformaciones aplicadas. Arrastra la entidad 'Snoopy' a tu grafo para empezar. Si no especificas una fecha de inicio o fin en las propiedades de las entidades, se obtendrán los resultados de los últimos 5 minutos por defecto (este valor se puede cambiar en el menú de configuración del servidor).
Las máquinas de Snoopy te permiten secuenciar transformaciones automáticamente y filtrar/eliminar nodos según los requisitos. El código fuente/los comentarios deberían explicar suficientemente cómo funcionan.
CONSIDERACIONES LEGALES ======================= Todos o algunos de los componentes de Snoopy pueden ser ilegales en tu lugar de residencia. Infórmate antes de usar el software. En el Reino Unido, el componente de recolección de sondas es legal debido a la naturaleza de difusión del tráfico. Sin embargo, el componente de punto de acceso no autorizado (rogue access point) es muy probablemente ilegal en la mayoría de las regiones. SensePost no se hace responsable de que te metas en problemas por usar esta herramienta.
CONSIDERACIONES DE SEGURIDAD ========================== Cada 'Drone pack' contiene claves OpenVPN y SSH. Si un Drone se ve comprometido (por robo o de otra forma) puede suponer un riesgo de seguridad para tu servidor. Se recomienda encarecidamente que tu servidor Snoopy se ejecute dedicado a su propósito. Al usuario creado en el servidor se le añade automáticamente lo siguiente al archivo .ssh/authorized_hosts file, para un poco más de seguridad:
"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/bin/rsync ${SSH_ORIGINAL_COMMAND#* }""
TRABAJO FUTURO =============== Quedan muchas cosas por hacer / añadir. Esta versión es más bien una prueba de concepto (PoC).
Gracias por la ayuda/consejos/aportaciones a:
P. Sabemos que un espía extranjero llega a Heathrow el 11 de noviembre, pero no sabemos cuándo ni en qué vuelo. Nuestra inteligencia sugiere que se alojará en el Hilton tras llegar, y que cogerá un vuelo desde el aeropuerto de Luton el 14 (de nuevo, no sabemos a qué hora ni destino). Es un maestro del disfraz. ¿Cómo podemos identificarlo?
R. Despliega drones Snoopy en Heathrow, el Hilton y Luton. La transformación 'CommonLocation' de Maltego anotará la intersección de todos los dispositivos presentes en esas tres ubicaciones. Con suerte, solo un resultado: nuestro objetivo humano. Una vez descubierto, podemos examinar Google Maps y las fotografías de street view de a dónde ha viajado nuestro espía. Su identidad podría revelarse si sus dispositivos son engañados para conectarse al punto de acceso no autorizado de Snoopy (como su Facebook, Twitter o correo electrónico).
Pide a Snoopy que registre a todos los individuos que se hayan conectado a un punto WiFi en ciertos países arenosos^W indeseables.
Despliega Snoopy en tus 10 grandes almacenes. Registra el tráfico de personas, clientes recurrentes, tipos de clientes.
Inyecta código malicioso para tomar el control de los dispositivos de los clientes e instalar malware. Los exploits pueden lanzarse directamente desde el servidor a las víctimas conectadas, gracias a las tablas de enrutamiento.
TFL podría desplegar un Snoopy Drone en cada estación del metro de Londres. Podrían monitorizar el tráfico de personas, anotando horas/días punta y valle, y asignar/reducir personal en consecuencia.
Despliega 500 Snoopy Drones por todo Londres. Monitoriza los movimientos de las personas cuando pasan cerca de un Drone. Seguro que aparecerán patrones interesantes de movimiento humano si se aplica durante semanas/meses.
Para un escritorio/portátil basado en Linux, la tarjeta Alfa AWUS036H tiene un rendimiento medio. Una tarjeta más fiable es la Ubiquity SR-71. Se agradecerá cualquier comentario sobre lo que te funciona o no en cuanto a soporte de controladores de inyección.
En el N900, notarás que la carga de los controladores de inyección reduce severamente la duración de la batería. El paquete de batería TecNet 6600mAh proporcionó alrededor de 6-8 horas en las pruebas. Sin embargo, necesitarás un adaptador para conectar el N900 a cualquier paquete de batería. Reducir (o deshabilitar) la frecuencia de sondeo del GPS también ayudará a la duración de la batería.
Puedes encontrar consejos sobre cómo conectar tu N900 a tu portátil por USB (con el fin de usar SSH) aquí
Actualmente estoy probando con la RaspberryPi, el mini AP Alfa R36 y la SheevaPlug. Resultados próximamente.
Puedes crear tus propias transformaciones de Maltego para explorar los datos recopilados. Las proporcionadas son en su mayoría para demostrar lo que se puede hacer. Revisa el código fuente y lee:
Contacta con [email protected] si tienes alguna duda (o pregúntale a los increíbles chicos de Maltego).
El código de la interfaz web es accesible a través de ~user/snoopy/server/bin/snoopy/src/snoopy/
Los plugins constan de dos partes:
Un plugin es un elemento invocable que la aplicación Snoopy carga dinámicamente. Comencemos con un ejemplo:
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()
Ahora, paso a paso...
from snoopy import db, pluginregistry
Necesitamos db para acceder a la base de datos de Snoopy y pluginregistry para registrar nuestro
plugin.
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
Así es como registramos nuestro plugin (que puede ser cualquier invocable). El primer
argumento especifica el nombre del grupo al que pertenece este plugin. Nosotros
especificamos client-data, ya que este plugin acepta una dirección MAC y devuelve
datos para mostrarse en una ventana de datos del cliente. Aparte de client-data, también
existe el grupo de plugins session-data, que operan sobre sesiones de
proximidad. El segundo parámetro es el nombre del plugin. Este nombre es solo para uso
interno y debe ser compatible con JSON. El tercer parámetro es el título del plugin.
Esencialmente es lo mismo que el nombre, pero el título se muestra en la GUI.
Más específicamente, este es el título de la sección de datos en la ventana de datos
del cliente.
Todos los argumentos de palabra clave después del título se guardan como opciones. Aunque el sistema
de plugins no requiere opciones, Snoopy soporta la opción js. Esta
opción especifica la URL (desde el lado del navegador, no desde el lado de Snoopy/del
servidor) del componente JavaScript de este plugin.
def ssid_list(mac):
Este plugin es una función simple. Acepta una cadena de dirección MAC, según
la definición de los plugins de client-data. El nombre del invocable no se utiliza.El cuerpo de este complemento de ejemplo simplemente realiza una consulta SQLAlchemy que básicamente hace SELECT DISTINCT probe_ssid FROM probes WHERE device_mac=$mac y devuelve los resultados como una lista. Los valores de retorno de los complementos normalmente se añaden como parte de una respuesta JSON. Por lo tanto, los resultados tienen la limitación de que deben ser compatibles con JSON (según lo admitido por la función jsonify() de Flask).
¡Así de simple!
Los complementos de front-end para datos de cliente se denominan manejadores de datos de cliente. Se registran mediante la función Snoopy.registerPlugin(sectionName, dataHandler). sectionName es el nombre de la sección de datos que el manejador de datos quiere gestionar. Este nombre es el mismo que el nombre del complemento de back-end que generó los datos. El dataHandler debe ser una función con la siguiente firma: function($section, clientData) {...}. $section es un objeto jQuery del elemento div donde el manejador de datos puede mostrar datos o efectuar cambios. Los datos de cliente (generados por el complemento de back-end) se proporcionan en el parámetro clientData.
Dado que la única salida permitida del manejador de datos son cambios en el div dado ($section), no es necesario ningún valor de retorno.
Instalación y ejecución de Snoopy en el Drone Puedes tener hasta 100 drones (si quieres más, revisa el código fuente o envíame un correo, no hay una limitación real). La instalación consiste en descargar el paquete de configuración del paso anterior y ejecutar el script de configuración correspondiente. Para el Nokia N900 se colocará un icono en tu escritorio. Por ejemplo:
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
Consulta de ubicaciones de SSID Crea una cuenta en www.wigle.net y configura tus credenciales mediante 'Configure server options'
Interfaz web Puedes acceder a la interfaz web a través de http://your-snoopy-server:5000/. Puedes escribir tus propios plugins para recorrer y mostrar datos. Walter lo ha hecho fácil para ti (consulta el apéndice de este documento).
Exploración de datos con Maltego En el menú del servidor Snoopy ve a 'Configure Server Options' > 'Maltego'. Aquí verás URLs para descargar entidades y máquinas de Snoopy, y URLs para las transformaciones. Para usar las transformaciones de Maltego necesitarás: