
Bluetooth Low Energy(BLE)のスイスアーミーナイフ
BtleJack: 新しいBluetooth Low Energyスイスアーミーナイフ #####################################################
Btlejackは、Bluetooth Low Energyデバイスのスニッフィング、ジャミング、ハイジャックに必要なすべてを提供します。専用ファームウェアを実行する1つ以上のBBC Micro:Bit <http://microbit.org/>_デバイスに依存しています。また、AdafruitのBluefruit LEスニファ <https://www.adafruit.com/product/2269>_やnRF51822 Eval Kit <https://www.waveshare.com/wiki/BLE400>_も使用できます。これらのデバイスのサポートを追加しました。
本ツールの現在のバージョン(2.0)は、BLE 4.xおよび5.xをサポートしています。BLE 5.xのサポートは限定的で、1Mbps Uncoded PHYのみをサポートし、チャネルマップの更新はサポートしていません。
UNIXベースのシステム(例えばRaspberry Pi)が必要です。BBC Micro:Bitを使用する場合、1~3台のMicro:Bitデバイス(3台推奨)と、各デバイスに1つの空きUSBポートが必要です。Micro:Bitの消費電力はかなり低いため、推奨される3台のユニットに電源を供給するために、1つのUSBポートとパッシブハブを使用できます。
コンピュータに同時に3台のMicro:Bitを接続すると、Btlejackはすべてのアドバタイジングチャネルでスニッフィングが可能になり、接続要求をキャプチャする可能性がはるかに高くなります。
まず、Pipを使用してbtlejack Python3クライアントソフトウェアをインストールします。
::
$ sudo pip3 install btlejack
次に、Micro:BitデバイスをUSBケーブルでコンピュータに接続し、関連するマスストレージデバイスをマウントし(マウントポイントに MICROBIT が含まれている必要があります)、次のコマンドを実行します。
::
$ btlejack -i
これにより、コンピュータに接続されているすべてのMicro:Bitデバイスがプログラムされ、Btlejackで使用できるようになります。現在のクライアントソフトウェアに適したファームウェアバージョンが使用されるため、Btlejackを更新するたびにこのファームウェアインストール手順を実行することを強くお勧めします。
Bluefruit LEスニファまたはnRF51822 Eval Kitを使用している場合は、外部SWDプログラマを使用して、このファームウェア <https://github.com/virtualabs/btlejack-firmware/raw/master/dist/btlejack-firmware-ble400.hex>_でデバイスをフラッシュしてください。
デバイスを接続したままにしておけば準備完了です!
注記 これはPOSIX互換システムでのみ機能します。
Btlejackの使用は非常に簡単です。Btlejackは以下のことができます。
Btlejackは通常、接続されている互換性のあるデバイス(現時点ではMicro:Bitのみ)を自動検出して使用しようとしますが、ファームウェアをハッキングまたは改造して他のnRF51822ベースのボードで動作させることができるため、これらのデバイスとの互換性を可能にする特定のオプションを提供しています。
-dオプションを使用すると、Btlejackで1つ以上のデバイスを指定できます。このオプションはデバイスの自動検出を無効にすることに注意してください。必要な数のデバイスを追加してください。
::
$ btlejack -d /dev/ttyACM0 -d /dev/ttyACM2 -s
まず、btlejackでターゲットとする既存の接続を見つけます:
::
$ btlejack -s BtleJack version 1.1
[i] Enumerating existing connections ... [ - 54 dBm] 0xcd91d517 | pkts: 1 [ - 46 dBm] 0xcd91d517 | pkts: 2
最初の値(dBm単位)は信号の強度を示し、この値が大きいほどスニッフィングされる接続の品質が良くなります。
2番目の値(16進数)は関連する アクセスアドレス で、2つのBluetooth Low Energy互換デバイス間のリンクを識別する32ビット値です。
最後の値は、この アクセスアドレス で見られたパケット数です。この値が高いほど、対応する アクセスアドレス が使用されている可能性が高くなります。
次に、-fオプションを使用して特定の接続を追跡します:
::
$ btlejack -f 0xdda4845e BtleJack version 1.1
[i] Detected sniffers:
Sniffer #0: fw version 1.1
[i] Synchronizing with connection 0xdda4845e ... ✓ CRCInit: 0x2a035e ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 39 ✓ Hop increment = 15 [i] Synchronized, packet capture in progress ... LL Data: 02 07 03 00 04 00 0a 03 00 LL Data: 0a 08 04 00 04 00 0b 5a 69 70 LL Data: 02 07 03 00 04 00 0a 03 00 LL Data: 0a 08 04 00 04 00 0b 5a 69 70
複数のmicrobitを使用している場合、Btlejackはスニッフィング操作の一部を並列化し、接続パラメータの回復を高速化します!
btlejackでサポートされている-cオプションを使用すると、ターゲットのBDアドレスを指定したり、anyを使用して作成された新しい接続をすべてキャプチャしたりできます。
::
$ btlejack -c any BtleJack version 1.1
[i] Detected sniffers:
Sniffer #0: version 1.1 Sniffer #1: version 1.1 LL Data: 05 22 df b4 6f 95 c5 55 c0 0a f6 99 23 40 1d 7b 2f 0a 9a f4 93 01 12 00 27 00 00 00 d0 07 ff ff ff ff 1f 0b [i] Got CONNECT_REQ packet from 55:c5:95:6f:b4:df to 40:23:99:f6:0a:c0 |-- Access Address: 0x0a2f7b1d |-- CRC Init value: 0x93f49a |-- Hop interval: 39 |-- Hop increment: 11 |-- Channel Map: 1fffffffff |-- Timeout: 20000 ms
LL Data: 03 09 08 0f 00 00 00 00 00 00 00 LL Data: 03 09 08 0f 00 00 00 00 00 00 00 LL Data: 0b 06 0c 08 0f 00 09 41 LL Data: 03 06 0c 07 1d 00 d3 07
または、ターゲットのBDアドレスを指定することもできます:
::
$ btlejack -c 03:e1:f0:00:11:22
アクセスアドレスで識別された接続が確立したら、-jオプションを使用してジャミングできます:
::
$ btlejack -f 0x129f3244 -j̀
Btlejackは既存の接続をハイジャックすることもできます。そのためには-tオプションを使用します。ハイジャックされると、Btlejackはプロンプトを表示し、ハイジャックされたデバイスと対話できるようになります。
まず、既存の接続をハイジャックします:
::
$ btlejack -f 0x9c68fd30 -t -m 0x1fffffffff BtleJack version 1.1
[i] Using cached parameters (created on 2018-08-11 01:48:24) [i] Detected sniffers:
Sniffer #0: fw version 1.1
[i] Synchronizing with connection 0x9c68fd30 ... ✓ CRCInit: 0x81f733 ✓ Channel map is provided: 0x1fffffffff ✓ Hop interval = 39 ✓ Hop increment = 9 [i] Synchronized, hijacking in progress ... [i] Connection successfully hijacked, it is all yours \o/ btlejack>
次に、以下のコマンドを使用してデバイスと対話します:
discover コマンド ^^^^^^^^^^^^^^^^^^
discoverコマンドは、Bluetooth LEパケットを送受信し、すべてのサービスのUUIDとパラメータ、および特性のUUIDとパラメータを取得します:
::
btlejack> discover start: 0001 end: 0005 start: 0014 end: 001a start: 0028 end: ffff Discovered services: Service UUID: 1801 Characteristic UUID: 2a05 | handle: 0002 | properties: indicate (20) \ value handle: 0003
Service UUID: 1800 Characteristic UUID: 2a04 | handle: 0019 | properties: read (02) \ value handle: 001a
Characteristic UUID: 2a00 | handle: 0015 | properties: read (02) \ value handle: 0016
Characteristic UUID: 2a01 | handle: 0017 | properties: read (02) \ value handle: 0018
Service UUID: 1824 Characteristic UUID: 2abc | handle: 0029 | properties: write indicate (28) \ value handle: 002a
read コマンド ^^^^^^^^^^^^^^
readコマンドは1つのパラメータ、読み取りたい特性に対応する値ハンドルを受け入れます:
::
btlejack> read 0x16 read>> 4c 47 20 77 65 62 4f 53 20 54 56
write コマンド ^^^^^^^^^^^^^^^
writeコマンドは3つのパラメータを受け入れます:
::
btlejack> write
サポートされているデータ形式:
hex: 16進データ(例:"414261")str: テキスト文字列。二重引用符で囲むことができますll コマンド ^^^^^^^^^^^^
この最後のコマンドを使用すると、Volume 6, Part B, Chapter 2.4で指定されているように、Bluetooth Low Energyリンク層PDUを16進形式で送信できます。
Btlejackの興味深い機能の1つは、キャプチャしたデータをPCAPファイルにエクスポートできることです。
Btlejackは以下のDLT形式をサポートしています:
出力ファイルは-oオプションで指定でき、出力形式は-xオプションで指定できます。有効な形式の値は、ll_phdr、nordic、またはpcap(デフォルト)です。
::
$ btlejack -f 0xac56bc12 -x nordic -o capture.nordic.pcap
ll_phdrエクスポートタイプは、暗号化された接続をスニッフィングする場合に便利です。これはcrackle <https://github.com/mikeryan/crackle>_でもサポートされています。したがって、暗号化された接続をスニッフィングして解読したい場合は、これが最適な方法です。
また、-sオプションを使用して、crackleに特定の解読戦略を指定する必要がある場合もあります:
::
$ crackle -i some.pcap -s 1
Btlejackは、処理を少し高速化するために、接続関連の値を保存する接続キャッシュを使用します。この接続キャッシュは、特にアクセスアドレスが以前に表示された場合に問題を引き起こす可能性があります。
このキャッシュは-zオプションでフラッシュできます:
::
$ btlejack -z
Btlejack 2.0では、新しい -w オプションが導入されました。このオプションを使用すると、パケットのライブ分析を実行するためにFIFOパス(既存または新規)を指定できます:
::
$ btlejack -c any -w /tmp/blepipe
FIFOと出力ファイルを同時に使用することもできます:
::
$ btlejack -c any -w /tmp/blepipe -o blepackets.pcap
以前に、USB経由でRaspberry Pi Zero WをセットアップするためにUSB仮想イーサネット(RNDIS)を有効にした場合、これを再度無効にする必要があります(つまり、boot/config.txtからdtoverlay=dwc2を削除し、boot/cmdline.txtからmodules-load=dwc2,g_etherを削除し、sudo rebootを実行します)。そうしないと、スニファのUSB接続に干渉するためです。
このバージョンは、Bluetooth Low Energyバージョン5および5.1、特にバージョン5で導入された新しいチャネル選択アルゴリズム(CSA #2)をサポートしています。ただし、使用されるハードウェアはバージョン5で追加された2つの新しいPHYをサポートしていないため、1Mbps Uncoded PHYを使用する接続のみをスニッフィング、ジャミング、おそらくハイジャックできます。
また、Btlejackに含まれているCSA #2の現在の実装は、現時点ではチャネルマップの更新をサポートしていないことに注意してください。
Btlejackは使用されているチャネル選択アルゴリズムを自動的に検出するため、心配する必要はなく、通常どおりパケットをキャプチャするだけです。
既存のBLE 5接続(1Mbps Uncoded PHYを使用し、このPHYのみ)のスニッフィングはそれほど難しくありません。まず、-5オプションを使用して、BLE 5接続をターゲットにすることを指定する必要があります。既存の接続がCSA #2とCSA #1のどちらを使用しているかを判断する方法はないため、どちらかが機能するまで両方の手法を試す必要があります。
::
$ btlejack -f 0x11223344 -5
次に、Btlejackは使用されているチャネルマップを回復し、次にホップ間隔値を回復します:
::
$ btlejack -f 0x11223344 -5 [i] Synchronizing with connection 0x11223344 ... ✓ CRCInit: 0x40d64f ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 160
その後、この接続のPRNGカウンタ値を回復しようとします:
::
$ btlejack -f 0x11223344 -5 [i] Synchronizing with connection 0x11223344 ... ✓ CRCInit: 0x40d64f ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 160 ✓ CSA2 PRNG counter = 5137 [i] Synchronized, packet capture in progress ...
これが完了すると、Btlejackはこの接続と同期し、通常どおりパケットを処理します。
ここでは新しいことはありません。ただし、-5オプションを使用して、BLE 5接続を攻撃していることを指定する必要があります。
この攻撃は、それぞれ*-mフラグと-p*フラグを使用して、使用するチャネルマップとホップ間隔値を指定することで最適化できることに注意してください。両方を指定する必要があります。指定しないと機能しません。
現時点では、この攻撃は時間に敏感であるため、BLE 5接続のハイジャックは成功していません。私のBLE 5デバイスはレイテンシ0を使用しているため、遅延が許容されず、この攻撃は失敗します。
正規のBLE 5デバイスを入手できたら、これを改善する予定です。