Skip to content

IoM 核心概念

IoM采用高度解耦的分布式架构,本文档介绍各个核心组件的概念和作用。

与开发者指南的关系

本文档介绍概念和架构,具体开发实践请参考开发者贡献指南

Server

数据处理和状态管理的核心组件。

核心职责: - 所有数据的中央管理和持久化 - 提供gRPC服务供Client和Listener调用 - 状态集合管理和事件分发 - 任务调度和结果处理

架构特点: - Client/Listener中只保留只读副本 - 内存中保留当前存活的数据 - 历史数据保存在数据库中

状态管理:

状态集合 用途 说明
clients 用户连接管理 正在连接的所有用户
listeners 监听器管理 所有Listener实例
jobs 任务管道管理 Pipeline实例(TCP、Website等)
events 事件系统 轮询用户并广播事件
sessions 会话管理 存活的Implant会话

RPC服务: 通过gRPC实现对状态的CRUD操作、事件通知、Listener交互等功能。

二进制文件

v0.0.2后Server与Listener使用同一个二进制文件,通过不同配置启动不同模式。

开发指南

Server开发详见Server开发指南

Session

Implant会话的状态管理结构,保存单个Implant的完整信息。

核心功能: Session是Server中最复杂的数据结构,负责管理单个Implant的完整生命周期。

子状态集合:

子状态 内容 用途
基本信息 操作系统、进程信息、权限等 环境识别和决策
任务管理 正在执行的Task列表 任务状态跟踪
连接状态 网络连接的逻辑状态 连接管理和故障恢复
数据缓存 历史数据缓存 性能优化和数据持久化
模块信息 可用Module列表 功能能力管理
组件管理 已加载的Addon 内存管理和资源控制
...

并且还有复杂的同步机制,将在client与listener上维护session的备份。

Implant

植入物,在目标系统中执行的核心组件。

https://github.com/chainreactors/malefic/

主要类型: - Malefic: 功能完整的主Implant,支持Beacon/Bind模式 - Pulse: 轻量级上线马,仅4KB大小,类似CS的artifact
- Prelude: 多段上线的中间阶段,支持权限维持等

核心特性: - 基于Rust实现,跨平台支持 - 模块化设计,动态加载功能 - 多种通讯模式(Beacon/Bind) - OPSEC友好的设计

模块系统: Implant通过Module系统实现功能扩展,支持编译时静态链接和运行时动态加载。

IoM支持多种格式的无文件执行:

类型 描述 特性
execute-assembly CLR程序执行 支持bypass AMSI/ETW
execute-exe PE程序反射执行 参数欺骗、进程注入
inline-exe 当前进程内执行 无新进程创建
execute-dll DLL反射执行 支持sideload
execute-shellcode Shellcode执行 灵活的注入方式
powershell Unmanaged PowerShell 绕过PowerShell限制
bof Beacon Object File 轻量级功能扩展
上诉拓展能力能满足绝大部分场景。

开发指南

Implant开发详见Implant开发指南

Client

用户交互界面,负责命令输入和结果展示。

架构特性: - 通过gRPC与Server通讯 - 支持CLI和GUI两种模式 - 高度可扩展的插件系统

插件生态

插件类型 用途 兼容性
Mal插件 Lua脚本扩展 IoM原生
Module 动态模块加载 IoM原生
Addon 二进制程序缓存 IoM原生
Alias CLR/UDRL管理 Sliver兼容
Extension BOF管理 Sliver兼容
Armory 插件包管理 Sliver兼容

开发指南

Client开发详见Client开发指南

通讯

C2的本质就是安全的通讯与命令下发。我们需要将Client/Server/Listener/Implant 四端打通, 因此通讯设计是其中核心。

Spite

Spite是整个IoM通讯的最小单元,是server/listener ↔ implant之间进行数据交换的载体。

核心特性: - 基于Protobuf实现,高效序列化 - 统一的数据交换格式 - 支持任务状态管理 - 模块化的body设计

结构定义:

message Spite {
  string name = 1;      // 目标module名称  
  uint32 task_id = 2;   // 任务ID
  uint32 error = 5;     // 错误码
  Status status = 6;    // 任务状态

  oneof body {          // 具体数据载体
    Request request = 24;     // 通用请求
    Response response = 25;   // 通用响应  
    LoadModule load_module = 31;
    ExecuteBinary execute_binary = 42;
    // ... 更多模块特定的消息类型
  }
}

使用场景: - Client通过RPC调用生成Spite - Server将Spite转发给对应Listener
- Listener通过Parser和Cryptor处理Spite - Implant接收Spite并路由到对应Module执行

协议定义

完整定义请参考proto仓库implant.proto

Listener

分布式监听服务,负责与Implant的实际通讯。

