写在前面正篇(预计读完 10 分钟)
插件工作原理
在讲插件工作原理之前,有必要讲一下一句话 WebShell 的工作原理,以PHP为例子来说,eval方法可以将我们传过来的 String 当成 PHP 代码来执行。所以,一句话的玩法就不仅仅是文件管理、虚拟终端、数据库管理这些经典操作了。
我发一段查找文件的代码给Shell,这样就多了一个查找文件的功能; 我发一段导出数据库的代码给Shell,于是有了导出数据库的功能; 我发一段反弹Shell的代码给Shell,最后就有了一个反弹Shell的功能...
这就是整个插件的核心所在,把你想要的功能写成代码,发给Shell,然后你自己再处理一下结果,将重复的工作通过一个个插件整理起来,提高效率。
拿 PortScan 为例来说,我们发送一段扫描端口的代码,让 Shell 执行,Shell 再把扫描后的结果返回给我们,接着我们再将扫描后的结果用漂亮的界面展示出来。
为了方便理解,这里直接附上一张AntSword插件工作流程图(以调用 PortScan 插件为例):
用户点击「PortScan」插件菜单后,主界面向 AntSword Core 发送插件调用的消息,传递选中的 Shell 的配置信息(比如 url、密码、shell类型、编码器、数据库配置等)给插件的入口函数,插件入口函数在拿到配置后,创建并渲染 PortScan UI(就是你看到的让你填写 IP 和 端口号的那个界面),然后等待用户的输入。
用户填写完毕后,点击「开始扫描」按钮触发扫描事件,根据用户填写的 IP和Port,插件生成对应的代码,然后调用 AntSword Core 将这段代码发送给 Shell 执行。拿到执行结果后,插件再将执行结果进行展示。
没有界面行不行?当然可以。我们实操阶段写的「复制服务端代码」插件就是一个不需要界面的插件。
从零打造「复制服务端代码」插件
我们要写的这个插件,具体的功能是,当我们调用这个插件之后,将服务端 Shell 的源代码复制到「剪贴板」里,并提示「复制成功」。
Step0. 准备工作
创建插件前需要先打开插件市场的「开发者模式」。进入「插件中心」(或叫「插件市场」,两个是一个东西)。选择「设置中心」面板,打开「开发者模式」,设置好插件开发目录后,点击「保存」按钮。最后,鼠标「右键」点击「插件中心的图标」重新加载插件中心。看下图:
开启开发者模式后,插件中心会多出「开发仓库」面板,在这里可看到开发仓库中的插件啦。当然,你那里肯定是空荡荡的,我们马上来创建我们的第一个插件。
Step1.创建插件
还记得准备工作中设置的那个插件开发目录吗?进入那个目录。然后我们新建一个名为的目录,然后进入copyself目录创建,,三个文件,此时文件的结构是这样的:
Step2.填写 package.json
用编辑器打开,文件内容如下:
大部分的内容相信你第一眼就能懂是什么意思,我就说点别的:
: 入口脚本文件名,这里我们指定为
: 插件调用菜单显示的图标, 我们这次用的是,也就是个剪贴板的图标。你可以根据你个人喜好,去FontAwesome官网(https://fontawesome.com/icons)上去查找图标。
: 中文插件分类, 为空则会出现在默认分类子菜单下,作者可自由命名类型,建议4个汉字,如:、
: 英文插件分类, 为空则会出现在子菜单下
: 是否支持同时被多个Shell加载。我们只复制一个Shell的代码就够了,设置为 false
: 支持的Shell类型列表, 取值为、、、我们第一次写,先只支持吧
由于我们现在还没开始写代码,所以调用是不会有什么效果的,下面就来写代码喽。
Step3.初始化入口代码
编辑文件,填入下图中的代码:
这里的构造函数,就是插件在调用之时的入口函数了,AntSword Core 会在实例化时向这个函数传递一个参数,我们用在控制台打印一段话「调用了一下我的第一个AntSword插件.」并且把 opt 的内容也打印了出来。
试着调用一下刚刚写的插件:
Step4.编写获取业务代码
整理下思路,我们先想想要发送的 payload 代码是什么。首先得知道当前执行 PHP 代码的脚本文件路径,然后再用来读取该文件,最后输出。
PHP 获取当前执行文件的源码的代码如下:
我们的插件,需要将这段代码发送给 Shell 来执行,所以就需要调用 AntSword Core 的 request 方法了:
如果你跟着我一步一步来,那么现在你的 main.js 应该是这个样子的:
重新载入 AntSword,调用一下插件,看看 console 下输出什么:
Cool~,已经成功拿到了服务端脚本的代码了。接着就是复制到「剪贴板」里,并提示「复制成功」了。
先说提示吧,AntSword 右下角弹出层提示使用的是 layerui,已经提前实例化了一个全局变量 toastr,我们可以调用他的(成功,绿色),(警告,橙色),(错误,红色)。
试着直接在 Console 面板下输入下面一行代码,看看有什么效果吧:
第一个参数是提示的内容,第二个参数是提示的标题,第三个参数是弹出层的配置选项
最后就是剪贴板了,我们需要调用 electron 的 clipboard 组件,并使用方法,将写入 剪贴板:
完成后,我们的代码现在长这个样子:
已经迫不及待想要调用一下看看效果了,别忘了要重新载入 AntSword 才会生效哟。看下我们用20几行代码实现的插件的效果图吧:
总结
至此,我们已经完成了第一个无界面的 AntSword 插件「复制服务端代码」,当然了,这个插件还有许多不尽人意的地方,比如:
不支持 asp 和 aspx ()
提示信息只有中文一种,不够友好
webshell 如果是 include 形式的,获取不到真正关键的服务端代码
这些就留给大家自行实现了。溜了溜了,过些天再更带界面的教程 :)
领取专属 10元无门槛券
私享最新 技术干货