Ubertooth One – Bluetooth Hacking
Mijn toolkit bestaat voor het grootste gedeelte uit Hak5 tools en tools van Great Scott Gadgets. Deze review gaat over een (op mijn blog) nog onbesproken tool uit die laatste categorie, de Ubertooth One. De Ubertooth One van Great Scott Gadgets is een “open source wireless development platform suitable for Bluetooth experimentation“. Met andere woorden, een Bluetooth device welke in tegenstelling tot het maken van een bluetooth verbinding ook in staat is om bluetooth verbindingen (2.4 GHz) af te luisteren (data te sniffen). Bluetooth is een interessante aanvalsmethode welke vaak vergeten of niet gebruikt wordt. De Ubertooth One geeft je de mogelijkheid om deze methode te bekijken en om ermee te spelen. Let’s Play!
De Ubertooth One bestaat al geruime tijd en werd voor het eerst gedemonstreerd op Toorcon 2010. Toen droeg deze nog de naam “Zero Tooth”. De Zero Tooth hardware is in 2011 met project Ubertooth verbeterd. en gaat sindsdien door het leven als de Ubertooth One. De Ubertooth One zoals je die nu kunt kopen is ook aan het einde van zijn levensduur. Of er een vervolg komt is nog onbekend maar de meest recente firmware update is de 2018-12-R1 update en dus alweer wat ouder. Firmware releases komen dus wat minder vaak dan in de beginjaren van de Ubertooth One. De Ubertooth One is uitgerust met een BLE (Bluetooth Smart) sniffer welke de capaciteit heeft om data te sniffen van Basic Rate (BR) Bluetooth Classic connections. Alleen Class1 bluetooth verbindingen zijn dus ondersteund door de Ubertooth.
In deze “recap” gaan we kort kijken hoe pakketten over het netwerk verstuurd worden. Herinneren jullie het OSI model nog?
Hardware Design
De Ubertooth One ziet eruit als een ietwat grote USB stick (standaard zonder casing). Het hele project is gebouwd op een LPC175x ARM Cortex-M3 microcontroller (USB 2).

