Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
obike — oBike プロトコル通信 (BLE および HTTP) のリバースエンジニアリング | Kitploit
ツール/GitHubGitHub/antoinet/obike
BluetoothセキュリティIoTセキュリティリバースエンジニアリングワイヤレスセキュリティ暗号化論文と研究APIセキュリティ
GitHubantoinet/obike

obike

oBike プロトコル通信 (BLE および HTTP) のリバースエンジニアリング

リポジトリを見る
42867年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

oBike プロトコル解説(BLE/HTTP)

このドキュメントは、2018年1月時点のoBike通信プロトコルの分析です。

結果は insomni'hack security conference 2019 で発表されました:

  • スライド
  • 録画

また、AREA41 security conference 2018 でも発表されました:

  • スライド
  • 録画

oBike の一般的な通信

oBikeのロックは、TI CC2541マイクロコントローラと、Bluetooth Low Energy(BLE)アプリケーション用の電力最適化型System on a Chip(SoC)で構成されています。ロック自体にはIP接続機能はなく、モバイルデバイスの3G/4G接続を利用してoBikeのバックエンドと通信します。ロックはBLEを介してモバイルデバイス上のoBikeアプリと通信します。プロトコルメッセージは、REST APIを介してoBikeのバックエンドに中継されます。

ロックには独自のGPSモジュールはありません。そのため、バックエンドに報告される位置情報は常にモバイルデバイスのものであり、oBike本体のものではありません。``` GPS | +---------+ +---------+ +----------+ | oBike | | Mobile | | oBike | | Lock | +--- BLE ---> | Device | +--- HTTPS ---> | Backend | +---------+ +---------+ +----------+

root@kitploit:~
## ロック解除シーケンス```
 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)

手順:

  1. BLE で hello メッセージを送信し、座標をロックに送信する。
  2. BLE で keySource を受信する。これは、 チップの電源投入からの経過ミリ秒数(リトルエンディアン)を表す 32bit 値である。
  3. HTTPS で unlockPass REST 呼び出しを介して keySource を oBike バックエンドに送信する。
  4. HTTPS で encKey(キーインデックス)と、keys 内の 128bit キー値を受信する。
  5. BLE で encKey(96bit に切り詰めたもの)と index( encKey に対応する)。その時点で、自転車のロックが解除される。
  6. BLE で macKey と index を受信する。これは、ロック解除が成功したことを示す 確認応答である。
  7. HTTPS で、対応する値(macKey と index)を含む lockMessage を送信する。その時点で、oBike バックエンドは走行を登録し、 課金を開始する。

BLE プロトコル

以下のセクションで説明する BLE プロトコルコンポーネントは、 python モジュール obike.ble_client に実装されている。さらに、obike の BLE アドバタイズメントを検出するスキャナーは、 obike.ble_scanner.py に実装されている。

一般的なコマンド形式```

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

root@kitploit:~
送受信されるメッセージは、常にシグネチャ `\x67\x74`(ASCII `gt`)で始まります。

ペイロードの長さは、ヘッダーとトレーラーを除いたバイト数です。

プロトコルは、バイトで識別されるさまざまなメッセージタイプをサポートしています。最上位2ビットがメッセージの方向を定義します。```
 0x86   1000 0101     mobile -> obike
 0x46   0100 0101     obike  -> mobile

チェックバイトは、コマンドタイプとペイロードバイトをXORして計算されます:``` check_byte = cmdtype ^ b[0] ^ b[1] ^ ... ^ b[N-1]

root@kitploit:~
最大PDUサイズは19バイトです(ヘッダー + ペイロード + トレーラー)。このサイズを超えるメッセージは断片化されます。

### BLE getLockRecord/deleteLockRecord

コマンドタイプ: `6`  
これらのメッセージは、「ロックレコード」を管理するために使用されます。ロックレコードとは、チップによって保持されるデータレコードで、前回のライドからの情報(memberid、タイムスタンプ、oBike識別子、座標など)で構成されます。

ペイロードなしで呼び出された場合、このコマンドは保存されたロックレコードを取得するために使用されます:```
00000000  67 74 00 86 86                                    |gt...|

