| 📢 注意!!! |
|---|
| 本仓库已迁移至 Honeynet Project :) |
RIoTPot 是一个混合交互蜜罐,主要专注于物联网和工控协议的仿真,但也能仿真其他服务。本质上,RIoTPot 充当系统中其他蜜罐的代理服务。因此,你可以在 RIoTPot 旁边运行任何蜜罐及其他服务。此外,它还有一个 Web 应用程序 UI,可用于管理你的路由。
该蜜罐内置了多个可直接使用的低交互服务。由于这些服务是以插件形式编写的,它们仅支持 Linux 系统;不过,你也可以在不加载这些插件的情况下启动 RIoTPot。下表列出了 RIoTPot 默认包含的服务、它们的内部端口和代理端口。
目录
RIoTPot 的架构基于与内部及周边(或外部)服务(例如蜜罐、完整服务、容器、远程主机等)的代理连接。为此,蜜罐管理多个用户定义的 proxy,它们负责在服务与 RIoTPot 之间中继连接1。这样,RIoTPot 可以决定如何处理和路由传入的攻击。用于确定如何处理传入攻击的逻辑以 middleware(中间件)2 的形式实现。为了管理服务、中间件和代理,RIoTPot 内置了 REST API 3 和一个 Web 应用程序 UI 4。你可以通过浏览器访问 localhost:2022 来使用 UI,并可以在 localhost:2022/api/swagger 上查看 Swagger [^swagger] 接口来操作 API 端点。
图1 展示了 RIoTPot 的架构,包括构成 RIoTPot 的两个主要应用程序(RIoTPot 本身和 RIoTPot UI)及其组件,以及一个包含外部(或相邻)服务的分区。
RIoTPot 使用 Golang 编写5。每个 RIoTPot 实例按需公开已注册的代理(基于其端口)。为了提供代理服务,它必须绑定一个服务,并且代理端口必须可用(目前,RIoTPot 不接受在同一个端口上运行多个服务)。当代理被绑定并提供服务后,攻击者可以在此端口上向 RIoTPot 发送消息,这些消息将被中继到绑定的服务,然后返回给攻击者6。
为了方便访问,可以通过 RIoTPot UI Web 应用程序管理多个 RIoTPot 实例。除了管理每个实例中注册的代理外,UI 还允许你创建、使用和编辑 profile(配置文件)。每个配置文件包含多个以协议或其他服务命名的代理,使 RIoTPot 实例模拟真实设备(例如家庭助手)。简而言之,配置文件加快了使用特定配置设置和配置 RIoTPot 实例的过程。UI 使用 React 前端 JavaScript 库(该项目使用 TypeScript)和 Recoil 状态管理库编写。由于 RIoTPot 规模较小,目前它不使用数据库。
运行 RIoTPot 相对简单。总的来说,你有三种选择。第一种是下载 RIoTPot 发行版;你可以选择下载最新版本或之前的版本。第二种选择是自行构建项目。最后一种选择是使用源代码创建一个包含 RIoTPot 和其他一些增强蜜罐功能的附加应用程序的 Docker 容器。
信息: 本指南适用于没有特殊需求、希望获得开箱即用体验的用户。
每个发行版都包含一个名为 riotpot 的文件夹,其中包含一个名为 riotpot 的可执行二进制文件和一个包含多个服务(或低交互蜜罐)的 plugins 文件夹。为了 RIoTPot 正常运行,保持内部文件夹结构非常重要。
📁 riotpot
┕ riotpot
┕ 📁 plugins
riotpot 文件夹。riotpot 二进制文件。这将启动 RIoTPot,启用 API,加载所有插件,并启动 UI 服务器。
localhost:2022 访问。信息: 本指南适用于熟悉开发环境的高级用户。
要求
- Golang - 需要用于构建项目
- Node - 需要用于构建 UI
可选:
- Git - 用于下载源代码
- Make - 用于运行预制的命令
从 GitHub 下载 RIoTPot 源代码。打开控制台并输入以下命令。
git clone [email protected]:aau-network-security/riotpot.git
导航到下载 RIoTPot 源代码的文件夹,并安装所需的 Node 包。
npm install
如果你已安装 Make,我们提供了多个命令帮助器来协助你构建项目。简单来说,你可以运行两个简单的命令来构建 RIoTPot 二进制文件和插件(并将它们放在正确的文件夹中)。
# 构建 UI
make build-ui
# 构建 RIoTPot 和插件
make riotpot-build
注意: UI 使用 Vite 构建项目。如果你倾向于使用其他构建工具,你可能需要先自行做一些修改。
信息: 本指南适用于倾向于在虚拟环境中使用 RIoTPot 的高级用户。
要求
- Docker - 用于构建 RIoTPot 实例和 UI 服务器的镜像。
- Docker-compose - 用于创建一个包含 RIoTPot 实例、UI 及其他应用程序和服务的单个容器。
使用此设置的主要优势在于,只需对容器配置和容器本身进行最少的更改,即可获得额外的安全功能。例如,我们可以定义独立的虚拟私有网络和覆盖网络,以隐藏、沙箱化和封装 RIoTPot 及其他相邻服务。此外,容器允许我们使用 Docker 地址名称而不是其 IP 来绑定服务,这非常方便。最后,我们可以按需启动和停止独立的容器,而不会影响其他服务。
另一方面,虚拟化可以说比在裸机上运行应用程序要求更高。虽然单个 RIoTPot 实例相对轻量,但考虑虚拟化和硬件仿真带来的缺点(例如响应延迟)也很重要。
**警告: ** 从技术上讲,专门的攻击者可能会通过分析和比较虚拟化引入的响应时间延迟与真实服务器的差异,来识别出 RIoTPot 实际上是一个蜜罐(!!)。尽管这种蜜罐指纹识别方法之前已被研究过,但对于常见的互联网服务(例如 HTTP、Telnet 和 SSH),结果仍不确定,这是由于使用虚拟机的云托管服务和详细的服务器配置已经变得很普遍。
docker-compose 文件包含额外的服务以增强 RIoTPot 体验。下表总结了该容器中打包的服务和应用程序列表。
服务
RIoTPot 带有影响启动内容和方式的标志命令。示例:
# 不带 UI 运行 RIoTPot
./riotpot --ui false
内部和周边服务无法通过互联网访问。内部服务已集成且仅可被 RIoTPot 访问。这些服务在启动时加载,不能删除,但可以停止。周边服务必须与 RIoTPot 处于同一网络。外部服务必须仅将 RIoTPot 加入白名单。 ↩
https://raw.githubusercontent.com/aau-network-security/riotpot/master/%E4%B8%AD%E9%97%B4%E4%BB%B6%E7%9B%AE%E5%89%8D%E6%AD%A3%E5%9C%A8%E5%BC%80%E5%8F%91%E4%B8%AD%E3%80%82 ↩
RIoTPot API 不得暴露到互联网。目前,API 仅接受来自 localhost 的连接。未来可能会更改,提供主机白名单和标准认证。 ↩
虽然 Web 界面可以作为独立组件使用,但它已嵌入 RIoTPot 二进制文件中。 ↩
尽管基础应用程序是跨平台的,但内部服务(插件)只能在 Linux、FreeBSD 和 macOS 环境中使用。我们计划通过将插件替换为使用 gRPC 通信的微服务来克服这一限制。 ↩
出于伦理和安全原因,RIoTPot 不允许向外部主动发起未经请求的请求,即不允许反向 shell 等操作。 ↩
| 服务 | 内部端口 | 代理端口 |
|---|
| Echo | 20007 | 7 |
| SSH | 20022 | 22 |
| Telnet | 20023 | 23 |
| HTTP | 28080 | 80 |
| Modbus | 20502 | 502 |
| MQTT | 21883 | 1883 |
| CoAP | 25683 | 5683 |
| 服务 | 镜像 | 端口 | 详情 |
|---|
| MQTT | eclipse-mosquitto | 1883 | Mosquitto MQTT 服务器 |
| HTTP | httpd | 80 | 常规 HTTP 服务器 |
| Modbus | oitc/modbus-server | 502 | Modbus 服务器 |
| OCPP | ocpp1.6-central-system | 443 | OCPP v1.6(用于汽车充电站) |
| 应用程序 | 镜像 | 详情 |
|---|---|---|
| TCPDump | kaazing/tcpdump | 数据包记录器。它将网络流量存储在 .pcap 文件中 |
容器可以通过三个简单步骤设置:
从 GitHub 下载 RIoTPot 源代码。打开控制台并输入以下命令。
git clone [email protected]:aau-network-security/riotpot.git
导航到下载 RIoTPot 源代码的文件夹。
在 Docker 运行的情况下:如果你已安装 Make,运行以下命令。否则,使用 build/docker 文件夹中包含的 docker-compose 文件运行 docker-compose 命令。
# 使用 make
make up
# 使用 docker-compose
docker-compose -p riotpot -f build/docker/docker-compose.yaml up -d --build
| 标志 | 类型 | 默认值 | 描述 |
|---|
| debug | 布尔 | false | 将日志级别设置为调试 |
| api | 布尔 | true | 是否启动 API |
| plugins | 布尔 | true | 是否加载低交互蜜罐插件 |
| whitelist | 字符串 | http://localhost,http://localhost:3000 | 允许访问 API 的逗号分隔的主机列表 |
| ui | 布尔 | true | 是否启动 UI |