Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
obike — Ingeniería inversa de la comunicación del protocolo oBike (BLE y HTTP) | Kitploit
Herramientas/GitHubGitHub/antoinet/obike
Seguridad BluetoothSeguridad IoTIngeniería InversaSeguridad InalámbricaCriptografíaPapers e InvestigaciónSeguridad de APIs
GitHubantoinet/obike

obike

Ingeniería inversa de la comunicación del protocolo oBike (BLE y HTTP)

Ver Repositorio
42822hace 7 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Descripción del Protocolo oBike (BLE/HTTP)

Este documento proporciona un análisis de los protocolos de comunicación de oBike a partir de enero de 2018.

Los resultados se han presentado en insomni'hack security conference 2019:

  • diapositivas
  • grabación

así como en AREA41 security conference 2018:

  • diapositivas
  • grabación

Comunicación General de oBike

El candado de oBike consta de un microcontrolador TI CC2541, un System on a Chip (SoC) optimizado para consumo de energía utilizado para aplicaciones Bluetooth Low Energy (BLE). El candado en sí no tiene conectividad IP; aprovecha la conexión 3G/4G del dispositivo móvil para comunicarse con el backend de oBike. El candado se comunica por BLE con la aplicación oBike en el dispositivo móvil. Los mensajes del protocolo se reenvían luego al backend de oBike a través de una API REST.

El candado no tiene módulo GPS propio. Por lo tanto, la posición notificada al backend es siempre la del dispositivo móvil, no la de la propia oBike.``` GPS | +---------+ +---------+ +----------+ | oBike | | Mobile | | oBike | | Lock | +--- BLE ---> | Device | +--- HTTPS ---> | Backend | +---------+ +---------+ +----------+

## Secuencia de desbloqueo```
 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)

Pasos:

  1. Envío por BLE del mensaje hello, se envían las coordenadas al candado.
  2. Recepción por BLE de keySource, un valor de 32 bits que representa el número de milisegundos desde que el chip fue encendido (little endian).
  3. Envío por HTTPS de keySource al backend de oBike mediante la llamada REST unlockPass.
  4. Recepción por HTTPS de encKey (índice de clave) y un valor de clave de 128 bits en keys.
  5. Envío por BLE de encKey (truncado a 96 bits) y el index (corresponde a encKey). En ese punto, la bicicleta se desbloqueará.
  6. Recepción por BLE de macKey e index, un acuse de recibo de que el desbloqueo fue exitoso.
  7. Envío por HTTPS de lockMessage, con los valores correspondientes (macKey y index). En ese punto, el backend de oBike registrará el viaje y comenzará la facturación.

Protocolo BLE

Los componentes del protocolo BLE descritos en las siguientes secciones están implementados en el módulo de Python obike.ble_client. Además, se implementa un escáner para detectar anuncios BLE de obike en obike.ble_scanner.py.

Formato General del Comando```

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

El mensaje, tanto entrante como saliente, siempre comienza con la firma `\x67\x74`
(ascii `gt`).

La longitud del payload es el número de bytes sin cabecera/tráiler.

El protocolo soporta diferentes tipos de mensaje identificados por un byte. Los dos
bits más significativos definen la dirección del mensaje:```
 0x86   1000 0101     mobile -> obike
 0x46   0100 0101     obike  -> mobile

El byte de comprobación se calcula aplicando XOR al tipo de comando y a los bytes de carga útil:``` check_byte = cmdtype ^ b[0] ^ b[1] ^ ... ^ b[N-1]

El tamaño máximo de PDU es de 19 bytes (cabecera + carga útil + tráiler). Los mensajes que exceden este tamaño se fragmentan.

### BLE getLockRecord/deleteLockRecord

Tipo de comando: `6`  
Estos mensajes se utilizan para gestionar el "lock record", un registro de datos que el chip persiste y que contiene información del último viaje, como memberid, timestamp, identificador de oBike, coordenadas, etc.

Si se llama sin payload, el comando se utiliza para recuperar el registro de bloqueo guardado:```
00000000  67 74 00 86 86                                    |gt...|

Si no hay ningún registro de bloqueo disponible, el bloqueo responde con una carga útil vacía.``` 00000000 67 74 00 46 46 |gt.FF|

De lo contrario, la respuesta del candado contiene varios valores del último viaje, en
el siguiente 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                 |...........|

La figura a continuación ilustra el almacenamiento de nodos en disco y memoria. Los nodos hoja se almacenan en la sección de datos mientras que los nodos internos se almacenan en la sección de metadatos. Las claves en la sección meta contienen referencias a las páginas hijas correspondientes en la sección de datos o en la sección de metadatos. Un archivo de base de datos en el modelo Bolt tiene dos secciones principales: sección de datos y sección de metadatos. La sección de metadatos son las dos primeras páginas del archivo de base de datos. Las páginas en la sección de metadatos almacenan nodos internos o ramas. Las páginas en la sección de datos almacenan nodos hoja o pares clave-valor reales.``` 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)

Descargar herramienta