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