1. 项目概述为什么要在Kali上搞个AWD训练场如果你对网络安全感兴趣或者已经是个CTFCapture The Flag爱好者那你肯定听说过AWDAttack With Defense攻防赛。这种比赛模式特别刺激它不像传统的CTF那样只让你攻击一个静态的靶机而是给你一个带漏洞的服务器通常是一个Web应用你需要一边修补自己服务器的漏洞一边去攻击对手的服务器。整个过程实时对抗紧张感拉满。但问题来了对于新手来说AWD的门槛不低。首先你很难找到一个稳定、随时可用的真实AWD环境来练习。其次即使找到了环境配置、依赖安装、漏洞复现这些前期准备工作就足以劝退一大半人。更别提很多公开的练习平台题目类型固定缺乏灵活性无法针对性地训练自己的短板。这就是为什么我强烈推荐你自己动手用Docker在Kali Linux上搭建一个AWD训练平台。听起来有点技术含量别怕这正是本文要解决的问题。我将带你一步步走完整个过程即使你之前没怎么用过Docker或者对Kali Linux只是略知一二也能跟着做下来。这个方案的核心优势在于环境隔离与纯净Docker容器保证了每个训练靶场环境的独立性。你可以在几分钟内启动一个全新的、包含特定漏洞的靶机练完就删不留任何“垃圾”在宿主机上下次练习又是一个干净的环境。高度可定制你可以从Docker Hub上拉取现成的漏洞靶场镜像也可以基于官方镜像如Ubuntu, CentOS自己构建包含特定漏洞的环境。想练什么类型的漏洞SQL注入、文件上传、命令执行等就搭什么样的环境。资源占用低启动快相比完整的虚拟机Docker容器轻量得多在个人电脑上也能轻松运行多个靶机模拟多队对抗的场景。与Kali无缝集成Kali Linux本身就是渗透测试的“瑞士军刀”集成了海量工具。在Kali宿主机上运行Docker靶场你可以直接使用Burp Suite、Nmap、Sqlmap等工具进行攻击测试体验最接近真实比赛的流程。简单说这个项目就是让你拥有一个私人的、可随时重置的、想练什么就练什么的AWD攻防训练场。接下来我们从最基础的准备工作开始。1.1 核心需求与工具选型解析在动手之前我们先明确一下我们需要什么以及为什么选择这些工具。核心需求清单一个Linux操作系统作为宿主机这是运行一切的基础。我们选择Kali Linux因为它预装了绝大多数我们需要的安全工具省去了大量配置时间。你可以用实体机安装也可以用VMware或VirtualBox安装虚拟机。容器化引擎用于创建和管理我们的靶场环境。毫无疑问选择Docker。它是目前最流行、生态最完善的容器平台有海量的现成镜像可供使用。漏洞靶场镜像这是我们训练的核心“教材”。我们将从Docker Hub等镜像仓库拉取别人已经制作好的、包含漏洞的Web应用镜像。例如vulhub/xxx,web-dvwa等。网络配置工具为了让多个靶场容器能相互通信模拟攻击对手同时宿主机Kali也能访问它们我们需要对Docker的网络进行简单配置。辅助脚本可选但推荐用于快速启动、停止、重置多个容器管理比赛流程。为什么是Kali Docker这个组合效率最大化Kali负责“攻击方”的所有工具Docker负责“防守方”靶机的环境供给。两者分工明确在单一系统内完成闭环。学习路径平滑通过搭建这个过程你不仅能练习AWD技巧还能实战学习Docker的基本操作和网络知识这些都是现代安全运维和渗透测试的必备技能。社区支持强大无论是Kali的社区还是Docker的生态当你遇到问题时都能很容易地找到解决方案和现成的资源。2. 环境准备在Kali Linux上安装与配置Docker万事开头难但这一步其实很简单。我们将确保Kali系统是最新的然后安装Docker引擎。2.1 更新系统与安装必要依赖首先打开你的Kali Linux终端。建议先切换到root用户或者在所有命令前加上sudo。# 1. 更新软件包列表确保获取到最新的源信息 apt update # 2. 进行全系统升级安装所有可用的更新 apt full-upgrade -y # 3. 安装一些后续可能需要的工具如https传输、CA证书等 apt install -y apt-transport-https ca-certificates curl gnupg lsb-release注意apt full-upgrade比apt upgrade更彻底它会处理软件包依赖关系的变更。在Kali这种滚动更新的系统上定期全升级是个好习惯。2.2 安装Docker引擎Docker官方提供了便捷的安装脚本但我们更推荐使用添加Docker官方APT仓库的方式这样便于后续管理和更新。# 1. 添加Docker的官方GPG密钥用于验证软件包的完整性 curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 2. 设置稳定的Docker APT仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable | tee /etc/apt/sources.list.d/docker.list /dev/null # 3. 再次更新APT源使新增的Docker仓库生效 apt update # 4. 安装Docker引擎、命令行工具以及容器运行时containerd apt install -y docker-ce docker-ce-cli containerd.io安装完成后运行下面的命令验证Docker是否安装成功。如果看到客户端和服务端的版本信息说明安装正确。docker --version2.3 配置Docker服务与用户组默认情况下运行Docker命令需要root权限。为了安全和使用方便我们通常将当前用户添加到docker用户组这样以后就不用每次都加sudo了。# 1. 启动Docker服务并设置为开机自启 systemctl start docker systemctl enable docker # 2. 将当前用户假设是kali添加到docker组 usermod -aG docker $USER # 3. 为了让组权限更改立即生效你需要注销并重新登录或者使用以下命令在新终端中生效 newgrp docker执行完newgrp docker后最好关闭当前终端重新打开一个新的。然后尝试运行一个不需要sudo的Docker命令来测试docker run hello-world如果这个命令能成功运行并输出一段“Hello from Docker!”的欢迎信息那么恭喜你Docker已经准备就绪。这个命令会从Docker Hub拉取一个极小的测试镜像并运行它。实操心得如果遇到Got permission denied错误通常是因为组权限没有刷新。确保执行了newgrp docker并开启了新的终端会话。如果还不行可以尝试重启系统。2.4 可选但重要配置Docker镜像加速器由于Docker Hub的服务器在国外直接从那里拉取镜像速度可能很慢甚至失败。我们可以配置一个国内的镜像加速器。这里以阿里云镜像加速器为例你需要有一个阿里云账号注册是免费的访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors登录后你会看到为你分配的专属加速器地址格式如https://xxxx.mirror.aliyuncs.com。在Kali上编辑Docker的配置文件# 如果文件不存在会新建 sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [你的专属加速器地址] } EOF重启Docker服务使配置生效sudo systemctl daemon-reload sudo systemctl restart docker配置完成后后续拉取镜像的速度会有显著提升。3. 核心环节拉取与运行漏洞靶场镜像环境搭好了现在我们来“进货”——获取我们的训练靶场。Docker Hub上有大量安全研究人员和维护者制作好的漏洞环境镜像我们直接拿来用就行。3.1 探索与选择漏洞镜像你可以把Docker Hub想象成一个巨大的“应用商店”。我们使用docker search命令来查找感兴趣的靶场。# 搜索包含 ‘vuln’ (漏洞) 关键词的镜像 docker search vuln # 搜索更具体的比如 ‘dvwa’ (Damn Vulnerable Web Application) docker search dvwa搜索结果会显示镜像名、描述、星标数等。星标数通常代表受欢迎程度和可靠性。这里我推荐几个非常适合AWD新手入门的经典漏洞环境DVWA (Damn Vulnerable Web Application) 一个故意设计成充满漏洞的PHP/MySQL应用涵盖SQL注入、文件上传、命令执行等十大常见漏洞且有低、中、高三种安全等级是绝佳的练习对象。常用镜像vulnerables/web-dvwaWebGoat OWASP维护的一个故意不安全的Java Web应用课程式设计每个漏洞都有详细说明和练习目标。常用镜像webgoat/webgoatVulhub 这不是一个镜像而是一个开源项目提供了上百个不同漏洞环境的Docker Compose配置文件。你可以把它克隆到本地然后一键启动任意一个漏洞环境极其强大。项目地址https://github.com/vulhub/vulhub为了演示我们以DVWA为例。3.2 拉取并运行第一个靶场DVWA# 1. 拉取DVWA镜像 docker pull vulnerables/web-dvwa # 2. 运行DVWA容器 docker run -d -p 8080:80 --name my_dvwa vulnerables/web-dvwa让我们拆解一下docker run命令的参数-d 让容器在“后台”运行。-p 8080:80 端口映射。将宿主机的8080端口映射到容器的80端口Web服务默认端口。这意味着你在浏览器访问http://你的Kali-IP:8080就能看到DVWA了。--name my_dvwa 给这个容器起一个名字方便后续管理启动、停止、进入等。vulnerables/web-dvwa 指定要运行的镜像名。运行后使用docker ps命令查看正在运行的容器应该能看到my_dvwa的状态是Up。现在打开Kali上的浏览器如Firefox访问http://127.0.0.1:8080。你应该能看到DVWA的安装/登录页面。首次访问可能需要点击“Create / Reset Database”按钮来初始化数据库然后使用默认账号admin/password登录。恭喜你的第一个私人漏洞靶场已经上线了。你可以在这里练习各种攻击手法。3.3 管理容器基础命令速查学会运行还要学会管理。这几个命令你会频繁用到# 查看正在运行的容器 docker ps # 查看所有容器包括已停止的 docker ps -a # 停止一个运行中的容器 docker stop my_dvwa # 启动一个已停止的容器 docker start my_dvwa # 重启容器 docker restart my_dvwa # 删除一个已停止的容器加 -f 可强制删除运行中的 docker rm my_dvwa # 删除镜像需先删除依赖它的所有容器 docker rmi vulnerables/web-dvwa # 进入容器的命令行终端就像SSH进一台服务器 docker exec -it my_dvwa /bin/bash注意事项docker run每次都会创建一个新的容器。如果你只是想重新启动之前创建过的容器请用docker start。直接再次docker run会导致你拥有多个同名容器除非你用--rm参数让容器停止后自动删除造成混乱。4. 模拟真实AWD场景多靶场与网络配置单机练习只是第一步。真实的AWD是多人多机的对抗。我们需要模拟出多个队伍多个靶机的环境并且让它们处于同一个网络下可以相互攻击。4.1 创建自定义的Docker网络Docker默认有三种网络模式bridge桥接默认、host主机、none无。为了隔离和方便管理我们创建一个自定义的桥接网络。# 创建一个名为 ‘awd_net’ 的自定义网络并指定子网段 docker network create --subnet172.20.0.0/24 awd_net--subnet172.20.0.0/24 为这个网络指定了一个IP地址范围172.20.0.1 到 172.20.0.254。这很重要因为我们需要为每个“队伍”的容器分配固定的IP以便于攻击时指定目标。使用docker network ls可以查看所有网络docker network inspect awd_net可以查看这个网络的详细信息。4.2 启动多个“队伍”靶场并加入网络现在我们模拟两支队伍Team A 和 Team B。我们启动两个DVWA容器分别赋予它们固定的IP并加入awd_net。# 启动 Team A 的靶机 docker run -d \ --name team_a \ --network awd_net \ --ip 172.20.0.10 \ -p 8081:80 \ vulnerables/web-dvwa # 启动 Team B 的靶机 docker run -d \ --name team_b \ --network awd_net \ --ip 172.20.0.20 \ -p 8082:80 \ vulnerables/web-dvwa解释新参数--network awd_net 指定容器加入我们刚创建的自定义网络。--ip 172.20.0.10 为容器指定一个固定的IP地址。这样在容器内部team_a的IP就是172.20.0.10team_b是172.20.0.20。-p 8081:80 将宿主机的不同端口映射到容器的80端口这样我们才能从宿主机浏览器分别访问它们。Team A 通过http://127.0.0.1:8081访问Team B 通过http://127.0.0.1:8082访问。现在一个简单的“双队对抗”环境就搭建好了。关键点来了在真实的AWD比赛中你攻击的是对手服务器的IP和端口。在这个模拟环境里从Kali宿主机攻击机的角度你可以通过127.0.0.1:8081和127.0.0.1:8082访问两个靶场进行漏洞分析和攻击测试。从容器内部模拟比赛环境的角度如果team_a容器里的一个漏洞利用脚本想攻击team_b它应该指向的地址是http://172.20.0.20:80。因为它们在同一个Docker网络awd_net内可以通过IP直接通信。4.3 编写漏洞利用与修补脚本模拟攻防这才是训练的核心。假设DVWA的“SQL Injection”关卡存在漏洞。现在你需要完成两件事攻击脚本编写一个Python脚本自动化利用这个漏洞从team_b(172.20.0.20) 获取数据比如flag。修补方案在team_a自己的服务器上找到漏洞代码并修复它防止被team_b以同样方式攻击。示例一个简单的SQL注入攻击脚本Python#!/usr/bin/env python3 import requests import sys # 目标地址模拟从team_a攻击team_b target_url http://172.20.0.20/vulnerabilities/sqli/ # 假设我们知道漏洞点在 ‘id’ 参数使用基于错误的注入 payload {id: 1 AND 1CONCAT(1,(SELECT database())) -- , Submit: Submit} # 需要携带登录后的Cookie实际操作中需先模拟登录获取session cookies {PHPSESSID: 你的session_id, security: low} try: response requests.get(target_url, paramspayload, cookiescookies) # 这里需要根据实际返回页面的内容来提取信息例如通过正则匹配 if error in response.text: # 从错误信息中提取数据库名等 print([] 可能存在SQL注入漏洞) # 进一步解析response.text... else: print([-] 未发现明显注入特征) except Exception as e: print(f[-] 请求失败: {e})修补示例进入容器修改源码# 1. 进入 team_a 的容器 docker exec -it team_a /bin/bash # 2. 找到DVWA的SQL注入漏洞文件路径可能因镜像而异通常在 /var/www/html/vulnerabilities/sqli/ cd /var/www/html/vulnerabilities/sqli/ # 3. 备份原文件 cp source/low.php source/low.php.bak # 4. 编辑源码将不安全的查询方式改为使用预处理语句PDO或mysqli # 例如找到类似 $id $_GET[id]; $query SELECT * FROM users WHERE id$id; 的代码 # 将其修改为使用参数化查询 # 这是一个需要你真正理解漏洞和修复技术的步骤也是AWD防守的核心。 # 5. 修改后退出容器 exit核心技巧在真实AWD中时间就是分数。你的攻击脚本要快、准、稳你的修补要彻底且不影响服务正常运行。平时练习时就要养成“一手攻击一手防御”的思维习惯。为每个常见漏洞如文件上传、命令执行都准备好自己的“武器库”EXP脚本和“补丁包”修复代码片段。5. 高阶搭建使用Docker Compose编排复杂靶场当你需要启动一个由多个服务如Web服务器、数据库、缓存组成的复杂漏洞环境时一个个docker run命令会非常繁琐。这时就需要Docker Compose。它通过一个YAML文件来定义和运行多容器应用。5.1 安装Docker Compose# 从Github下载最新稳定版的Docker Compose二进制文件 sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version5.2 使用Vulhub一键搭建复杂环境Vulhub项目完美利用了Docker Compose。我们以部署一个经典的CVE-2017-12615(Apache Tomcat PUT方法任意文件上传) 漏洞环境为例。# 1. 克隆Vulhub仓库到本地如果没装git先运行 apt install git -y git clone https://github.com/vulhub/vulhub.git cd vulhub # 2. 进入特定的漏洞环境目录 cd tomcat/CVE-2017-12615 # 3. 查看 docker-compose.yml 文件了解它会启动什么 cat docker-compose.yml # 通常内容很简单定义了Tomcat镜像和映射端口。 # 4. 一键启动环境会在后台下载镜像并启动 docker-compose up -d执行后Docker Compose会根据docker-compose.yml文件的描述自动拉取Tomcat镜像创建网络启动容器。你通常只需要访问它提示的端口比如http://127.0.0.1:8080就可以开始测试漏洞了。管理Compose项目# 查看由当前目录下docker-compose.yml管理的容器状态 docker-compose ps # 停止并移除所有相关容器、网络但保留镜像和卷 docker-compose down # 停止并移除所有相关容器、网络、卷数据也会被清理 docker-compose down -v使用Vulhub你可以轻松搭建数百种不同的漏洞环境从Web到系统从中间件到数据库极大地丰富了你的训练题库。5.3 编写自己的docker-compose.yml模拟多队AWD你也可以自己编写Compose文件来定义一场多队的AWD比赛。下面是一个简化版的示例定义了两个队伍每个队伍包含一个Web应用和一个独立的数据库更贴近真实场景。# docker-compose.awd.yml version: 3 services: team1_web: image: vulnerables/web-dvwa container_name: awd_team1_web networks: awd_network: ipv4_address: 172.22.0.10 ports: - 10001:80 # 宿主机端口映射方便外部访问检查 depends_on: - team1_db # 可以在这里定义环境变量如数据库连接字符串 environment: - MYSQL_HOSTteam1_db team1_db: image: mysql:5.7 container_name: awd_team1_db networks: awd_network: ipv4_address: 172.22.0.11 environment: - MYSQL_ROOT_PASSWORDroot_pass_team1 - MYSQL_DATABASEdvwa - MYSQL_USERdvwa - MYSQL_PASSWORDpssw0rd # 将数据卷挂载到本地防止容器删除后数据丢失 volumes: - ./data/team1_db:/var/lib/mysql team2_web: image: vulnerables/web-dvwa container_name: awd_team2_web networks: awd_network: ipv4_address: 172.22.0.20 ports: - 10002:80 depends_on: - team2_db environment: - MYSQL_HOSTteam2_db team2_db: image: mysql:5.7 container_name: awd_team2_db networks: awd_network: ipv4_address: 172.22.0.21 environment: - MYSQL_ROOT_PASSWORDroot_pass_team2 - MYSQL_DATABASEdvwa - MYSQL_USERdvwa - MYSQL_PASSWORDpssw0rd volumes: - ./data/team2_db:/var/lib/mysql # 定义自定义网络并指定子网 networks: awd_network: driver: bridge ipam: config: - subnet: 172.22.0.0/24保存这个文件为docker-compose.awd.yml然后在同一目录下运行# 启动整个AWD环境 docker-compose -f docker-compose.awd.yml up -d # 查看状态 docker-compose -f docker-compose.awd.yml ps # 停止并清理 docker-compose -f docker-compose.awd.yml down -v这个环境更复杂也更接近真实比赛。每个队伍的应用和数据库在独立的子网IP上你可以编写更复杂的攻击链脚本例如通过Web漏洞获取数据库权限。6. 实战演练流程与经验技巧平台搭好了怎么用它进行有效的训练呢这里分享一套我常用的个人训练流程和技巧。6.1 单人训练流程环境启动使用Docker或Docker Compose启动一个靶场如DVWA。信息收集用浏览器访问用Nmap扫描端口用Dirb/Dirsearch扫描目录全面了解目标。漏洞挖掘手动或使用工具如Burp Suite、Sqlmap对每个功能点进行测试。从低安全等级开始。编写利用脚本一旦确认漏洞立即用Python等语言编写自动化利用脚本EXP。脚本要能稳定获取Flag或执行特定命令。漏洞修复切换到“防守方”视角。分析漏洞代码思考修复方案。然后进入容器修改源代码。修改后要测试功能是否正常。验证与反思用自己写的攻击脚本测试修复后的靶机确认漏洞是否被成功修补。思考是否有绕过修复的方法。环境重置练习完毕docker-compose down -v或docker rm -f删除容器下次练习又是一个全新的开始。6.2 多人模拟对抗训练找一两个朋友按照以下步骤统一环境所有人使用相同的docker-compose.yml文件启动环境确保靶场一致。分配角色每人负责防守自己的靶机例如你防守team_a同时攻击其他人的靶机。设置Flag约定好Flag的格式和存放位置例如在/flag文件里或者数据库的某个字段里。可以定时如每5分钟更新Flag。开始比赛在规定时间内如1小时进行攻防。防守方要不断监控日志、修补漏洞攻击方要不断扫描、利用。计分与复盘比赛结束后根据获取的Flag数量计分。最重要的是复盘环节互相分享攻击路径和防守策略。6.3 独家避坑技巧与心得镜像版本锁定拉取镜像时最好指定版本标签如vulnerables/web-dvwa:latest。避免因为镜像更新导致环境变化影响练习。使用docker pull vulnerables/web-dvwa:latest明确拉取最新版或查找特定版本。善用数据卷Volume对于需要持久化数据的服务如数据库一定要在docker run或docker-compose.yml中定义数据卷。否则容器删除后所有数据包括你修改的配置、插入的Flag都会丢失。例如-v ./mysql_data:/var/lib/mysql。资源监控运行多个容器可能会消耗较多内存和CPU。使用docker stats命令可以实时查看所有容器的资源占用情况。如果电脑卡顿可以适当减少同时运行的容器数量。日志是金矿防守时一定要查看容器日志。docker logs -f [容器名]可以实时跟踪Web服务器或应用的访问日志和错误日志帮助你发现攻击行为。这也是真实AWD比赛中排查入侵痕迹的重要手段。备份与快照在搭建好一个满意的复杂环境后比如自定义了多个漏洞的靶场可以考虑使用docker commit将容器保存为新的镜像或者使用docker save将镜像导出为文件备份。这样下次可以直接加载无需重新配置。Kali工具链整合你的所有攻击工具都在Kali上。将Burp Suite的代理设置为Kali本机的某个端口如8080然后通过-p参数将靶场容器的流量映射出来就能用Burp进行抓包和深度测试了。这种“本机工具容器靶场”的模式效率极高。搭建属于自己的AWD训练平台就像拥有了一个永不关闭的私人道场。从Docker和Kali的基础操作到漏洞的挖掘、利用、修复再到多机环境的编排和对抗模拟整个过程本身就是一次宝贵的学习之旅。坚持在这个平台上练习你会发现自己对漏洞原理的理解、代码审计的能力、应急响应的速度都会有质的飞跃。最重要的是你获得了一种“掌控感”——不再依赖外部不稳定的平台训练的内容、时间和强度完全由你自己决定。