offensive-z-wave について
offensive-z-waveは、Z-Waveネットワークの認可済みセキュリティ評価向けガイドです。S0・S2の仕組み、通信の捕捉、デバイスのテストを扱います。
主な機能
- 01地域別のZ-Wave周波数の特定
- 02インクルージョン通信の捕捉と分析
- 03S0とS2のセキュリティ評価
- 04リプレイとコマンド注入のテスト
- 05デフォルトキーとハブ経路の確認
活用シーン
- 01Z-Waveネットワークのセキュリティ設定の評価
- 02インクルージョン中の鍵交換リスクの確認
- 03未認証デバイスがコマンドを受け入れるかのテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ snailsploit/ claude-red --skill offensive-z-waveインストール後、Claude Code で/offensive-z-waveを入力して読み込まれたか確認します。
詳細
Z-Wave 攻撃
Z-Wave は 800/900 MHz ISM 帯域で動作します(米国:908 MHz、EU:868 MHz)。旧式のネットワークでは、固定値から導出されるネットワークキーを使用する S0 セキュリティ方式が使われていました。この方式には以前から欠陥があることが知られています。2017 年以降、Z-Wave Plus v2 で必須となった S2 は、ECDH によるコミッショニングを使用し、大幅に強化されています。
クイックワークフロー
- 地域を特定します(米国 908 MHz/EU 868 MHz)。アダプターの周波数を一致させる必要があります
- インクルージョン(コミッショニング)時の通信をスニッフィングします。キー交換はこの段階で行われます
- フレーム形式から S0 と S2 のどちらかを判別します
- S0 の場合:キーを導出するか、リプレイします。S2 の場合:ECDH を解析し、実装上の欠陥を探します
ハードウェア
| アダプター | 用途 |
|---|---|
| Z-Force(旧式、入手困難) | 初期の調査ツール |
| EZ-Wave(カスタム HackRF ファームウェア) | 最新のフル・トランシーバー |
| Aeotec Z-Stick | 市販コントローラー。正規ノードとして便利 |
| HackRF + オープンな Z-Wave ファームウェア | マルチバンド SDR アプローチ |
| RTL-SDR + ZniffMobile(パッシブ専用) | 安価なスニファー |
スニッフィング
# EZ-Wave (HackRF firmware-based)
git clone https://github.com/cureHsu/EZ-Wave
ezwave-sniff -f 908.4MHz -o capture.pcap
# Wireshark with the Z-Wave dissector parses captured frames
wireshark capture.pcap
インクルージョン段階(コントローラーが新しいデバイスを追加する段階)を探します。ネットワークキーはこの段階で交換されます。
S0 のセキュリティ上の欠陥
S0 は、最初のデバイスをインクルージョンする際に、固定の全ゼロ PSK からネットワークキーを導出します。この固定値は広く知られているため、インクルージョン中にスニッフィングした S0 ネットワークは、オフラインで復号できます。
S0 commissioning:
1. New node joins → controller sends key with zero-PSK encryption
2. Attacker sniffs commissioning frame → derives session key
3. All future S0 traffic on that network is decryptable
次のことができれば:
- インクルージョンを開始する(ノードを工場出荷時の状態にリセットするか、正規のインクルージョンを待ちます)
- 約 2 秒間のキー交換時間中にスニッフィングする
そのメッシュのネットワークキーを入手できます。
S2(Z-Wave Plus/S2 Authenticated)
S2 は、コミッショニングに ECDH を使用して S0 の欠陥を修正しています。
- 各デバイスは Curve25519 のキーペアを持ちます
- インクルージョンでは、帯域外(ステッカー/QR コード)で検証される DSK(Device Specific Key)を使用します
- ネットワークキーが平文で無線通信を経由することはありません
S2 の攻撃対象領域は、主に実装に関するものです。
- インクルージョンモードが常時オープンになっている(コントローラーの設定ミス)
- S2 検証におけるファームウェアのバグ
- リソースに制約のあるチップ上での ECDH に対するサイドチャネル攻撃
- ステッカーに印刷された DSK。物理的にアクセスできれば取得できます
未認証ノードに対するリプレイ/インジェクション
ローエンドの Z-Wave デバイス(旧式のセンサーや基本的なスイッチ)の多くは S0 や S2 を適用しておらず、平文のコマンドを受け入れます。
# scapy-zwave (community fork) for crafted frames
from scapy.contrib.zwave import *
frame = ZWave(home_id=0x12345678)/ZWaveBasic(set_value=0xff)
sendp(frame, iface='ezwave0')
対象に認証機能がない場合、ドアの解錠、照明の点灯、センサーの警戒解除が可能になります。
キーの総当たり
デフォルトの Home ID/ネットワークキーを使用する古いテスト環境では:
# Try default home IDs
for hid in 0x00000000 0x12345678 ...; do
ezwave-test --home-id $hid --target-node 1
done
本番環境での成功率は低く、デフォルト設定の IoT ラボ機器にのみ有用です。
ハブを経由した侵入
Z-Wave デバイスは通常、ハブ(SmartThings、Hubitat、Vera、Home Assistant、Z-Wave JS UI)で制御されます。ハブは Linux デバイスで、Z-Wave PSK が平文で保存されています。
- SmartThings Hub:以前はクラウドのみの認証情報でしたが、最新の v3 ではネットワークキーをローカルに保存します
- Home Assistant:通常、
~/.homeassistant/zwave_js.jsonにキーが含まれています - Hubitat:旧バージョンでは、デフォルトパスワードでウェブ UI にアクセスできます
ハブを侵害すれば、Z-Wave PSK と、ペアリングされたすべてのデバイスに対するコマンド権限を入手できます。ハブのファームウェア抽出については offensive-iot を参照してください。
エンゲージメント用チートシート
# 1. Identify region + frequency
# US: 908.4 MHz; EU: 868.4 MHz; CN: 868.4 MHz
# 2. Sniff
ezwave-sniff -f 908.4MHz -o cap.pcap
wireshark cap.pcap # filter zwave
# 3. Identify S0 vs S2 from frame format
# 4. For S0: capture inclusion → derive key → decrypt history + control devices
# 5. For S2: focus on hub compromise / DSK theft / implementation bugs
# 6. Test unauthenticated cleartext devices with crafted frames
検知
- ほとんどの Z-Wave 導入環境には、Wi-Fi/Zigbee の監視に匹敵する IDS がありません
- ハブは予期しないコマンドを記録する場合がありますが、ユーザー向け UI に表示されることはほとんどありません
- インクルージョンモードがオープンになっている状態はハブの UI で確認できますが、注意を払わない管理者は見過ごします
報告
- デバイスごとにチップセット/ファームウェアのリビジョンを特定します(ZW0500 シリーズ、ZW7000 シリーズ)
- ノードごとに S0 と S2 の別をマッピングし、S2 対応ノードがあるネットワークに S0 が残っていないか記録します
- ハブの侵害経路は個別に記録します
主な参考資料
- EZ-Wave:github.com/cureHsu/EZ-Wave(HackRF ベース)
- 「Z-Force and the Z-Wave Sniffer」— 初期の調査
- Silicon Labs Z-Wave 700-series 仕様
- 出典:https://github.com/SnailSploit/offensive-checklist/blob/main/wireless.md