从‘攻’到‘防’:一次完整的AWD实战复盘与自动化脚本编写思路

从‘攻’到‘防’:一次完整的AWD实战复盘与自动化脚本编写思路 从‘攻’到‘防’AWD实战攻防策略与自动化脚本开发指南在网络安全竞赛的众多赛制中AWDAttack With Defense模式因其高度模拟真实攻防场景而备受瞩目。不同于传统的CTF解题模式AWD要求参赛者在攻击对手系统的同时还要实时防御自家服务这种双线作战的模式对选手的技术广度和临场应变能力提出了极高要求。本文将从一个完整AWD赛程的视角分享从开局信息收集到中盘攻防对抗再到自动化脚本开发的实战经验。1. 开局快速资产梳理与漏洞定位AWD比赛的前30分钟往往决定了整场比赛的走势。这个阶段需要快速完成以下关键任务1.1 资产信息收集标准化流程文件指纹识别是第一步。使用以下命令快速获取Web服务基础信息# 获取HTTP头信息 curl -I http://target-ip # 识别Web框架指纹 whatweb http://target-ip -v # 目录结构探测使用温和模式避免触发WAF dirsearch -u http://target-ip -e php,asp,aspx,jsp -t 20常见资产信息需要记录的关键字段信息类型采集工具记录要点开放端口nmap特别关注非标准端口服务Web框架whatweb版本号、已知漏洞目录结构dirsearch后台地址、上传目录文件权限find命令可写目录、SUID文件提示比赛开始前准备一个checklist模板能节省大量时间建议包含IP段、服务类型、漏洞状态等字段。1.2 漏洞快速筛查方法论基于历史赛事数据分析AWD环境中高频漏洞分布如下Web类占比68%SQL注入特别是布尔盲注文件上传绕过Content-Type/后缀名检查缺陷反序列化漏洞PHP/Java居多系统类占比22%SUID提权find/vim/bash等内核漏洞脏牛等经典漏洞服务类占比10%Redis未授权访问MySQL弱口令使用自动化扫描脚本时要注意流量特征这个Python示例展示了如何低调检测SQL注入import requests def check_sqli(url): test_payloads [ , 1 AND 11-- , 1 AND SLEEP(5)-- ] for payload in test_payloads: try: r requests.get(f{url}?id1{payload}, timeout3) if error in r.text.lower() or syntax in r.text: return True except: continue return False2. 中盘攻防对抗的动态平衡策略当比赛进入白热化阶段单纯的漏洞利用已不足以取胜需要建立攻防一体的战术体系。2.1 攻击层面的效率优化批量利用已验证漏洞是关键。下面是一个自动化提交flag的Python脚本框架import requests import re from multiprocessing import Pool def submit_flag(flag): headers {Authorization: team_token} r requests.post(http://game-server/submit, data{flag: flag}, headersheaders) return r.status_code 200 def exploit_target(ip): # 这里替换为实际的漏洞利用代码 flag get_flag_via_sqli(ip) if flag and re.match(rflag{.*}, flag): return submit_flag(flag) return False if __name__ __main__: targets [192.168.1.%d % i for i in range(1,20)] with Pool(8) as p: p.map(exploit_target, targets)2.2 防御层面的应急响应当发现自家服务被入侵时分阶段响应更有效即时止血关闭非必要端口重置数据库密码删除webshell漏洞修复补丁热更新避免直接重启服务添加基础WAF规则迷惑对手部署伪flag生成器设置蜜罐目录一个简单的PHP热补丁示例// 修复文件上传漏洞的临时方案 if (isset($_FILES[file])) { $finfo new finfo(FILEINFO_MIME_TYPE); $mime $finfo-file($_FILES[file][tmp_name]); $allowed [image/jpeg, image/png]; if (!in_array($mime, $allowed)) { die(Invalid file type); } }3. 自动化运维监控体系搭建成熟的AWD选手会建立实时监控系统主要关注三个维度3.1 服务状态监控使用PythonFlask快速搭建监控面板from flask import Flask import psutil, socket app Flask(__name__) app.route(/status) def status(): data { cpu: psutil.cpu_percent(), memory: psutil.virtual_memory().percent, ports: check_ports(), web: check_web_service() } return data def check_ports(): open_ports [] for port in [80, 3306, 6379]: sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) result sock.connect_ex((127.0.0.1, port)) open_ports.append((port, result 0)) return open_ports3.2 文件完整性校验关键目录监控脚本示例#!/bin/bash # 监控web目录文件变化 WEB_DIR/var/www/html BASELINE_FILE/tmp/web_baseline.md5 if [ ! -f $BASELINE_FILE ]; then find $WEB_DIR -type f -exec md5sum {} \; $BASELINE_FILE else changes$(find $WEB_DIR -type f -exec md5sum {} \; | diff - $BASELINE_FILE) if [ $changes ]; then echo Alert: Web files modified! | mail -s AWD Alert adminteam fi fi4. 赛后技术沉淀与工具开发比赛结束后的复盘比参赛本身更重要。建议建立个人知识库包含以下内容漏洞利用代码库按漏洞类型分类防御脚本集常用补丁、监控脚本战术记录表时间线、决策点分析一个典型的工具开发迭代路径原始POC阶段手动利用半自动化参数化输入全自动化集成flag提交智能化自动识别漏洞类型例如将简单的SQL注入检测升级为智能探测工具class VulnerabilityScanner: def __init__(self, target): self.target target self.plugins [SQLiPlugin(), XSSPlugin(), RCEPlugin()] def scan(self): results [] for plugin in self.plugins: if plugin.check(self.target): results.append(plugin.exploit(self.target)) return results在实际比赛中我们团队发现最有效的策略是三分攻七分防。保持服务稳定获得的防守分数往往比冒险攻击更可靠。特别是在比赛最后半小时维护好现有得分比开拓新攻击面更重要。