
Monitoree la actividad bluetooth de su vecindario local
Bluetooth Neighborhood - Rastrea dispositivos BLE en tu zona y analiza patrones de tráfico.
ADVERTENCIA: Software en fase alfa
Este proyecto está en desarrollo temprano y no está listo para uso en producción. Las funciones pueden cambiar, romperse o eliminarse sin previo aviso. Úsalo bajo tu propio riesgo. Los datos recopilados deben tratarse como experimentales.
Panel principal que muestra la lista de dispositivos con filtrado, búsqueda y estadísticas en tiempo real
Página de configuración con pestañas — Alertas, Operaciones, Grupos y Seguridad
Página de información con detalles del proyecto y resumen de capacidades
Este proyecto se inspiró en la vulnerabilidad WhisperPair (CVE-2025-36911), que puso de manifiesto los riesgos para la privacidad en los dispositivos Bluetooth.
Miles de dispositivos Bluetooth nos rodean en todo momento: teléfonos, coches, televisores, auriculares, audífonos, vehículos de reparto y más. Bluehood demuestra lo sencillo que es detectar estos dispositivos de forma pasiva y observar patrones en su presencia.
Con suficientes datos, podrías potencialmente:
Estos metadatos pueden revelar información sorprendentemente personal sin ninguna interacción activa con los dispositivos.
Bluehood es una herramienta educativa para concienciar sobre la privacidad Bluetooth. Es un proyecto de fin de semana, pero las implicaciones merecen reflexión.
Bluehood es un escáner Bluetooth que:
? para verlos)Requisitos previos — solo hosts Linux
Bluehood se comunica con tu adaptador Bluetooth a través de BlueZ, la pila Bluetooth de Linux. BlueZ debe estar instalado y en ejecución en el host antes de iniciar el contenedor — la imagen Docker en sí no lo incluye.
# Debian / Ubuntu (incluido Ubuntu Server) sudo apt install bluez sudo systemctl enable --now bluetooth # Arch Linux sudo pacman -S bluez bluez-utils sudo systemctl enable --now bluetoothSin BlueZ en el host verás un error como:
BLE scan error: [org.freedesktop.DBus.Error.ServiceUnknown] The name org.bluez was not provided by any .service files
# Create a docker-compose.yml or download the one from this repo
# Then start with Docker Compose
docker compose up -d
# View logs
docker compose logs -f
La imagen Docker está disponible en GitHub Container Registry:
ghcr.io/dannymcc/bluehood:latest
El panel web estará disponible en http://localhost:8080
sudo apt install bluez && sudo systemctl enable --now bluetooth)Nota: Los adaptadores más antiguos (Bluetooth 2.x/3.x) no soportan el escaneo BLE. Si tu adaptador carece de soporte para el rol BLE 'central', verás:
No Bluetooth adapters with BLE 'central' role found.
Nota: Docker se ejecuta en modo privilegiado con red de host para el acceso a Bluetooth. Esto es necesario para el escaneo BLE.
Bluehood requiere un adaptador Bluetooth compatible con BLE (Bluetooth 4.0 o posterior) con soporte para el rol Central. Los adaptadores Bluetooth 2.x/3.x más antiguos no soportan el escaneo BLE y no funcionarán.
Si tu adaptador no soporta el rol BLE Central, Bluehood saldrá con:
No Bluetooth adapters with BLE 'central' role found
Puedes comprobar las capacidades de tu adaptador con bluetoothctl show y buscar central en los roles soportados.
# Install system dependencies (Arch Linux)
sudo pacman -S bluez bluez-utils python-pip
# Install system dependencies (Debian/Ubuntu)
sudo apt install bluez python3-pip
# Clone and install
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
pip install -e .
El escaneo Bluetooth requiere privilegios elevados. Elige uno:
Ejecutar como root (lo más sencillo):
sudo bluehood
Conceder capacidades a Python:
sudo setcap 'cap_net_admin,cap_net_raw+eip' $(readlink -f $(which python))
bluehood
Usar servicio systemd (recomendado para siempre activo):
sudo cp bluehood.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now bluehood
Bluehood funciona de forma nativa en macOS sin Docker. macOS usa CoreBluetooth en lugar de BlueZ, lo cual es gestionado automáticamente por la librería bleak.
# Clone the repository
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
# Create a virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install
pip install -e .
# Run
python -m bluehood.daemon
El panel web estará disponible en http://localhost:8080
Nota: En la primera ejecución, macOS te pedirá que permitas el acceso a Bluetooth. Debes conceder este permiso para que el escaneo funcione.
# Start with web dashboard (default port 8080)
bluehood
# Specify a different port (or set BLUEHOOD_PORT)
bluehood --port 9000
# Use a specific Bluetooth adapter
bluehood --adapter hci1
# Use separate adapters for BLE and classic scanning (concurrent)
bluehood --adapter hci0 --classic-adapter hci1
# List available adapters
bluehood --list-adapters
# Disable web dashboard (scanning only)
bluehood --no-web
# Enable Prometheus metrics exporter on port 9199
bluehood --metrics-port 9199
El panel proporciona:
/settings#operations)Activa el modo captura de pantalla desde la barra lateral para ofuscar datos sensibles antes de compartir capturas:
AA:BB:XX:XX:XX:XX)Da********)Bluehood puede enviar notificaciones push a través de ntfy, un servicio de notificaciones gratuito y de código abierto. Puedes usar el servidor público ntfy.sh o tu propia instancia autoalojada.
bluehood-myname-alerts), o en tu propio servidor ntfyhttps://ntfy.sh), el nombre de tu tema y un token de acceso si tu servidor lo requiere, luego habilita las notificacionesLos datos se almacenan en ~/.local/share/bluehood/bluehood.db (SQLite).
Anula la ubicación con variables de entorno:
BLUEHOOD_DATA_DIR - Directorio para archivos de datosBLUEHOOD_DB_PATH - Ruta directa al archivo de base de datosNota: La configuración de latido y eliminación se puede configurar desde la interfaz web (Configuración > Operaciones) o mediante variables de entorno. Los valores de la GUI tienen prioridad sobre las variables de entorno.
Bluehood clasifica dispositivos usando múltiples señales (en orden de prioridad):
Los dispositivos modernos aleatorizan sus direcciones MAC por privacidad. Bluehood:
Bluehood analiza las marcas de tiempo de los avistamientos para detectar patrones:
Patrones de ejemplo: "Diario, tardes (17:00-21:00)", "Días laborables, mañana (8:00-12:00)"
Bluehood detecta dispositivos que aparecen frecuentemente juntos dentro de una ventana de tiempo configurable. Esto puede revelar:
Según la intensidad de señal RSSI, los dispositivos se clasifican en zonas de proximidad:
Rastrea cuánto tiempo pasan los dispositivos en rango analizando los intervalos entre avistamientos. Un umbral de intervalo configurable (por defecto 15 minutos) determina cuándo comienza una nueva "sesión".
Bluehood puede exponer métricas para el scraping de Prometheus. Habilítalo configurando la variable de entorno BLUEHOOD_METRICS_PORT o el flag CLI --metrics-port.
# Via environment variable
export BLUEHOOD_METRICS_PORT=9199
# Via CLI
bluehood --metrics-port 9199
Las métricas se sirven en http://host:9199/metrics.
Se incluye un panel de Grafana listo para importar en grafana/bluehood-dashboard.json. Impórtalo a través de la interfaz de Grafana (Dashboards > Import) o la API:
curl -X POST "http://localhost:3000/api/dashboards/db" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d "{\"dashboard\": $(cat grafana/bluehood-dashboard.json), \"overwrite\": true}"
bluetoothctl power onbluehood --list-adaptersBLE scan error: org.freedesktop.DBus.Error.ServiceUnknown / The name org.bluez was not provided
BlueZ no está instalado o no se está ejecutando en el host. Solución:
sudo apt install bluez # Debian/Ubuntu
sudo systemctl enable --now bluetooth
docker compose restart
Lista de verificación general:
systemctl status bluetoothbluetoothctl list¡Las contribuciones son bienvenidas! Por favor, abre un issue o PR en GitHub.
Licencia MIT - Consulta LICENSE para más detalles.
Esta herramienta es solo para fines educativos. Sé consciente de las leyes de privacidad en tu jurisdicción al monitorizar dispositivos Bluetooth. El autor no es responsable de ningún uso indebido de este software.
Creado por Danny McClelland
| Variable | Predeterminado | Descripción |
|---|
PUID | 1000 | UID para el usuario del contenedor — configúralo para que coincida con tu usuario del host (id -u) al usar montajes bind |
PGID | 1000 | GID para el usuario del contenedor — configúralo para que coincida con tu grupo del host (id -g) al usar montajes bind |
TZ | UTC | Zona horaria del contenedor (p. ej., Europe/London) |
BLUEHOOD_ADAPTER | auto | Adaptador Bluetooth para escaneo BLE (p. ej., hci0) |
BLUEHOOD_CLASSIC_ADAPTER | igual que BLUEHOOD_ADAPTER | Adaptador separado para escaneo Bluetooth clásico (p. ej., hci1). Cuando se configura con un adaptador diferente, los escaneos BLE y clásico se ejecutan de forma concurrente. |
BLUEHOOD_DATA_DIR | /data | Directorio de almacenamiento de la base de datos |
BLUEHOOD_PORT | 8080 | Puerto del panel web. El contenedor usa red de host, así que cambia esto (en lugar de un mapeo de puertos) si el 8080 está ocupado |
BLUEHOOD_NTFY_SERVER | https://ntfy.sh | URL base del servidor ntfy para notificaciones push; apúntalo a una instancia autoalojada. El valor guardado en la página de Configuración tiene prioridad |
BLUEHOOD_METRICS_PORT | deshabilitado | Puerto de métricas Prometheus (p. ej., 9199) |
BLUEHOOD_HEARTBEAT_URL | deshabilitado | URL para enviar check-ins de latido mediante POST (p. ej., una URL push de healthchecks.io o uptime-kuma) |
BLUEHOOD_HEARTBEAT_INTERVAL | 300 | Segundos entre check-ins de latido |
BLUEHOOD_PRUNE_DAYS | 0 (deshabilitado) | Elimina automáticamente avistamientos más antiguos que N días para liberar almacenamiento |
BLUEHOOD_PRUNE_MIN_SIGHTINGS | 0 (deshabilitado) | Cuando es >0, elimina dispositivos obsoletos completos (más antiguos que BLUEHOOD_PRUNE_DAYS y con menos de N avistamientos totales) en lugar de solo recortar filas de avistamientos antiguos; los dispositivos vigilados nunca se eliminan |
| Tecla | Acción |
|---|
/ | Enfocar la barra de búsqueda |
r | Actualizar la lista de dispositivos |
c | Alternar vista compacta |
w | Alternar vigilancia en el dispositivo seleccionado |
Esc | Cerrar modal |
? | Mostrar atajos de teclado |
| Métrica | Tipo | Descripción |
|---|
bluehood_scans_total | Counter | Total de ciclos de escaneo completados |
bluehood_scan_errors_total | Counter | Errores de escaneo (etiqueta: scan_type) |
bluehood_sightings_total | Counter | Total de avistamientos de dispositivos registrados |
bluehood_new_devices_total | Counter | Nuevos dispositivos únicos descubiertos |
bluehood_last_scan_devices | Gauge | Dispositivos en el último escaneo (etiqueta: scan_type) |
bluehood_devices_total | Gauge | Dispositivos únicos en la BD (etiqueta: bt_type) |
bluehood_devices_active | Gauge | Dispositivos vistos en los últimos 5 minutos |
bluehood_devices_watched | Gauge | Recuento de dispositivos vigilados |
bluehood_devices_ignored | Gauge | Recuento de dispositivos ignorados |
bluehood_scan_duration_seconds | Histogram | Duración del ciclo de escaneo |
bluehood_device_rssi_dbm | Histogram | Distribución RSSI de dispositivos BLE |
bluehood_build_info | Info | Información de versión |