设计理念: IoM的Listener与传统C2框架最大的不同是完全独立于Server,可以部署在任意服务器上,通过gRPC Stream与Server进行全双工通讯。

graph LR
    MSF["MSF\n监听在本机"] --> Cobaltstrike["Cobaltstrike\n监听在Server"] --> IoM["IoM\n分布式监听"]

核心特性: - 分布式部署: 可在任意服务器上部署 - 完全解耦: 与Server独立,故障隔离 - 多形态支持: 支持各种伪装和隐蔽形式 - 实时通讯: 通过gRPC Stream与Server双向通讯

内部架构: - Listener核心: 管理Pipeline和与Server交互 - Pipeline: 具体的数据管道实现 - Forwarder: 数据转发组件 - Parser: 协议解析器 - Cryptor: 加密解密器

开发指南

Listener开发详见Server开发指南

Pipeline

数据管道,Listener与Implant/WebShell交互的具体实现。

概念说明: Pipeline相当于传统C2框架中的Listener概念,但IoM进一步细分了其实现。每个Listener可以运行多个Pipeline,Pipeline负责与Implant的具体交互。

主要类型:

类型 用途 状态
TCP/TLS 监听TCP端口,默认配置 ✅ 稳定
HTTP/HTTPS HTTP协议通讯 🛠️ 开发中
Bind 主动连接bind模式Implant ✅ 稳定
Pulse 轻量级Pulse专用管道 ✅ 稳定
Website 静态文件托管(类似CS的host) ✅ 稳定
REM 流量代理和转发服务 🛠️ 计划中

交互模式: - Beacon模式: 解析心跳包并返回任务数据 - Bind模式: 主动向目标发起连接
- Website模式: 提供HTTP服务分发文件 - 代理模式: 提供端口转发和流量中转

可扩展性: 通过实现Pipeline的基本RPC控制接口,可以接入各种形式的Pipeline,如云函数、代理、LOLC2等。

设计特点

Pipeline比传统Listener设计更加灵活,支持更丰富的功能,并且与Parser、Cryptor完全解耦。

Parser

协议解析器,控制最终数据包格式的组件。

设计目的: Parser提供了协议实现的抽象层。虽然内部组件间通过Spite通讯,但最终发送到目标的数据包可以是任意格式。

接口定义:

type PacketParser interface {  
    PeekHeader(conn *peek.Conn) (uint32, uint32, error)  
    ReadHeader(conn *peek.Conn) (uint32, uint32, error)  
    Parse([]byte) (*implantpb.Spites, error)  
    Marshal(*implantpb.Spites, uint32) ([]byte, error)  
}

核心功能: - Parse: 二进制数据 → Spites映射 - Marshal: Spites → 二进制数据映射
- ReadHeader/PeekHeader: 协议识别和header解析

默认协议栈:

graph TD
    subgraph "默认通讯协议"
        TLS["TLS层"]
        subgraph "自定义加密"
            Encryption["Encryption Layer"]
            subgraph "内部结构"
                Header["Protocol Header"]
                Proto["Protobuf Data"]
            end
        end
    end

扩展能力: - 自定义传输协议格式 - 接入第三方C2框架 - 作为其他C2的external listener - 适配不同的implant协议

Cryptor

流式加密解密器,负责数据流的加密处理。

接口设计:

type Cryptor interface {  
    Encrypt(reader io.Reader, writer io.Writer) error  
    Decrypt(reader io.Reader, writer io.Writer) error  
    Reset() error  
}

特性: - 直接作用于连接流(与REM相同设计) - 支持流式加密算法 - 对全包进行加密解密

当前实现: - XOR: 简单异或加密 - AES-CFB: AES CFB模式

组件解耦

Parser、Pipeline、Cryptor三者完全解耦,可以任意组合使用,提供极大的灵活性。

OPSEC模型

IoM设计了基于四个维度的OPSEC评估模型,参考CVSS评分标准。

评分体系

评分范围: 0-10分,分越高越安全

等级 分数 描述
0-3.9 极易被检测,明显痕迹,可能造成严重后果
4.0-6.9 可能被检测,痕迹可控,后果可控
7.0-8.9 基本不被检测,痕迹较小,后果轻微
OPSEC 9.0-10 几乎不可能被检测,无痕迹,无后果

评估维度

1. 暴露度 - EDR/NDR检测风险 - 进程创建活动 - 线程创建活动
- 文件系统操作 - 网络连接建立 - 系统API调用

2. 痕迹 - 操作可追溯性 - 日志删除能力 - 文件清理能力 - 注册表痕迹 - 内存痕迹

3. 检测可能性 - 被发现的概率 - 现有检测机制覆盖 - 系统级追踪可能性 - 检测实现复杂度

4. 后果 - 被发现后的影响 - 立足点丢失风险 - 长期潜伏影响 - 整体行动暴露