Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
obike — Reverse engineering del protocollo di comunicazione oBike (BLE e HTTP) | Kitploit
Strumenti/GitHubGitHub/antoinet/obike
Sicurezza BluetoothSicurezza IoTReverse EngineeringSicurezza WirelessCrittografiaPaper e RicercaSicurezza delle API
GitHubantoinet/obike

obike

Reverse engineering del protocollo di comunicazione oBike (BLE e HTTP)

Vedi Repository
428227 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Descrizione del Protocollo oBike (BLE/HTTP)

Questo documento fornisce un'analisi dei protocolli di comunicazione oBike a partire da gennaio 2018.

I risultati sono stati presentati alla insomni'hack security conference 2019:

  • slides
  • registrazione

nonché all'AREA41 security conference 2018:

  • slides
  • registrazione

Comunicazione Generale oBike

La serratura oBike è composta da un microcontrollore TI CC2541, un System on a Chip (SoC) ottimizzato per il consumo energetico usato per applicazioni Bluetooth Low Energy (BLE). La serratura stessa non ha connettività IP; sfrutta la connessione 3G/4G del dispositivo mobile per comunicare con il backend oBike. La serratura comunica via BLE con l'app oBike sul dispositivo mobile. I messaggi di protocollo vengono poi inoltrati al backend oBike tramite una API REST.

La serratura non ha un modulo GPS proprio. Pertanto, la posizione riportata al backend è sempre quella del dispositivo mobile, non quella dell'oBike stesso.``` GPS | +---------+ +---------+ +----------+ | oBike | | Mobile | | oBike | | Lock | +--- BLE ---> | Device | +--- HTTPS ---> | Backend | +---------+ +---------+ +----------+

## Sequenza di sblocco```
 oBike Lock          (BLE)     Mobile Device    (HTTPS)           oBike Backend
------------+------------------------+---------------------------+--------------
            |                        |                           |
            | [1] hello(lat, lng)    |                           |
            | <--------------------- |                           |
Generate    |                        |                           |
32bit       | [2] keySource          |                           |
Challenge   | ---------------------> | [3] unlockPass(keySource) |
            |                        | ========================> | Compute
            |                        |                           | Response
            | [5]                    | [4] encKey, keys          |
            | sendKeys(encKey, keys) | <======================== |
!Unlock     | <--------------------- |                           |
 Bike!      |                        |                           |
            |                        |                           |
Generate    |                        |                           |
Acknowledge | [6] macKey, index      | [7]                       |
Message     | ---------------------> | lockMessage(macKey,index) |
            |                        | ========================> | Register
            |                        |                           | Ride (start
            |                        |                           | billing)

Passaggi:

  1. Invia tramite BLE il messaggio hello e invia le coordinate al lucchetto.
  2. Ricevi tramite BLE keySource, un valore a 32 bit che rappresenta il numero di millisecondi da quando il chip è stato alimentato (little endian).
  3. Invia tramite HTTPS keySource al backend oBike mediante la chiamata REST unlockPass.
  4. Ricevi tramite HTTPS encKey (indice della chiave) e un valore di chiave a 128 bit in keys.
  5. Invia tramite BLE encKey (troncato a 96 bit) e l'index ( corrisponde a encKey). A quel punto, la bici si sbloccherà.
  6. Ricevi tramite BLE macKey e index, una conferma che lo sblocco è avvenuto con successo.
  7. Invia tramite HTTPS lockMessage, con i valori corrispondenti (macKey e index). A quel punto, il backend oBike registrerà la corsa e avvierà la fatturazione.

Protocollo BLE

I componenti del protocollo BLE descritti nelle sezioni seguenti sono implementati nel modulo Python obike.ble_client. Inoltre, uno scanner per rilevare gli annunci BLE di obike è implementato in obike.ble_scanner.py.

Formato Generale dei Comandi```

6774 0D 86 59AEB6...3931 FD | | | | | | | | | +-- Check byte | | | +----------------- Payload | | +--------------------- Command type | +------------------------- Length of payload in bytes +------------------------------- Command Signature ('gt')

Il messaggio sia in ingresso che in uscita inizia sempre con la firma `\x67\x74`
(ascii `gt`).

La lunghezza del payload è il numero di byte senza header/trailer.

Il protocollo supporta diversi tipi di messaggio identificati da un byte. I due bit
più significativi definiscono la direzione del messaggio:```
 0x86   1000 0101     mobile -> obike
 0x46   0100 0101     obike  -> mobile

Il byte di controllo viene calcolato eseguendo lo XOR tra il tipo di comando e i byte del payload:``` check_byte = cmdtype ^ b[0] ^ b[1] ^ ... ^ b[N-1]

La dimensione massima PDU è 19 byte (header + payload + trailer). I messaggi
che superano questa dimensione vengono frammentati.

### BLE getLockRecord/deleteLockRecord

Tipo di comando: `6`  
Questi messaggi vengono utilizzati per gestire il "lock record", un record di dati
persistito dal chip contenente le informazioni dell'ultima corsa, come memberid,
timestamp, identificativo oBike, coordinate, ecc.

Se chiamato senza payload, il comando viene utilizzato per recuperare il lock
record salvato:```
00000000  67 74 00 86 86                                    |gt...|

Se non è disponibile alcun record di blocco, il blocco risponde con un payload vuoto.``` 00000000 67 74 00 46 46 |gt.FF|

Altrimenti, la risposta del lucchetto contiene diversi valori dell'ultima corsa, nel
seguente formato:```
00000000  67 74 46 46 00 00 01 23  45 67 59 9d 72 2a 44 31  |gtFF...#d2Y.r*D1|
00000010  39 33 36 42 33 31 37 2a  72 9d 59 00 34 37 2e 33  |936B317*r.Y.47.3|
00000020  37 32 37 36 30 00 00 00  30 38 2e 35 33 30 38 34  |72760...08.53084|
00000030  32 32 00 00 87 76 f3 7a  8c be 90 f8 4b a4 fa 00  |22...v.z....K...|
00000040  2e ae e3 dc 91 00 00 00  a9 01 8b                 |...........|

Il contenuto da tradurre non è stato fornito. L'input è vuoto.``` Offset Value Description

0004 000001234567 member-id (explicitly coded in decimal, value is: 1234567)

000a 599d722a UNIX timestamp, 08/23/2017 @ 12:16pm

000e 443139333642333137 obike identifier (D1936B317) this corresponds to the MAC address without the first 3 hex digits, in this case: D4:3D:19:36:B3:17

0017 2a729d59 same UNIX timestamp, little endian

001b 00 transaction type

001c 34372e333732373630000000 latitude (47.372760)

0028 30382e353330383432320000 longitude (08.5308422)

0034 8776f37a8cbe90f84ba4fa002eaee3dc mackey (128 bits)

0044 91 key index

Scarica lo strumento