mirror of
https://github.com/qi4L/JYso.git
synced 2026-09-23 23:31:52 +08:00
gui 初次提交
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,125 +1,127 @@
|
||||
package com.qi4l.JYso;
|
||||
|
||||
import com.qi4l.JYso.controllers.LdapController;
|
||||
import com.qi4l.JYso.controllers.LdapMapping;
|
||||
import com.qi4l.JYso.controllers.utils.JNDIUtils;
|
||||
import com.qi4l.JYso.gadgets.Config.Config;
|
||||
import com.unboundid.ldap.listener.InMemoryDirectoryServer;
|
||||
import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
|
||||
import com.unboundid.ldap.listener.InMemoryListenerConfig;
|
||||
import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult;
|
||||
import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.reflections.Reflections;
|
||||
|
||||
import javax.net.ServerSocketFactory;
|
||||
import javax.net.SocketFactory;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.net.InetAddress;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import static com.qi4l.JYso.gadgets.Config.Config.*;
|
||||
import static com.qi4l.JYso.gadgets.utils.Utils.base64Decode;
|
||||
import static org.fusesource.jansi.Ansi.ansi;
|
||||
|
||||
|
||||
public class LdapServer extends InMemoryOperationInterceptor {
|
||||
|
||||
private static final Logger log = LogManager.getLogger(LdapServer.class);
|
||||
public static TreeMap<String, LdapController> routes = new TreeMap<>();
|
||||
|
||||
public LdapServer() throws Exception {
|
||||
|
||||
//find all classes annotated with @LdapMapping
|
||||
Set<Class<?>> controllers = new Reflections(this.getClass().getPackage().getName())
|
||||
.getTypesAnnotatedWith(LdapMapping.class);
|
||||
|
||||
//instantiate them and store in the routes map
|
||||
for (Class<?> controller : controllers) {
|
||||
Constructor<?> cons = controller.getConstructor();
|
||||
LdapController instance = (LdapController) cons.newInstance();
|
||||
String[] mappings = controller.getAnnotation(LdapMapping.class).uri();
|
||||
for (String mapping : mappings) {
|
||||
if (mapping.startsWith("/")) {
|
||||
mapping = mapping.substring(1); //remove first forward slash
|
||||
routes.put(mapping, instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void start() {
|
||||
try {
|
||||
InMemoryDirectoryServerConfig serverConfig = new InMemoryDirectoryServerConfig("dc=example,dc=com");
|
||||
|
||||
serverConfig.setListenerConfigs(new InMemoryListenerConfig(
|
||||
"listen",
|
||||
InetAddress.getByName("0.0.0.0"),
|
||||
Config.ldapPort,
|
||||
ServerSocketFactory.getDefault(),
|
||||
SocketFactory.getDefault(),
|
||||
(SSLSocketFactory) SSLSocketFactory.getDefault()));
|
||||
|
||||
if (!USER.isEmpty() || !PASSWD.isEmpty()) {
|
||||
serverConfig.addAdditionalBindCredentials(USER, PASSWD);
|
||||
}
|
||||
|
||||
//添加操作拦截器
|
||||
//将提供的操作拦截器添加到操作拦截器列表中,该列表可用于在请求被内存目录服务器处理之前转换请求,和/或在响应返回给客户端之前转换响应。
|
||||
serverConfig.addInMemoryOperationInterceptor(new LdapServer());
|
||||
InMemoryDirectoryServer ds = new InMemoryDirectoryServer(serverConfig);
|
||||
ds.startListening();
|
||||
System.out.println(ansi().render("@|green [+]|@ LDAP Server Start Listening on >> " + Config.ldapPort + "..."));
|
||||
} catch (Exception e) {
|
||||
log.error("e: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processSearchResult(InMemoryInterceptedSearchResult result) {
|
||||
String base;
|
||||
if (!ROUTE.isEmpty()) {
|
||||
base = ROUTE;
|
||||
} else {
|
||||
base = result.getRequest().getBaseDN();
|
||||
}
|
||||
try {
|
||||
if (!AESkey.equals("123")) {
|
||||
base = base64Decode(base);
|
||||
base = JNDIUtils.decrypt(base, AESkey);
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
|
||||
}
|
||||
|
||||
//收到ldap请求
|
||||
//System.out.println(ansi().render("@|green [+] Received LDAP Query : |@" + base));
|
||||
LdapController controller = null;
|
||||
//find controller
|
||||
//根据请求的路径从route中匹配相应的controller
|
||||
for (String key : routes.keySet()) {
|
||||
//compare using wildcard at the end
|
||||
if (base.toLowerCase().startsWith(key)) {
|
||||
controller = routes.get(key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (controller == null) {
|
||||
System.out.println(ansi().render("@|red [!] Invalid LDAP Query >> |@" + base));
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
//从控制器中进行返回
|
||||
controller.process(base);
|
||||
controller.sendResult(result, base);
|
||||
} catch (Exception e1) {
|
||||
System.out.println(ansi().render("@|red [!] Exception >> |@" + e1.getMessage()));
|
||||
}
|
||||
}
|
||||
package com.qi4l.JYso;
|
||||
|
||||
import com.qi4l.JYso.controllers.LdapController;
|
||||
import com.qi4l.JYso.controllers.LdapMapping;
|
||||
import com.qi4l.JYso.controllers.utils.JNDIUtils;
|
||||
import com.qi4l.JYso.gadgets.Config.Config;
|
||||
import com.unboundid.ldap.listener.InMemoryDirectoryServer;
|
||||
import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
|
||||
import com.unboundid.ldap.listener.InMemoryListenerConfig;
|
||||
import com.unboundid.ldap.listener.interceptor.InMemoryInterceptedSearchResult;
|
||||
import com.unboundid.ldap.listener.interceptor.InMemoryOperationInterceptor;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.reflections.Reflections;
|
||||
|
||||
import javax.net.ServerSocketFactory;
|
||||
import javax.net.SocketFactory;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.net.InetAddress;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import static com.qi4l.JYso.gadgets.Config.Config.*;
|
||||
import static com.qi4l.JYso.gadgets.utils.Utils.base64Decode;
|
||||
import static org.fusesource.jansi.Ansi.ansi;
|
||||
|
||||
|
||||
public class LdapServer extends InMemoryOperationInterceptor {
|
||||
|
||||
private static final Logger log = LogManager.getLogger(LdapServer.class);
|
||||
public static TreeMap<String, LdapController> routes = new TreeMap<>();
|
||||
public static boolean isRunning = false;
|
||||
|
||||
public LdapServer() throws Exception {
|
||||
|
||||
//find all classes annotated with @LdapMapping
|
||||
Set<Class<?>> controllers = new Reflections(this.getClass().getPackage().getName())
|
||||
.getTypesAnnotatedWith(LdapMapping.class);
|
||||
|
||||
//instantiate them and store in the routes map
|
||||
for (Class<?> controller : controllers) {
|
||||
Constructor<?> cons = controller.getConstructor();
|
||||
LdapController instance = (LdapController) cons.newInstance();
|
||||
String[] mappings = controller.getAnnotation(LdapMapping.class).uri();
|
||||
for (String mapping : mappings) {
|
||||
if (mapping.startsWith("/")) {
|
||||
mapping = mapping.substring(1); //remove first forward slash
|
||||
routes.put(mapping, instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void start() {
|
||||
try {
|
||||
InMemoryDirectoryServerConfig serverConfig = new InMemoryDirectoryServerConfig("dc=example,dc=com");
|
||||
|
||||
serverConfig.setListenerConfigs(new InMemoryListenerConfig(
|
||||
"listen",
|
||||
InetAddress.getByName("0.0.0.0"),
|
||||
Config.ldapPort,
|
||||
ServerSocketFactory.getDefault(),
|
||||
SocketFactory.getDefault(),
|
||||
(SSLSocketFactory) SSLSocketFactory.getDefault()));
|
||||
|
||||
if (!USER.isEmpty() || !PASSWD.isEmpty()) {
|
||||
serverConfig.addAdditionalBindCredentials(USER, PASSWD);
|
||||
}
|
||||
|
||||
//添加操作拦截器
|
||||
//将提供的操作拦截器添加到操作拦截器列表中,该列表可用于在请求被内存目录服务器处理之前转换请求,和/或在响应返回给客户端之前转换响应。
|
||||
serverConfig.addInMemoryOperationInterceptor(new LdapServer());
|
||||
InMemoryDirectoryServer ds = new InMemoryDirectoryServer(serverConfig);
|
||||
ds.startListening();
|
||||
isRunning = true;
|
||||
System.out.println(ansi().render("@|green [+]|@ LDAP Server Start Listening on >> " + Config.ldapPort + "..."));
|
||||
} catch (Exception e) {
|
||||
log.error("e: ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processSearchResult(InMemoryInterceptedSearchResult result) {
|
||||
String base;
|
||||
if (!ROUTE.isEmpty()) {
|
||||
base = ROUTE;
|
||||
} else {
|
||||
base = result.getRequest().getBaseDN();
|
||||
}
|
||||
try {
|
||||
if (!AESkey.equals("123")) {
|
||||
base = base64Decode(base);
|
||||
base = JNDIUtils.decrypt(base, AESkey);
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
|
||||
}
|
||||
|
||||
//收到ldap请求
|
||||
//System.out.println(ansi().render("@|green [+] Received LDAP Query : |@" + base));
|
||||
LdapController controller = null;
|
||||
//find controller
|
||||
//根据请求的路径从route中匹配相应的controller
|
||||
for (String key : routes.keySet()) {
|
||||
//compare using wildcard at the end
|
||||
if (base.toLowerCase().startsWith(key)) {
|
||||
controller = routes.get(key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (controller == null) {
|
||||
System.out.println(ansi().render("@|red [!] Invalid LDAP Query >> |@" + base));
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
//从控制器中进行返回
|
||||
controller.process(base);
|
||||
controller.sendResult(result, base);
|
||||
} catch (Exception e1) {
|
||||
System.out.println(ansi().render("@|red [!] Exception >> |@" + e1.getMessage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,59 +1,61 @@
|
||||
package com.qi4l.JYso;
|
||||
|
||||
import com.qi4l.JYso.gadgets.Config.Config;
|
||||
import com.unboundid.ldap.listener.InMemoryDirectoryServer;
|
||||
import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
|
||||
import com.unboundid.ldap.listener.InMemoryListenerConfig;
|
||||
import com.unboundid.util.ssl.KeyStoreKeyManager;
|
||||
import com.unboundid.util.ssl.SSLUtil;
|
||||
import com.unboundid.util.ssl.TrustAllTrustManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import static org.fusesource.jansi.Ansi.ansi;
|
||||
|
||||
public class LdapsServer {
|
||||
private static final Logger log = LogManager.getLogger(LdapsServer.class);
|
||||
private final String certFile;
|
||||
private final String keyPass;
|
||||
|
||||
public LdapsServer(String certFile, String keyPass) {
|
||||
this.certFile = certFile;
|
||||
this.keyPass = keyPass;
|
||||
}
|
||||
|
||||
public static void start() {
|
||||
System.out.println(ansi().render("@|green [+]|@ LDAPS Server Start Listening on >> " + Config.ldapsPort + "..."));
|
||||
new LdapsServer(Config.certFile, Config.keyPass).run();
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// 设置JDK信任证书
|
||||
System.setProperty("javax.net.ssl.trustStore", certFile);
|
||||
System.setProperty("javax.net.ssl.trustStorePassword", keyPass);
|
||||
|
||||
try {
|
||||
SSLUtil serverSSLUtil = new SSLUtil(
|
||||
new KeyStoreKeyManager(certFile, keyPass.toCharArray()),
|
||||
new TrustAllTrustManager()
|
||||
);
|
||||
SSLUtil clientSSLUtil = new SSLUtil(new TrustAllTrustManager());
|
||||
|
||||
InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig("dc=example,dc=com");
|
||||
config.setListenerConfigs(InMemoryListenerConfig.createLDAPSConfig(
|
||||
"listen-ldaps",
|
||||
null,
|
||||
Integer.parseInt(String.valueOf(Config.ldapsPort)),
|
||||
serverSSLUtil.createSSLServerSocketFactory(),
|
||||
clientSSLUtil.createSSLSocketFactory()
|
||||
));
|
||||
config.addInMemoryOperationInterceptor(new LdapServer());
|
||||
|
||||
InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config);
|
||||
ds.startListening();
|
||||
System.out.println(ansi().render("@|green [+]|@ LDAPS Server Start Listening on >> " + Config.ldapsPort + "..."));
|
||||
} catch (Exception e) {
|
||||
log.error("e: ", e);
|
||||
}
|
||||
}
|
||||
package com.qi4l.JYso;
|
||||
|
||||
import com.qi4l.JYso.gadgets.Config.Config;
|
||||
import com.unboundid.ldap.listener.InMemoryDirectoryServer;
|
||||
import com.unboundid.ldap.listener.InMemoryDirectoryServerConfig;
|
||||
import com.unboundid.ldap.listener.InMemoryListenerConfig;
|
||||
import com.unboundid.util.ssl.KeyStoreKeyManager;
|
||||
import com.unboundid.util.ssl.SSLUtil;
|
||||
import com.unboundid.util.ssl.TrustAllTrustManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import static org.fusesource.jansi.Ansi.ansi;
|
||||
|
||||
public class LdapsServer {
|
||||
private static final Logger log = LogManager.getLogger(LdapsServer.class);
|
||||
public static boolean isRunning = false;
|
||||
private final String certFile;
|
||||
private final String keyPass;
|
||||
|
||||
public LdapsServer(String certFile, String keyPass) {
|
||||
this.certFile = certFile;
|
||||
this.keyPass = keyPass;
|
||||
}
|
||||
|
||||
public static void start() {
|
||||
System.out.println(ansi().render("@|green [+]|@ LDAPS Server Start Listening on >> " + Config.ldapsPort + "..."));
|
||||
new LdapsServer(Config.certFile, Config.keyPass).run();
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// 设置JDK信任证书
|
||||
System.setProperty("javax.net.ssl.trustStore", certFile);
|
||||
System.setProperty("javax.net.ssl.trustStorePassword", keyPass);
|
||||
|
||||
try {
|
||||
SSLUtil serverSSLUtil = new SSLUtil(
|
||||
new KeyStoreKeyManager(certFile, keyPass.toCharArray()),
|
||||
new TrustAllTrustManager()
|
||||
);
|
||||
SSLUtil clientSSLUtil = new SSLUtil(new TrustAllTrustManager());
|
||||
|
||||
InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig("dc=example,dc=com");
|
||||
config.setListenerConfigs(InMemoryListenerConfig.createLDAPSConfig(
|
||||
"listen-ldaps",
|
||||
null,
|
||||
Integer.parseInt(String.valueOf(Config.ldapsPort)),
|
||||
serverSSLUtil.createSSLServerSocketFactory(),
|
||||
clientSSLUtil.createSSLSocketFactory()
|
||||
));
|
||||
config.addInMemoryOperationInterceptor(new LdapServer());
|
||||
|
||||
InMemoryDirectoryServer ds = new InMemoryDirectoryServer(config);
|
||||
ds.startListening();
|
||||
isRunning = true;
|
||||
System.out.println(ansi().render("@|green [+]|@ LDAPS Server Start Listening on >> " + Config.ldapsPort + "..."));
|
||||
} catch (Exception e) {
|
||||
log.error("e: ", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -49,6 +49,8 @@ import static org.fusesource.jansi.Ansi.ansi;
|
||||
@SuppressWarnings("restriction")
|
||||
public class RMIServer implements Runnable {
|
||||
|
||||
public static boolean isRunning = false;
|
||||
|
||||
private final ServerSocket ss;
|
||||
private final Object waitLock = new Object();
|
||||
private final URL classpathUrl;
|
||||
@@ -66,6 +68,7 @@ public class RMIServer implements Runnable {
|
||||
try {
|
||||
System.out.println(ansi().render("@|green [+]|@ RMI Server Start Listening on >> " + rmiPort + "..."));
|
||||
RMIServer c = new RMIServer(rmiPort, new URL(url));
|
||||
isRunning = true;
|
||||
c.run();
|
||||
} catch (Exception e) {
|
||||
System.err.println("Listener error");
|
||||
|
||||
@@ -1,41 +1,44 @@
|
||||
package com.qi4l.JYso;
|
||||
|
||||
import com.qi4l.JYso.gadgets.Config.ysoserial;
|
||||
import com.qi4l.JYso.gadgets.Config.Config;
|
||||
import com.qi4l.JYso.gadgets.ObjectPayload;
|
||||
import org.apache.commons.collections4.map.CaseInsensitiveMap;
|
||||
|
||||
import static com.qi4l.JYso.gadgets.Config.Config.logo;
|
||||
|
||||
public class Starter {
|
||||
|
||||
// 用于存储所有的ObjectPayload类
|
||||
public static CaseInsensitiveMap<String, Class<? extends ObjectPayload<?>>> caseInsensitiveObjectPayloadMap = new CaseInsensitiveMap<>();
|
||||
public static boolean JYsoMode = false;
|
||||
|
||||
static {
|
||||
for (Class<? extends ObjectPayload<?>> clazz : ObjectPayload.Utils.getPayloadClasses()) {
|
||||
caseInsensitiveObjectPayloadMap.put(clazz.getName(), clazz);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// 如果参数中包含-j,则启动LDAP、HTTP、RMI服务
|
||||
if (args.length > 0 && args[0].equals("-j")) {
|
||||
logo();
|
||||
Config.applyCmdArgs(args);
|
||||
LdapServer.start();
|
||||
HTTPServer.start();
|
||||
if (Config.TLSProxy) {
|
||||
LdapsServer.start();
|
||||
}
|
||||
RMIServer.start();
|
||||
}
|
||||
|
||||
// 如果参数中包含-y,则启动 ysoserial
|
||||
if (args.length > 0 && args[0].equals("-y")) {
|
||||
JYsoMode = true;
|
||||
ysoserial.run(args);
|
||||
}
|
||||
}
|
||||
}
|
||||
package com.qi4l.JYso;
|
||||
|
||||
import com.qi4l.JYso.gadgets.Config.ysoserial;
|
||||
import com.qi4l.JYso.gadgets.Config.Config;
|
||||
import com.qi4l.JYso.gadgets.ObjectPayload;
|
||||
import com.qi4l.JYso.web.JYsoWebApplication;
|
||||
import org.apache.commons.collections4.map.CaseInsensitiveMap;
|
||||
|
||||
import static com.qi4l.JYso.gadgets.Config.Config.logo;
|
||||
|
||||
public class Starter {
|
||||
|
||||
public static CaseInsensitiveMap<String, Class<? extends ObjectPayload<?>>> caseInsensitiveObjectPayloadMap = new CaseInsensitiveMap<>();
|
||||
public static boolean JYsoMode = false;
|
||||
|
||||
static {
|
||||
for (Class<? extends ObjectPayload<?>> clazz : ObjectPayload.Utils.getPayloadClasses()) {
|
||||
caseInsensitiveObjectPayloadMap.put(clazz.getName(), clazz);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (args.length == 0 || args[0].equals("-w")) {
|
||||
JYsoWebApplication.start(args);
|
||||
return;
|
||||
}
|
||||
|
||||
if (args[0].equals("-j")) {
|
||||
logo();
|
||||
Config.applyCmdArgs(args);
|
||||
LdapServer.start();
|
||||
HTTPServer.start();
|
||||
if (Config.TLSProxy) {
|
||||
LdapsServer.start();
|
||||
}
|
||||
RMIServer.start();
|
||||
}
|
||||
|
||||
if (args[0].equals("-y")) {
|
||||
JYsoMode = true;
|
||||
ysoserial.run(args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,9 +126,7 @@ public class ysoserial {
|
||||
} catch (Throwable e) {
|
||||
System.err.println("Error while generating or serializing payload");
|
||||
log.error(String.valueOf(e));
|
||||
System.exit(1);
|
||||
}
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
public static Options getOptions() {
|
||||
|
||||
Reference in New Issue
Block a user