Bluetooth Low Energy, théorie et pratique

I. Introduction

Le Bluetooth Low Energy est une technologie sans fil basée sur les spécifications du bluetooth 4.0. Il est particulièrement adapté aux objets connectés portables qui l’utilisent pour synchroniser les données avec leurs applications respectives.

Avec la multiplication des IoT et l’envoi massif de d’informations privées aux sociétés d’analyses, le BLE se trouve être un élément technique non négligeable dans la transmission de nos données personnelles, d’autant qu’il permet d’effectuer du tracking de manière invisible pour l’utilisateur final. Dès lors, il peut être intéressant de se pencher sur le fonctionnement de nos objets connectés afin de savoir comment ils fonctionnent et de quelle façon les données sont stockées.

II. Théorie

A. L’organisation GATT

Le BLE utilise des profiles bluetooth spécifiques appelé Generic Attribute ou GATT. ils se divisent en trois niveaux : Profile, Service et Characteristic. le schéma suivant illustre cette organisation :

profile gatt

Un Profile est un ensemble de Services prédéfinis ajouté par le fabricant en fonction de son besoin. Voici quelques exemples de profile que l’on retrouve dans de nombreux objets :

Health Care Profile : un ensemble de services orienté vers le domaine de la santé. On peut y trouver la mesure de la pression sanguine, de la température ou du taux de glucose.

