Skip to content

Commit eb32f32

Browse files
committed
add: 添加对命令行的支持
1 parent 5a2b4e6 commit eb32f32

File tree

3 files changed

+307
-0
lines changed

3 files changed

+307
-0
lines changed

jmg-cli/pom.xml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>jmg</groupId>
8+
<artifactId>java-memshell-generator</artifactId>
9+
<version>1.0.8</version>
10+
</parent>
11+
12+
<artifactId>jmg-cli</artifactId>
13+
14+
<properties>
15+
<maven.compiler.source>8</maven.compiler.source>
16+
<maven.compiler.target>8</maven.compiler.target>
17+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
</properties>
19+
20+
<dependencies>
21+
<!-- https://mvnrepository.com/artifact/org.jline/jline -->
22+
<dependency>
23+
<groupId>org.jline</groupId>
24+
<artifactId>jline</artifactId>
25+
<version>3.21.0</version>
26+
</dependency>
27+
<dependency>
28+
<groupId>jmg</groupId>
29+
<artifactId>jmg-sdk</artifactId>
30+
<version>${parent.version}</version>
31+
</dependency>
32+
</dependencies>
33+
34+
<build>
35+
<plugins>
36+
<plugin>
37+
<groupId>org.apache.maven.plugins</groupId>
38+
<artifactId>maven-assembly-plugin</artifactId>
39+
<version>3.6.0</version>
40+
<configuration>
41+
<descriptorRefs>
42+
<descriptorRef>jar-with-dependencies</descriptorRef>
43+
</descriptorRefs>
44+
<archive>
45+
<manifest>
46+
<mainClass>jmg.cli.CLIApp</mainClass>
47+
</manifest>
48+
</archive>
49+
<appendAssemblyId>false</appendAssemblyId>
50+
<outputDirectory>../releases</outputDirectory>
51+
</configuration>
52+
<executions>
53+
<execution>
54+
<id>make-assembly</id>
55+
<phase>package</phase>
56+
<goals>
57+
<goal>single</goal>
58+
</goals>
59+
</execution>
60+
</executions>
61+
</plugin>
62+
</plugins>
63+
</build>
64+
</project>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package jmg.cli;
2+
3+
public class CLIApp {
4+
public static void main(String[] args) throws Throwable {
5+
Console console = new Console();
6+
console.init();
7+
console.run();
8+
}
9+
}
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
package jmg.cli;
2+
3+
import jmg.core.config.AbstractConfig;
4+
import jmg.core.config.Constants;
5+
import jmg.sdk.jMGenerator;
6+
import jmg.sdk.util.SDKResultUtil;
7+
import org.jline.reader.LineReader;
8+
import org.jline.reader.LineReaderBuilder;
9+
import org.jline.reader.impl.completer.StringsCompleter;
10+
import org.jline.terminal.Terminal;
11+
import org.jline.terminal.TerminalBuilder;
12+
13+
import java.lang.reflect.InvocationTargetException;
14+
import java.lang.reflect.Method;
15+
import java.util.Arrays;
16+
import java.util.List;
17+
18+
public class Console {
19+
20+
private static AbstractConfig config = new AbstractConfig();
21+
private static final List<String> SERVER_TYPES = Arrays.asList(
22+
Constants.SERVER_TOMCAT,
23+
Constants.SERVER_SPRING_MVC,
24+
Constants.SERVER_JETTY,
25+
Constants.SERVER_RESIN,
26+
Constants.SERVER_WEBLOGIC,
27+
Constants.SERVER_WEBSPHERE,
28+
Constants.SERVER_UNDERTOW,
29+
Constants.SERVER_GLASSFISH,
30+
Constants.SERVER_JBOSS);
31+
private static final List<String> TOOL_TYPES = Arrays.asList(
32+
Constants.TOOL_GODZILLA,
33+
Constants.TOOL_BEHINDER,
34+
Constants.TOOL_ANTSWORD,
35+
Constants.TOOL_SUO5,
36+
Constants.TOOL_NEOREGEORG);
37+
38+
private static final List<String> SHELL_TYPES = Arrays.asList(
39+
Constants.SHELL_LISTENER,
40+
Constants.SHELL_FILTER,
41+
Constants.SHELL_INTERCEPTOR);
42+
43+
private static final List<String> FORMAT_TYPES = Arrays.asList(
44+
Constants.FORMAT_BASE64,
45+
Constants.FORMAT_BCEL,
46+
Constants.FORMAT_BIGINTEGER,
47+
Constants.FORMAT_CLASS,
48+
Constants.FORMAT_JAR,
49+
Constants.FORMAT_JAR_AGENT,
50+
Constants.FORMAT_JSP);
51+
52+
private static final List<String> GADGET_TYPES = Arrays.asList(
53+
Constants.GADGET_NONE,
54+
Constants.GADGET_JDK_TRANSLET,
55+
Constants.GADGET_XALAN_TRANSLET,
56+
Constants.GADGET_FJ_GROOVY,
57+
Constants.GADGET_SNAKEYAML);
58+
59+
60+
public void init() {
61+
System.out.println(String.format("Welcome to jMG %s !", Constants.JMG_VERSION));
62+
config = new AbstractConfig() {{
63+
// 设置工具类型
64+
setToolType(Constants.TOOL_GODZILLA);
65+
// 设置中间件 or 框架
66+
setServerType(Constants.SERVER_TOMCAT);
67+
// 设置内存马类型
68+
setShellType(Constants.SHELL_LISTENER);
69+
// 设置输出格式为 BASE64
70+
setOutputFormat(Constants.FORMAT_BASE64);
71+
// 设置漏洞利用封装,默认不启用
72+
setGadgetType(Constants.GADGET_NONE);
73+
// 初始化基础配置
74+
build();
75+
}};
76+
77+
}
78+
79+
public void run() throws Throwable {
80+
List<String> commands = Arrays.asList("help", "list", "use", "set", "show", "generate", "info", "exit");
81+
Terminal terminal = TerminalBuilder.builder().build();
82+
LineReader lineReader = LineReaderBuilder.builder()
83+
.terminal(terminal)
84+
.completer(new StringsCompleter(commands))
85+
.build();
86+
87+
String prompt = "jmg > ";
88+
String line;
89+
while (true) {
90+
line = lineReader.readLine(prompt);
91+
String[] parts = line.trim().split("\\s+");
92+
String command = parts[0];
93+
String argument1 = parts.length > 1 ? parts[1] : null;
94+
String argument2 = parts.length > 2 ? parts[2] : null;
95+
switch (command) {
96+
case "help":
97+
help();
98+
break;
99+
case "list":
100+
list(argument1);
101+
break;
102+
case "use":
103+
use(argument1, argument2);
104+
break;
105+
case "set":
106+
set(argument1, argument2);
107+
break;
108+
case "get":
109+
get(argument1);
110+
break;
111+
case "generate":
112+
generate();
113+
break;
114+
case "info":
115+
info();
116+
break;
117+
case "exit":
118+
System.out.println("Bye!");
119+
return;
120+
default:
121+
System.out.println("Unknown command: " + line);
122+
}
123+
}
124+
}
125+
126+
public static void help() {
127+
String[][] helpMessages = {
128+
{"help", "help message", "帮助信息"},
129+
{"list [type]", "list toolTypes/serverTypes/formatTypes/shellTypes", "支持的工具类型/中间件|框架/组件类型/输出格式"},
130+
{"use <type> <name>", "choose toolType/serverType/formatType/shellType", "选择工具类型/中间件|框架/组件类型/输出格式"},
131+
{"set <key> <value>", "set pass/key/headerName/headerValue/urlPattern/...", "设置密码/密钥/请求头名称/请求头值/请求路径[/*]/..."},
132+
{"get <type>", "get <type> or <key>", "查看配置"},
133+
{"generate", "generate payload", "生成载荷"},
134+
{"info", "connect info", "连接信息"},
135+
{"exit", "exit jmg", "退出"}
136+
};
137+
138+
for (String[] message : helpMessages) {
139+
System.out.println(String.format("%-20s %-50s %-40s", message[0], message[1], message[2]));
140+
}
141+
}
142+
143+
144+
public static void list(String argument1) {
145+
if ("serverTypes".equalsIgnoreCase(argument1)) {
146+
System.out.println("Servers: " + SERVER_TYPES);
147+
} else if ("toolTypes".equalsIgnoreCase(argument1)) {
148+
System.out.println("Tools: " + TOOL_TYPES);
149+
} else if ("shellTypes".equalsIgnoreCase(argument1)) {
150+
System.out.println("Shells: " + SHELL_TYPES);
151+
} else if ("formatTypes".equalsIgnoreCase(argument1)) {
152+
System.out.println("Formats: " + FORMAT_TYPES);
153+
} else if ("gadgetTypes".equalsIgnoreCase(argument1)) {
154+
System.out.println("Gadgets: " + GADGET_TYPES);
155+
} else {
156+
System.out.println("Unknown type: " + argument1);
157+
}
158+
}
159+
160+
public static void get(String argument1) {
161+
try {
162+
String methodName = "get" + argument1.substring(0, 1).toUpperCase() + argument1.substring(1);
163+
Method method = config.getClass().getMethod(methodName);
164+
System.out.println(argument1 + " : " + method.invoke(config));
165+
} catch (NoSuchMethodException e) {
166+
System.out.println("Unknown type: " + argument1);
167+
} catch (IllegalAccessException | InvocationTargetException e) {
168+
System.out.println("Error getting value for type: " + argument1);
169+
}
170+
}
171+
172+
public static void use(String argument1, String argument2) {
173+
if ("serverType".equalsIgnoreCase(argument1)) {
174+
if (!SERVER_TYPES.contains(argument2)) {
175+
System.out.println("Unsupported server type: " + argument2);
176+
return;
177+
}
178+
set("serverType", argument2);
179+
} else if ("toolType".equalsIgnoreCase(argument1)) {
180+
if (!TOOL_TYPES.contains(argument2)) {
181+
System.out.println("Unsupported tool type: " + argument2);
182+
return;
183+
}
184+
set("toolType", argument2);
185+
} else if ("shellType".equalsIgnoreCase(argument1)) {
186+
if (!SHELL_TYPES.contains(argument2)) {
187+
System.out.println("Unsupported shell type: " + argument2);
188+
return;
189+
}
190+
set("shellType", argument2);
191+
} else if ("formatType".equalsIgnoreCase(argument1)) {
192+
if (!FORMAT_TYPES.contains(argument2)) {
193+
System.out.println("Unsupported format type: " + argument2);
194+
return;
195+
}
196+
set("outputFormat", argument2);
197+
} else if ("gadgetType".equalsIgnoreCase(argument1)) {
198+
if (!GADGET_TYPES.contains(argument2)) {
199+
System.out.println("Unsupported gadget type: " + argument2);
200+
return;
201+
}
202+
set("gadgetType", argument2);
203+
} else {
204+
System.out.println("Unknown type: " + argument1);
205+
}
206+
}
207+
208+
public static void set(String argument1, String argument2) {
209+
try {
210+
String methodName = "set" + argument1.substring(0, 1).toUpperCase() + argument1.substring(1);
211+
Method method = config.getClass().getMethod(methodName, String.class);
212+
method.invoke(config, argument2);
213+
System.out.println(argument1 + " : " + argument2);
214+
} catch (NoSuchMethodException e) {
215+
System.out.println("Unknown key: " + argument1);
216+
} catch (IllegalAccessException | InvocationTargetException e) {
217+
System.out.println("Error setting value for key: " + argument1);
218+
}
219+
}
220+
221+
public static void generate() throws Throwable {
222+
// 更新配置
223+
config.build();
224+
jMGenerator generator = new jMGenerator(config);
225+
generator.genPayload();
226+
generator.printPayload();
227+
}
228+
229+
public static void info() throws Throwable {
230+
// 连接信息
231+
SDKResultUtil.printBasicInfo(config);
232+
SDKResultUtil.printDebugInfo(config);
233+
}
234+
}

0 commit comments

Comments
 (0)