
简介本资源是面向网络安全竞赛选手与CTF/AWD攻防赛初学者的实战型脚本工具集聚焦攻击链构建与防守响应能力提升解决比赛中信息收集、漏洞利用、Web渗透、日志分析及防御加固等核心环节的自动化需求。压缩包共34个文件涵盖12个Python脚本如awd_attack.py、GetFlag.py、upload_shell.py、6个PHP Webshell与不死马生成工具、7个文本类策略文档含防御配置、日志分析要点、WAF绕过技巧、6个pyc辅助模块及1个exe命令行工具整体体积仅3.18MB轻量易部署。已有670人下载学习内容结构清晰攻击侧覆盖DNS探测、端口扫描、批量打点与Flag提取防守侧提供Linux文件监控、Web日志安全分析工具v2.0、WAF对抗方案及蜜罐式防御思路另含README.md说明与新建文件夹中的扩展资料便于快速集成到比赛环境或日常靶场训练中。 AWD攻防赛脚本集合这个zip包我拿到手也有段时间了前前后后在不同比赛里迭代了好几个版本。说实话AWD这种赛制打到后面拼的就是谁手上的自动化脚本更顺手、更稳定。如果说CTF解题赛是脑力比拼那AWD就是手速、体力、工具链的综合较量。一套好用的脚本集合基本等于给你在比赛里装了一台半自动化的“攻防流水线”。这个zip包里装的东西简单说就是围绕AWD赛前、赛中、赛后三个时间节点拆出来的各种自动化工具覆盖信息收集、批量打点、拿flag、防守监控、权限维护、流量分析等场景。适合那种已经接触过AWD、但还没形成自己工具链的新手也适合已经在比赛里被锤过几次、想系统梳理自己脚本体系的参赛者。如果你连AWD是什么都还不太清楚这篇文章也能帮你建立基本认知——我会把每个脚本的用途、运行原理、踩坑点都摊开讲清楚。1. 在AWD赛场上为什么需要一套脚本集合1.1 AWD赛制的核心逻辑与脚本需求AWDAttack With Defense攻防赛制通俗点说就是每个参赛队伍都会分到若干台配置相同的靶机你既要守住自己的机器不被别人打穿又要想尽办法去攻击其他队伍的机器。比赛积分通常由两部分构成防守分和攻击分。防守分靠的是你的服务在比赛过程中持续可用攻击分靠的是你成功从对手机器上拿到flag并提交。这种赛制最大的特点就是并发和持续。你在攻击别人的同时别人也在打你所有操作几乎都是同时发生的。纯手动操作根本忙不过来——你还在手工测试自己靶机的漏洞别人的批量脚本可能已经把你机器上的flag全薅走了。所以脚本的需求不是“锦上添花”而是“生存必需品”。我见过不少第一次打AWD的新人开局前半小时还在手动敲命令等反应过来准备提交flag的时候后台一查自己的flag已经被别人提交好几轮了。这就是没脚本的代价。自动化脚本的核心价值就三个词快、稳、批量。快是指从发现目标到拿下flag的响应速度稳是指脚本在几十台目标上执行时不掉链子批量是指同样的操作能同时作用于所有对手的机器。1.2 拿到zip包后第一件事先看目录结构很多人拿到“AWD攻防赛脚本集合.zip”第一反应是直接解压然后双击运行。这个习惯在比赛里很危险。我一般拿到任何脚本集合第一件事永远是解压到一个干净目录先看目录结构再逐个审计脚本源码。哪怕是自己写的脚本隔一段时间再看也可能有细节问题更不用说从网上收集来的工具。这个zip包里通常会有这么几类文件Python脚本.py主要承担批量flag获取、提交、扫描等逻辑Shell脚本.sh用于Linux环境下的快速部署、监控、自动化操作配置文件.txt/.json/.yaml存放目标地址、flag提交地址、自定义参数依赖清单requirements.txt记录Python库依赖README说明文档记录使用方式和注意事项这里多说一句来源不明的脚本集合一定要先审计再运行。AWD圈子里的脚本流传非常广但谁也不能保证某个“热心网友分享”的脚本里没有夹带私货。万一脚本里藏了一行回传你本机信息的代码你在比赛里辛辛苦苦打的flag反而成了别人的盘中餐那就真的是被阴了。拿到脚本先看代码不是不信任而是基本功。2. 脚本集合的核心模块拆解2.1 批量flag获取模块这是整个脚本集合里最核心的部分。AWD比赛里拿到flag的路径大致有两类一是通过已知漏洞直接读取靶机上的flag文件二是通过拿到shell后在目标机器上执行命令获取flag。无论哪种路径自动化脚本要做的事情都是同一件对一批目标IP重复执行同一个利用逻辑并把结果汇总回来。这套脚本里通常会有类似batch_getflag.py的脚本它的核心流程是读取目标IP列表文件对每个IP尝试连接指定的服务端口如果连接成功构造对应的数据包或命令去获取flag将获取到的flag写入结果文件这里有个很关键的细节AWD比赛的flag通常不是一成不变的它会定期轮换。比如每5分钟或10分钟靶机上的flag文件内容就会更新一次。所以获取flag的脚本不是跑一次就完事而是一个持续循环的过程。脚本里一般会有一个while True循环配合time.sleep()控制轮询间隔保证flag一更新就能第一时间拿到。从技术实现上看获取flag的方式主要有以下几种直接HTTP请求靶机上运行着web服务直接请求特定路径或接口触发漏洞返回flag构造特定数据包比如SQL注入、命令注入的payload通过socket或requests发送模拟登录后读取有些靶机后台需要认证脚本里会预置弱口令字典或已知密码利用已植入的后门提前在对手机器上种了webshell或二进制后门通过后门接口直接执行命令batch_getflag.py这类脚本的通用之处在于它把“网络请求、数据解析、失败重试、结果记录”这套流程封装好了你只需要把具体的payload和解析逻辑换成适合当前赛题的内容即可。2.2 文件监控与应急响应模块AWD不比攻击很多防守方根本没有自己的文件监控体系。每次比赛我都看到有人守着终端不断敲ls -la去查有没有可疑文件问题是手动查根本来不及。所以脚本集合里一定会有文件监控脚本它干的事情是持续监听指定目录的文件变化一旦发现新增文件或文件内容被修改立刻告警并备份现场。这类脚本在Linux下最常见的实现方式是用inotify它在Python里有对应的库pyinotify。基本原理是给内核注册一个文件系统事件监听器当目录下有文件创建、删除、修改、移动时内核会推送事件给用户态程序脚本收到事件后执行预设的处置动作。我这套脚本里的监控模块大概长这样import pyinotify class EventHandler(pyinotify.ProcessEvent): def process_IN_CREATE(self, event): print(f[ALERT] new file created: {event.pathname}) # 备份新文件便于后续分析 # 如果是关键目录如/tmp可自动删除并封禁来源IP def process_IN_MODIFY(self, event): print(f[ALERT] file modified: {event.pathname}) # 对比文件哈希判断是否被篡改比赛中的实际情况是别人打你的方式无非是上传webshell、写计划任务、改配置、替换二进制文件。有了监控脚本你至少能在第一时间发现异常而不是等比赛结束复盘时才看到攻击痕迹。文件监控的意义不是防止攻击而是缩短发现时间。在AWD里防守方每慢一步flag就被多提交一轮。应急响应模块还会包含一些一键处置的脚本比如检测到可疑进程后自动kill检测到异常外连后自动添加防火墙规则封禁IP。这类脚本的自动化程度越高你腾出来去攻击别人的时间就越多在积分榜上的优势也就越明显。2.3 攻击辅助与批量提交模块拿到flag只是第一步把flag成功提交到计分系统才算真正得分。AWD比赛的flag提交通常有专门的API接口但手动一个接一个提交非常低效。批量提交脚本的核心价值就在于此——它把你的flag结果文件读取出来去重之后批量POST到计分平台。这段的核心代码逻辑不复杂import requests import time def submit_flag(flag, submit_url, token): headers {Authorization: token} data {flag: flag} resp requests.post(submit_url, jsondata, headersheaders, timeout5) if resp.json().get(success): return True return False但有一个隐藏的坑是flag提交频率限制。AWD平台的防作弊机制通常会对提交频率做限制比如同一来源IP每分钟最多提交多少条。脚本闭眼一堆POST很可能触发风控导致后续flag被拉黑。所以成熟的提交脚本一定要有流量控制逻辑我一般会在提交循环里加一个time.sleep(random.uniform(1, 3))的随机延时模拟人类操作节奏既不会太慢也不触发风控。攻击辅助模块里还有一类很实用的脚本就是弱口令批量检测。AWD比赛里很多靶机的薄弱点其实就是弱密码比如MySQL、Redis、SSH服务挂着默认密码或简单密码。脚本的作用是对整个网段或IP列表批量尝试弱口令组合命中之后自动完成登录或获取shell的后续操作。我见过有些选手的脚本还会自动把弱口令检测的结果同步给自己的攻击链一旦某台靶机Redis弱口令连上了立刻写入计划任务拿shell轮询取flag。这就是把“发现漏洞”和“利用漏洞”串成了一条流水线整套东西自动化程度高了以后你会发现别人手忙脚乱的时候你还有时间喝口水。2.4 自动化部署与权限维护脚本AWD比赛里还存在一个很微妙的环节权限维护。你通过漏洞拿到shell只是个开始要持续不断地从靶机上获取新flag你需要保证后门不被对手清除、不崩溃。这就涉及到权限维护脚本。但说实话这类脚本在比赛中非常敏感。很多平台明令禁止超出规则范围的恶意操作比如删数据、搞崩溃、植入顽固后门等。正规的比赛规则通常会明确标注哪些行为违规碰了就会被取消成绩甚至禁赛。所以这里我强调的是合规范围内的权限维护——简单说就是通过弱口令或漏洞获取shell后加固自己的访问通道比如替换一个更稳定的连接方式确保自己的利用链不断掉。而不是去搞破坏。比赛是讲武德的打比赛是为了提升技术不是为了让对手难受。部署类脚本也很重要比如批量同步自己的防守配置到多台靶机。你分到的机器可能有三四台手动一台台改配置太浪费宝贵时间。写一个shell脚本scp把你的nginx配置、php配置、SSH配置批量推过去顺便执行重启服务命令几分钟就能把所有靶机的基础防护拉齐。这个思路在比赛中特别实用。3. 环境准备与脚本部署实操3.1 Linux和Windows双环境下的准备AWD比赛里大部分靶机都是Linux系统所以脚本集合里大多数工具都是面向Linux开发的。但参赛选手本地环境往往是Windows这就产生了一个严重的问题在Windows上开发调试的脚本部署到Linux上跑起来一大堆毛病。我建议有条件的话本地准备一个Ubuntu虚拟机或者直接用WSLWindows Subsystem for Linux在Linux环境里调试这些脚本。毕竟比赛的靶机就是Linux本地复现的时候环境越接近出问题的概率越低。如果实在要在Windows上运行Python脚本也不是不行。需要注意几点Python版本建议3.8及以上太低的话很多依赖库装不上用python -m pip install -r requirements.txt安装依赖避免直接用pip install造成的环境隔离问题脚本里如果涉及Linux独有的命令或路径要手动调整我见过太多人卡在环境问题上了明明脚本逻辑没问题跑起来就是各种报错。有一个特别常见的坑脚本第一行写的#!/usr/bin/python3在Windows上直接被忽略然后你用python xx.py跑的时候发现跟直接执行脚本效果不完全一样。解决方案很简单Windows下统一用python命令来运行不要依赖shebang。3.2 Python依赖安装与虚拟环境拿到脚本集合之后第一步是搭环境。在Linux下我习惯用virtualenv或者python3 -m venv建一个独立环境这样不会污染系统全局的Python环境。尤其是有些比赛服务器上还跑着别的东西全局装一堆依赖容易被干扰。# 创建虚拟环境 python3 -m venv awd_env # 激活虚拟环境 source awd_env/bin/activate # 安装依赖 pip install -r requirements.txtrequirements.txt里面常见的依赖有requestsHTTP请求、paramikoSSH连接、pymysqlMySQL数据库操作、redisRedis连接、pycryptodome加解密函数。这些是AWD脚本里出现频率最高的库建议提前熟悉它们的常用API。这里有个小技巧网络环境差的时候用国内镜像源安装依赖会快很多。命令是这样的pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple比赛现场的网络往往不太稳定别等到比赛开始了才装依赖提前把环境准备好、依赖装好、脚本跑通一遍是赛前准备的基本功。3.3 zip包解压的常见问题既然这个项目标题叫“AWD攻防赛脚本集合.zip”就免不了要聊一聊zip包本身的那些坑。很多人在解压这一步骤就翻车了我这里集中说几个高频问题。问题一解压时报错“file is not a zip file”或者“invalid zip archive: could not find eocd”。这两个报错本质上是同一个问题文件根本不是zip格式或者下载过程中损坏了。出现这种报错第一步不是找解压工具而是用file命令看看文件真实类型file AWD攻防赛脚本集合.zip如果输出显示是HTML document或者gzip compressed data之类的说明你下载的文件不对可能下载到了一个网页提示页或者资源本身被服务器做了转码。重新从源地址下载即可。如果文件大小跟源文件对不上八成是网络传输中断导致的不完整文件换个网络环境重新下。问题二解压出来的文件名乱码。这个在Windows上特别常见因为zip包在Linux下打包时用的编码是UTF-8而Windows老版本的文件资源管理器默认用GBK解码导致文件名变成一堆乱码。解决办法是用支持编码切换的解压工具或者在Linux下解压完再同步到Windows。问题三分卷压缩包.z01、.zip的解压。有些大的脚本集合会拆成好几个分卷比如.z01和.zip配合使用。这种情况要注意先打开主zip文件通常是最后一个分卷让解压工具自动识别前面的分卷把主zip和分卷文件放在同一目录下再解压。有个很容易搞混的点是主分卷不是序号最小的那个而是001.zip这种后缀的解压工具通常会智能排序。问题四zip包被加密需要密码。来源不明的加密zip包要格外小心有可能是恶意软件的分发方式。如果确实是从可信渠道获取的加密包尝试官方提供的密码或README里的说明。网上有些所谓的“zip密码移除工具”其实并不可靠原理上zip的加密是基于AES或ZipCrypto的暴力破解的成本很高除非密码特别简单。4. 典型场景下的实战演练4.1 开局巡检三分钟摸清目标战况比赛刚开局的时候每个人都是既兴奋又紧张。我的习惯是前三分钟不着急进攻先把防守基础打好。脚本集合里有一个init_check.sh之类的巡检脚本它在每台靶机上做的事情大致是这样检查系统账号是否有新增的可疑用户检查/tmp、/var/tmp、/dev/shm这些临时目录有没有可疑的脚本或二进制文件检查计划任务看是否被写入了不认识的条目监听当前网络连接标记异常的外联IP检查web目录通常是/var/www/html或者/data/wwwroot下的文件是否有被篡改痕迹这几项检查用shell脚本实现非常顺手。比如检查临时目录新增文件可以用find加-mmin参数find /tmp /var/tmp /dev/shm -type f -mmin -30 -exec ls -la {} \; 2/dev/null检查完成后脚本会生成一个报告文件你只需要快速扫一眼找出异常项然后决定封禁还是清理。这个巡检流程在每场比赛里都该跑对手的批量脚本往往开局几分钟就开始行动你越早发现异常防守分就丢得越少。4.2 拿到flag后的自动提交链路一个比较理想的自动提交流程是这样批次获取flag脚本跑一轮把结果写入flags.txt然后提交脚本读取这个文件筛选、去重、排掉已经提交过的flag批量POST到计分平台再把成功/失败的结果写回日志。整个链路可以用一个shell脚本串起来#!/bin/bash while true; do python3 batch_getflag.py python3 batch_submit.py --input flags.txt --log submit.log sleep 60 done用while true循环让整个链路持续运行每60秒跑一个周期。这个60秒的间隔是我实测下来比较平衡的值——太频繁容易触发平台风控和资源浪费太久则可能错过flag刷新周期。具体间隔可以根据比赛机制灵活调整。这里有一个容易踩的坑批量获取flag之后不先去重就提交。同一台靶机可能被多个脚本重复获取同一个flag如果每次都提交平台可能判定你重复提交轻则忽略重则封禁提交接口。所以提交脚本里必须有去重逻辑用集合或者数据库记录已提交过的flag不重复提交。4.3 被拿shell后的应急止血打AWD不可能全程顺风顺水总有被对手突破的时候。我记得有一场比赛大概是开赛40分钟我发现自己的web目录莫名其妙多了一个upload.php大小只有几KB但执行效果却是直接反弹shell。赶紧翻监控日志发现是对手先扫到了我们端的未修复漏洞批量上传了后门。遇到这种情况直接手动删文件已经不够了。我会立刻执行应急响应脚本它做的事情是备份可疑文件到隔离目录便于赛后分析通过正则匹配找出上传目录下的新增php、jsp等动态文件把webshell文件从web目录中移除或者用chattr i锁死目录权限搜索并终止可疑的反弹shell进程在防火墙层封禁对手的攻击IP这套应急处置流程手动操作至少要十分钟脚本只要几十秒。这里唯一的经验是被拿shell了不要慌乱先把外联断掉再分析攻击来源。断外联最直接的方法是封禁目标IP如果你还不知道是谁打的可以先临时封掉所有陌生外联再逐步排查。5. 常见问题与排查技巧实录5.1 脚本报错一页红先排查什么用AWD脚本集合的时候新人最容易遇到的问题就是“跑起来报错一屏直接心态崩溃”。其实大部分报错都是可以快速排查的。第一类模块找不到ModuleNotFoundError。这个最简单就是依赖没装全。看报错信息里缺的是哪个库手动补装即可。大部分依赖都在requirements.txt里但偶尔会有遗漏。我习惯的做法是在脚本开头加一段自动检测依赖的逻辑import importlib required [requests, paramiko, pymysql, redis] for lib in required: try: importlib.import_module(lib) except ImportError: print(f缺少依赖: {lib}) exit(1)第二类语法错误SyntaxError。这个通常发生在Python版本不兼容的情况下。有些脚本是Python2写的拿Python3跑就会各种语法问题。看脚本头部或者代码里有没有print xxx这种没有括号的写法有的话基本就是Python2脚本。要么用Python2运行要么把语法改成Python3。我碰到过不少网上流传的AWD脚本就是Python2的在现在的环境下跑不起来需要做迁移。第三类连接错误ConnectionError/TimeoutError。多半是目标IP变了、端口没开、或网络隔离导致连不上。排查方法很简单先手动ping目标再nc -zv 目标IP 端口测端口通不通。如果连不上看是不是比赛平台禁ping或者开放端口与预期不符。很多时候不是脚本问题而是你拿到了错误的目标清单。5.2 Windows下PowerShell提示禁止运行脚本“因为在此系统上禁止运行脚本”这个报错我从很多初学者那里听到过。其实这是Windows PowerShell的执行策略默认过于保守导致的。AWD脚本集合里的.sh、.bat甚至有些.ps1辅助脚本放到Windows上执行的时候会被拦下来。解决办法是修改执行策略Set-ExecutionPolicy Bypass -Scope CurrentUser或者启动PowerShell时用参数powershell -ExecutionPolicy Bypass -File your_script.ps1不过要说明的是AWD比赛里的主力脚本应该跑在Linux环境Windows端更多是用来编辑、比对、辅助分析的。我见过有的选手非要在Windows上硬跑shell脚本结果各种环境不一样白白浪费比赛时间。建议重大操作前先在小范围测试一下脚本行为不要直接对着所有目标IP盲跑。5.3 命令识别不了npm、claude、opencode之类比赛中会经常在终端里敲命令有时候会遇到“npm : 无法将‘npm’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”这类的错误提示不只是npm换成claude、opencode甚至自创的命令名报错逻辑是一样的——系统PATH环境变量里找不到这个可执行文件。这个问题的本质是你安装的软件没有自动注册到系统的PATH路径。解决办法有两类找到软件的实际安装路径把目录加入PATH环境变量用完整路径直接调用比如C:\Users\xxx\AppData\Roaming\npm\npm.cmd但在AWD比赛场景里我更想提醒的是另一件事比赛时用的脚本和命令尽量只依赖系统自带工具。网络上很多教程会教你装各种第三方工具但比赛环境不一定允许你安装、网络也不一定支持你下载。常用的Linux命令grep、awk、sed、find、curl、nc、python3就是最可靠的工具组合把基本功练扎实了比依赖花里胡哨的外部软件更靠谱。5.4 脚本集合也可以自己扩展维护“AWD攻防赛脚本集合.zip”这个包里的内容说白了只是一个起点。每一场比赛都会催生新的需求也都会暴露已有脚本的不足。我个人的习惯是每场比赛结束之后趁热打铁把比赛中临时改过的脚本记录到日志里赛后统一整理迭代版本。比如你会遇到这样的情况原来写的flag提交脚本只支持HTTP接口结果有一场比赛计分系统换成了HTTPS加自定义签名。如果脚本结构写得好改动只局限于指定模块其他部分不受影响。但如果一开始就是一堆代码堆在一起那每次换赛题都等于重构。写脚本集合的时候我会用“模块化配置化”的思路把通用逻辑和赛题特定逻辑分开。通用逻辑包括IP列表读取、结果记录、HTTP请求封装、提交去重特定逻辑包括payload、路径、漏洞类型。这样换赛题的时候只需要改配置文件或特定函数不需要动整个脚本。这个东西是可以串成自己专属工具链的第一场比赛你可能只是东拼西凑一个跑得通的脚本第二场比赛你开始考虑稳定性第三场比赛你就有了自己的模块化框架。积累下来的经验远比某一个脚本本身更有价值。我在实际使用这套脚本集合的时候最深的体会是脚本能解决的从来不是“会不会打”的问题而是“打得多快、守得多稳”的问题。技术基础扎实的前提下自动化工具是放大器技术基础空白的前提下再好的脚本也只是空中楼阁。AWD赛场上最值钱的资产永远是思考能力而不是那一堆冷冰冰的代码。最后分享一个小技巧比赛前一定要逐个脚本跑一遍冒烟测试特别是flag提交脚本拿一个测试flag试提交一下确认平台的提交接口是通的、token没有过期。我见过有人开赛前没有测试到了比赛才发现自己的提交token配置错了前几轮拿到的flag全没交上去积分直接落后一大截。比赛里每一分钟都很珍贵这种低级错误能避就避。希望这套脚本集合的思路对你有帮助。后续如果你想扩展可以考虑加上日志可视化、多人协作模式、更智能的应急响应联动。工具是死的人是活的把脚本用成趁手的兵器你才能在AWD这条路上越走越远。本文还有配套的精品资源点击获取