Verder bestaat de Ubertooth One uit:
-
li>RP-SMA RF connector (voor antenne of verbinding met testapparatuur)
- CC2591 RF front end
- CC2400 wireless transceiver
- USB A plug (vor verbinding met host computer)
- Cortex Debug Connector (10-pin 50-mil JTAG)
- In-System Programming (ISP) serial connector
- Expansion connector(voor Ubertooth communicatie of toekomstige uitbreidingen)
- 6 indicator LEDs, 1V8 – TX – RX – USR – RST en USB
De LED’s geven tijdens het werken een indicatie van de acties van de Ubertooth One. De 6 LED’s hebben de volgende betekenis:
- 1V8 – Dit LED laat zien dar de CC2400 Wireless Tranceiver wordt voorzien van 1.8V. De transciever heeft minimaal 1.8 volt nodig om de crystal oscillator te activeren welke weer benodigd is om USB te activeren.
- TX – Radio transmissie (zenden).
- RX – Radio Reception (ontvangen).
- USR – Dit LED kan door de gebruiker geprogrammeerd worden.
- RST – Deze LED geeft aan dat het LPC17x microcontroller voorzien wordt van stroom en zal altijd branden (behalve tijdens een full reset van de firmware).
- USB – Het USB LEDje geeft aan dat USB configuratie voltooid is en dat het apparaat klaar is voor gebruik.
Bovenstaande acties beschrijven de default acties van de LED’s. Deze actie is echter gebaseerd op de actieve firmware en kan dus afwijken.
What about Bluetooth?
Juist! Eerst even een kleine recap over Bluetooth. Wat is het en hoe werkt het?
Bluetooth is een technologie welke draadloze transmissie van data mogelijk maakt binnen een relatief kleine afstand, zo’n 2 tot 10 meter. Bluetooth wordt op veel zaken toegepast maar met name op audio-based toepassingen. Bluetooth boxen, hoofdtelefoons, microfoons etc. Maar ook b.v. game controllers, camera’s, draadloze muizen en andere remote toepassingen werken op basis van Bluetooth. Bluetooth opereert in hetzelfde spectrum als WiFi, namelijk de 2.4 / 2.5 GHz bandbreedte. Bluetooth werkt met Gaussian Frequency Shift Keying (GFSK) modulatie met de een modulation index tussen 0.25 en 0.35:
Omdat Bluetooth een draadloze technologie is werkt het ook met ontvangers (receivers) en verzenders (transmitters). Er zijn 3 klasse bluetooth devices. Deze worden bepaald op basis van de sterkte en dus afstand van deze transmitters en receivers.
- Class 1 – Maximaal 300 meter
- Class 2 – Maximaal 100 meter
- Class 3 – Maximaal 10 meter
- Class 4 – Maximaal 1 meter
Zoals je ziet is class 3 (vroeger, voor de komst van bluetooth 5 nog class 2) de meest voorkomende klasse.
Bluetooth werkt over een breedte van 79 verschillende frequenties (kanalen) met als middelpunt 2,45 GHz. Deze kanalen zijn gereserveerd voor het gebruik van industriële, wetenschappelijke en medische gadgets en ook voor bluetooth. Dit is ook de reden dat je WiFi en Bluetooth uit moet zetten in sommige omgevingen (hospitalen / vliegtuigen). Je Bluetooth signalen zouden hier belangrijke apparatuur kunnen verstoren. Doordat bluetooth werkt over zeer korte afstanden verbruiken ze zeer weinig stroom en zijn theoretisch gezien veiliger dan draadloze netwerken die over langere afstanden werken (Wi-Fi).
Bluetooth apparaten koppelen met elkaar. Om dit te doen is er eerst een “pairing” nodig. Gedurende dit proces wordt er verbinding gemaakt. Dit proces is vaak beveiligd met een wachtwoord (default is dit vaak 0000 of 1111). Als apparaten met elkaar gepaired zijn dan kan er data tussen deze apparaten verstuurd worden. Er kunnen 2 tot 8 Bluetooth-apparaten met elkaar verbonden worden. Dit wordt een “piconet” genoemd. Onder deze apparaten kan er maar één hoofdapparaat zijn, de “master”. Alle andere zijn zogenaamde “slave” apparaten. Maar een apparaat kan ook tot twee piconets behoren waarbij hij als slave verbonden is met piconet A en als master fungeert op piconet B. In zo’n geval wordt het apparaat een bridging device (overbruggingsapparaat) genoemd. Bridging-apparaten verbinden piconets met elkaar om zo een “scatternet” te vormen.

