LinuxのBluetoothスタック(BlueZ)が提供するBluetoothプロトコルアナライザです。
BlueZ:Linux および Android システムで標準的に使われているオープンソースの Bluetooth プロトコルの実装
btmonとは
Bluetoothコントローラ(HCI)とLinuxカーネルとの間でやり取りされる全てのHCIパケットやイベントをリアルタイムで表示します。
Wiresharkがネットワークパケットを解析するツールであるのに対し、btmonはBluetooth版のパケットモニタです。
btmonの主な用途
| 用途 | 内容 |
|---|---|
| ペアリング解析 | どんな手順で認証しているか |
| 接続トラブル解析 | どこで失敗したか |
| BLE解析 | Advertising内容を見る |
| Classic Bluetooth解析 | L2CAPなどを見る |
| HCIコマンド解析 | OSが送った命令を見る |
| セキュリティ研究 | Bluetooth通信の解析 |
データの収集
以下のコマンドで、
- 周囲を飛び交っているbluetooth電波をキャプチャしたHCIからの信号
- カーネルからHCIへの信号
をモニタリングします。
sudo btmon
コマンド実行後に、bluetoothマネージャの ‘search’ ボタンをクリックすると、信号収集を始めます。(具体的には下記)
画面右上のブルートゥースアイコン(図では左から2つ目)をクリックし、![]()
表示された ‘Bluetooth Devices’ ダイアログの ‘seach’ ボタンをクリックします。
btmonの終了は ‘Ctrl + C’ です。
保存ファイルへの記録
記録は ‘-w’ オプションで保存ファイル名を指定します。
sudo btmon -w 保存ファイル名
保存形式は、’btsnoop’ というBluetooth記録の標準形式です。

データの解析
収集したbluetoothのパケットデータの解析です。
統計
‘-a’ オプションでサマリーが表示されます。
btmon -a ファイル名

上記の例では、
2行目:総パケット数257個
続いて2つのコントローラ別に表示されています。
第一のコントローラ(index 65535 BD_ADDR 00:00:00:00:00:00)は、仮想コントローラです。
第二のコントローラ(index 0 BD_ADDR 2C:CF:67:XX:XX:XX)は、ラズパイ搭載のbluetoothコントローラです。(Cypress Semiconductor 社製のbluetoothアダプタを内蔵していることが表示されています)
実物のアダプタは第二の方です。
| 項目 | 意味・内容 |
|---|---|
| commands | HCIコマンド・コントローラへ送信した命令 |
| events | コマンドの返事・コントローラからの応答やAdvertising Report |
| ACL packets | ACL通信(接続後) |
| SCO packets | 音声通信(接続後) |
| ISO packets | LE Audio通信(接続後) |
| vender diagnotics | メーカー独自ログ |
| system notes | ログ開始などのシステムメモ |
| user logs | ユーザーメモ |
| control mesages | MGMT(management)イベント・BlueZの管理メッセージ |
| unknown opcodes |
記録ファイルの詳細
保存したファイルは、 ‘btsnoop’ 方式なので、普通に ‘cat’ コマンドや、 ‘nano’ などのテキストエディタでは開けません。(開いても判読できません)
btmonツールの ‘-r’ オプションを使用します。
btmon -r ファイル名

色分けされているので分かりやすいですが、行数が多く全体の俯瞰が今一つ困難です。
なので、 ‘grep’ コマンドなどを使用して分析します。
wiresharkによる解析
‘btsnoop’ 形式は “wireshark” ツールでも対応していますので、 “wireshark” で開けます。
kali ー 09-Discovery ー wireshark で起動します。

起動時の画面です。
左上に並ぶアイコンの左から5つ目のアイコンをクリックするとファイルを指定して展開出来ます。

ファイルを展開した所です。

その他解読のヒント
紙面不足(と私の能力不足・努力不足・根気不足)で今回の投稿では完全に解読出来ていません。
取り敢えず分かる “単語” についていくつか記載します。
BDアドレスの種類について
bluetoothのアドレスは、固定アドレスのものと変動アドレスのものがあります。
まずはbluetoothは2系統あります。Classic系統とBLE(Bluetooth Low Energy)系統です。
- Classsic系統はアドレス固定で通信します。
- BLE系統は(プライバシー・セキュリティ上の理由で)通信時にアドレスを変動させます。つまり変動前アドレスと変動後アドレスの2つのアドレスを持ちます。
BLE系統において、変動前のアドレス(すなわち工場出荷時から持つ固有のアドレス)をBLE Public Addressと呼び、これは一生変わりません。
一方変動後のアドレス(Random Address)は変動の具合により、さらに以下の3種類があります。
| btmon出力上の表示 | 変動アドレスの種類 | 特徴 |
|---|---|---|
| Static | BLE Static Random | 起動中は固定(再起動などで変わる場合あり) |
| Resolvable | BLE Private Resolvable Address | ペアリング済み機器は識別可能 定期的(15分毎)にアドレス変化 |
| Non-Resolvable | BLE Private Non-Resolvable Address | 完全に匿名(頻繁にアドレス変化) Bluetoothコントローラ自身が使用するランダムアドレス |
RSSIについて
通信内容にあるRSSIは電波の強さの指標です。
RSSI(Received Signal Strength Indicator)
無線通信の受信電波の強さを示す指標で単位はdBm(デシベルミリワット)
0に近いほど電波が強く、マイナスの数字が大きくなるほど電波が弱くなります。
Wi-FiやBluetooth、携帯電話のアンテナ表示などに使われます。

bluetooth機器の電波出力はほぼ一定の為、結果的に近似的な電波源の近さの目安となります。
| RSSI | 距離の目安 |
|---|---|
| -40 dBm | 30cm程度 |
| -50 dBm | 約1m |
| -60 dBm | 2〜3m |
| -70 dBm | 5〜10m |
| -80 dBm | かなり遠い |
| -90 dBm以下 | 通信限界付近 |
まとめ
btmonは、周囲を飛び交うbluetoothの電波を傍受して記録するコマンドです。
記録形式は ‘btsnoop’ で、wiresharkツールでも解読できます。
wiresharkと同じくその解釈が困難で、これがポイントのようです。
参考)bluetooth関連コマンド
bluetooth関連の主なコマンドの使い分けです (by chatGPT先生)
| コマンド | 用途 |
|---|---|
bluetoothctl | Bluetooth機器の操作(スキャン、ペアリング、接続など) |
btmon | Bluetooth通信内容の監視・解析 |
hciconfig(旧) | HCIデバイス設定(現在は非推奨) |
btmgmt | Bluetoothコントローラ管理 |
hcitool(旧) | 簡易的なHCI操作(現在は非推奨) |
ヘルプ


コメント