Bluetooth Low Energy (BLE) Scanner
Detecta dispositivos IoT próximos e lista seus serviços e características.
Contexto
Dispositivos IoT costumam ser o ponto cego da infraestrutura de rede. O objetivo deste módulo é identificar dispositivos que utilizam o protocolo BLE e enumerar seus GATT Services (serviços) e Characteristics (características).
Em um Pentest de hardware/IoT, isso permite:
- Identificação de Dispositivos: Descobrir fabricantes e modelos ocultos no ambiente.
- Análise de Superfície de Ataque: Identificar serviços que permitem leitura ou escrita de dados sem autenticação.
- Eavesdropping: Preparar a base para interceptação de dados transmitidos entre o dispositivo e o smartphone do usuário.
Possibilidades de Implementação
- Biblioteca
Bleak: É a biblioteca Python multiplataforma (Windows, Linux, macOS) mais moderna e recomendada para interagir com BLE usandoasyncio. - Filtragem por RSSI: Utilizar a força do sinal (Received Signal Strength Indicator) para estimar a proximidade física do dispositivo.
- Enumeração Automática: Uma vez conectado, o script varre todos os UUIDs disponíveis para entender quais permissões cada característica possui (Read, Write, Notify).
Código
Este módulo utiliza a biblioteca bleak. Por lidar com comunicações assíncronas, o código é estruturado com async/await.
Requisito: pip install bleak
import asyncio
from bleak import BleakScanner, BleakClient
async def run_ble_scanner():
print("[*] Iniciando varredura por dispositivos BLE...")
# 1. Escaneia dispositivos próximos por 5 segundos
devices = await BleakScanner.discover(timeout=5.0)
if not devices:
print("[-] Nenhum dispositivo BLE encontrado.")
return
for d in devices:
print(f"\n[+] Dispositivo Encontrado: {d.name or 'Desconhecido'}")
print(f" MAC: {d.address} | RSSI: {d.rssi} dBm")
# Opcional: Tentar conectar para listar serviços (pode falhar se pareamento for exigido)
# Atenção: Conectar a dispositivos desconhecidos pode ser intrusivo
"""
try:
async with BleakClient(d.address) as client:
print(f" [*] Conectado. Listando serviços...")
for service in client.services:
print(f" - Serviço: {service.uuid}")
for char in service.characteristics:
print(f" [Char] {char.uuid} | Permissões: {','.join(char.properties)}")
except Exception:
print(" [-] Não foi possível parear/conectar para listar serviços.")
"""
async def main():
print("=" * 60)
print("Módulo: BLE Scanner | Projeto: 30 Lessons in Python")
print("=" * 60)
try:
await run_ble_scanner()
except Exception as e:
print(f"[!] Erro no scanner: {e}")
print("\n" + "=" * 60)
print("[*] Varredura BLE finalizada.")
if __name__ == "__main__":
asyncio.run(main())
Observações
- Modo Assíncrono: Como Software Architect, você notará que o
asyncioé fundamental aqui, pois a descoberta de hardware não deve bloquear o loop principal do programa. - UUIDs Padrão: Muitos serviços usam UUIDs padronizados pela Bluetooth SIG (ex:
0x180Dpara frequência cardíaca). Um script avançado pode traduzir esses IDs para nomes amigáveis. - Limitações de SO: No Windows, o Bluetooth deve estar ativado nas configurações. No Linux, pode ser necessário rodar com
sudopara acessar a interfacehci0.