- A – Single slave piconet
- B – Multiple-Slave piconet
- C – Scatternet
De reden dat apparaten binnen een piconet niet met elkaar interfereren is omdat elk paar apparaten een ander kanaal uit de range van 79 beschikbare kanalen gebruikt. Als twee apparaten willen praten, kiezen ze willekeurig een kanaal en schakelen ze, als dat al gebeurt, willekeurig over naar een van de andere (deze techniek heet ook wel “spread-spectrum frequency hopping”). Ook tijdens communicatie zullen bluetooth pairs hoppen naar verschillende kanalen. Dit doen ze duizenden keren per seconde. Pakketje A kan dus afkomstig zijn van een ander kanaal dan pakketje B. Dit “frequency hopping” zorgt voor meer veiligheid en minder interferentie met andere apparaten.
De master fungeert binnen een piconet als “algemene controller” van het piconet. De slave apparaten volgen de instructies van de master op. Als de master naar een andere frequentie hopt, dan hoppen de salves mee naar de andere frequentie.
Ook bluetooth is de laatste jaren veel veranderd en evalueert nog elke dag. De eerste bluetooth was bluetooth BR / EDR (Basic Rate/Enhanced Data Rate). Technisch gezien was dit Bluetooth-versie 2.1). Dit is ook de bluetooth versie waar de Ubertooth One uitermate geschikt voor is. Vervolgens kwam Bluetooth Highspeed (Bluetooth versie 3.0), die een snellere communicatie en een lager stroomverbruik bood. Hierna kwam Bluetooth Smart of Bluetooth Low Energy (technisch gesproken Bluetooth-versie 4.0+ genoemd). Deze versie verbruikt zeer weinig stroom en is nog beter in het verbinden van een groot aantal apparaten met elkaar. Tegenwoordig hebben we bluetooth 5 welke wederom een hogere snelheid biedt (2 Mbps i.p.v. 1 Mbps), lagere latency, hoger bereik (maximaal 240 meter) en de ondersteuning voor mesh netwerken.
Ubertooth One Installeren
Om met de Ubertooth One te werken wordt een native Linux machine geadviseerd. Je kunt er eventueel voor kiezen om Linux virtueel te draaien of om een Linux bootable USB te gebruiken. Gebruik bij voorkeur een Debian-based distributie (Fedora, Free-BSD en MacOS worden ook ondersteund). Je Linux distributie moet ook voorzien worden de nodige prerequisites zoals libusb, libbluetooth en libpcap. Laten we dat eerst doen:
sudo apt-get install cmake libusb-1.0-0-dev make gcc g++ libbluetooth-dev \pkg-config libpcap-dev python-numpy python-pyside python-qt4 |
Nu de prerequisites erop staan kunnen we de Bluetooth Baseband Library (libbtb) installeren welke gebruikt wordt om bluetooth pakketten te decoderen. Libbtb is eveneens een vereist component voor de Ubertooth Tools.
wget https://github.com/greatscottgadgets/libbtbb/archive/2018-12-R1.tar.gz -O libbtbb-2018-12-R1.tar.gz tar -xf libbtbb-2018-12-R1.tar.gz cd libbtbb-2018-12-R1 mkdir build cd build cmake .. make sudo make install sudo ldconfig |
Het laatste commando (ldconfig) is alleen nodig al je de bluetooth baseband library voor de eerste keer start of als je tegen fouten aanloopt.
Nu is het zaak om de Ubertooth One Toolkit te installeren. De repository voor de Ubertooth One bevat 3 componenten. De tools (voor het sniffen van bluetooth pakketten), configuratiebestanden voor de Ubertooth en de firmware update.
Laten we de volledige repository installeren:
wget https://github.com/greatscottgadgets/ubertooth/releases/download/2018-12-R1/ubertooth-2018-12-R1.tar.xz tar xf ubertooth-2018-12-R1.tar.xz cd ubertooth-2018-12-R1/host mkdir build cd build cmake .. make sudo make install sudo ldconfig |
En wederom, het laatste commando (ldconfig) is alleen nodig al je de software voort het eerst installeert of als je tegen fouten aanloopt.
Nu we verkeer kunnen sniffen willen we het ook kunnen analyseren. We kunnen dit doen met Wireshark welke standaard de Ubertooth BLE (Bluetooth low energy) plugin bevat. We kunnen ook het bluetooth verkeer direct in de Wireshark GUI analyseren welke gesniffed is met behulp van Kismet. Hiervoor moeten we de BTBB en BR/EDR plugins installeren. De BTBB plugin moet geïnstalleerd worden in de Wireshark plugin directory. Dit is dezelfde directory als waar ook andere Wireshark SO plugins instaan zoals “asn1.so en ethercat.so”.
sudo apt-get install wireshark wireshark-dev libwireshark-dev cmake cd /libbtbb-2018-12-R1/wireshark/plugins/btbb mkdir build cd build cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/plugins .. make sudo make install |
En hetzelfde gaan we doen voor de BT BR/EDR plugin:
sudo apt-get install wireshark wireshark-dev libwireshark-dev cmake cd /libbtbb-2018-12-R1/wireshark/plugins/btbredr mkdir build cd build cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/plugins .. make sudo make install |
Later zullen we ook Spectools nog installeren. Spectools is een 2.4 GHz spectrum analyzer met een duidelijke interface. De Spectools ondersteunen standaard de Ubertooth One.
Mocht je de tools al geïnstalleerd hebben en alleen de firmware willen upgraden dan download je de meest recente versie op https://github.com/greatscottgadgets/ubertooth/releases/latest. Deze pak je uit en vervolgens navigeer je naar de directory (ubertooth-one-firmware-bin). Let op, de Ubertooth moet uiteraard aanwezig zijn op de computer.
cd ubertooth-one-firmware-bin |
Vervolgens voer je het volgende commando’s uit om het apparaat in DFU mode te plaatsen en om de firmware te flashen:
ubertooth-dfu -d bluetooth_rxtx.dfu -r |

