
Kali Docker Vulhub 靶场搭建完整指南Author: 枷锁适用环境macOS Apple Silicon (M1/M2/M3/M4) VMware Fusion Kali 2026.2 ARM64目的在 Kali 虚拟机中安装 Docker克隆 Vulhub 漏洞仓库启动/关闭靶场环境Vulhub 是什么Vulhub 是一个开源漏洞靶场集合基于 Docker 和 Docker Compose 构建。它为每个已知漏洞提供了预配置的容器化环境一行命令就能启动一个包含特定漏洞的服务无需手动搭建复杂的环境。为什么用 Vulhub传统漏洞复现需要自己搭环境找对应版本、配置数据库、改配置文件……一个漏洞环境折腾半天。Vulhub 把这一切打包成了 Docker 容器传统方式Vulhub找对应软件版本 → 手动安装docker compose up -d一键启动环境残留、系统污染容器隔离用完即删只能用一次换漏洞重装系统随时启停多个环境并存依赖冲突Java 版本、Python 版本等每个容器独立依赖文档分散不知怎么搭建每个漏洞自带 README含复现步骤Vulhub 覆盖了哪些漏洞截至 2026 年Vulhub 收录了180 个漏洞环境涵盖Java 中间件Weblogic、Tomcat、Spring、Struts2、Fastjson、Shiro、Log4j 等CMS / Web 应用Confluence、Django、Drupal、WordPress、Discuz 等大数据组件Apache Druid、Airflow、Flink、Solr、Elasticsearch 等基础设施Redis、Docker、Kubernetes、GitLab、Jenkins 等常见漏洞类型RCE、反序列化、SSRF、认证绕过、文件上传、SQL 注入等项目地址官网https://vulhub.orgGitHubhttps://github.com/vulhub/vulhub许可证MIT开源免费前置知识为什么需要这些东西Docker 是什么Docker 是一个容器引擎你可以把它理解成一个轻量级虚拟机。每个漏洞环境跑在一个独立的容器里互不干扰用完就删不会搞脏系统。为什么需要 QEMU你的 Mac 是 Apple SiliconARM64 架构Kali 虚拟机也是 ARM64 的。但很多 Vulhub 的 Docker 镜像是 x86_64amd64架构的不能直接在 ARM64 上运行。QEMU 就是一个翻译器让 ARM64 的 CPU 能执行 x86_64 的指令。装了qemu-user-static之后Docker 会自动调用 QEMU 来模拟运行 x86 镜像。┌─────────────────────────────────────────┐ │ Mac (Apple Silicon ARM64) │ │ ┌───────────────────────────────────┐ │ │ │ VMware Fusion │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │ Kali VM (ARM64) │ │ │ │ │ │ ┌───────────────────────┐ │ │ │ │ │ │ │ Docker 容器 (x86_64) │ │ │ │ │ │ │ │ 通过 QEMU 模拟运行 │ │ │ │ │ │ │ └───────────────────────┘ │ │ │ │ │ └─────────────────────────────┘ │ │ │ └───────────────────────────────────┘ │ └─────────────────────────────────────────┘网络是怎么通的Mac 浏览器 ── 172.16.25.139:8080 ── Kali ── Docker 容器 :8080Kali 用的是 VMware NAT 网络IP 固定为 172.16.25.139。Docker 启动容器时把容器的 8080 端口映射到 Kali 的 8080 端口所以 Mac 访问 Kali 的 8080 就等于访问容器里的漏洞服务。第一步安装 Docker以下所有命令在 Kali 终端中执行。1.1 更新软件包列表sudoaptupdate解释从软件源拉取最新的软件包索引。sudo表示以 root 权限执行。每次安装新软件前都应该先跑这条。预期输出已下载 72.5 MB耗时 14秒 (5,068 kB/s) 正在读取软件包列表... 正在分析软件包的依赖关系树... 正在读取状态信息... 所有软件包均为最新。1.2 安装 Docker 引擎和 Docker Composesudoaptinstall-ydocker.iodocker-compose解释apt install 安装软件包-y 自动回答 yes不用手动确认docker.io Docker 引擎本身docker-compose 编排工具用 yml 配置文件一键启动整个环境预期输出会列出所有要安装的依赖包最后显示安装完成。大约需要 1-2 分钟。1.3 启动 Docker 服务并设为开机自启sudosystemctlenabledocker--now解释systemctl enable 设置服务开机自动启动--now 现在就启动等同于enablestart两条命令服务名是docker不是docker.io1.4 把 kali 用户加入 docker 组sudousermod-aGdockerkali解释usermod 修改用户属性-aG docker 将用户追加append到 docker 组默认情况下只有 root 能操作 Docker把 kali 加入 docker 组后kali 用户也能直接跑docker命令不需要每次加sudo注意这条命令执行后不会立即生效需要重新加载用户组。1.5 刷新当前终端的用户组不需要注销newgrpdocker解释newgrp docker会在当前 shell 中开启一个子 shell使用新的组权限。执行完后当前终端就可以不用sudo直接操作 Docker 了。替代方案直接注销 Kali 再重新登录组权限会自动加载。第二步安装跨架构模拟器 QEMU2.1 安装sudoaptinstall-yqemu-user-static binfmt-support解释qemu-user-static QEMU 用户模式静态二进制让 ARM64 系统能运行 x86_64 程序binfmt-support 二进制格式支持告诉 Linux 内核遇到 x86_64 程序时自动调用 QEMU2.2 验证 QEMU 已生效ls/proc/sys/fs/binfmt_misc/预期输出看到qemu-x86_64字样的条目说明 x86 模拟已注册。第三步验证 Docker 安装3.1 查看 Docker 版本docker--version解释如果 Docker 装好了这条命令会输出版本号。预期输出Docker version 28.5.2dfsg4, build 9cc6dea35e9a3.2 查看 Docker 服务运行状态sudosystemctl statusdocker解释检查 Docker 守护进程是否在运行。active (running)表示正常运行。预期输出关键行Active: active (running) since ...按q退出状态查看。第四步克隆 Vulhub 到 Kali 桌面4.1 安装 git如果还没装sudoaptinstall-ygit4.2 浅克隆 Vulhub 仓库gitclone--depth1https://github.com/vulhub/vulhub.git ~/桌面/vulhub逐词解释git clone 从远程仓库下载代码--depth 1 只下载最新版本不下载历史提交记录。Vulhub 仓库很大完整克隆会很慢浅克隆体积小、速度快https://github.com/vulhub/vulhub.git 仓库地址~/桌面/vulhub 保存到 Kali 桌面上的vulhub文件夹~是当前用户的家目录预期输出正克隆到 /home/kali/桌面/vulhub... remote: Enumerating objects: ... ...大约 1-2 分钟克隆完成。4.3 查看克隆结果ls~/桌面/vulhub/预期输出150 个文件夹每个文件夹对应一个应用或中间件。1panel apache-druid confluence django ... activemq apisix couchdb discuz ... adminer cacti craftcms flink ... ...每个文件夹里面有具体的漏洞编号子文件夹比如tomcat/CVE-2017-12615。4.4 快速浏览某个漏洞目录ls~/桌面/vulhub/tomcat/预期输出CVE-2017-12615 CVE-2020-1938 CVE-2025-24813 CVE-2026-34486 tomcat8每个 CVE 编号文件夹里都有一个docker-compose.yml和一个README.md。第五步启动靶场完整演示下面以Tomcat CVE-2017-12615Tomcat 任意文件写入漏洞可 getshell为例完整演示启动过程。5.1 进入漏洞目录cd~/桌面/vulhub/tomcat/CVE-2017-12615解释所有 Docker Compose 命令都必须在包含docker-compose.yml的目录下执行。5.2 查看目录里有什么ls-la预期输出-rw-r--r-- 1 kali kali 374 6月 28 16:49 Dockerfile -rw-r--r-- 1 kali kali 545 6月 28 16:49 docker-compose.yml -rw-r--r-- 1 kali kali 1234 6月 28 16:49 README.mddocker-compose.yml 编排文件定义了用哪个镜像、开哪个端口Dockerfile 描述了如何构建镜像README.md 漏洞说明和利用方法5.3 查看 docker-compose.yml 的内容catdocker-compose.yml预期输出version:2services:tomcat:build:.ports:-8080:8080逐行解释version: 2 Compose 文件格式版本services: 定义服务列表tomcat: 服务名称build: . 从当前目录的 Dockerfile 构建镜像而不是从仓库拉取ports: 8080:8080端口映射把容器的 8080 端口映射到 Kali 的 8080 端口。左边是 Kali 端口右边是容器端口5.4 启动靶场sudodockercompose up-d逐词解释sudo Docker 组还没生效的话需要用 sudo之前newgrp docker生效了的可以不加docker compose Docker Compose 命令up 启动服务-d detached 模式后台运行。如果不加-d终端会被日志占满CtrlC 就会停止容器预期输出[] Building 23.3s [] Running 2/2 ✔ Network cve-2017-12615_default Created ✔ Container cve-2017-12615-tomcat-1 Started如果看到exec format error回到第二步安装 QEMU。如果看到platform (linux/amd64) does not match的警告但容器仍然启动了这是正常的——QEMU 正在模拟。5.5 确认容器正在运行sudodockerps逐词解释docker ps 列出所有正在运行的容器不加sudo的前提是已经加入 docker 组且重新登录了预期输出CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee4df86bbdd4 cve-2017-12615-tomcat catalina.sh run 10 seconds ago Up 10 seconds 0.0.0.0:8080-8080/tcp, [::]:8080-8080/tcp cve-2017-12615-tomcat-1各列解释CONTAINER ID 容器唯一 ID缩写IMAGE 使用的镜像名COMMAND 容器启动时执行的命令CREATED 容器创建时间STATUS 运行状态Up表示正在运行PORTS 端口映射0.0.0.0:8080-8080/tcp表示 Kali 的 8080 端口所有网卡转发到容器的 8080 端口NAMES 容器名称5.6 验证服务可访问在 Kali 内测试curl-Ihttp://localhost:8080/逐词解释curl 命令行 HTTP 客户端-I 只获取 HTTP 响应头不下载页面内容http://localhost:8080/ Kali 本机的 8080 端口预期输出HTTP/1.1 200 Content-Type: text/html;charsetUTF-8 ...看到HTTP/1.1 200说明 Tomcat 服务正常运行。5.7 查看容器日志sudodockerlogs cve-2017-12615-tomcat-1解释docker logs加上容器名可以查看该容器的标准输出。容器名从docker ps的NAMES列获取。第六步从 Mac 访问靶场6.1 在 Mac 浏览器打开Kali 静态 IP 是172.16.25.139容器映射的端口是 8080所以在 Mac 浏览器地址栏输入http://172.16.25.139:8080就能看到 Tomcat 的欢迎页面。、6.2 通信路径图┌──────────────────────────────────────────────────┐ │ 你的 Mac │ │ │ │ 浏览器输入 http://172.16.25.139:8080 ─────────┐ │ │ │ │ └────────────────────────────────────────────────│──┘ │ VMware NAT 网络 (vmnet8) │ │ ┌────────────────────────────────────────────────│──┐ │ Kali VM (172.16.25.139) │ │ │ ▼ │ │ Docker 端口映射 (0.0.0.0:8080) │ │ │ │ │ ▼ │ │ Tomcat 容器 (内部 :8080) │ └────────────────────────────────────────────────────┘第七步关闭靶场7.1 停止并删除容器cd~/桌面/vulhub/tomcat/CVE-2017-12615sudodockercompose down逐词解释必须先cd到包含docker-compose.yml的目录docker compose down 停止容器 删除容器 删除创建的网络。比docker stop清理得更彻底预期输出[] Running 2/2 ✔ Container cve-2017-12615-tomcat-1 Removed ✔ Network cve-2017-12615_default Removed7.2 验证容器已删除sudodockerps预期输出CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES表头下面什么都没有说明没有运行中的容器。7.3 查看所有容器包括已停止的sudodockerps-a解释-a all显示所有状态的容器。如果down执行正确这里也看不到之前的 Tomcat 容器了。7.4 彻底清理磁盘空间可选sudodockersystem prune-a逐词解释docker system prune 清理未使用的 Docker 资源-a 包括未使用的镜像不仅仅是悬空镜像执行前会提示确认WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all images without at least one container associated to them - all build cache Are you sure you want to continue? [y/N]输入y确认。注意这会删除所有已停止的容器和未使用的镜像下次启动靶场时需要重新下载/构建镜像。第八步更多靶场示例8.1 Weblogic CVE-2017-10271反序列化 RCEcd~/桌面/vulhub/weblogic/CVE-2017-10271sudodockercompose up-d访问http://172.16.25.139:7001Weblogic 启动较慢1-2 分钟用sudo docker logs -f 容器名查看实时日志看到Server started in RUNNING mode就启动了。8.2 Spring Cloud Gateway RCECVE-2022-22947cd~/桌面/vulhub/spring/CVE-2022-22947sudodockercompose up-d访问http://172.16.25.139:80808.3 Confluence OGNL 注入 RCECVE-2022-26134cd~/桌面/vulhub/confluence/CVE-2022-26134sudodockercompose up-d访问http://172.16.25.139:80908.4 同时跑多个靶场不同漏洞环境用不同端口可以同时启动# 启动 Tomcat8080cd~/桌面/vulhub/tomcat/CVE-2017-12615sudodockercompose up-d# 启动 Weblogic7001cd~/桌面/vulhub/weblogic/CVE-2017-10271sudodockercompose up-d# 启动 Spring8080 端口冲突需要先改 docker-compose.ymlcd~/桌面/vulhub/spring/CVE-2022-22947# 编辑 docker-compose.yml把 8080:8080 改成 8081:8080sudodockercompose up-d查看所有正在运行的容器sudodockerps第九步常用 Docker 命令速查容器管理命令作用示例docker ps列出运行中的容器sudo docker psdocker ps -a列出所有容器含已停止sudo docker ps -adocker start 容器名启动已停止的容器sudo docker start cve-xxxdocker stop 容器名停止运行中的容器sudo docker stop cve-xxxdocker restart 容器名重启容器sudo docker restart cve-xxxdocker rm 容器名删除已停止的容器sudo docker rm cve-xxxdocker rm -f 容器名强制删除容器即使运行中sudo docker rm -f cve-xxxdocker stop $(docker ps -q)停止所有运行中的容器sudo docker stop $(sudo docker ps -q)日志和调试命令作用示例docker logs 容器名查看容器日志sudo docker logs cve-xxxdocker logs -f 容器名实时跟踪日志sudo docker logs -f cve-xxxdocker logs --tail 50 容器名查看最近 50 行日志sudo docker logs --tail 50 cve-xxxdocker exec -it 容器名 /bin/bash进入容器的 shellsudo docker exec -it cve-xxx /bin/bashdocker inspect 容器名查看容器详细信息sudo docker inspect cve-xxx镜像管理命令作用示例docker images列出本地所有镜像sudo docker imagesdocker rmi 镜像名删除镜像sudo docker rmi cve-2017-12615-tomcatdocker pull 镜像名从仓库拉取镜像sudo docker pull tomcat:8.5.19Compose 命令命令作用示例docker compose up -d后台启动服务sudo docker compose up -ddocker compose down停止并删除服务sudo docker compose downdocker compose ps查看 Compose 启动的容器sudo docker compose psdocker compose logs查看 Compose 服务日志sudo docker compose logsdocker compose restart重启服务sudo docker compose restartdocker compose up -d --build重新构建并启动sudo docker compose up -d --build空间管理命令作用docker system df查看 Docker 占用的磁盘空间docker system prune清理停止的容器、未使用的网络docker system prune -a清理所有未使用的资源含镜像第十步常见问题排查Q1docker compose up -d报exec format error原因镜像是 x86_64 架构但没有安装 QEMU 模拟器。解决sudoaptinstall-yqemu-user-static binfmt-support然后重新启动sudodockercompose downsudodockercompose up-dQ2docker ps报permission denied原因kali 用户不在 docker 组中。解决sudousermod-aGdockerkali newgrpdocker或者每次命令前加sudo。Q3docker compose up -d报端口已被占用原因另一个容器或服务已经在使用同一个端口。排查是哪个进程占用了端口sudoss-tlnp|grep8080解决方案一停止占用端口的容器sudodockerps# 找到占用端口的容器sudodockerstop容器名解决方案二修改端口映射# 编辑 docker-compose.ymlvimdocker-compose.yml# 把 8080:8080 改成 8081:8080# 然后重新启动sudodockercompose up-dQ4容器启动后 curl 连不上原因服务可能还没完全启动。排查步骤# 1. 先确认容器确实在运行sudodockerps# 2. 查看容器日志看服务启动到哪一步了sudodockerlogs容器名# 3. 等几秒再试sleep5curl-Ihttp://localhost:8080/Weblogic、Confluence 等重型应用可能需要 2-3 分钟才能完全启动。Q5从 Mac 浏览器打不开http://172.16.25.139:8080排查步骤# 1. Mac 终端 ping Kaliping172.16.25.139# 2. Kali 终端确认容器在运行sudodockerps# 3. Kali 终端确认端口在监听sudoss-tlnp|grep8080# 4. Mac 终端测试端口curl-Ihttp://172.16.25.139:8080/Q6VMware Fusion 重启后 Docker 容器都没了原因docker compose down或系统重启会停止容器但不会自动删除。解决容器停止后可以用docker compose up -d重新启动不需要重新下载镜像cd~/桌面/vulhub/tomcat/CVE-2017-12615sudodockercompose up-d如果想让容器在 Kali 开机时自动启动在docker-compose.yml中添加restart: always。Q7下载镜像很慢原因Docker Hub 默认从国外拉取。解决配置国内镜像加速sudomkdir-p/etc/dockersudotee/etc/docker/daemon.jsonEOF { registry-mirrors: [ https://mirror.ustc.edu.cn/dockerhub, https://docker.mirrors.ustc.edu.cn ] } EOFsudosystemctl restartdocker