☰
AWD自动化框架实战:YML配置驱动批量改密与flag提交
2026/10/6 3:15:14 网站建设 项目流程

简介:这是一款面向AWD(Attack 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控制轮询节奏,设太短容易把平台接口打限流,设太长又抢不到一血,一般 20~60 秒之间试。

提示:改完配置先别急着全量跑,拿一台靶机做单点验证,确认 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 pyyaml

paramiko是 SSH 连接的核心,requests负责提交 flag,pyyaml解析 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 2>&1 & tail -f run.log

flag 提交环节要特别注意:很多比赛平台对提交频率有限制,CHECK_INTERVAL设太短会被封 token。我一般会把间隔设在 30 秒以上,并且只对“已确认拿到 flag”的目标提交,避免无效请求。

3.4 用数据库回查战果

跑了一段时间后,直接查库比翻日志快:

sqlite3 data/Awd.db "select ip, status, flag from targets where status='success';"

这条语句能告诉你哪些靶机已经打穿、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 "cmd=whoami"

返回root或www-data才算真的通了。框架的日志只能证明它发了请求,不能证明对面真的执行了。

另外一个小技巧:把data/Awd.db定期备份。AWD 比赛节奏快,万一框架崩了或者你改配置改坏了,有备份能快速回滚到上一个可用状态。我一般每轮提交完 flag 就cp data/Awd.db data/Awd.db.bak,花不了几秒,但能救命。

从那以后我每次跑这类自动化框架,都强制先单机验证、再查库确认、最后才放开批量,三步少一步都不踏实。希望这套拆解能帮你在下一场 AWD 里少点手忙脚乱。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询