ロックレコードが利用できない場合、ロックは空のペイロードで応答します。``` 00000000 67 74 00 46 46 |gt.FF|

root@kitploit:~
それ以外の場合、ロックの応答には前回の走行からのいくつかの値が含まれており、
次の形式になります:```
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                 |...........|

現在のタグ

OCI Image Formatタグのサポート。これらのタグはターゲットレジストリの特定のリポジトリタグにマッピングされます。

例:

現在定義されているタグ: sha256-9b3b13f501d9fa04445790cd6ecb146c1b340a58f0b4a0b4dd3f0899e1c2e10d.sig -> `latest```` 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

0045 000000 ? 0048 a901 battery voltag level (little endian) e.g. 4.25V

root@kitploit:~
ペイロードと共に使用すると、このコマンドは現在のロックレコードを削除します:```
00000000  67 74 0d 86 59 d5 ff a4  36 33 39 38 37 37 31 33  |gt..Y...63987713|
00000010  43 14                                             |C.|

deleteコマンドのペイロードは、以前に読み出された"Bike Trade Number"、つまり自転車がレンタルされた時刻のタイムスタンプとobike識別子で構成されます:``` Offset Value Description

0004 59d5ffa4 timestamp (little endian) 000e 3633393837373133 "63987713C" obike identifier

root@kitploit:~
### BLE Push Coords / Get Challenge

Command type: `1`  
これらのメッセージは、モバイルデバイスがobikeの現在位置を示すために使用され、デバイスがそれを保存します。```
00000000  67 74 13 81 30 38 2e 35  33 30 38 34 32 32 34 37  |gt..08.530842247|
00000010  2e 33 37 32 37 36 30 b7                           |.372760.|

ペイロードは緯度と経度で構成されています:``` Offset Value Description

0004 30382e35333038343232 longitude (08.5308422) 000e 34372e333732373630 latitude (47.372763)

root@kitploit:~
このコマンドはペイロードなしでも使用できます:```
00000000 67 74 00 81 81                                     |gt...|

応答として、obike はチャレンジ、つまり電源投入からの経過ミリ秒数を表す32ビット整数(リトルエンディアン)を送信します:``` 00000000 67 74 0b 41 00 11 51 00 06 ef 5f 34 aa 01 00 28 |gt.A..Q..._4...(|

root@kitploit:~
Chunk 31の入力が空です。翻訳するテキストが提供されていないため、翻訳を生成できません。```
Offset Value                    Description
-------------------------------------------------------------------------
 0004  00115100                 ? (constant, sometimes also 00115900)
 0008  06ef5f34                 challenge (aka keysource)
 000c  aa01                     battery voltage level (little endian),
                                e.g 4.26V
 000e  00                       ? (constant)

BLE 送信キー

コマンドタイプ: 2
これらのメッセージは、チャレンジへの応答をobikeに伝えるために使用されます。``` 00000000 67 74 18 82 8b 00 00 01 23 45 67 00 2a 72 9d 59 |gt......#d2.*r.Y| 00000010 2f 42 d3 b4 3b 1b 9d 51 e7 67 13 e3 77 |/B..;..Q.g..w|

root@kitploit:~
I'm unable to translate this chunk because the input content is empty. No text was provided after "INPUT:". Please provide the actual content for chunk 35 of 87, and I'll translate it from English to Japanese following all the specified rules.```
Offset Value                    Description
-------------------------------------------------------------------------
 0004  8b                       key index
 0005  00000123456700           member-id (explicitly coded in decimal,
                                value is 1234567)
 000c  2a729d59                 UNIX timestamp, little endian
                                08/23/2017 @ 12:16pm (UTC)
 0010  2f42d3b43b1b9d51e76713e3 enckey (truncated to 96 bits)

