SIREN

插件开发指南

了解如何开发自定义 SIREN 插件

本指南面向希望为 SIREN 开发自定义插件的开发者。

基本概念

SIREN 插件是独立的可执行文件,通过标准输入/输出与 SIREN 交互。插件可以使用任意编程语言开发,只要最终产物是目标平台的可执行二进制文件即可。

每个插件包含以下内容:

文件必需说明
manifest.json插件元数据描述文件
可执行二进制文件插件的实际执行程序(需按平台提供)
setup.sh安装后自动执行的初始化脚本

manifest.json

manifest.json 是插件的核心描述文件,定义插件的元数据和行为:

manifest.json
{
  "name": "myplugin",
  "version": "1.0.0",
  "type": "recon",
  "description": "A brief description of the plugin",
  "usage": "myplugin <Client ID> [args]",
  "clientUsage": "myplugin [args]",
  "platforms": ["linux_amd64", "linux_arm64"],
  "entrypoint": "myplugin",
  "setup": "setup.sh"
}

字段说明

字段类型必需说明
namestring插件名称,仅允许字母、数字、-_,最长 128 字符
versionstring语义化版本号
typestring插件类型:recon(信息收集)或 command(命令)
descriptionstring插件功能描述
usagestring远程模式下的使用说明(展示在服务端帮助信息中)
clientUsagestring本地模式下的命令名称(command 插件使用,默认为 name
platforms[]string支持的平台列表,格式为 {os}_{arch}
entrypointstring可执行文件名(不能包含路径分隔符)
setupstring安装后的初始化脚本文件名

支持的平台

平台标识说明
linux_amd64Linux x86_64
linux_arm64Linux AArch64
windows_amd64Windows x86_64
darwin_amd64macOS x86_64
darwin_arm64macOS Apple Silicon

开发流程

创建插件目录

_plugins/ 下创建以你的插件名命名的目录:

_plugins/
└── myplugin/
    ├── main.go          # 插件源代码(以 Go 为例)
    └── manifest.json    # 插件描述文件

编写插件逻辑

插件是独立的可执行程序。SIREN 通过命令行参数传递用户输入,并捕获标准输出作为结果。

对于 recon 插件:

  • 无需接收参数
  • 将收集到的信息输出到 stdout
  • 输出会自动包含在信息收集报告中

对于 command 插件:

  • 通过命令行参数接收用户输入
  • 将执行结果输出到 stdout

编译

为每个目标平台交叉编译二进制文件:

# Linux amd64
GOOS=linux GOARCH=amd64 go build -o myplugin .

# Linux arm64
GOOS=linux GOARCH=arm64 go build -o myplugin .

编写 setup 脚本(可选)

如果插件依赖外部工具或需要初始化环境,可以提供 setup.sh。该脚本在插件安装时自动以 sh 执行,超时时间为 5 分钟。

安全约束

setupentrypoint 字段不能包含 ../\,以防止路径穿越。

发布到市场

将编译产物按以下目录结构上传到插件市场(OSS):

plugins/
└── myplugin/
    ├── manifest.json
    ├── setup.sh              # 可选
    ├── linux_amd64/
    │   └── myplugin          # Linux x86_64 二进制
    └── linux_arm64/
        └── myplugin          # Linux ARM64 二进制

上传完成后,用户即可通过 plugins install myplugin 安装。

插件运行机制

执行环境

  • 工作目录:插件所在目录(./plugins/<name>/
  • 超时时间:与信息收集命令超时一致(默认 30s,可通过 recon.commandTimeout 配置)
  • 标准输出和标准错误均会被捕获

启用与禁用

插件的启用状态存储在配置文件中:

config.yaml
# recon 插件使用 recon.<name> 控制
recon:
  chkrootkit: true

# command 插件使用 plugins.<name> 控制
plugins:
  jdump: true

远程模式交互

在远程模式下,插件管理和调用通过消息协议实现:

  1. 客户端启动后,通过 MsgPluginRegister 向服务端注册已安装的插件列表
  2. 服务端通过 MsgPluginManage 远程管理客户端插件(安装、卸载、更新、启用/禁用)
  3. 服务端通过 MsgPluginInvoke 远程调用 command 插件
  4. 客户端通过 MsgPluginResponse 返回执行结果

市场配置

插件市场地址通过配置文件中的 plugins.marketplace 字段指定:

config.yaml
plugins:
  marketplace: https://oss-siren.oss-cn-hongkong.aliyuncs.com/plugins

安装时,SIREN 从以下路径下载文件:

文件URL
插件清单{marketplace}/{name}/manifest.json
可执行文件{marketplace}/{name}/{platform}/{entrypoint}
初始化脚本{marketplace}/{name}/{setup}

On this page