ruoyi利用bypatch进行rce
0x01 前因
r0ser1大哥前几天发表了ruoyi的定时任务的最新利用,在此大哥也说了这种利用不太完美,所以我就顺着大哥的思路进行学习。
0x02 ruoyi 绕过定时任务点
因为大哥的文章很完整,我这就随便搞一下
com.ruoyi.quartz.controller.SysJobController#addSave
可以看到定时任务主要先检测黑名单后在检测白名单。通过后在存到数据库
com.ruoyi.common.utils.StringUtils#containsAnyIgnoreCase

从这里看到,我们只需要不在黑名单中,然后包含白名单就行。

对应的黑白名单
com.ruoyi.quartz.util.JobInvokeUtil#getMethodParams

从这里知道我们可以通过定时任务调用string、boolean、long、doule、Integer类型。
0x03 思考
根据上面的分析,要不在黑名单,且要包含白名单,我第一时间想到的就是json和jdbc,这两个可以把白名单搞里头。
com.mchange.v1.db.sql.ConnectionBundlePoolBean#init

jdbc我找到了这个,但是这里是int类型,而定时任务调用的是Integer,这里获取不到这个函数。g
json我就找到了fastjson,但是这里环境是1.2.83
com.alibaba.fastjson.JSONObject.parseObject
这里还找了很多,有兴趣的可以试试,给个提示,就是子类也可以去调用abstrct父类的方法。也许从做个点去找。
然后在大哥文章提供函数。
ch.qos.logback.core.rolling.helper.RenameUtil.renameByCopying 复制文件

ch.qos.logback.core.FileAppender.openFile 可以创建一个目录或者


com.sun.glass.utils.NativeLibLoader.loadLibrary(不是所有jdk有) 加载so/dll 。
0x04 枯木逢春
Author:https://flowerwind.github.io/,在大哥博客看到了fasthjson1.2.83下的利用。

jdk.nashorn.tools.Shell

这里我用构造函数无法使用,所以改成set方法后可以进行出发。
这里我加了一点功能,然后把这个恶意类编译后替换原本的nashorn.jar。这样我们就可以借助上次,然后利用ch.qos.logback.core.rolling.helper.RenameUtil.renameByCopying 写入到jre/ext/lib。
然后利用定时任务调用fj进行触发。 其实这里也不用nashorn吧,自己找下jre/lib、 jre/lib/ext 中jar包,进行替代。
0x05 复现
http://192.168.0.104:8083/monitor/server

拿到项目和jre目录、
http://192.168.0.104:8083/common/upload

拿到上传目录
http://192.168.0.104:8083/monitor/job/edit

调用ch.qos.logback.core.rolling.helper.RenameUtil.renameByCopying 替换nashorn.jar


这里特地写了一个url类去加载。我们可以上传class的base64,因为这个调用字符在sql数据库,有长度限制。
然后用file或者http去加载

对了写lib需要root。

要是jre目录下存在classes文件夹,直接写这里最好了
Reference
https://wx.zsxq.com/group/51112822555244/topic/2852241188548821