前言
什么是哥斯拉工具?
哥斯拉是下一代webshell管理工具。
学会编写哥斯拉插件,你不仅可以绕过waf,还可以编写更多的功能,甚至哥斯拉的服务端可以脱离webshell,在数据库中运行,如SqlServer的CLR。
首先简单阅读哥斯拉插件Api:
https://beichendream.github.io/godzillaApi/
接下来我们将简单的学习一下怎么搭建环境,并编写插件。在后续的文章中我们会编写带有实际功能的插件,本文我们只是简单了解一下。
新建一个哥斯拉插件项目
首先打开IntelliJ IDEA,新建一个Java项目
一直点Next
写一个项目名
新建好之后,点击项目配置
点击加号
选择哥斯拉Jar包的路径,并点击OK
选择依赖模式,编译
然后点击Apply应用即可
然后右击Src文件夹,选择新建一个包
包名必须是以shells.plugins.任意字符
为开头
包名的最后建议填入网络ID、作者名
我这里填beichendream
shells.plugins.你的网络Id
shells.plugins.beichendream
编写插件
之后我们新建一个类并声明core.annotation.PluginnAnnotation
注解,然后继承并实现core.imp.Plugin
接口。
我们可以做一些有意思的操作了。
在下面的代码我们实现了获取哥斯拉的版本,当前web路径,当前用户名,添加一条shell,克隆当前的shell。
代码如下:
package shells.plugins.beichendream;
import java.awt.*;
import java.awt.event.*;
import core.ApplicationContext;
import core.Db;
import core.annotation.PluginnAnnotation;
import core.imp.Payload;
import core.shell.ShellEntity;
import core.ui.MainActivity;
import util.Log;
import javax.swing.*;
@PluginnAnnotation(payloadName = "PhpDynamicPayload",Name="FirstGodzillaPlugin") //有效载荷的名字以及插件名 (插件名唯一不可重复)
public class FirstGodzillaPlugin implements core.imp.Plugin{
private JPanel contentPanel;// 组件内容容器
private JLabel currentGodzillaVersionLabel;//当前哥斯拉版本
private JLabel currentDirLabel;//当前web路径
private JLabel currentUsernameLabel;//当前用户名
private JButton insertShellButton;//添加一条哥斯拉shell的按钮
private JButton copyShellButton;//克隆当前的shell
private ShellEntity shellEntity;
private Payload payload;
public FirstGodzillaPlugin(){
contentPanel=new JPanel();//创建组件内容容器
currentGodzillaVersionLabel=new JLabel();//创建标签
currentDirLabel=new JLabel();//创建标签
currentUsernameLabel=new JLabel();//创建标签
insertShellButton=new JButton("添加shell");//创建按钮
copyShellButton=new JButton("克隆当前shell");//创建按钮
insertShellButton.addActionListener(new AbstractAction() {//响应单击事件
@Override
public void actionPerformed(ActionEvent e) {
insertShellButtonClick(e);
}
});
copyShellButton.addActionListener(new AbstractAction() {//响应单击事件
@Override
public void actionPerformed(ActionEvent e) {
copyShellButtonClick(e);
}
});
contentPanel.add(currentGodzillaVersionLabel);//添加组件到容器
contentPanel.add(currentDirLabel);//添加组件到容器
contentPanel.add(currentUsernameLabel);//添加组件到容器
contentPanel.add(insertShellButton);//添加组件到容器
contentPanel.add(copyShellButton);//添加组件到容器
}
private void copyShellButtonClick(ActionEvent e){
Db.addShell(this.shellEntity);//添加当前shell到数据库
ShellEntity resultShell=Db.getOneShell(Db.getAllShell().lastElement().get(0));//因为我们刚才添加了一条shell 所以最后一条shell就是我们添加的
MainActivity.getMainActivityFrame().refreshShellView();//刷新shell管理界面的视图
Log.log( String.format("我添加了一条Id为:%s的shell", resultShell.getId()));//打印日志到控制台
JOptionPane.showMessageDialog(this.shellEntity.getFrame(), String.format("我添加了一条Id为:%s的shell", resultShell.getId()));//弹框告诉用户添加成功
}
private void insertShellButtonClick(ActionEvent e){
ShellEntity shellEntity=new ShellEntity();//创建一个shell实体
shellEntity.setUrl("http://127.0.0.1/shell.php");//设置URL
shellEntity.setPassword("pass");//设置连接密码
shellEntity.setSecretKey("SuperGodzilla");//设置加密秘钥
shellEntity.setPayload("JavaDynamicPayload");//设置有效载荷的名字
shellEntity.setCryption("JAVA_AES_IIOP_T3_HTTP");//设置加密器的名字
shellEntity.setRemark("这是插件添加的webshell");//设置一个备注
shellEntity.setProxyHost("127.0.0.1");//设置代理地址
shellEntity.setProxyPort(8888);//设置代理端口
shellEntity.setProxyType("NO_PROXY");//设置代理类型 类型种类请看哥斯拉开发Api
shellEntity.setEncoding("UTF-8");//设置编码类型
Db.addShell(shellEntity);//添加一条shell到数据库
ShellEntity resultShell=Db.getOneShell(Db.getAllShell().lastElement().get(0));//因为我们刚才添加了一条shell 所以最后一条shell就是我们添加的
MainActivity.getMainActivityFrame().refreshShellView();//刷新shell管理界面的视图
Log.log( String.format("我添加了一条Id为:%s的shell", resultShell.getId()));//打印日志到控制台
JOptionPane.showMessageDialog(this.shellEntity.getFrame(), String.format("我添加了一条Id为:%s的shell", resultShell.getId()));//弹框告诉用户添加成功
}
/***
* 插件初始化的时候回调用此方法 你可以在这里做一些初始化的操作 比如获取当前路径 但不建议在此处调用payload.include()方法
* */
@Override
public void init(ShellEntity shellContext) {
this.shellEntity=shellContext;//把shell上下文储存到类变量
this.payload=this.shellEntity.getPayloadModel();//获取有效载荷并存储到类变量
this.currentGodzillaVersionLabel.setText(String.format("哥斯拉版本:%s", ApplicationContext.VERSION));
this.currentDirLabel.setText(String.format("当前web路径:%s", payload.currentDir()));
this.currentUsernameLabel.setText(String.format("当前用户名:%s", payload.currentUserName()));
}
@Override
public JPanel getView() {
return contentPanel;//返回内容容器
}
}
编译插件
然后我们编译导出JAR工件
点击OK即可
删除导出哥斯拉Jar包,然后点击Apply应用
点击打包工件
选择我们添加的添加的工件即可
我们看到我们的插件已经编译成功
来个动图展示(在PC浏览器观感较佳)
编写添加到shell管理主页面的插件
随便新建一个类,但是包名必须是shells.plugins.任意字符
为开头
然后使用以下Api分别把弹出菜单注册到不同位置
MainActivity.registerJMenu(menu);//注册一个单独的菜单在主页面
MainActivity.registerPluginJMenuItem(pluginMenuItem);//注册一个菜单元素在插件菜单栏下
MainActivity.registerShellViewJMenuItem(shellViewMenuItem);//注册一个菜单元素在Shell管理主页面的右击弹出菜单中
必须在static静态代码块中完成注册菜单。
代码如下:
package shells.plugins.beichendream;
import core.ui.MainActivity;
import javax.swing.*;
import java.awt.event.ActionEvent;
public class FirstGodzillaPluginForMainActivity {
static {
JMenu menu = new JMenu("我是单独的主选项");
menu.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(MainActivity.getMainActivityFrame(), "我是单独的主选项 click");
}
});
JMenuItem pluginMenuItem=new JMenuItem("我是插件选项下面的选项");
pluginMenuItem.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(MainActivity.getMainActivityFrame(), "我是插件选项下面的选项 click");
}
});
JMenuItem shellViewMenuItem = new JMenuItem("我是shell管理页面的右键菜单");
shellViewMenuItem.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(MainActivity.getMainActivityFrame(), "我是shell管理页面的右键菜单 click");
}
});
MainActivity.registerJMenu(menu);//注册一个单独的菜单在主页面
MainActivity.registerPluginJMenuItem(pluginMenuItem);//注册一个菜单元素在插件菜单栏下
MainActivity.registerShellViewJMenuItem(shellViewMenuItem);//注册一个菜单元素在Shell管理主页面的右击弹出菜单中
}
}
然后按照上面的编译方式进行编译,加载成功后如下,独立的主菜单需要重启哥斯拉后生效。
来个动图展示(在PC浏览器观感较佳)
总结
在上面的插件编写中,我们一共用到了以下Api
ApplicationContext.VERSION 哥斯拉的版本
Db.addShell();//添加一条shell
Db.getOneShell();//根据插件Id获取一条shell
Log.log();//打印日志到控制台
this.shellEntity.getPayloadModel();//获取shell上下文的有效载荷(实际功能模块)
MainActivity.getMainActivityFrame().refreshShellView();//刷新shell管理界面的视图
MainActivity.registerJMenu(menu);//注册一个单独的菜单在主页面
MainActivity.registerPluginJMenuItem(pluginMenuItem);//注册一个菜单元素在插件菜单栏下
MainActivity.registerShellViewJMenuItem(shellViewMenuItem);//注册一个菜单元素在Shell管理主页面的右击弹出菜单中
上面的代码我已经传到Github,大家可以自由学习发挥。
https://github.com/BeichenDream/GodzillaPluginDemo
更多Api骚操作请看哥斯拉Api:
https://beichendream.github.io/godzillaApi/
敬请期待,在后续的文章中,我会手把手教大家编写,哥斯拉PHP/CSharp/Java的插件。
你的关注是我更新的动力。~比心❤
end
招新小广告
ChaMd5 Venom 招收大佬入圈
新成立组IOT+工控+样本分析 长期招新