AntSword 插件篇(二)

写在前面正篇(预计读完 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 形式的,获取不到真正关键的服务端代码

这些就留给大家自行实现了。溜了溜了,过些天再更带界面的教程 :)

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181010G0ET2U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券