Voor nu hebben we alle nodige zaken in huis om te starten met de Ubertooth One.
Werken met de Ubertooth One
Controleren welke firmware versie we momenteel draaien:
ubertooth-util -v |

Voordat we verder gaan nog een klein beetje extra bluetooth achtergrond. Bluetooth-pakketten kennen een andere architectuur en volgen niet het traditionele OSI model maar hebben hun eigen Bluetooth model:

Bluetooth data bestaat net als ethernet verkeer uit pakketten. Deze zien er als volgt uit:

Bovenstaande formaat is echter niet statisch. Een pakket kan ook bestaan uit de access code, de access code + header of zoals hij boven staat weergegeven.
Het access code veld wordt gebruikt voor synchronisatie, identificatie en om eventueel een DC offset te genereren. Het access code veld is met name belangrijk tijdens het pairen en het uitwisselen van wachtwoorden. Als we dieper inzoomen op de access code dan bestaat deze ook uit de volgende velden:

Er zijn drie soorten access codes:
- Channel Access Code (CAC) – Identificatie van het piconet. Alle pakketten die binnen een bepaald piconet verzonden worden dragen het adres van de master.
- Device Access Code (DAC) – De DAC wordt gebruikt voor speciale signaleringsprocedures zoals paging en paging responses.
- BD_ADDR – Dit is een uniek MAC adres welke uit 2 delen bestaat, namelijk het company ID (OUI) welke uniek is voor de leverancier van het apparaat en het device ID (LAP) welke uniek is voor het type product. De LAP bestaat uit de onderste 24 bits van de BD_ADDR en is het enige deel van het adres dat met elk pakket wordt verzonden.

Het sync word (synchronisatiewoord) binnen het access code veld is afgeleid van een BD_ADDR-adres met (64,30) opgedreven blokcode en een overlay van een 64-bits PN-reeks.
De preamble is een vaste “0101” of “1010” reeks, afhankelijk of de LSB van het volgende syncwoord een “0” of “1” is.
Een trailer komt alleen voor als het pakket een header heeft. Zonder header is een trailer overbodig.
Het header veld van een bluetooth pakket kent ook verschillende subvelden, namelijk:

