ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Docker的Cardinal AWD攻防平台搭建与实战指南

基于Docker的Cardinal AWD攻防平台搭建与实战指南 1. 项目概述与核心价值最近几年AWDAttack With Defense攻防兼备模式在网络安全竞赛和实战演练中越来越火。它不像传统的CTF只考攻击也不像纯粹的渗透测试只关注单点突破。AWD要求你在攻击对手靶机的同时实时加固自己的服务器这种“攻防一体、动态对抗”的模式对选手的综合能力、应急响应和策略思维提出了极高的要求。然而一个稳定、可控、贴近实战的AWD训练环境却不容易搭建。网上的开源平台不少但要么部署复杂文档缺失要么功能简陋难以模拟真实对抗场景。Cardinal 就是在这种背景下进入我视野的一个开源AWD平台。它基于Docker容器技术实现了靶机环境的快速生成、一键启停、状态回滚和实时flag提交校验架构清晰社区也相对活跃。更重要的是它允许我们自定义比赛题目和网络拓扑这对于想深入研究漏洞原理和防御技巧的团队来说价值巨大。今天我就结合自己多次在Kali Linux上折腾的经验带你从零开始手把手搭建一个功能完整的Cardinal AWD平台。无论你是想组织一场小型的内部训练赛还是想搭建一个私人的攻防演练场这篇指南都能帮你避开我踩过的那些坑直达终点。2. 环境准备与核心依赖解析搭建Cardinal首要任务是准备好一个“干净”且“强壮”的基础环境。我们选择Kali Linux不仅因为它是渗透测试人员的“瑞士军刀”预装了海量工具更因为其基于Debian的稳定特性能很好地兼容Cardinal所需的各项服务。2.1 Kali Linux系统准备与优化首先确保你的Kali系统是最新状态。打开终端执行以下命令进行系统更新和升级sudo apt update sudo apt full-upgrade -y这个操作会更新软件源列表并升级所有可升级的包。full-upgrade比单纯的upgrade更彻底它会处理因依赖关系变化而需要安装或移除的包确保系统底层的一致性。注意在升级过程中如果遇到询问是否替换配置文件的情况例如/etc/ssh/sshd_config除非你明确知道自己在做什么否则建议选择“保持当前已安装的版本”以避免自定义配置被覆盖。接下来安装一些基础编译工具和必要的库文件这些是后续安装Docker、Python模块等操作的基石sudo apt install -y curl wget git vim net-tools build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libffi-dev这里安装的包解释一下curl,wget,git: 网络下载和版本管理工具。vim: 文本编辑器当然你可以用nano。net-tools: 包含ifconfig等传统网络工具虽然ip命令是趋势但很多老脚本仍依赖它。build-essential: 包含GCC、make等核心编译工具链。后面一串lib*-dev是编译Python、OpenSSL等软件时常用的开发库。2.2 Docker与Docker Compose部署详解Cardinal平台的核心运行依赖于Docker容器。Docker提供了轻量级的隔离环境每个靶机、数据库、Web后台都是一个独立的容器这使得平台部署、管理和重置变得极其简单。安装Docker Engine官方推荐使用其提供的仓库进行安装以确保获得最新且兼容性最好的版本。# 1. 卸载旧版本如有 sudo apt remove docker docker-engine docker.io containerd runc # 2. 安装依赖包允许apt通过HTTPS使用仓库 sudo apt install -y ca-certificates curl gnupg lsb-release # 3. 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 4. 设置稳定版仓库 echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 5. 更新源并安装Docker引擎 sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin安装完成后将当前用户加入docker组这样以后运行docker命令就不需要每次都加sudo了sudo usermod -aG docker $USER重要执行此命令后你需要完全退出当前终端会话并重新登录或者重启系统用户组变更才会生效。你可以通过运行docker run hello-world来测试安装是否成功且无需sudo。安装Docker Compose虽然Docker现在内置了docker compose插件我们上面安装的docker-compose-plugin但Cardinal的部署脚本可能仍使用独立的docker-compose命令。为了兼容性我们同时安装独立版本。# 下载最新稳定版的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 --version2.3 MySQL数据库独立部署考量Cardinal默认使用Docker Compose编排服务通常会包含一个MySQL容器。但在生产或长期训练环境中我强烈建议将MySQL数据库部署在宿主机或一个独立的、数据持久化的容器中。原因有三点数据持久性比赛数据、用户信息、题目配置至关重要。如果MySQL容器随着docker-compose down被删除所有数据将丢失。性能与资源管理数据库独立后可以单独分配资源、优化配置避免与其他服务争抢。备份与恢复独立的数据目录如/var/lib/mysql更容易进行定期备份和灾难恢复。如果你决定采用独立部署可以按以下步骤在Kali上安装MySQL Serversudo apt install -y mysql-server sudo systemctl start mysql sudo systemctl enable mysql安装后运行安全初始化脚本sudo mysql_secure_installation设置root密码并移除测试数据库和匿名用户。之后你需要根据Cardinal的文档修改其配置文件将数据库连接地址从容器名如mysql改为宿主机的IP或127.0.0.1并创建对应的数据库和用户。3. Cardinal平台部署与初始化实战基础环境就绪后我们就可以开始部署Cardinal平台本身了。3.1 获取Cardinal源码与目录结构解析从GitHub克隆Cardinal的仓库到本地git clone https://github.com/vidar-team/Cardinal.git cd Cardinal花几分钟时间熟悉一下目录结构这对后续排错和自定义非常重要docker-compose.yml: 核心的编排文件定义了所有服务Web、API、MySQL、Redis等的构建和运行方式。Dockerfile: 用于构建Cardinal主应用镜像的配方。config/: 存放应用配置文件如数据库连接、Redis设置、比赛规则等。data/:重要默认映射的数据库数据目录确保此目录存在且有写权限。problems/: 存放AWD题目的目录每个题目一个子文件夹里面包含靶机镜像的Dockerfile和题目描述文件。frontend/: 前端代码通常为Vue.js。backend/: 后端代码通常为Go。3.2 配置文件修改与关键参数调优在启动前有几个关键配置需要根据你的环境进行调整。主要修改config目录下的文件。1. 数据库配置 (config/application.yaml或类似文件)找到数据库连接部分。如果你使用Docker Compose内置的MySQL容器配置可能类似database: host: mysql # Docker Compose中的服务名 port: 3306 name: cardinal username: root password: your_strong_password_here # 务必修改如果你采用了上一节建议的独立MySQL部署则需要将host改为宿主机的IP地址如果Cardinal容器能访问宿主机网络或127.0.0.1如果使用host网络模式。务必修改默认的弱密码2. Redis配置Cardinal使用Redis来管理比赛状态、缓存和消息队列。同样在配置文件中检查Redis连接信息确保密码不是默认的。redis: host: redis port: 6379 password: another_strong_password # 务必修改3. 比赛规则配置在config目录下可能有一个game.yaml或类似文件用于设置初始分数、每次攻击/防御的得分、扣分规则、check健康检查间隔、一轮的时间等。根据你的训练目标调整这些参数。例如将每轮时间从默认的5分钟调整为3分钟可以加快比赛节奏训练快速反应能力。3.3 启动平台与初始化数据库配置修改无误后使用Docker Compose启动所有服务docker-compose up -d-d参数表示在后台运行。首次执行会从Docker Hub拉取基础镜像并构建Cardinal的自定义镜像需要一定时间请耐心等待。使用docker-compose ps命令查看所有容器状态确保它们都是Up状态。如果某个容器反复重启使用docker-compose logs [服务名]查看具体日志来排错常见问题包括数据库连接失败、配置文件语法错误、端口冲突等。平台启动后通常需要通过迁移脚本来初始化数据库表结构。Cardinal可能会在首次启动时自动执行也可能需要手动运行。查看项目README或backend目录下的说明。常见的手动初始化方式是进入后端容器执行docker-compose exec backend ./cardinal migrate或者如果后端是Go程序可能是一个独立的二进制文件。4. 平台功能详解与比赛配置当所有服务正常运行并通过浏览器访问http://你的服务器IP:8000端口请查看docker-compose.yml中前端服务的映射端口能看到登录界面时恭喜你平台搭建成功了接下来是更有趣的部分配置一场比赛。4.1 管理员后台功能初探使用默认的管理员账号通常在项目文档或配置文件中如admin/admin123首次登录后必须立即修改登录后台。管理员后台一般包含以下核心功能模块用户管理批量导入参赛队员支持CSV格式分配队伍重置密码。题目管理这是核心中的核心。你可以在这里添加、编辑、启用/禁用题目。每个题目需要关联一个在problems/目录下定义好的靶机镜像。比赛管理创建一场新的比赛设置比赛名称、开始结束时间、是否公开、比赛模式AWD、攻防混合等。比赛监控实时查看所有靶机的状态是否存活、各队伍的攻击/防御得分、当前的排行榜。Flag管理查看Flag提交记录管理动态Flag的生成规则。4.2 自定义AWD题目的创建与导入Cardinal平台的灵活性体现在可以自定义题目。在problems/目录下创建一个新的文件夹例如web_sqli。其典型结构如下problems/web_sqli/ ├── docker/ # 靶机镜像构建目录 │ ├── Dockerfile # 定义靶机环境基础镜像、漏洞代码、服务启动命令 │ ├── src/ # 存放漏洞应用源代码如一个存在SQL注入的PHP网站 │ └── flag.txt # 静态Flag文件如需动态Flag则由平台注入 ├── manifest.json # 题目元数据名称、描述、分类、初始分数、难度等 └── writeup.md # 题目的官方解题思路可选关键文件解析Dockerfile: 这是靶机的蓝图。你需要从一个基础镜像开始如ubuntu:20.04安装必要的服务Apache, PHP, MySQL复制漏洞代码设置启动脚本。最重要的是要确保服务在容器启动时能自动运行通常用CMD或ENTRYPOINT执行一个启动脚本。manifest.json: 这个文件告诉Cardinal如何加载你的题目。一个简单的示例{ category: Web, name: 简单的SQL注入, description: 尝试找到注入点并获取管理员密码。, score: 300, flag: flag{this_is_a_static_flag}, author: YourName, tags: [sqli, easy] }动态Flag真实AWD比赛中Flag通常是每支队伍唯一且定期变化的。Cardinal支持在容器启动时将动态生成的Flag写入容器内的指定位置如/flag文件。这需要在题目的Dockerfile中预留好Flag写入点并在平台配置中指定。创建好题目目录后需要在管理员后台的“题目管理”中“导入”或“刷新”题目列表平台会自动识别problems/下的新题目。4.3 比赛流程与规则引擎配置创建一场比赛时你需要仔细配置规则引擎这直接决定了比赛的对抗体验。回合制与计时设置每轮时长如180秒。在每一轮内平台会进行多次“检查”。检查机制这是平台自动评判的核心。平台会定期如每30秒向每个队伍的每个靶机发送HTTP请求或执行特定脚本检查服务是否存活check.sh并验证Flag是否被篡改或窃取。你需要为每个题目编写check.sh脚本放在题目目录下。该脚本返回特定的退出码如0表示正常1表示服务异常2表示Flag异常。得分规则攻击得分当队伍A提交了队伍B的靶机中当前回合的有效Flag则A获得攻击分B被扣分防御失分。防御得分自己的靶机在一轮内所有检查点都正常服务存活且Flag正确则获得防御分。初始分数比赛开始时每支队伍的基础分。网络拓扑Cardinal默认可能为每个队伍生成独立的靶机容器组。你需要理解其网络模式通常是自定义的Docker网络确保队伍间容器可以互相访问以模拟攻击但管理网络是隔离的。5. 实战演练组织一场内部AWD训练赛平台和题目都准备好了我们来模拟组织一场小型的3队对抗赛。5.1 赛前准备与队伍配置环境检查再次确认所有靶机镜像都已构建成功 (docker images)无错误。队伍创建在后台创建3支队伍Red Team, Blue Team, Green Team。为每队生成一个参赛账号或让队员自行注册后由管理员审核分配。题目选择从题库中挑选3道难度适中的题目例如一道Web注入、一道命令执行、一道逻辑漏洞启用它们。比赛创建名称“内部实战演练-2023Q3”模式AWD时长60分钟回合时长180秒初始分数1000攻击得分50/次防御得分20/回合Flag失分-30/次通知与准备将比赛时间、访问地址、账号密码或注册方式告知参赛队员。建议提供一份简单的赛制说明和平台使用指南。5.2 赛中监控与应急处理比赛开始后作为管理员你的主要工作不再是技术操作而是监控与保障。监控大盘紧盯管理员后台的监控面板。关注“服务状态”一栏如果有队伍的靶机显示“宕机”红色可能是该队伍自己操作失误关闭了服务也可能是被攻击者打崩了。这是正常对抗的一部分除非出现大面积异常。排行榜观察排行榜变化了解比赛激烈程度。攻击频繁时分数会剧烈波动。日志查看如果出现争议如某队声称提交了Flag但未得分可以通过查看平台的提交日志和容器的运行日志来辅助判断。应急响应如果出现平台本身的问题如Web界面无法访问、数据库连接中断需要快速介入。常用的命令包括# 查看所有容器状态 docker-compose ps # 查看平台后端日志 docker-compose logs backend -f # 重启某个问题服务 docker-compose restart backend # 如果问题严重可以暂停比赛在后台操作后进行排查5.3 赛后复盘与数据归档比赛时间到系统会自动结束比赛并停止攻防。这时不要急着关闭平台。数据导出从后台导出最终的排行榜数据、详细的得分日志、攻击日志。这些数据是复盘分析的宝贵材料。环境保存如果需要对比赛中出现的特定攻击手法或防御姿势进行深入研究可以暂时保留比赛环境。使用docker commit命令将某个队伍的靶机容器保存为镜像以供后续分析。docker commit [容器ID] post_game_analysis:web_sqli清理环境分析完成后运行docker-compose down可以停止并删除本次比赛创建的所有容器但不会删除镜像和数据卷。如果你使用了独立数据库比赛数据会保留在其中。复盘会议组织参赛队员一起复盘。结合导出的日志分析哪些攻击路径最有效哪些防御措施起到了关键作用哪些漏洞在实战中最容易被忽略。这是将技术转化为实战能力的关键一步。6. 高级技巧与深度优化平台跑起来只是第一步要让它在长期训练中稳定、高效还需要一些“调优”。6.1 性能优化与资源限制一场多队伍、多题目的比赛会同时运行大量容器对宿主机资源是考验。限制容器资源在题目的Dockerfile或docker-compose.yml中为每个靶机容器设置资源上限防止某个靶机因被攻击或自身bug耗尽资源导致宿主机卡死。# 在docker-compose.yml的靶机服务下添加 deploy: resources: limits: memory: 512M cpus: 0.5这限制了每个靶机容器最多使用512MB内存和0.5个CPU核心。优化镜像构建构建靶机镜像时使用.dockerignore文件忽略不必要的文件如.git,__pycache__并尽量使用多阶段构建减小最终镜像体积加快拉取和启动速度。数据库优化对于独立部署的MySQL根据你的硬件配置调整my.cnf中的innodb_buffer_pool_size缓存池大小等参数。6.2 网络拓扑与隔离策略默认的Docker Compose网络可能将所有队伍的靶机放在同一个子网这模拟了“内网互访”的场景。但你也可以设计更复杂的拓扑。自定义Docker网络你可以创建多个Docker网络将不同队伍或不同题目类型的靶机划分到不同网络中通过网关容器来模拟防火墙和路由增加攻击难度和真实性。网络流量监控在宿主机上使用tcpdump或部署一个ELKElasticsearch, Logstash, Kibana栈收集和分析容器间的网络流量赛后可以分析攻击流量特征。6.3 动态Flag与检查脚本的进阶设计动态Flag生成算法研究Cardinal的动态Flag生成机制。通常Flag会与队伍ID、回合数、题目ID通过某种哈希算法关联。理解这一点有助于你编写更健壮的check.sh脚本。健壮的检查脚本check.sh脚本不能只检查服务端口是否监听。它应该模拟真实用户访问关键功能确保业务逻辑正常。检查关键文件如/flag的完整性内容、权限、所有者。检查是否有异常进程、后门文件、计划任务。脚本自身要具备一定的抗干扰能力避免被攻击者轻易kill或篡改。 一个简单的示例片段#!/bin/bash # check.sh for a web service if ! curl -f -s http://localhost:80/login.php /dev/null; then exit 1 # 服务不可用 fi FLAG$(cat /flag) if [[ $FLAG ! flag{* ]]; then exit 2 # Flag被篡改 fi # 检查是否有异常的监听端口除了80 if ss -tulpn | grep LISTEN | grep -vE :80\s | grep -vE :22\s; then exit 3 # 存在异常后门端口 fi exit 0 # 一切正常7. 常见问题排查与解决实录在多次搭建和运行中我遇到了不少问题这里把典型问题和解决方案记录下来希望能帮你节省时间。问题1执行docker-compose up -d时MySQL容器不断重启。查看日志docker-compose logs mysql可能原因1数据目录权限问题。Cardinal的docker-compose.yml可能将宿主机的./data目录映射到容器的/var/lib/mysql。确保宿主机上的./data目录存在且MySQL容器有权限写入通常需要chown -R 999:999 ./data其中999是容器内mysql用户的UID。可能原因2端口冲突。宿主机3306端口已被占用。修改docker-compose.yml中MySQL服务的端口映射如改为3307:3306。问题2平台Web界面可以访问但无法登录提示数据库错误。排查检查后端容器的日志docker-compose logs backend。很可能是数据库连接字符串配置错误、密码不对、或者数据库没有初始化表结构。解决确认config/下的配置文件中的数据库IP、端口、用户名、密码、数据库名全部正确。然后尝试手动初始化数据库参见3.3节。问题3比赛开始后所有队伍的靶机状态一直是“检查失败”或“宕机”。排查这通常是靶机镜像本身的问题或者check.sh脚本有bug。手动进入一个靶机容器看看docker exec -it [靶机容器名] /bin/bash。检查服务是否真的在运行ps aux | grep [服务名]网络是否通畅。手动执行一下该题目的check.sh脚本看输出和退出码是什么。常见原因Dockerfile中服务启动命令错误容器启动后主进程退出导致容器直接停止。确保启动命令是前台持久运行的如apache2-foreground,php-fpm,sleep infinity配合后台进程。check.sh脚本路径或权限问题确保脚本在容器内存在且可执行。在Dockerfile中记得用COPY复制并chmod x。容器内时区/时间不同步可能影响基于时间的Flag生成或检查逻辑。在Dockerfile中设置时区RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime。问题4攻击提交Flag后平台没有加分。排查在后台查看Flag提交日志确认提交的Flag是否被记录。检查该Flag是否为当前回合的有效Flag。AWD中Flag通常每回合变化提交旧Flag无效。检查目标靶机在该回合的Flag是否确实被获取可能防御方修复了漏洞。检查平台的得分计算规则配置是否正确。技巧在训练赛中可以开启“Flag回显”或降低Flag更新频率帮助新手理解规则。问题5平台运行一段时间后变慢甚至卡死。排查使用docker stats命令查看所有容器的实时资源占用CPU、内存、网络IO。很可能某个靶机被攻击后产生了死循环、内存泄漏或DDoS攻击耗尽了资源。解决立即在后台暂停比赛。使用docker-compose restart [问题靶机服务名]重启问题靶机。如前所述为容器设置资源限制limits这是预防此类问题的根本方法。审查题目代码是否存在可被利用导致资源耗尽的漏洞如未限制循环次数、未过滤文件读取路径导致读取大文件。搭建和维护一个AWD平台本身就是一个持续学习和攻防对抗的过程。每一次部署失败、每一次比赛异常都是深入了解Docker、网络、应用安全和赛事运维的宝贵机会。希望这篇从环境准备到实战演练再到深度优化的长文能成为你构建专属网络安全演练场的坚实蓝图。记住平台是死的人是活的最精彩的永远是平台上发生的那些攻防博弈与智慧碰撞。
返回列表