Kali Linux上基于Docker搭建AWD攻防训练平台实战指南

📅 2026/7/5 22:13:41 👁️ 阅读次数 📝 编程学习
Kali Linux上基于Docker搭建AWD攻防训练平台实战指南

1. 项目概述:为什么要在Kali上搞个AWD训练场?

如果你对网络安全感兴趣,或者已经是个CTF(Capture The Flag)爱好者,那你肯定听说过AWD(Attack 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 核心需求与工具选型解析

在动手之前,我们先明确一下我们需要什么,以及为什么选择这些工具。

核心需求清单:

  1. 一个Linux操作系统作为宿主机:这是运行一切的基础。我们选择Kali Linux,因为它预装了绝大多数我们需要的安全工具,省去了大量配置时间。你可以用实体机安装,也可以用VMware或VirtualBox安装虚拟机。
  2. 容器化引擎:用于创建和管理我们的靶场环境。毫无疑问,选择Docker。它是目前最流行、生态最完善的容器平台,有海量的现成镜像可供使用。
  3. 漏洞靶场镜像:这是我们训练的核心“教材”。我们将从Docker Hub等镜像仓库拉取别人已经制作好的、包含漏洞的Web应用镜像。例如vulhub/xxx,web-dvwa等。
  4. 网络配置工具:为了让多个靶场容器能相互通信(模拟攻击对手),同时宿主机(Kali)也能访问它们,我们需要对Docker的网络进行简单配置。
  5. 辅助脚本(可选但推荐):用于快速启动、停止、重置多个容器,管理比赛流程。

为什么是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-upgradeapt 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 --version

2.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的服务器在国外,直接从那里拉取镜像速度可能很慢,甚至失败。我们可以配置一个国内的镜像加速器。

这里以阿里云镜像加速器为例(你需要有一个阿里云账号,注册是免费的):

  1. 访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
  2. 登录后,你会看到为你分配的专属加速器地址,格式如https://xxxx.mirror.aliyuncs.com
  3. 在Kali上编辑Docker的配置文件:
# 如果文件不存在,会新建 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["你的专属加速器地址"] } EOF
  1. 重启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新手入门的经典漏洞环境:

  1. DVWA (Damn Vulnerable Web Application): 一个故意设计成充满漏洞的PHP/MySQL应用,涵盖SQL注入、文件上传、命令执行等十大常见漏洞,且有低、中、高三种安全等级,是绝佳的练习对象。
    • 常用镜像:vulnerables/web-dvwa
  2. WebGoat: OWASP维护的一个故意不安全的Java Web应用,课程式设计,每个漏洞都有详细说明和练习目标。
    • 常用镜像:webgoat/webgoat
  3. Vulhub: 这不是一个镜像,而是一个开源项目,提供了上百个不同漏洞环境的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 --subnet=172.20.0.0/24 awd_net
  • --subnet=172.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_b172.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:8081127.0.0.1:8082访问两个靶场进行漏洞分析和攻击测试。
  • 容器内部(模拟比赛环境)的角度:如果team_a容器里的一个漏洞利用脚本想攻击team_b,它应该指向的地址是http://172.20.0.20:80。因为它们在同一个Docker网络awd_net内,可以通过IP直接通信。

4.3 编写漏洞利用与修补脚本(模拟攻防)

这才是训练的核心。假设DVWA的“SQL Injection”关卡存在漏洞。现在你需要完成两件事:

  1. 攻击脚本:编写一个Python脚本,自动化利用这个漏洞,从team_b(172.20.0.20) 获取数据(比如flag)。
  2. 修补方案:在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 1=CONCAT(1,(SELECT database())) -- ", "Submit": "Submit"} # 需要携带登录后的Cookie(实际操作中需先模拟登录获取session) cookies = {"PHPSESSID": "你的session_id", "security": "low"} try: response = requests.get(target_url, params=payload, cookies=cookies) # 这里需要根据实际返回页面的内容来提取信息,例如通过正则匹配 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 --version

5.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_HOST=team1_db team1_db: image: mysql:5.7 container_name: awd_team1_db networks: awd_network: ipv4_address: 172.22.0.11 environment: - MYSQL_ROOT_PASSWORD=root_pass_team1 - MYSQL_DATABASE=dvwa - MYSQL_USER=dvwa - MYSQL_PASSWORD=p@ssw0rd # 将数据卷挂载到本地,防止容器删除后数据丢失 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_HOST=team2_db team2_db: image: mysql:5.7 container_name: awd_team2_db networks: awd_network: ipv4_address: 172.22.0.21 environment: - MYSQL_ROOT_PASSWORD=root_pass_team2 - MYSQL_DATABASE=dvwa - MYSQL_USER=dvwa - MYSQL_PASSWORD=p@ssw0rd 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 单人训练流程

  1. 环境启动:使用Docker或Docker Compose启动一个靶场(如DVWA)。
  2. 信息收集:用浏览器访问,用Nmap扫描端口,用Dirb/Dirsearch扫描目录,全面了解目标。
  3. 漏洞挖掘:手动或使用工具(如Burp Suite、Sqlmap)对每个功能点进行测试。从低安全等级开始。
  4. 编写利用脚本:一旦确认漏洞,立即用Python等语言编写自动化利用脚本(EXP)。脚本要能稳定获取Flag或执行特定命令。
  5. 漏洞修复:切换到“防守方”视角。分析漏洞代码,思考修复方案。然后进入容器,修改源代码。修改后要测试功能是否正常。
  6. 验证与反思:用自己写的攻击脚本,测试修复后的靶机,确认漏洞是否被成功修补。思考是否有绕过修复的方法。
  7. 环境重置:练习完毕,docker-compose down -vdocker rm -f删除容器,下次练习又是一个全新的开始。

6.2 多人模拟对抗训练

找一两个朋友,按照以下步骤:

  1. 统一环境:所有人使用相同的docker-compose.yml文件启动环境,确保靶场一致。
  2. 分配角色:每人负责防守自己的靶机(例如,你防守team_a),同时攻击其他人的靶机。
  3. 设置Flag:约定好Flag的格式和存放位置(例如,在/flag文件里,或者数据库的某个字段里)。可以定时(如每5分钟)更新Flag。
  4. 开始比赛:在规定时间内(如1小时),进行攻防。防守方要不断监控日志、修补漏洞;攻击方要不断扫描、利用。
  5. 计分与复盘:比赛结束后,根据获取的Flag数量计分。最重要的是复盘环节,互相分享攻击路径和防守策略。

6.3 独家避坑技巧与心得

  • 镜像版本锁定:拉取镜像时,最好指定版本标签,如vulnerables/web-dvwa:latest。避免因为镜像更新导致环境变化,影响练习。使用docker pull vulnerables/web-dvwa:latest明确拉取最新版,或查找特定版本。
  • 善用数据卷(Volume):对于需要持久化数据的服务(如数据库),一定要在docker rundocker-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的基础操作,到漏洞的挖掘、利用、修复,再到多机环境的编排和对抗模拟,整个过程本身就是一次宝贵的学习之旅。坚持在这个平台上练习,你会发现自己对漏洞原理的理解、代码审计的能力、应急响应的速度都会有质的飞跃。最重要的是,你获得了一种“掌控感”——不再依赖外部不稳定的平台,训练的内容、时间和强度,完全由你自己决定。