obike は単一のステータスバイト (00) で応答します:``` 00000000 67 74 01 42 00 42 |gt.B.B|

root@kitploit:~
### BLE リセット

コマンドタイプ: `9`    
CC2541 チップをリセットします。```
00000000: 67 74 00 89 89                                    gt...

応答は返されません。

oBike HTTP REST API

暗号化レイヤーを含むobike REST APIのクライアントは、Pythonモジュール obike.http_client に実装されています。

REST API仕様

oBikeバックエンドとのすべての通信におけるREST APIエンドポイントは次のとおりです:``` https://mobile.o.bike/api//

root@kitploit:~
REST 呼び出しに応じて、現在は `v1` または `v2` のいずれかが使用されています。

oBike モバイルアプリから oBike バックエンドに対して実行されるリクエストでは、以下のヘッダーが使用されます:```
Host: mobile.o.bike
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: okhttp/3.4.2
platform: Android
Content-Type: application/json; charset=utf-8
version: 2.5.4
Authorization: Bearer 0123456789abcdef0123456789abcdef
Content-Length: 397

Encryption

2017年秋から、APIのバージョン2が導入され、対称暗号化方式を使用してほとんどのHTTP POSTペイロードを暗号化します。暗号化された値は、次の形式のJSONオブジェクトのペイロードで伝達されます。``` {"value": "b9fb151cd004e1d570201c8ee1a42a6bea3053550c545c446f192f11cfebac8389741 94cff9d3985cebf2bc751acc98359769a9886bc02fe9ab9fc1a5a646c46e1c51e668a717343307fc 5dcef00f8bf92e1badc6d0506f31303e5947ee3453d"}

root@kitploit:~
hex 値は、以下の方法で AES-128 CBC モードで暗号化されます:```
ciphertext = AES(plaintext_with_hash, secret_key, iv)

ここで、secret_key は文字列 oBAddMYFUzLed にモバイルアプリのバージョン 番号を付加したものです。例:バージョン 2.5.4 の場合、秘密鍵は oBAddMYFUzLed254 です。 使用される初期化ベクトルは 1234567890123456 です。

plaintext_with_hash は以下から計算されます:``` plaintext_with_hash = plaintext + '&' + SHA1(hash_key + plaintext + '&')

root@kitploit:~
ここで、`hash_key` は文字列 `oBaddX4buhBMG` です。

OpenSSL でペイロードを復号化する方法は次のとおりです:```
$ echo -n "b9fb151cd0...453d" | \
xxd -r -p | \
openssl enc -aes-128-cbc -d -K 6f424164644d5946557a4c6564323534 -iv 313233343536
37383930313233343536

認証

REST APIの認証方式は、どこかOAuth/OpenIDを連想させるものです。ユーザー名 とパスワードが送信され、その見返りとして、サーバーは新しいセッションのためのアクセス トークンとリフレッシュトークンを送信します。例:

