mirror of
https://github.com/pen4uin/java-memshell-generator.git
synced 2026-09-22 01:30:43 +08:00
add: 添加对命令行的支持
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
<?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-cli</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>
|
||||
<!-- https://mvnrepository.com/artifact/org.jline/jline -->
|
||||
<dependency>
|
||||
<groupId>org.jline</groupId>
|
||||
<artifactId>jline</artifactId>
|
||||
<version>3.21.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jmg</groupId>
|
||||
<artifactId>jmg-sdk</artifactId>
|
||||
<version>${parent.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<version>3.6.0</version>
|
||||
<configuration>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>jmg.cli.CLIApp</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<appendAssemblyId>false</appendAssemblyId>
|
||||
<outputDirectory>../releases</outputDirectory>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>make-assembly</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,9 @@
|
||||
package jmg.cli;
|
||||
|
||||
public class CLIApp {
|
||||
public static void main(String[] args) throws Throwable {
|
||||
Console console = new Console();
|
||||
console.init();
|
||||
console.run();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,234 @@
|
||||
package jmg.cli;
|
||||
|
||||
import jmg.core.config.AbstractConfig;
|
||||
import jmg.core.config.Constants;
|
||||
import jmg.sdk.jMGenerator;
|
||||
import jmg.sdk.util.SDKResultUtil;
|
||||
import org.jline.reader.LineReader;
|
||||
import org.jline.reader.LineReaderBuilder;
|
||||
import org.jline.reader.impl.completer.StringsCompleter;
|
||||
import org.jline.terminal.Terminal;
|
||||
import org.jline.terminal.TerminalBuilder;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class Console {
|
||||
|
||||
private static AbstractConfig config = new AbstractConfig();
|
||||
private static final List<String> SERVER_TYPES = Arrays.asList(
|
||||
Constants.SERVER_TOMCAT,
|
||||
Constants.SERVER_SPRING_MVC,
|
||||
Constants.SERVER_JETTY,
|
||||
Constants.SERVER_RESIN,
|
||||
Constants.SERVER_WEBLOGIC,
|
||||
Constants.SERVER_WEBSPHERE,
|
||||
Constants.SERVER_UNDERTOW,
|
||||
Constants.SERVER_GLASSFISH,
|
||||
Constants.SERVER_JBOSS);
|
||||
private static final List<String> TOOL_TYPES = Arrays.asList(
|
||||
Constants.TOOL_GODZILLA,
|
||||
Constants.TOOL_BEHINDER,
|
||||
Constants.TOOL_ANTSWORD,
|
||||
Constants.TOOL_SUO5,
|
||||
Constants.TOOL_NEOREGEORG);
|
||||
|
||||
private static final List<String> SHELL_TYPES = Arrays.asList(
|
||||
Constants.SHELL_LISTENER,
|
||||
Constants.SHELL_FILTER,
|
||||
Constants.SHELL_INTERCEPTOR);
|
||||
|
||||
private static final List<String> FORMAT_TYPES = Arrays.asList(
|
||||
Constants.FORMAT_BASE64,
|
||||
Constants.FORMAT_BCEL,
|
||||
Constants.FORMAT_BIGINTEGER,
|
||||
Constants.FORMAT_CLASS,
|
||||
Constants.FORMAT_JAR,
|
||||
Constants.FORMAT_JAR_AGENT,
|
||||
Constants.FORMAT_JSP);
|
||||
|
||||
private static final List<String> GADGET_TYPES = Arrays.asList(
|
||||
Constants.GADGET_NONE,
|
||||
Constants.GADGET_JDK_TRANSLET,
|
||||
Constants.GADGET_XALAN_TRANSLET,
|
||||
Constants.GADGET_FJ_GROOVY,
|
||||
Constants.GADGET_SNAKEYAML);
|
||||
|
||||
|
||||
public void init() {
|
||||
System.out.println(String.format("Welcome to jMG %s !", Constants.JMG_VERSION));
|
||||
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();
|
||||
}};
|
||||
|
||||
}
|
||||
|
||||
public void run() throws Throwable {
|
||||
List<String> commands = Arrays.asList("help", "list", "use", "set", "show", "generate", "info", "exit");
|
||||
Terminal terminal = TerminalBuilder.builder().build();
|
||||
LineReader lineReader = LineReaderBuilder.builder()
|
||||
.terminal(terminal)
|
||||
.completer(new StringsCompleter(commands))
|
||||
.build();
|
||||
|
||||
String prompt = "jmg > ";
|
||||
String line;
|
||||
while (true) {
|
||||
line = lineReader.readLine(prompt);
|
||||
String[] parts = line.trim().split("\\s+");
|
||||
String command = parts[0];
|
||||
String argument1 = parts.length > 1 ? parts[1] : null;
|
||||
String argument2 = parts.length > 2 ? parts[2] : null;
|
||||
switch (command) {
|
||||
case "help":
|
||||
help();
|
||||
break;
|
||||
case "list":
|
||||
list(argument1);
|
||||
break;
|
||||
case "use":
|
||||
use(argument1, argument2);
|
||||
break;
|
||||
case "set":
|
||||
set(argument1, argument2);
|
||||
break;
|
||||
case "get":
|
||||
get(argument1);
|
||||
break;
|
||||
case "generate":
|
||||
generate();
|
||||
break;
|
||||
case "info":
|
||||
info();
|
||||
break;
|
||||
case "exit":
|
||||
System.out.println("Bye!");
|
||||
return;
|
||||
default:
|
||||
System.out.println("Unknown command: " + line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void help() {
|
||||
String[][] helpMessages = {
|
||||
{"help", "help message", "帮助信息"},
|
||||
{"list [type]", "list toolTypes/serverTypes/formatTypes/shellTypes", "支持的工具类型/中间件|框架/组件类型/输出格式"},
|
||||
{"use <type> <name>", "choose toolType/serverType/formatType/shellType", "选择工具类型/中间件|框架/组件类型/输出格式"},
|
||||
{"set <key> <value>", "set pass/key/headerName/headerValue/urlPattern/...", "设置密码/密钥/请求头名称/请求头值/请求路径[/*]/..."},
|
||||
{"get <type>", "get <type> or <key>", "查看配置"},
|
||||
{"generate", "generate payload", "生成载荷"},
|
||||
{"info", "connect info", "连接信息"},
|
||||
{"exit", "exit jmg", "退出"}
|
||||
};
|
||||
|
||||
for (String[] message : helpMessages) {
|
||||
System.out.println(String.format("%-20s %-50s %-40s", message[0], message[1], message[2]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void list(String argument1) {
|
||||
if ("serverTypes".equalsIgnoreCase(argument1)) {
|
||||
System.out.println("Servers: " + SERVER_TYPES);
|
||||
} else if ("toolTypes".equalsIgnoreCase(argument1)) {
|
||||
System.out.println("Tools: " + TOOL_TYPES);
|
||||
} else if ("shellTypes".equalsIgnoreCase(argument1)) {
|
||||
System.out.println("Shells: " + SHELL_TYPES);
|
||||
} else if ("formatTypes".equalsIgnoreCase(argument1)) {
|
||||
System.out.println("Formats: " + FORMAT_TYPES);
|
||||
} else if ("gadgetTypes".equalsIgnoreCase(argument1)) {
|
||||
System.out.println("Gadgets: " + GADGET_TYPES);
|
||||
} else {
|
||||
System.out.println("Unknown type: " + argument1);
|
||||
}
|
||||
}
|
||||
|
||||
public static void get(String argument1) {
|
||||
try {
|
||||
String methodName = "get" + argument1.substring(0, 1).toUpperCase() + argument1.substring(1);
|
||||
Method method = config.getClass().getMethod(methodName);
|
||||
System.out.println(argument1 + " : " + method.invoke(config));
|
||||
} catch (NoSuchMethodException e) {
|
||||
System.out.println("Unknown type: " + argument1);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
System.out.println("Error getting value for type: " + argument1);
|
||||
}
|
||||
}
|
||||
|
||||
public static void use(String argument1, String argument2) {
|
||||
if ("serverType".equalsIgnoreCase(argument1)) {
|
||||
if (!SERVER_TYPES.contains(argument2)) {
|
||||
System.out.println("Unsupported server type: " + argument2);
|
||||
return;
|
||||
}
|
||||
set("serverType", argument2);
|
||||
} else if ("toolType".equalsIgnoreCase(argument1)) {
|
||||
if (!TOOL_TYPES.contains(argument2)) {
|
||||
System.out.println("Unsupported tool type: " + argument2);
|
||||
return;
|
||||
}
|
||||
set("toolType", argument2);
|
||||
} else if ("shellType".equalsIgnoreCase(argument1)) {
|
||||
if (!SHELL_TYPES.contains(argument2)) {
|
||||
System.out.println("Unsupported shell type: " + argument2);
|
||||
return;
|
||||
}
|
||||
set("shellType", argument2);
|
||||
} else if ("formatType".equalsIgnoreCase(argument1)) {
|
||||
if (!FORMAT_TYPES.contains(argument2)) {
|
||||
System.out.println("Unsupported format type: " + argument2);
|
||||
return;
|
||||
}
|
||||
set("outputFormat", argument2);
|
||||
} else if ("gadgetType".equalsIgnoreCase(argument1)) {
|
||||
if (!GADGET_TYPES.contains(argument2)) {
|
||||
System.out.println("Unsupported gadget type: " + argument2);
|
||||
return;
|
||||
}
|
||||
set("gadgetType", argument2);
|
||||
} else {
|
||||
System.out.println("Unknown type: " + argument1);
|
||||
}
|
||||
}
|
||||
|
||||
public static void set(String argument1, String argument2) {
|
||||
try {
|
||||
String methodName = "set" + argument1.substring(0, 1).toUpperCase() + argument1.substring(1);
|
||||
Method method = config.getClass().getMethod(methodName, String.class);
|
||||
method.invoke(config, argument2);
|
||||
System.out.println(argument1 + " : " + argument2);
|
||||
} catch (NoSuchMethodException e) {
|
||||
System.out.println("Unknown key: " + argument1);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
System.out.println("Error setting value for key: " + argument1);
|
||||
}
|
||||
}
|
||||
|
||||
public static void generate() throws Throwable {
|
||||
// 更新配置
|
||||
config.build();
|
||||
jMGenerator generator = new jMGenerator(config);
|
||||
generator.genPayload();
|
||||
generator.printPayload();
|
||||
}
|
||||
|
||||
public static void info() throws Throwable {
|
||||
// 连接信息
|
||||
SDKResultUtil.printBasicInfo(config);
|
||||
SDKResultUtil.printDebugInfo(config);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user