Java安全-CC3
CC3的目的是为了找到除invokeTransformer与Runtime#exec之外的可以实现命令执行的漏洞点
即
TemplatesImpl#newTransformer与TrAXFilter#TrAXFilter
一、主要逻辑
1.危险调用点
这里用到了之前所学的动态类加载方法defineClass,但是大部分直接实现的defineClass方法都私有的
经过寻找,我们找到了TemplatesImpl

于是可以使用他的一系列逻辑加载我们的恶意外部类
2.TemplatesImpl#newTransformer
尝试使用一个公有方法调用defineClass
defineTransletClasses这个方法调用了defineClass

将其加载参数改为恶意类
byte[] code = Files.readAllBytes(Paths.get("D:\\小川\\code\\javasec\\CC1\\target\\classes\\CC1\\HelloTranslet.class"));
setFieldValue(obj, "_bytecodes", new byte[][] {code});
此方法依旧为private,又找到getTransletInstance方法

但是需要满足图中的条件,通过反射设置
setFieldValue(obj, "_name", "HelloTemplatesImpl");
setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());
_tfactory这个参数会在TemplatesImpl反序列化的时候自行赋值

此方法依旧为private,于是找到了公开的newTransformer

这里就是最终的出口点,我们只需要调用构造好的TemplatesImpl类下的newTransformer方法,即可成功实现链路逻辑,加载恶意外部类
但是还有一点需要注意defineTransletClasses方法在加载完类后,会判断,从而影响下一步getTransletInstance的类的实例化

所以为了保证逻辑不出问题,我们在构造恶意类时需要继承与常量类,并且实现需要的方法
public class HelloTranslet extends AbstractTranslet {
尝试打通,后面具体的调用方法,我们暂时用CC6的TiedMapEntry实现
byte[] code = Files.免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)