- AM_ADDR – Tijdelijk adres welke toegewezen is aan alle leden van het piconet. Dit veld wordt gebruikt op alle pakketten welke heen en weer verzonden worden tussen de master en de slave. Om alle slaves te benaderen wordt een “All-Zero AM-ADDR” gebruikt (000).
- Type – Het type packet. Er bestaan 12 type pakketten voor zowel SCO als ACL connecties en 4 common controll packets.
- Flow – Flow Control
- ARQN – Voor ACK
- SEQN – Bevat het sequence nummer
- HEC – Header Integrity Control
Hierboven zien we dat er 2 type verbindingen zijn, namelijk ACL en SCO. Dit zijn de verschillen:
ACL – Asynchronous Connection-Less
- Multipoint tussen master en meerdere slaves
- High quality audio/video data. Zoals voor het afspelen van muziek via A2DP. Voornamelijk voor het transporteren van data. Retransmission is gebaseerd op ARQ. Er zijn een paar beschikbare types zoals DMx (Moderate rate), DHx (High data rate). waarbij x versie 1,3,5 is.
- Variable channel (verschillend aantal kanalen per apparaat)
SCO – Synchronous Connection Oriented
- Point-to-point tussen master en slave
- Real-time narrow band signaal waarbij geen retransmission vereist is. Denk hierbij aan Bluetooth voice toepassingen. Geen retransmission. Er zijn verschillende voice pakketten mogelijk zoals HV1, HV2 en HV3.
- Fixed channel (maximal 3 kanalen per apparaat)
Er bestaan 2 type payloads, namelijk zoals we hierboven al zien, ACL of SCO payloads. SCO pakketten hebben een voice field en ACL pakketten hebben een data field. Een ander onderdeel van de payload is het “Link Manager” onderdeel. De Link Manager pakketten zijn bedoeld voor link setup, beveiliging en controle. Link Manager berichten ofwel LM berichten worden niet doorgezet naar de upper layers maar tijdig gefilterd door de LM layer. LM layer berichten hebben een hogere prioriteit dan normale berichten.
De LM laag kan ook de L2CAP-laag inschakelen. De L2CAP laag is altijd beschikbaar over een enkele ACL-koppeling via de basisband. De L2CAP-laag dient de bovenste laag door gegevens over kanalen te verzenden. Elk kanaal heeft twee eindpunten en een logische kanaal-ID (CID). De L2CAP laag is belangrijk tijdens het opzetten van een verbinding (pairing). Het opzetten van een verbinding werkt als volgt:
- Connection – Een apparaat gaat verbinding zoeken met een master en verstuurd een L2CAP verzoek. Als dit verzoek wordt ontvangen gaat het apparaat over op “config” modus.
- Config – Het configuratieproces bestaat uit een onderhandeling tussen de twee eindpunten van het kanaal net zoals dit bij WiFi gebeurt. De eindpunten onderhandelen over de MTU (maximale transmissie-eenheid), flush time-out en QOS (quality of service). Nadat de apparaten de settings overeengekomen zijn gaan de apparaten naar de “open” status en kan er gestart worden met de gegevensoverdracht.
- Disconnection – Wanneer er ontkoppeling plaats moet vinden zal de L2CAP laag een ontkoppelingsverzoek ontvangen van de bovenliggende laag. Deze wordt vervolgens doorgezet naar het externe apparaat waarna de verbinding gesloten wordt.
Ok… nu terug naar de Ubertooth One. Wat altijd leuk is om te doen is het inzichtelijk maken van het bluetooth spectrum. Dit kunnen we doen met de “Specan” tool van KisMet. Deze tool is meestal al geinstalleerd maar als dat nog niet het geval is voer je het volgende uit:
git clone https://github.com/trainman419/kismet.git cd kismet cd plugin-spectools ./configure make make install spectool_gtk |
We moeten ook nog PySide2 installeren:
pip install PySide2 |
Vervolgens kunnen we het spectrum bekijken met het volgende commando:
ubertooth-specan-ui |

“LAP” sniffing wordt gebruikt om verkeer te identificeren en sniffen. Met bluetooth LAP-sniffing kunnen we Bluetooth-apparaten identificeren die zich dichtbij bevinden.
Met de Ubertooth One Tools kunnen we deze LAP sniffen. Hiervoor gebruiken we het volgende commando:
ubertooth-rx |

Je zien nu verschillende LAP’s gedetecteerd worden. Vanwege diverse onzekerheden bij het identificeren van Bluetooth-pakketten zonder voorafgaande kennis van een adres is het normaal dat dit proces ook false-positives identificeert. Foutcorrectie zou dit probleem moeten verminderen, maar een klein aantal false-positives kan in dit proces nog steeds worden waargenomen. Wanneer we dezelfde LAP vaker voorbij zien komen is het zeer waarschijnlijk een daadwerkelijk Bluetooth apparaat. Je kunt uiteraard ook zelf bluetooth verkeer genereren door op je telefoon naar bluetooth apparaten te zoeken.
Nadat we een LAP vaker hebben gezien kunnen we de volgende byte van het adres zoeken, de UAP:
ubertooth-rx -l %LAP% |

