插件概述:定义与基础类型
Yakit 插件是与 Yak 语言深度绑定的一套体系。理论上来说,任意一段 Yak 代码均可以被封装成一个 Yakit 模块,分发给用户使用。
插件系统本质
插件系统的核心流程一般来说都是 yak 引擎通过 '热加载' 或者 '封装注入依赖' 等手段来执行一段 yak 代码,让代码中的行为与引擎与数据库发生交互。
#
常见插件类型yaklang.io 中定义 Yakit 的插件类型目前分为三种
- 以 Webhook 为通信媒介的原生 Yak 模块,通过核心引擎启动新的 yak 执行进程来控制执行过程;
- 以 MITM 劫持过程为基础 Hook 点的 Yak 模块,
- 以 Yaml 为媒介封装 Nuclei PoC 的模块,本质上也是执行一段 Yak 代码,原理与(1)相同,本文将不再赘述。
#
原理分类:独立模块与嵌入模块#
独立模块独立模块的核心是一段 Yak 脚本,一般来说使用 Webhook 与 Database 为通信媒介,通过控制进程的生命周期来控制执行任务的生命周期。
一般独立模块用于提供相对独立的整体功能。
独立模块启动进程目的
- 防止和引擎核心进程发生不期望的交互导致内存泄露
- 不期望的崩溃影响到主进程
#
嵌入式模块嵌入式模块的核心原理是把一段 Yak 代码发送到引擎,加载到内存,在一个特定的主功能执行的过程中,在特定的情况下执行用户 "热加载" 的代码。
MITM 插件就是一个典型的 "热加载" 模块,可以在 "任何新请求到来时执行用户代码 / 新网站被发现时执行用户代码 / 新参数发现时执行代码 ..."。
嵌入式模块与主核心通信直接通过内存进行通信,通信速度相对更快。
注意
但是根据我们上面的说法,这种情况可能会有内存泄漏的风险。所以我们需要编写嵌入式模块时进行充分测试,确保可用性。
#
典型应用分类#
Yak 原生模块我们使用 Yak 原生模块是最容易理解的模块,我们对 "概论" 中的图进行一部分修改,即可得到核心原理。
#
MITM 原生模块MITM 是 "热加载" 插件的典型模块,我们使用这个模块的过程中,将会对 MITM 的过程进行插桩,在恰当的点触发恰当的函数。
我们使用一个时序图来向大家展示 MITM 模块的调用 / 执行过程
当我们理解 MITM 插件的运作流程之后,发现他其实是一个非常非常典型的被动扫描器的模型架构。
In a Nutshell
MITM 平台劫持了用户流量,同时可以把用户流量作为参数,执行用户自定义的流量处理和分析函数。
#
总结我们理解了 Yakit 插件的执行流程之后,非常有助于我们之后使用 Yakit 自助编写插件。
在使用过程中,我们尤其会对 "MITM 插件" 的略微复杂的执行流程有更清醒的认识