AWD自动化框架实战:YML配置驱动批量改密与flag提交
简介这是一款面向AWDAttack With Defense攻防对抗比赛参赛者的自动化攻击框架基于YML配置文件驱动帮助选手将精力集中在策略设计与优化上而非繁琐的代码实现适合具备一定安全基础、希望提升比赛效率的CTF选手与安全研究者。资源包共66个文件约1.03MB以py与pyc源码文件为主辅以xml工程配置、png示意图及md说明文档整体结构紧凑。框架包含核心引擎、模块系统、配置文件、日志报告与第三方库等部分YML文件可定义攻击阶段、模块调用、条件逻辑与定时任务并支持自定义扩展攻击模块兼顾兼容性与可扩展性。目前已有945人学习下载。通过研读源码与配置示例读者可理解自动化攻击流程的编排思路掌握模块化开发与动态策略设计方法并借助实战场景模拟提升攻防对抗能力。1. 从一份 AWD 自动化框架压缩包说起它到底能替你省下多少操作如果你打过线下 AWD大概率经历过这种场面开赛前 10 分钟拿到靶机 IP 和默认口令比赛一开始别人已经批量改密、批量种马、批量提交 flag而你还在手忙脚乱地一台台 SSH 上去改密码。这份[Bugku-AWD专版]一款用于AWD比赛中的自动化攻击框架.zip就是冲着这个痛点来的——它把 AWD 里最耗手速的几件事改密、批量连接、后门维持、flag 自动提交用一套 YML 配置串起来让脚本替你去点鼠标。解压后主目录是YML-AWD-FRAME-FOR-BUGKU-master核心入口是start.py配置集中在config/下攻击逻辑在code/里数据落在data/Awd.db。它不是一个开箱即用的“一键日站”神器而是一套需要你按自己比赛环境填参数、改模块的半成品框架。适合已经懂基本 Web 漏洞利用、但不想在重复劳动上浪费时间的参赛者如果你连 SSH 登录和一句话木马都没手打过建议先把基础补上再来拆这套东西。2. 拆开目录看设计YML 配置驱动 模块化攻击链是怎么落地的2.1 目录结构与各模块职责先把压缩包解开进到主目录看一眼文件分布这决定了你后面改哪里、加哪里。unzip [Bugku-AWD专版]一款用于AWD比赛中的自动化攻击框架.zip cd YML-AWD-FRAME-FOR-BUGKU-master ls -la你会看到大致这么几块路径作用你大概率要动它吗start.py框架启动入口读配置、起调度基本不动config/YML 与 Python 配置含MemShellConfig.py、SimpleConfig.py必改填靶机信息code/攻击核心AttackCore.py、AutoAck.py、SshAck.py、BehinderAck.py按需改code/MemShell.py内存马相关逻辑进阶再碰data/Awd.dbSQLite 存储记录目标与结果看日志用misc/杂项脚本与测试调试用这个布局的思路很清晰配置和逻辑分离。你不需要读懂AttackCore.py每一行只要把config/里的参数填对框架就能按你定义的流程跑。常见做法是先把SimpleConfig.py里的靶机列表和凭据改成自己比赛的再决定要不要启用SshAck或BehinderAck。2.2 配置层把靶机、凭据、flag 地址填进去AWD 比赛环境每次都不一样所以第一步永远是改配置。打开config/SimpleConfig.py你会看到类似下面这种结构不同版本字段名可能略有差异以你解压出来的为准# config/SimpleConfig.py 片段示意 TARGETS [ { ip: 192.168.1.10, ssh_port: 22, ssh_user: root, ssh_pass: 初始密码, web_port: 80, }, # 多台靶机就继续往下加 ] FLAG_URL http://172.16.0.1/flag # 比赛平台的 flag 提交接口 FLAG_TOKEN your_team_token # 队伍 token CHECK_INTERVAL 30 # 轮询间隔单位秒这里几个参数直接决定框架能不能跑通TARGETS里每一条对应一台你要打的靶机ssh_pass填比赛给的初始口令框架会用它去改密、种后门。FLAG_URL和FLAG_TOKEN是提交 flag 用的填错的话你打得再快也拿不到分。CHECK_INTERVAL控制轮询节奏设太短容易把平台接口打限流设太长又抢不到一血一般 2060 秒之间试。提示改完配置先别急着全量跑拿一台靶机做单点验证确认 SSH 能连、flag 能提交再放开到全部目标。2.3 攻击链从 SSH 改密到后门维持的执行顺序配置填好后框架的执行顺序大致是连靶机 → 改默认口令 → 种后门内存马或一句话→ 轮询读 flag → 提交。code/AutoAck.py负责自动化确认code/SshAck.py管 SSH 通道code/BehinderAck.py对接冰蝎类流量。启动方式通常是python3 start.py如果你用的是 Python 3.6 环境目录里有cpython-36.pyc说明作者当时跑的是 3.6直接python start.py也行。启动后框架会按CHECK_INTERVAL循环日志会打到控制台同时写进data/Awd.db。想确认它到底干了什么可以查一下数据库sqlite3 data/Awd.db .tables sqlite3 data/Awd.db select * from targets limit 5;表名以实际为准这一步的目的是让你看到框架记录了哪些目标、哪些已成功。如果表是空的说明配置没被正确加载回去检查SimpleConfig.py有没有语法错误——Python 配置文件里少个逗号就会静默失败这是血泪经验。2.4 模块扩展自己加一个攻击动作框架的模块化设计意味着你可以往code/里加自己的脚本。比如你想在改密之后额外上传一个 WebShell可以照着AutoAck.py的接口写一个新模块然后在主流程里调用。关键是把输入输出对齐输入是目标信息字典输出是成功/失败状态这样才不会把整条链跑崩。3. 实战跑通从单机验证到批量提交 flag 的完整操作3.1 环境准备与依赖确认这套框架依赖 Python 3 和几个常见库网络请求、SSH 连接、YML 解析。先确认环境python3 --version pip3 list | grep -iE requests|paramiko|pyyaml缺什么补什么pip3 install requests paramiko pyyamlparamiko是 SSH 连接的核心requests负责提交 flagpyyaml解析 YML。如果比赛机器不能联网装包提前在本地打好 wheel 包带过去。3.2 单台靶机验证先跑通一台再放开不要一上来就把所有靶机填进去全量跑。先只留一台把CHECK_INTERVAL设大一点比如 60 秒启动后盯着日志看python3 start.py观察输出里有没有SSH connected、password changed、flag submitted这类关键节点。如果卡在连接阶段八成是口令或端口填错了如果连上了但改密失败可能是目标系统不允许 root 直接改密得换普通用户加 sudo。3.3 批量模式与 flag 自动提交单台验证通过后把其余靶机补进TARGETS重启框架。这时候它会并行处理多个目标日志会变多建议重定向到文件方便回看python3 start.py run.log 21 tail -f run.logflag 提交环节要特别注意很多比赛平台对提交频率有限制CHECK_INTERVAL设太短会被封 token。我一般会把间隔设在 30 秒以上并且只对“已确认拿到 flag”的目标提交避免无效请求。3.4 用数据库回查战果跑了一段时间后直接查库比翻日志快sqlite3 data/Awd.db select ip, status, flag from targets where statussuccess;这条语句能告诉你哪些靶机已经打穿、flag 是什么。如果status一直是pending说明攻击链在某个环节断了回去看run.log里对应 IP 的最后几行。4. 避坑与排查这套框架最容易翻车的五个地方4.1 现象启动就报 YAML 解析错误 → 原因缩进用了 Tab → 解决统一用空格YML 对缩进极其敏感Tab 和空格混用直接报错。用编辑器把config/下所有 YML 文件的缩进统一成 2 或 4 个空格别偷懒。4.2 现象SSH 连接超时 → 原因靶机端口不是 22 或防火墙拦截 → 解决确认端口并测试连通性先用nc -zv 靶机IP 端口确认端口开着再检查SimpleConfig.py里的ssh_port有没有填错。有些比赛靶机的 SSH 会改到非标准端口这个信息通常在开赛说明里。4.3 现象改密成功但下一轮连不上 → 原因框架没记录新密码 → 解决确认改密后是否回写配置或数据库这是最坑的一种情况框架把密码改了但自己没记住新密码下一轮还用旧密码连直接失败。检查SshAck.py里改密后有没有把新密码写回Awd.db或内存变量。如果没有你得手动补这个逻辑。4.4 现象flag 提交返回 403 → 原因token 过期或请求头不对 → 解决抓包对比平台接口用浏览器 F12 抓一次手动提交的请求对比框架发的请求重点看Cookie、User-Agent、Content-Type是否一致。很多平台会校验 Referer缺了就直接拒。4.5 现象跑着跑着进程挂了 → 原因未捕获异常导致主循环退出 → 解决给主循环加 try/except在start.py的主循环外面包一层异常捕获让单台靶机失败不影响整体while True: try: run_once() except Exception as e: print(f[!] round failed: {e}) time.sleep(CHECK_INTERVAL)这样即使某台靶机连不上框架也不会整个崩掉。5. 进阶玩法把内存马模块接进流程以及我自己的验证习惯框架里code/MemShell.py和code/MemShellConfig.py是给内存马留的口子。内存马的好处是不落文件、重启即失适合 AWD 里维持访问。要接进主流程你得先确认目标中间件类型Tomcat、PHP-FPM 等然后在MemShellConfig.py里填对应的注入参数。常见做法是先用 SSH 上传一个内存马注入脚本执行后再通过BehinderAck.py建立连接。验证内存马是否生效不要只看框架日志说“success”自己手动连一次curl -s http://靶机IP/your-shell-path -d cmdwhoami返回root或www-data才算真的通了。框架的日志只能证明它发了请求不能证明对面真的执行了。另外一个小技巧把data/Awd.db定期备份。AWD 比赛节奏快万一框架崩了或者你改配置改坏了有备份能快速回滚到上一个可用状态。我一般每轮提交完 flag 就cp data/Awd.db data/Awd.db.bak花不了几秒但能救命。从那以后我每次跑这类自动化框架都强制先单机验证、再查库确认、最后才放开批量三步少一步都不踏实。希望这套拆解能帮你在下一场 AWD 里少点手忙脚乱。本文还有配套的精品资源点击获取