免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。
目录
[Yakit 的插件是如何运作的?](#Yakit 的插件是如何运作的?)
[Yak 原生模块](#Yak 原生模块)
[MITM 原生模块](#MITM 原生模块)
插件系统技术概述
技术选型
当安全工具在自称"平台"的时候,插件的编写难度,价值,以及自由度其实是限制工具成为真正"平台"的原因。很久以来,我们一直在探索"插件"模式的最终发展。
在 Python 的时代,其实"插件"也并不是那么棘手的事情。如果不在乎安全性和代码保密性,eval 虽然丑陋,但是好用。
但是当大家的产品变得工程化之后,Golang 这种"静态"特性让插件变得不是那么"自然",大家可以通过 DLL / .so 来执行插件,但是 "并不是谁都可以写 Golang DLL/.so 的" 不是吗?于是在客户端层面,大家有努力的去想了别的办法,比如 npm 包的格式来封装插件,让他在客户端 "动态" 起来,但是依赖管理仍然是一个比较难过的关。
往往很多时候,我们遇到的这种困难其实换个领域,换个角度已经有了很棒的方案:譬如 Java 中的各种嵌入式脚本语言,经常被用来做"查询"的插件和简单逻辑。既然可以嵌入一些数据库与 IO 的能力,如果嵌入式语言可以使用的话,当然也可以嵌入 "扫描" 能力了。
"嵌入式"是最终方案
当大家有了这个想法之后,我们就发现"嵌入式的语言"作为插件的实现,其实强度和表现力都是远大于 Yaml / Json 这类数据描述语言:表现力层面:图灵完备 > 数据容器(描述)语言。这是毋庸置疑的。
同时,如果为这个图灵完备语言增加和插件平台的各种交互,他理所应当成为一个非常合理的插件系统的。
这件事情是最合适 Yak 来做的,我们的引擎已经可以做到 "零依赖","嵌入执行","自动代码补全"。难道成为 Yakit 的插件系统核心是一件难事儿吗?当选定了这一条我们认为正确的路线之后,其实后面很多事情就变成了 "加油干" 就能解决的了。
Yakit 的插件是如何运作的?
我们需要固化用户输入的 Schema:当我们把用户输入的参数预先设定好之后,就可以生成用户需要填写的表单了,这其实非常方便,并不需要插件编写者真的去编写"前端",不需要用户编写界面可以降低很多成本
当我们使用配置好的参数 + Yak脚本的时候,我们就可以把这两个东西保存到 Yak 核心引擎中,作为一个插件的持久化。
所以只要能拿到插件的持久化 ID,我们就可以获取到插件的全部信息,只要填了相对应的参数,我们就可以做到在 Yak 引擎中执行了。
插件商店介绍和使用
Yakit的插件仓库提供了拓展插件的功能,方便使用者编写自己的自定义插件或从插件商店中选择适合的插件。
插件可以以多种方式支持自定义的行为,例如:特定漏洞检测的POC/EXP,自定义UI,添加自定义扫描程序检查以及访问关键运行时信息等等。
yakit的插件具有以下特点:
yakit插件特点
灵活多变
Yaklang 的 "零依赖","嵌入执行","自动代码补全"等特点,为Yakit的插件系统提供了优秀的可扩展能力与可实践特性。Yakit的插件系统实质上是将编写的Yak脚本发送到Yak引擎,引擎将会启动一个进程来执行,执行过程的输出将会通过 gRPC 的双向数据流返回。这就意味着,用户可以根据自己的需要在平台编写各种符合自己实际使用场景的插件。
自带UI与绘图API
Yakit提供了一整套插件的使用页面,无需用户思考如何编写"前端"。只需将参数预设好并写好Yak脚本,将参数与脚本保存在引擎中,填写相对应的参数,就可以做到在Yak引擎中执行。Yakit除了有提供配套的插件UI外,也提供了超强的绘图能力,只需要调用 Yakit 的绘图 API仓库,直接执行,即可在插件输出中看到绘制的图表,用户无需消耗精力去制作图表。
插件联动
插件的灵活性也与Yakit本身的功能进行了结合,比如可以在使用MITM劫持、端口扫描的过程中去灵活使用插件,达到漏洞扫描、敏感信息检查等等各种各样的能力。且插件与插件间也可进行联动,只需在编写插件时启用联动UI,则在使用该插件时,也可使用其他的插件,达到多重使用的目的。
插件下载
一键下载
也可以编辑他人插件进行修改
插件编写与使用
插件概述:定义与基础类型
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 插件的运作流程之后,发现他其实是一个非常非常典型的被动扫描器的模型架构。
MITM 平台劫持了用户流量,同时可以把用户流量作为参数,执行用户自定义的流量处理和分析函数。