HTTPリクエスト:``` POST /api/v2/member/login HTTP/1.1 platform: Android Connection: close Accept-Language: en version: 2.5.4 Content-Type: application/json; charset=utf-8 Content-Length: 396 Host: mobile.o.bike Accept-Encoding: gzip User-Agent: okhttp/3.4.2

{"value":"e4526007ae3791e4fabdd5f6833563f8499d076fe5a4039e1ac1bcb7788dc7a053e8b4 384faf202828e6587bbc4bf32f505429129871253ecc388b493f32368ac418f627acc7720c1b5e1a 4ecc35fca7e80dd99062c24cea0b920fcc297164f8703511520f05c2f91ada946dbee9320a0d2f24 f1101036133d53425e91f2b52b7abbea95cde3f395ce8f2c586aa1ea9eaa35fecb26214eb498dbd3 5c56d37b88ebdc100180da662cdae6d6aa50c31d2f92063c2acb8ff45f62d12d34005d48a3"}

root@kitploit:~
復号化されたペイロード:```
{"phone":"791234567","deviceId":"0123456789abc-0123456789abcdef01","password":"s
wordfish","countryCode":"41","dateTime":"1515100814123"}&687fdcb704d0661b67cf1a2
97b5059b1d4d67900

HTTPレスポンス:``` HTTP/1.1 200 Server: nginx/1.10.3 (Ubuntu) Date: Thu, 04 Jan 2018 21:20:14 GMT Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Connection: close Vary: Accept-Encoding

{"data":{"resourceOwnerId":1234567,"accessToken":"0123456789abcdef0123456789abcd ef","refreshToken":"0123456789abcdef0123456789abcdef","scope":"customer","expire sIn":5184000,"registerCoupon":null},"success":true,"errorCode":100}

root@kitploit:~
認証済みリクエストは、Authorization ヘッダーにアクセストークンを含める必要があります
, 例:```
Authorization: Bearer 0123456789abcdef0123456789abcdef

自転車のロック解除

チャレンジを送信して、oBike のロック解除に使用されるレスポンスを受信します。

HTTP リクエスト:``` POST /api/v2/bike/unlockPass HTTP/1.1 Host: mobile.o.bike Connection: keep-alive Accept-Encoding: gzip, deflate Accept: / User-Agent: okhttp/3.4.2 platform: Android Content-Type: application/json; charset=utf-8 version: 2.5.4 Authorization: Bearer 0123456789abcdef0123456789abcdef Content-Length: 397

{"value": "697560f47a113c7950836a914d60a342ea3feac166dd74ae67aabfa5c51f79f27d0a0 3335e72d6fcf747681badbd177499deec15a2e545ef1e293431592f2e080ae5fa6e031064369bbfe f7bccf1a626d7c22265d2df4bcc20b514bf8aa0263d808d1de57ab3a8ef71093e0d558f0f6fba15b 59901b01ca6c95878d69f2f85c5dd90d9610222eb5f7ca2cf955991b7701496e701d39ed0b05514b 6f014634554"}

root@kitploit:~
復号化されたペイロード:```
{"dateTime":1515016440105,"deviceId":"0123456789abc-0123456789abcdef01","bikeId"
:"041001337","keySource":"54835578"}&cd835995e39c8076f15e3d989727106115b02b8b

Notes:

  • bikeId は、実際にロック解除される oBike に対応してはなりません
  • keySource は、oBike ロックが "BLE Push Coords / Get Challenge" コマンドへの応答として 生成した32ビットのチャレンジです。

HTTPレスポンス:``` HTTP/1.1 200 Server: nginx/1.10.3 (Ubuntu) Date: Fri, 05 Jan 2018 16:03:35 GMT Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Connection: close Vary: Accept-Encoding X-Application-Context: customer:prod:8084

{"data":{"encryptionKey":136,"keys":"ff533ae8ec0b1a1816160e9182af7d74","serverTi me":1515168215665},"success":true,"errorCode":100}

root@kitploit:~
### Lock Message
確認コードをサーバーに送信します。サーバーはこのメッセージを受信すると
課金を開始します。

HTTP Request:```
POST /api/v2/bike/lockMessage HTTP/1.1
platform: Android
Connection: close
Accept-Language: en
version: 2.5.4
Authorization: Bearer 80828d0bd57c95f6d5012c45e548598e
Content-Type: application/json; charset=utf-8
Content-Length: 652
Host: mobile.o.bike
Accept-Encoding: gzip
User-Agent: okhttp/3.4.2

{"value":"14420a2ef69b61c06667a58bc6842c7b781b3fc650100652982bbe369b5c818df3225c
6cd8bb63e9cbd7c33a21b6d7be5c66b4ff7744ddcc3b5debf1a1fc0a1a8b379278b360edb5ab3ceb
7014954dc084c1f05a76aa311b09aafe5ca84215f8f3e03f4d9187c14bd0215c8f8c1f535cb46f8f
fc3cd8f327a9410b0378a61dddc0ffdbadd084ccae67442da6598e52f69452a5a7c4fc087df6f8f0
dfd3277db90ae6ecbaf4c7763f5c2bb24611fd8b89c00a2f87442b526bce73405b7370b8adca045c
2852068516c3f8a473cb79c8635092531ef9104f361370c2d11f352c8b3ad9c356a8f363e8da7120
0dcf36d264009e0098c208089f7fbc113fdf342b4222b1466e3d40287dd1b024b3c55bfcf4dbce28
e7156ea5ef1883dd2c390bf7f5eef7833e72ff33eb04ed501f91c7915670f4bb24382fe232adbe30
7ebf80acfb"}

復号化されたペイロード:``` {"deviceId":"0123456789abc-0123456789abcdef01","lati":47.3732953,"longi":8.53144 7,"memberId":1234567,"dateTime":"1515159966559","index":"85","timestamp":"151515 9965000","mackey":"6C81C6822A08C30881CFB0D0FAF7D89B","vol":"3.79","transtype":0, "bikeTradeNo":"5A4F819D639BC4AE1"}&4b5d220310f48744cfadcfd0d554384e2df03921

root@kitploit:~
注記:
 * `mackey` は、自転車がロック解除状態のときに BLE Hello Command によって
 受信される 128ビット値です。

HTTP レスポンス:```
HTTP/1.1 200
Server: nginx/1.10.3 (Ubuntu)
Date: Fri, 05 Jan 2018 13:46:07 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding

{"data":{"startTime":1515159967958,"message":"Unlocked successfully."},"success"
:true,"errorCode":100}

注文リスト

このアカウントで予約された乗車のリストを取得します。

HTTP リクエスト:``` POST /api/v2/order/list HTTP/1.1 platform: Android Connection: close Accept-Language: en version: 2.5.4 Authorization: Bearer 0123456789abcdef0123456789abcdef Content-Type: application/json; charset=utf-8 Content-Length: 268 Host: mobile.o.bike Accept-Encoding: gzip User-Agent: okhttp/3.4.2

{"value":"14420a2ef69b61c06667a58bc6842c7b781b3fc650100652982bbe369b5c818df3225c 6cd8bb63e9cbd7c33a21b6d7be45a70bc261bf64e65f985aa51faefe44de6dcafd6e4037b82f1d05 029b4dcb85caeac6f67df317710c7ccd0b3303c92bb9557e2fde213bc397ede304c0c13a16b0310c 799a569df81f2f07a89c5cca06"}

root@kitploit:~
復号化されたペイロード:```
{"deviceId":"0123456789abc-0123456789abcdef01","current":1,"dateTime":"151605127
4357"}&11fae15b700f6f69133bfe167c1f99c503359cde

HTTPレスポンス(JSONを整形表示):``` HTTP/1.1 200 Server: nginx/1.10.3 (Ubuntu) Date: Mon, 15 Jan 2018 21:21:16 GMT Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Connection: close Vary: Accept-Encoding

{ "data": { "per": 20, "current": 1, "count": 42, "list": [ { "id": 15871962, "orderNo": "1801060003123123", "status": 5, "price": 0, "bookTime": null, "cancelBookTime": null, "startTime": 1515168315000, "endTime": 1515168321000, "userId": 1234567, "bikeId": "041001337", "trackId": 17041234, "distance": 0, "minutes": 0, "freeMinutes": 0, "carbon": 0, "calorie": 0, "grade": 0, "unitPrice": 1.5, "currency": "CHF", "currencySymbol": "CHF", "actualPrice": 0, "actualCurrency": "CHF", "actualCurrencySymbol": "CHF", "activityId": null, "couponId": null, "clubcardId": null, "savedMoney": null, "tempActualPrice": null, "tradeNo": "5A4FA1D763990A444", "tempEndTime": null, "tempMinutes": null, "lockType": 1, "countryId": 167, "cityId": null, "platForm": null, "promotionActivityId": 0, "parkingAreaType": 0 }, ... ], "pages": 3 }, "success": true, "errorCode": 100 }

root@kitploit:~
### 自転車の一覧表示
指定された座標(lat, lng)周辺の自転車の一覧を取得します。

HTTPリクエスト:```
POST /api/v2/bike/list HTTP/1.1
platform: Android
Connection: close
Accept-Language: en
version: 2.5.4
Authorization: Bearer 0123456789abcdef0123456789abcdef
Content-Type: application/json; charset=utf-8
Content-Length: 428
Host: mobile.o.bike
Accept-Encoding: gzip
User-Agent: okhttp/3.4.2

{"value":"1a585fffc27493e530e50c48b834f0df905fa023d59a7db8d64bae39473cd75adc7c33
e8a0e9173845c9478046cff0c85bccbaecc7acd9cfadfc650c30cae4278d7f906da3a710742b6372
79f21f5367f3ea2fd95564ee7077b85af5ef9ebcf7d456c15616ffda4f25524b587936984b62abfe
8a2a94c042d4893c9e74c267a42aed5310acc5fbb4924d57008cb2081e3e3009fdab5cbc7fc640b7
2efc4e2ba2a10af81ac72aee5100e1c706b9eb500810e40aae855134fe9f625bb34a3626e843922c
7c2b222e6f32daf69f130e9350"}

復号化されたペイロード:``` {"countryCode":41,"latitude":"47.37326917039802","longitude":"8.531275056302547" ,"deviceId":"0123456789abc-0123456789abcdef01","dateTime":"1508318416019"}&21b7e af2631f62fca73faf4c63fd75b1302aed4f

root@kitploit:~
HTTPレスポンス(JSONはプリティプリントされ、切り詰められている):```
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Server: cloudflare-nginx

{
  "data": {
    "iconUrl": null,
    "list": [{
      "id": "041003059",
      "longitude": 8.527892,
      "latitude": 47.369085,
      "imei": "6F6E384C30503166",
      "countryId": 167,
      "helmet": 0
    }, {
      "id": "041001731",
      "longitude": 8.526518,
      "latitude": 47.369303,
      "imei": "6F6E53696D39706C",
      "countryId": 167,
      "helmet": 0
    },
    ...
    {
     "id": "041000911",
     "longitude": 8.526561,
     "latitude": 47.377715,
     "imei": "72616C48496E6974",
     "countryId": 167,
     "helmet": 0
   }]
 },
 "success": true
}

インストール```

$ apt update $ apt install git build-essential python python-pip libbluetooth-dev libglib2.0-dev $ git clone https://github.com/antoinet/obike.git $ cd obike $ pip install -r requirements.txt

root@kitploit:~
## References
 * [oBikeロックの分解と再組み立て、ドックレスシェア自転車の救出](https://www.youtube.com/watch?v=Vl3Gl8w8n-Q)
 * [共有自転車システムの脆弱性の調査](http://www.comp.nus.edu.sg/~hugh/CS3235/CS3235-SemI-2017-18-FinalProjects.pdf), [代替ソース](http://web.archive.org/web/20180102175104/http://www.comp.nus.edu.sg/%7Ehugh/CS3235/CS3235-SemI-2017-18-FinalProjects.pdf)
 * [Huangzhou Luoping ElectronicsのFCC提出書類 - Smart Locker HBT203](https://fccid.io/2ALWC-HBT203)
 * [Les vélos en libre service dans les villes de Zurich et de Berne sont désormais retirés de la circulation temporairement, rts.ch](https://www.rts.ch/play/tv/19h30/video/les-velos-en-libre-service-dans-les-villes-de-zurich-et-de-berne-sont-desormais-retires-de-la-circulation-temporairement?id=9797225&station=a9e7621504c6960e35c3ecbe7f6bed0446cdf8da)
 * [CVE-2018-16242](https://seclists.org/bugtraq/2018/Sep/30)

## Credits
他のセキュリティ研究者から連絡をいただき、彼らもoBikeロックシステムに取り組んでいます。ご意見とご貢献に感謝します:
 * [@vincent_tky](https://twitter.com/vincent_tky)
 * mh ([SSD e.V.](https://ssdev.org))
 * [NUS Computing](https://www.comp.nus.edu.sg/)のCS3235の学生
ツールをダウンロード