
打了多次线上解题赛之后我第一次走进AWD线下攻防赛的机房时发现自己引以为傲的“解题速度”基本派不上用场。旁边队伍键盘敲得飞快我的服务在几十秒内就被拿下了权限这种现场压迫感只有线下AWD才有。AWDAttack With Defense攻防兼备真的不是单纯的抢分游戏——你得一边像攻击手那样快速打穿对手一边像运维工程师一样守好自己的靶机两边都不能松。这篇文章是我对AWD线下赛的完整复盘赛前该准备什么、开局怎么抢时间、攻防回合里怎么拿分、哪些坑让我白送了不少分以及赛后怎么把经验沉淀下来。无论你是第一次准备打线下赛还是已经打过几场仍觉得吃力这篇总结应该都能给你一些实在的东西。1. AWD不是拼手速而是拼“赛前积累”很多人以为AWD拼的是临场反应其实一进赛场你就会发现真正让你拉开差距的是你带进机房的那些“积累”。我说的积累不是脑子里记了多少漏洞利用姿势而是你的操作台、队伍分工、脚本工具是不是都已经固化成了肌肉记忆。1.1 先把操作台固化成肌肉记忆赛前最值得做的事不是刷新题而是整理自己的操作环境。AWD的靶机大多是Linux系统你的本机就是你的“指挥中心”。我建议赛前专门花一个下午搭一个干净的虚拟机模板把下面这套工具链全部装好端口扫描工具Nmap这类是必须的开局扫网段、确认服务清单全靠它。HTTP请求拦截工具用来快速改包、重放请求分析漏洞参数非常顺手。流量抓包工具Wireshark或者同类工具用于比赛中期观察对手的进攻路径。目录扫描脚本快速发现备份文件、后台路径、敏感文件。WebShell管理工具拿到权限后管理入口用能省大量重复操作。数据库客户端很多服务连数据库方便直接查看数据内容。日志分析命令集合grep、awk等常用命令的固定组合直接写成脚本。文件监控和快速备份脚本这两个后面细说属于开局保命用的。工具装好只是第一步关键是把它们的调用方式变成肌肉记忆。我会在自己的虚拟机里反复模拟比赛开场流程打开终端、启动扫描、挂上抓包、确认备份脚本路径整套动作练到不需要想就能完成。别小看这个练习线下赛的前几分钟别人已经开始拿分你还在找工具的话节奏就全乱了。1.2 分工不是所有人都在打AWD一般是3到5人一队赛前一定要把分工定死不要进赛场之后自由发挥。我见过不少队伍一开场所有人都扑出去打进攻结果自家靶机被人摸透了也没人发现等分数掉下来才慌慌张张回去防守这时候已经晚了。合理分工大概是这样的进攻手负责漏洞挖掘、打点、拿flag是队伍得分的主力。防守手负责备份、加固、盯服务存活状态同时负责修复被攻击的漏洞。监控手盯流量、日志和文件变化发现对手打法后及时反馈给进攻手。三个人各干各的但信息要实时同步。最简单的方式是拉一个内部群进攻手发现对手的漏洞马上甩给防守手去查自己靶机有没有同样的问题监控手在日志里看到对手的payload立刻告诉进攻手可以“反打回去”。分工明确后每个人都只操心自己那块反而能把事情做深。1.3 那几个能在关键时刻救命的“小脚本”赛前一定要写好几类防御性质的小脚本别到赛场上手敲命令。第一是快速备份脚本比赛一开始就执行把网站源码和数据库打包到一个安全位置。第二是文件监控脚本专门盯web目录里的新增和修改文件一旦发现异常文件马上记录。第三是进程监控脚本查是否有可疑的外联进程。我放两个最基础的模板你可以根据自己的习惯改#!/bin/bash # 快速备份脚本将web目录打包并记录hash src/var/www/html backup_dir/tmp/system_bak stamp$(date %H%M%S) mkdir -p $backup_dir tar czf $backup_dir/web_$stamp.tar.gz $src 2/dev/null sha256sum $backup_dir/web_$stamp.tar.gz $backup_dir/backup_hash.txt echo [] backup done: $backup_dir/web_$stamp.tar.gz#!/bin/bash # 文件监控脚本每60秒扫描一次web目录新增文件 while true; do find /var/www/html -type f -mmin -1 -exec ls -la {} \; /tmp/change.log sleep 60 done这两个脚本真的能救命。备份脚本让你被对手删了源码后能快速恢复文件监控脚本能第一时间告诉你对手有没有写入奇怪的文件。别看不起这些基础操作AWD里能稳定赢下来的队伍往往就是把基础动作做到极致的队伍。2. 开局30分钟从资产盘点到第一波先手比赛开局前30分钟是整个AWD最关键的窗口。这段时间内谁先把服务摸清楚谁先找到第一个漏洞谁就能建立心理优势。而所谓“先手”不是盲目地到处打而是有条理地把信息吃透。2.1 先把手里的资料榨干赛方通常会提供一批信息靶机IP列表、服务列表、账号密码、甚至部分源码。很多人一拿到IP就急着开扫但我建议先冷静下来把手里的资料过一遍。特别是服务列表它直接告诉你比赛涉及哪些技术栈。如果赛方提供了源码那这条路径优先级最高——源码审计比黑盒测试快得多直接看代码就能定位注入点、文件上传点、命令执行点效率是黑盒的好几倍。打开浏览器逐个访问服务页面也是必须的动作。很多题目会在前端页面留下提示比如注释里的调试信息、报错页面暴露的中间件版本、甚至一份遗留的管理后台。这些信息白纸黑字写在那里比扫描器更快更准确。记住一句话先看人给的东西再自己动手找。2.2 首轮扫描要回答三个问题开局扫描不能漫无目的地扫至少要让扫描结果回答三个问题对手开了哪些端口跑的是什么服务有没有明显的历史遗留文件先对本机做一次完整扫描确认自己靶机的服务基线再对其他靶机做同样的扫描。端口不局限于80、8080这类常见端口一定要看高位端口和非常规端口比赛题目经常把服务藏在诡异的位置。比如我曾经遇到一次比赛目标服务开在9789端口大多数队伍扫完常规端口就走了但那个端口上其实跑着一个带弱口令的管理后台。目录扫描也要做重点找以下几种文件压缩备份包常见后缀zip、tar.gz、bak、源码仓库泄露文件、编辑器留下的临时文件、后台路径。这些文件一旦存在价值往往比直接挖漏洞还高。一个备份包可能直接包含数据库配置文件拿到手基本就等于掌控了整台机器。2.3 防御动作必须抢在攻击前面很多队伍开局只顾进攻防御动作完全滞后这是大忌。我个人的节奏是扫描的同时让防守手立刻执行备份脚本然后启动文件监控最后检查默认账号和弱口令。前三件事一定要在比赛开始后就做不要等对手来打了才反应。为什么这么急因为AWD的防守分通常与服务和靶机存活状态绑定你要是被对手删了文件、改了配置服务就会出问题防守分会持续扣。备份能让你快速恢复监控能让你感知威胁弱口令排查能堵住最无脑的攻击。这几件事做完也就几分钟但能让你后面打得很省心。开局还有一个容易被忽略的点确认自己靶机上有没有赛方故意预留的漏洞文件。很多AWD在初始化环境中就带着一个明显的“欢迎漏洞”比如一个可直接命令执行的后台或一个不安全的文件上传接口。先在自己靶机上确认这些口子一是方便防守二是可以快速把同样打法复制到对手靶机上形成第一波攻击收益。3. 攻防拉锯中真正拉开分差的三个动作开局过去之后比赛进入漫长的攻防拉锯阶段。这个阶段看起来是持续不断地互相攻击实际上真正能拉开分差的往往只有几个关键动作。把它们做好比无目的地乱打更加有效。3.1 把流量分析变成自己的情报来源AWD里最经典的信息循环其实是防守侧的“反打”对手打你的时候会在你的流量和日志里留下大量痕迹。利用好这些痕迹你的进攻效率能翻倍。我习惯让监控手用抓包工具挂在本机入口同时持续查看访问日志。一旦发现某个来自对手IP的请求路径特别奇怪比如对方在尝试一个特定参数的注入或者在读取某个特定文件那基本就等于对方把漏洞位置和打法都“示范”了一遍。这时候我们要做的是把完整请求保存下来分析它为什么有效然后把同样的请求改到对手靶机上重放。这个循环一次可能没什么但整场比赛累积下来防守情报转进攻的转化率决定了你们队伍的“续航能力”。所以别把监控理解为被动的活它其实是整支队伍的信息中台。3.2 加固的度让服务活着但难啃防守端的核心矛盾是既要让服务存活又不能让对手轻易利用。常见的加固手段包括改后台路径、限制上传目录的执行权限、对输入参数做过滤、清理已知WebShell文件、修复已发现的漏洞。但加固不是越猛越好因为比赛还要进攻你把自己的服务加固到无法利用也会给防守分带来压力。我吃过大亏有一场比赛我把一个服务的参数全部加上过滤结果自己后续的利用脚本也打不进去了等于自断一条路。所以加固要有“度”核心原则是修复已知漏洞但保留必要的正常功能对攻击面做收敛但别让服务直接失效。每次加固前先把原文件备份好不要直接覆盖原配置免得改坏无法回滚。加固后立刻访问一遍关键功能确认服务没有异常再继续下一个动作。还有个细节尽量把加固动作脚本化。比如批量修改上传目录权限的命令写成一行脚本给所有靶机统一执行避免一台一台手工操作时遗漏也防止出现不同靶机加固状态不一致的混乱情况。3.3 攻击节奏稳定输出比一把梭更划算AWD的计分周期通常不连续而是按轮次结算。这意味着你不需要一次把所有漏洞全打出去而是要在每一轮保持稳定输出。一波流打完所有“存货”后面就会进入空窗期分数增长停滞对手却可以趁机反扑。我建议团队维护一张“进度表”记下每台靶机已经确认的漏洞类型、是否已打点、flag是否已提交。这样能避免多个人重复打同一台机器浪费时间也容易暴露意图。每次打点前先确认目标服务响应正常别因为自己操作过猛把对方服务打崩。很多比赛的规则里把对手服务打挂反而会扣分或导致该轮次无法继续得分所以“破坏性攻击”多数时候不划算。被反打也是常见的事。当你用某个入口登入对手服务器时对手也可能通过流量感知到你的动作然后反过来清理你的通道。所以攻击动作要轻、要快、要避免留下明显的访问特征。拿到flag提交之后不要一直霸占着通道尽量清理现场降低暴露概率。4. 复盘自己人制造的几个“反向伤害”每次AWD打完最值得聊的往往不是打赢了哪几台靶机而是我们自己人制造的那些“反向伤害”。这些错误非常典型写出来希望下回大家别踩同样的坑。4.1 备份包放错了目录等于给对面送装备有一场我们让防守手快速备份他图省事直接把web目录打包放在了网站根目录下文件名叫backup.tar.gz。结果对手第一次扫描就发现了这个包下载之后从里面翻出了数据库配置文件拿到了数据库密码随后直接登录数据库把我们所有数据清空。更讽刺的是对手顺手还把这个备份包删了我们连自我恢复都要从头再来。教训很明确备份的位置绝对不能放在web目录里。要放在web目录之外或者至少在系统内找一个不显眼的路径。命名也尽量别用backup、web_bak这种一眼就能认出的名字最好伪装成无关的系统文件。备份之后别忘了做完整性校验比如记录hash方便确认备份是否被篡改。抢救冗余才是备份的核心价值放得再近不安全等于没备份。4.2 批量脚本没有限速自己把靶机打崩了另一场比赛我们为了让进攻手更快地同时检测多台靶机写了一个批量请求脚本。脚本本身逻辑没问题但完全没有限速和超时控制导致全是并发请求直接打同一个目标。目标服务扛不住压力直接崩溃然后我们自己的服务状态也受到影响。最搞笑的是当时还以为是那个对手的防护很强后来一看日志才发现大量请求都来自我们自己的IP。这件事让我学会三件事第一任何批量脚本都必须带延迟和超时参数比如单次请求间隔控制在几百毫秒失败自动跳过第二脚本上线前先在自己的靶机上小范围跑一遍验证稳定再用于对手第三针对不同目标要设置并发上限不要给同一台靶机“地毯式轰炸”。这些参数看起来不酷但能在关键轮次让你少扣很多分。4.3 留着的权限维持入口被对手改成了进攻跳板AWD比赛过程中为了让后续轮次持续得分通常会在已拿下的靶机上留一个权限维持入口。这个思路本身没错问题在于入口文件往往千篇一律。有一场我们在某靶机上留了一个WebShell文件放的位置和命名都非常常规。对手扫到这个特征文件后没有直接删除而是把文件内容改成了一个反向连接的后门。我们下一次连上去时等于主动连接到了对手控制的通道差点把本机信息也泄露出去。经过这次之后我对权限维持入口的要求变得很严格尽量伪装文件名和内容避免使用默认路径定期检查入口是否被改过比如比对文件hash如果某个入口已经不再需要宁愿删除也不要留着让对方利用。AWD里最怕的不是丢分而是你留下的“工具”变成对手打你的跳板。5. 把一次线下赛的经验变成可复制的能力比赛总有结束的时候但经验不能就停在赛场里。赛后如果不复盘下一次还会犯同样的错误。我觉得线下赛经验最好的处理方式是把它变成一套可复制、可复用、可迭代的能力集合。5.1 复盘别只写漏洞要写时间线普通CTF比赛赛后写writeup主要写漏洞成因和解题步骤。但AWD复盘的维度要更宽一定要把时间线拉出来。比如第几分钟我们完成了备份第几分钟发现第一个漏洞第几分钟靶机被对手打穿第几分钟补上了缺口。这能帮你找出自己的“拖沓点”。我习惯用表格记录时间点事件影响根因开赛第3分钟完成备份正常赛前脚本准备充分开赛第12分钟对手用文件上传拿权丢失第一滴血未提前修复已知上传点开赛第25分钟完成修复停止掉分备份帮助快速恢复开赛第40分钟利用对手备份文件得flag加分目录扫描发现敏感文件这种时间线式复盘能让你看见自己每轮操作的代价和收益比单纯记录漏洞结论要高一个维度。5.2 把常用操作沉淀成模板脚本包赛后一定把自己在比赛中手动敲过的命令、写过的临时脚本整理成结构化的模板脚本包。最简单的做法是建一个仓库按功能分目录备份恢复、文件监控、端口扫描、目录扫描、日志分析、批量请求等。每个脚本都要写清楚参数说明和适用场景别只放代码不写注释不然下次比赛根本不记得当初为什么这么写。这样做的好处很直接下一次比赛开场你不是从零开始而是直接把仓库拉到本机按需执行。工具链越完整你的前几分钟就越从容。而且脚本包在平时训练中也能持续迭代赛后复盘发现哪个脚本有问题改掉就好永远不白费。5.3 AWD练出来的能力出去同样有用最后说个很多人没意识到的点AWD是竞赛但它的能力模型一点都不比赛事本身“窄”。比赛中练出来的应急响应意识、日志分析能力、加固修复能力、漏洞研判能力放在日常的安全运维、企业红蓝对抗演练、系统安全评估中都是很核心的素质。如果你想把这项能力延续下去我建议平时多约线上AWD训练赛或者找几台虚拟机自己搭一个模拟靶场两个人一对一练攻防。重点不是练“打穿一台机器”的速度而是练“从被打到反打”的完整闭环感知威胁、确认原因、快速恢复、逆向反制。这套闭环一旦成为习惯你的安全综合能力会有一个非常明显的提升。打了多次线下AWD之后我最深的体会是AWD的胜负七成在赛前两成在开局最后一成才是临场爆发。很多队伍输不是输在技术而是输在备份被删了没人发现或者所有队员都在往前冲没人在家看门。所以如果你正准备参加下一场建议从今天开始就把脚本写好、分工练熟、流程跑通。能赢的从来不是手最快的那一队而是犯错更少的那一队。希望这篇总结能帮你在下一场少犯一点错多拿几分。