前言
冰蝎跟哥斯拉都有了各自的一些后渗透模块,然而蚁剑这一块基本还是空缺,所以就萌生出来做一个蚁剑的后渗透框架插件的想法。
目前插件的定位是蚁剑的一个微内核拓展模块,可以迅速做到payload的工程化,不用过多时间浪费在插件的结构上。目前的As-Exlpoits各部分之间基本做到了解耦,新增一个payload只需要两步:1.填写payload,2. 画一个表单。其余发包,回显处理等事情框架会自动帮你实现。想要自定义的话只需要继承父类然后重写对应方法即可。
因为http是无状态的,webshell能做的事情其实很有限,所以插件功能的重点主要放在msf,nmap等其他工具的联动上面,把专业的事情交给专业的工具去做。
总体设计
一个模块在初始化之后的流程大概是这样
当exploit事件发生时,会调用getArgs跟genPayload函数来组合成最后的payload,默认将回显数据发送到编辑框里。
模块介绍
简单的塞一些模块,没错我就是缝合怪。
基本信息
获取当前服务端信息。
反弹Shell
跟MSF联动,与冰蝎和哥斯拉相比新增了bind类型的payload。
目前支持以下类型:
- java/meterpreter/reverse_tcp
- java/shell/reverse_tcp
- java/meterpreter/bind_tcp
- java/shell/bind_tcp
- php/meterpreter/reverse_tcp
- php/shell/reverse_tcp
- php/meterpreter/bind_tcp
- php/shell/bind_tcp
内存马
一键打入内存Webshell。由于时间仓促,目前仅支持Servlet型内存马。核心payload修改自哥斯拉,继承了nolog的功能,即内存马不会在tomcat中留下日志。
可打入的内存马种类:
- AntSword
- Behinder
- Godzilla-Base64
- reGerog
其中组件名称为注册的Servlet的名称,可以起一个具有迷惑性的名字来隐藏自己。
内存马管理
- 获取当前Servlet
- 卸载指定Servlet
杀软识别
数据来源是key师傅的项目:avList
通过tasklist /svc
获取当前进程列表,识别出其中的杀软。
目前支持手动跟自动两种获取方式:
自动获取
自动执行系统命令tasklist /svc
并分析回显数据。手动获取
手动输入tasklist /svc
的结果。
如何用node修改java字节码
在本插件中所有额外参数都采用了直接修改字节码,而没有采用额外参数的方式来传参。蚁剑没有java环境,那么是如何做到用node修改字节码的呢?详细的例子可以看我博客这篇文章:无java环境修改字节码
其实我们的需求无非只是修改变量池中的一个字符串,并不需要asm框架那么强大的功能。java字节码常量池中共有14种类型,如下表格所示:
注意上面的表格的单位是错的,应该是byte不是bit
我们关注的应该是CONSTANT_utf8_info跟CONSTANT_String_info。如果变量是第一次被定义的时候是用CONSTANT_utf8_info标志,第二次使用的时候就变成了CONSTANT_String_info,即只需要tag跟面向字符串的索引。
也就是说关键的结构就是这个
其实跟PHP的序列化很相似,首先来个标志位表示变量的类型,然后是变量的长度,最后是变量的内容。
既然知道了其结构,那么修改的办法也就呼之欲出。除了修改变量的hex,只需要再把前面的变量长度给改一下就可以了。
把yan表哥的代码抽出来修改一下,yan表哥yyds。
1 | function replaceClassStringVar(b64code, oldvar, newvar) { |
编写模块
父类Base
Base是所有模块的基类,放了一些默认的方法。
顺着代码来说吧。
1 | "use strict"; |
简单的例子
举一个简单的例子,执行系统命令并获取回显。
首先给插件起个炫酷的名字叫test,加入到根目录index.js的Modules里面。
然后在language\zh.js中增加对应的标签名字:测试。
接着新增一个test目录,这里的目录名称要与模块的名称一致,里面放两个文件:index.js跟payload.js。
在index.js中主要写逻辑处理部分,payload.js里面只放payload。
payload.js
默认的payload叫default。payload中把参数部分用一个特殊的名字标记出来,叫做 test_command 。
JSP类型同理,放base64格式的字节码。
1 | module.exports={ |
index.js
因为例子中需要额外的参数,所以要重写父类的createForm函数跟getArgs函数,把表单中获取到的test_command放入args里面。
1 | "use strict"; |
运行结果
重启蚁剑后再打开插件就可以使用我们的新模块了,是不是很简单?
最后
目前payload主要来自冰蝎跟哥斯拉,向前辈们致敬!
框架的优势就在于看到其他同类工具的比较好的功能可以迅速白嫖。这个功能不错,下一秒就是我的了.jpg