Bovenstaande commando laat alleen pakketten zien van het aangegeven piconet en gebruikt deze om de next-byte van het adres te vinden. Ook kan het commando wat internal clock data vinden.
Een specifiek device volgens om basis van LAP:
ubertooth-btle -f %LAP% |
Om verkeer te sniffen in “promiscuous mode” gebruik je de “bluetooth-btle” tool:
ubertooth-btle -p |

We kunnen de data ook meteen naar een PCAP bestand sturen:
ubertooth-btle -p -c /tmp/capture.pcap |
We kunnen de PCAP later analyseren in Wireshark maar we kunnen met de geïnstalleerde plugins ook het verkeer meteen monitoren in Wireshark. Dit doen we door gebruik te maken van een zogenaamde “FIFO special file”. Dit is een speciaal bestand voor systeem communicatie. De Ubertooth Tools zetten het verkeer door naar een tijdelijke locatie waar Wireshark het verkeer weer oppakt.
Het FIFO bestand maken we als volgt aan:
mkfifo /tmp/pipe |
Vervolgens pas je de volgende methode toe.
1. Open Wireshark.
2. Ga naar “Capture” – “Options”.
3. Open het tabblad “Pipes” en voeg een nieuwe local pipe toe, namelijk “/tmp/pipe”.

4. Sla deze op en start een capture.
5. Voeg het volgende commando uit in de terminal:
ubertooth-btle -f -c /tmp/pipe |

Wireshark zal nu de pakketten ontvangen. Het kan zijn dat je tijdens het capturen een DLT error krijgt vergelijkbaar met “User encapsulation not handled: DLT=147, check your Preferences->Protocols->DLT_USER”. In dat geval moet je de encapsulation nog instellen. Onthoudt de DLT waarde in de foutmelding en voer de volgende procedure uit:
6. Ga in Wireshark naar “Edit” – “Preferences”
7. Klik op “Protocols” en open het “DLT_USER” protocol.
8. Klik op “Edit” (Encapsulation Table) en voeg een nieuwe encapsulation toe.
9. Onder DLT kies je “User 0 (DLT=147)” (of kies hier voor een andere DLT waarde welke aangegeven stond in de foutmelding)
10. Onder “Payload Protocol” noteer je “btle”

11. Sla de instellingen op. Nieuwe captures moeten de foutmelding niet meer weergeven.

Standaard worden alleen “Bluetooth Advertisements” gevangen. Wanneer je een device hebt gelokaliseerd kun je het volgende commando uitvoeren zodat de Ubertooth One alleen dat specifieke apparaat volgt:
ubertooth-btle -t aa:bb:cc:dd:ee:ff |
aa:bb:cc:dd:ee:ff is uiteraard het BD-ADDR adres (MAC adres) van het apparaat.
Conclusie
Tot zover een stukje achtergrond informatie over bluetooth, de setup van de Ubertooth One en de eerste testen met de Ubertooth. De Ubertooth is een mooie en krachtig apparaat maar is met alle moderne bluetooth technieken een klein beetje achterhaald. Wat mij betreft is het tijd voor de Ubertooth Two. Toch kan de Ubertooth in veel scenario’s ontzettend behulpzaam zijn en ga ik zeker nog veel plezier beleven aan de Ubertooth. Op naar de volgende testen.
Vondt je dit een interessante post? Gaf hij inspiratie of heeft hij je een beetje op weg geholpen laat het me dan zeker even weten. Geef een leuke reactie of deel mijn post op je social media of op je website. Het maken van deze posts is leuk maar de echte kick zijn altijd jullie reacties!! Thanks Guys & Gals!