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 usando asyncio.
  • 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: 0x180D para 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 sudo para acessar a interface hci0.