Sport and Fitness Profile : un ensemble de service adapté aux objets dédiés au sport. Il inclue notamment la mesure de la fréquence cardiaque ( ou  du poids et la géolocalisation.

Alert and Time Profile : des services permettant à un objet de recevoir des notifications ou d’autoriser la modification de ses configurations de temps par un serveur distant.

Il existe un certain nombre de Profiles. Pour plus d’informations, vous pouvez consulter la liste des Profiles.

Un Service contient un ensemble de Characteristics qui, permettent d’effectuer certaines actions. Il est possible de fabriquer son propre service en se basant sur ceux déjà existant. Pour plus d’informations vous pouvez consulter la liste des Services.

Les Characteristic sont les éléments les plus bas dans l’organisation du GATT. Ils contiennent des valeurs qui peuvent prendre de nombreuses formes : array, string, integer etc… chacune de ces valeurs peut être en lecture seule ou en écriture. En plus de sa valeur, une Charateristic peut se voir attribuer un certain nombre de descriptors dont le but est de permettre la configuration de certaines fonctionnalités comme, par exemple, des notifications.

B. Les rôles

Il existe quatre rôles pouvant être utilisés par un objet pour communiquer en bluetooth LE :

  • Broadcaster : ce rôle permet à un objet  d’être serveur et de transmettre des données à un appareil distant. Cette opération s’effectue par le biais d’un envoi régulier de paquets. Dans ce mode, un objet n’accepte aucune connexion entrante.
  • Observer : un objet ayant ce rôle va se contenter d’écouter les données envoyées par un broadcaster et de les intepréter. Il se positionne donc en tant que client. Cependant, ce rôle ne permet pas d’initier des connexions vers le serveur.
  • Central : rôle attribué à un maitre qui va régulièrement envoyer des paquets à la recherche d’esclaves dans son entourage. Lorsqu’un esclave est trouvé, le maitre s’y connecte et commence à échanger des données.
  • Peripherical : ce rôle est celui d’un esclave qui accepte des connexions et envoi des paquets de manière periodique pour vérifier la présence du maitre.

C. UUID et SIG

L’Universally Unique Identifier est un nombre de 128 bits permettant d’identifier de manière unique. Ce nombre de 16 bytes étant très grand pour la couche Link-Layer qui ne comporte que 27 bytes, le BLE utilise également le SIG. Le Shortened Identifier est un nombre de 16 bits seulement et permet d’identifier les informations contenues par l’appareil.

Pour plus d’information, voir la liste des correspondance UUID/Mnemonic/Specification

D. Handle

Le handle est un nombre de 16 bits jouant le rôle d’adressage au sein de la hiérarchie GATT. Théoriquement, il est possible de stocker jusqu’à 0xFFFE soit 65535 adresses. En réalité les objets n’en possèdent que quelques dizaines.


III. La pratique

A. Les outils

hardware

Avant tout chose, il est nécessaire de posséder un ordinateur supportant le bluetooth 4.0. Si ce n’est pas le cas, il faudra se procurer un dongle bluetooth supportant cette norme. On peut en trouver à des prix raisonnables.

Software

Pour explorer notre appareil, nous allons avoir besoin de certains tools. L’utilisation de kali linux permet d’obtenir une distribution avec un certain nombre d’outils déjà à disposition. Cependant, pour ceux qui souhaiteraient partir d’une autre distribution, voici les différents programmes à installer :

hcitool

gatttool

Le paquet bluez contient l’ensemble de ces outils et est disponible dans les dépôts :

B. Utilisation et détection

Dans un premier temps nous allons déterminer quel est le nom de l’interface bluetooth :

hciconfig

Ici hci1 représente le dongle bluetooth 4.0. C’est cette interface que nous allons utiliser par la suite. Pour dialoguer avec l’appareil, nous devons connaitre son adresse MAC. hcitool dispose d’une option lescan permettant de détecter les devices utilisant le bluetooth LE :

LE Scan

Nous voyons que notre bracelet possède l’adresse FC:A5:6B:92:A0:6B. Nous allons pouvoir initier une connexion à l’aide de l’option lecc d’hcitool :

connect LE

Nous pouvons maintenant nous connecter grâce à l’outil gatttool :

gattool connect

Quelques explications :

-b : option spécifiant l’adresse MAC de l’appareil vers lequel on souhaite se connecter.

-t : option définissant le type d’adresse (public ou random). Dans le cas du bracelet, celui ci n’est pas censé être découvrable, il faut donc préciser l’option random.

-i : option spécifiant l’interface utilisée pour communiquer avec l’appareil distant.

-I : option précisant que l’on utilise le mode interactif de gatttool.

C. Exploration

Une fois connecté, la première chose à faire est de déterminer les différents Services et Characteristics. Pour se faire, on utilise la ligne suivante :

gatttool handles

Nous voyons qu’il existe un grand nombre de characteristics. On note toutefois que certains sont plus susceptible de nous intéressés que d’autres. En effet, les characteristics des handles 0x000E 0x0011, 0x0016 et 0x001A possèdent un UUID non standard. Nous pouvons en déduire qu’il s’agit de ceux ajoutés par le constructeur et que, par conséquent, les données sont stockées dans l’un de ces handles.

Cependant, avant de procéder à une analyse plus approfondie, il est préférable d’avoir une meilleure vision d’ensemble de l’organisation GATT. Pour cela, nous allons repérer les principaux services à l’aide de la commande primary :

Gatttool primary

A l’aide des informations de cette commande et de char-desc on peut dresser un tableau de l’organisation interne de l’appareil :

orga batt fitbit

Extrait du tableau déduis des informations données par primary et char-desc, les permissions ne sont découvertes qu’après exploration de chaque handle.

Nous pouvons maintenant commencer à explorer les valeurs de chaque Characteristic. Celles ci sont affichées en hexadécimale. Voici un exemple :

gatttool charge hexa

Ici nous demandons au bracelet quelles sont les données contenues à l’adresse handle 0x0003. Les informations sont données en hexadécimales mais avec un peu d’observation, on se rend compte qu’il s’agit d’une chaine de caractère en effet en se basant sur la table ascii hexadécimale :

43 = C          68 = h          61 =          72 = r          67 = g          65 = e

Cet handle contient donc le nom du produit puisqu’il s’agit d’un fitbit Charge.

Si certaines informations sont relativement simple à déchiffrer, d’autres sont un peu plus obscur. Prenons l’exemple du handle 0x000C. voici les informations renvoyées :

oxooc exeption

Cette chaine hexadécimale ne semble correspondre à aucun format de type string, integer, char ou array. Cependant, on se rend compte qu’il s’agit d’un uuid très proche des handles des adresses 0x000E 0x0011 et 0x0016 mais écrit en little endian

en effet en inversant    :     ba 56 89 a6 fa bf a2 bd 01 46 7d 6e 00 fb ab ad

on trouve  :     adabfb00-6e7d-4601-bda2-bffaa68956ba

Comparaison avec les handles :

0x000e   :      adabfb04-6e7d-4601-bda2-bffaa68956ba

0x0011     :      adabfb02-6e7d-4601-bda2-bffaa68956ba

0x0013     :     adabfb03-6e7d-4601-bda2-bffaa68956ba

0x0016     :     adabfb01-6e7d-4601-bda2-bffaa68956ba

Lors de l’exploration des handles, il arrive parfois d’obtenir un erreur de ce type :

gatttool encryption required

Par défaut gatttool se connecte avec un niveau de sécurité « low ». L’option -l permet de relever ce paramètre à « medium » ou « high » :

security

Cela ne règle pas systématiquement le problème. Dans le cas du bracelet fitbit, il n’est pas possible d’ouvrir l’handle à l’adresse 0x000e même avec un niveau de sécurité « high ». Cela semble indiquer que les données récoltées par le fitbit lors des activités sportives sont stockées dans cet handle. Si certains ont réussi à passer cette étape, n’hésitez pas à me le faire savoir. De mon coté je vais essayer de chercher une solution.

Dans ce tuto, nous avons essentiellement utilisé le mode interactif de gatttool. Toutefois, il peut être intéressant de maitriser le mode manuel qui permet d’ incorporé  gatttool à un script bash par exemple. Pour connaitre les équivalent des commandes du mode interactif, il est nécessaire de se référer à l’aide du programme à l’aide de –help-gatt :

gatt-help

Voici un exemple de ce qu’il est possible de faire avec ce mode :

ble explorer

Pour ceux qui seraient intéressés, voici le script en question

#!/bin/bash

hciconfig hci1 reset
hciconfig hci1 up
# adresse a changer en fonction du device
macaddress=« FC:A5:6B:92:A0:6B »
echo « connexion bluetooth LE en cours… »
hcitool -i hci1 lecc –random $macaddress
echo « done »
clear
echo « =========================================== »
echo « = Bluetooth LE Explorer = »
echo « =========================================== »
echo  » 1 => GATT Interactive mode »
echo  » 2 => GATT script »
read choix

if [ $choix == ‘1’ ]
then

gatttool -b $macaddress -t random -i hci1 -I

elif [ $choix == ‘2’ ]
then

echo « ==================================================================== »
echo « Primary services « 
echo « —————————————————————————« 
gatttool -b $macaddress -t random -i hci1 –primary

echo « ==================================================================== »

echo « Characetistics »
echo « —————————————————————————« 
gatttool -b $macaddress -t random -i hci1 –characteristics

else

        echo « erreur dans le choix »

fi

Hackimalement

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s