mh37/HIDNinja

GitHub: mh37/HIDNinja

HIDNinja 是一个基于 Linux SBC 的无线 HID 击键注入器,通过远程 WebSocket 接口投递 payload,实现无线化的 USB 键盘模拟攻击。

Stars: 4 | Forks: 0

# HIDNinja ## 简介 HIDNinja 是一个基于 Linux 的无线 HID 击键注入器,具有远程 payload 接口。该项目的灵感来源于 COTTONMOUTH-I、Bash Bunny 和 Rubber Ducky 等项目。 USB 是一种灵活的协议,提供了大量的功能,而其 HID 功能在大多数主机系统上默认受信任。这不仅使其功能多样,也使其成为一个极具吸引力的攻击点。在广泛的基于 USB 的攻击中,即使是像击键注入这样的简单方法也代表了重大的安全风险。 ## 所需硬件 该项目基于 Linux SBC,它将模拟 HID 设备,并能够通过板载 [WNIC](https://https://en.wikipedia.org/wiki/Wireless_network_interface_controller) 接收 payload。该项目也可以进行调整以适应更紧凑的硬件设置,并且可以使用替代的通信方法进行连接。 ## 架构 ![架构](https://unit37.org/assets/img/hidninja/architecture.png) 我们可以将软件端的核心功能总结如下: 1. SBC 运行一个 Web Socket Server,它使用 `http.HandleFunc()` 设置路由,以便我们可以为 payload 处理或 web/payload 接口提供连接。因此,服务器侦听传入的客户端连接并相应地对其进行路由。 2. 如果检测到客户端连接并触发了 Web 界面路由,则通过 HTTP 返回用于 payload Web 界面的 HTML 文件。 3. Web 界面接受基于文本的 payload 形式的用户输入,然后可以将其发送回 Web Socket 服务器的辅助 endpoint 路由。我们实现了一个用于侦听传入 payload 的 reader 函数。一旦接收到 payload 字符串,就会向客户端返回一条状态消息,如果没有报告错误,则触发 payload 执行过程。 4. 一旦在服务器端触发了 payload 执行链,接收到的 payload 字符串就会被分解为单个字符并发送到翻译层。请注意,此过程目前不区分大小写,未来需要进行修改以处理修饰键和其他特殊指令。 5. 翻译层会通过 scan code map 处理各个字符,其中 Strings 被映射为特定的 byte 值。我们在这里使用 string 值而不是 char 值的原因是我们计划将修饰键作为多字符 string 进行通信。这种实现方法在未来的版本中可能会发生改变。一旦正确识别出 byte 值,它就会被返回给 payload 执行函数。 6. 利用最新获取的信息,我们现在可以组装一个带有 scan code byte 值的 keypress。一个 keypress 由包含 8 个 byte 的 byte 序列组成,每个 keypress 最多可以包含六个 scan code (USB Implementer’s Forum 2001, 30)。重要的是要记住还要再次释放 keypress。这只需发送一个零值的 byte 数组即可完成,例如 `[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}`。 7. 组装好“keypress”后,我们将其传递给一个函数,该函数会将新构建的 byte 序列附加到我们的 USB gadget 文件 `/dev/hidg0` 中。一旦将其附加到文件中,它将作为击键直接发送到目标主机。 这种设计的相对简单性使我们能够以适中的代码量实现某种程度上的紧凑和高效的实现。未来随着功能和特性的增加,代码量肯定会增加,但我们会尽可能避免代码臃肿。 ## 待办事项与计划功能 目前的实现非常基础,因此,我有一长串缺失的功能: - Payload 仓库和 payload 管理 (CRUD) - 支持通过蓝牙与 SBC 进行通信 - 支持通过无线电频率 (RF) 与 SBC 进行通信 - 用于本地数据窃取的动态 USB 外设模拟(动态更改设备类型) - 通过 USB 控制传输 pipeline 接收从主机到 SBC 的编码数据窃取传输,以逃避检测。 - 尽可能模仿人类输入模式的动态击键计时,以逃避检测算法。 - 作为 payload 一部分的可自定义延迟 - 支持修饰键 - 使 scan code 转换区分大小写。 - 支持从一个用户界面处理和管理多个 SBC(集群),并同时向多个目标部署 payload。 - 在多个 SBC 之间实现中继/网格网络,以扩展通信范围。 ## 设置 在我们能够将 SBC 插入另一台机器并让它伪装成键盘(或任何其他 USB 外设)并开始发送击键注入 payload 之前,我们需要在我们的 SBC 上进行一些配置工作。为此,我在 repo 上准备了一个相应的脚本,它会运行正确的配置并创建一个用于维护必要配置状态的服务。 设置脚本将在我们的 SBC 上执行以下更改,以将其变成“键盘”: - 检查 boot 配置中是否存在 `dwc2`,如果不存在,我们将其附加到文件中。这将启用 `dwc2` 模块的设备树覆盖,这是运行 USB gadget 模式所必需的。 - 检查 `etc/modules` 中是否存在 `dwc2`,如果不存在,我们将其附加到 modules 文件中。这会将 `dwc2` 模块添加到开机时加载的内核模块列表中。 - 为 SBC 上激活“HID gadget 模式”的辅助脚本设置路径,并设置该脚本的执行权限(使用 `chmod +x`)。该子脚本包含以下操作: - 加载 `libcomposite` 内核模块,这对于 USB gadget 的设置至关重要。 - 创建一个代表我们旨在模拟的 USB gadget 的新目录。您也可以根据自己的需求和用例创建多个不同的 gadget。 - 在我们的新目录中,我们设置了 USB gadget 的属性。请随意根据您的喜好调整这些属性。我们预定义的属性是: - Vendor ID:我们选择了 `0x1d6b`,这是与 Linux Foundation 关联的 ID。 - Product ID:我们使用 `0x0104`,对应于多功能复合 Gadget。 - Device Version:设置为 v.1.0.0。 - USB Version:设置为 USB 2.0。 - Device Class:设置为 `0x02`,转换为“Common Class”。 - Device Protocol:设置为 `0x01`,代表接口关联描述符 (IAD)。 - 接下来我们定义 gadget 配置的属性。 - 将 STRINGS_DIR 设置为“strings/0x409”并创建所述目录。代码 `0x409` 代表 US English,我们将把它用于我们的目的。 - 我们设置了设备的序列号。我们在这里只使用了“Hello World!”的十六进制值,等同于 `fedcba9876543210`。 - 我们将制造商值设为 Unit37,这是我们个人网站的名字。 - 对于产品名称,我们使用了 HIDNinja Keyboard,这是基于我们项目的代号。 - 此外,我们还需要为 USB gadget 添加一个所谓的 function: - 我们为该 function 创建一个新文件夹,并在变量中定义其路径。 - protocol 值设置为 1,代表键盘。 - Subclass 设置为 0,等同于“no subclass”。 - 报告长度配置为 8 个 byte,我们设置了该 function 的 report descriptor。report descriptor 包含一个硬编码的 byte 数组,负责描述生成的数据包。 - 此外,我们需要通过定义和创建配置的目录路径来设置 USB 配置。在设置以 mA 为单位的最大功耗时,我们选择了 250。其他配置属性包括英文配置字符串的目录路径、配置字符串目录以及配置字符串的设置。 - 现在,我们可以将配置中的 HID function 链接到 config 中名为 `hid.usb0` 的符号链接,并通过将 gadget 名称写入 USB 设备控制器 (UDC) 文件“sys/class/udc”来启用 USB gadget。我们还需要确保“/dev/hidg0”具有正确的访问权限 (777),否则将拒绝访问 HID gadget。 - 重新加载 systemd 管理器配置以应用更改。 - 在开机时启用“usb-gadget”服务。 - 这个 systemd 服务单元文件将 "hidninja.service" 设置为在 syslog 服务准备就绪后的系统启动期间运行 "HIDNinja" USB Gadget。它以 root 权限运行,并被允许在本地文件系统挂载时启动。 - 最后一步我们重启系统。 ## 来源与致谢 - https://www.kernel.org/doc/html/latest/usb/gadget_hid.html - https://github.com/gsora/hid-compiler/blob/master/compiler/Scancodes.go - http://www.linux-usb.org/gadget/ - https://www.usb.org/sites/default/files/hid1_11.pdf - https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
标签:HID攻击, 日志审计, 硬件安全, 键盘注入