
简介这份AWD攻防赛脚本集合面向网络安全竞赛选手与渗透测试学习者聚焦攻防对抗中的信息收集、漏洞利用与防守加固等实战环节。压缩包共34个文件约3.18MB以Python脚本、PHP木马、pyc编译文件、txt说明文档为主另含exe工具、rar工具包与md说明覆盖攻击与防御两条主线。目录按Prepare-for-AWD、Attack、Defense等模块组织包含信息收集、漏洞扫描、渗透测试、Web漏洞检测、日志分析及防御策略文档等脚本与资料并附不死马、WAF、文件监控等实战代码便于快速搭建演练环境、理解攻防思路与查漏补缺。目前已有688人学习下载适合希望系统备赛、提升实战能力的中高级安全爱好者参考请在合法合规前提下使用。1. AWD攻防赛脚本集合从被按着打到能还手的自动化底座打 AWD 攻防赛最憋屈的不是不会挖洞是比赛一开始你还在手动连 SSH、手动备份、手动改密码对面自动化脚本已经把全场靶机的 flag 刷了一遍。AWD 的本质是「攻防节奏 服务可用性」的对抗谁把重复动作脚本化谁就多出几分钟去干真正值钱的事——找漏洞、写利用、盯流量。所谓 AWD 攻防赛脚本集合不是某个神秘工具包而是一套围绕「批量操作靶机、自动备份、自动提交 flag、自动封禁对手 IP」的脚本组合通常用 shell 和 Python 写跑在 Linux 攻击机上。它适合三类人第一次打 AWD 想先活下来的新手、被自动化队伍打崩过想补课的老手、以及负责给队伍搭基础设施的运维位。下面按「先立住原理、再动手复现、最后讲坑」的顺序把一套能直接抄的脚本集合拆开讲清楚。2. 脚本集合的骨架批量控制、备份、flag 提交三件套2.1 为什么 AWD 脚本必须围绕「批量」和「幂等」设计AWD 的靶机不是一台是十几台甚至几十台每台跑着相同或相似的服务。你手动 SSH 一台台改密码改到第五台的时候对面已经把你第一台又打穿了。所以脚本集合的第一原则是批量一份主机清单一条命令打穿全场。第二原则是幂等脚本重复执行不能把环境搞坏比如备份脚本第二次跑不能把第一次的干净备份覆盖成已经被挂马的版本。常见做法是用一个hosts.txt存 IP、端口、初始密码脚本读这个文件循环执行。幂等靠「先判断再动作」实现比如备份前先检查目标目录是否已存在当日备份存在就跳过。这里有个血泪经验很多新手脚本直接scp覆盖结果第一次备份是干净的第二次备份时服务已经被对手改了干净备份没了直接失去后悔药。选型上批量 SSH 有两种主流方案一是 shell 里用sshpass配合for循环轻量、依赖少二是 Python 用paramiko库可控性强、能处理交互式命令。前者适合快速上手后者适合复杂逻辑。我一般两套都留着简单改密码用 shell复杂的信息收集和 flag 提交用 Python。2.2 用 shell 写批量改密码和批量备份的最小脚本先看主机清单格式一行一台字段用空格分隔# hosts.txt 格式IP 端口 用户 初始密码 192.168.1.10 22 root toor 192.168.1.11 22 root toor 192.168.1.12 22 ctf ctf123批量改密码脚本核心是读清单、循环、用sshpass免交互登录#!/bin/bash # batch_chpasswd.sh - 批量修改靶机密码 NEWPASSAwD2024_$(date %m%d) # 新密码带日期方便赛后追溯 while read ip port user oldpass; do # 跳过空行和注释行 [[ -z $ip || $ip \#* ]] continue echo [*] 正在处理 $ip:$port sshpass -p $oldpass ssh -o StrictHostKeyCheckingno -o ConnectTimeout5 \ -p $port $user$ip \ echo $user:$NEWPASS | chpasswd \ echo [] $ip 密码已改 \ || echo [-] $ip 改密失败检查网络或密码 done hosts.txt逻辑说明sshpass -p把密码喂给 ssh-o StrictHostKeyCheckingno跳过首次连接的指纹确认否则脚本会卡在 yes/no 交互上。ConnectTimeout5是关键参数靶机被对手打挂时连接会挂起5 秒超时能让脚本快速跳过而不是整体卡死。chpasswd从标准输入读用户:密码格式比passwd更适合脚本。备份脚本同理但要多一层幂等判断#!/bin/bash # batch_backup.sh - 批量备份 web 目录幂等 BACKUP_ROOT/opt/awd_backup/$(date %Y%m%d) mkdir -p $BACKUP_ROOT while read ip port user pass; do [[ -z $ip || $ip \#* ]] continue # 幂等当天已备份过就跳过避免覆盖干净版本 if [[ -f $BACKUP_ROOT/$ip.tar.gz ]]; then echo [] $ip 今日已备份跳过 continue fi sshpass -p $pass ssh -o StrictHostKeyCheckingno -o ConnectTimeout5 \ -p $port $user$ip \ tar czf - /var/www/html 2/dev/null $BACKUP_ROOT/$ip.tar.gz \ echo [] $ip 备份完成 \ || echo [-] $ip 备份失败 done hosts.txt参数说明tar czf -把打包结果输出到标准输出本地重定向存成文件省去在靶机上落盘再 scp 的步骤速度快且不占靶机空间。2/dev/null屏蔽 tar 的权限警告避免污染输出流导致压缩包损坏——这个坑很多人踩过警告信息混进 tar 流里解压时报「归档文件损坏」。2.3 用 Python 写 flag 自动提交处理 HTTP 交互flag 提交是 AWD 的得分核心。常见赛制是每轮刷新 flag你需要定时读取靶机上的 flag 文件或通过接口获取再提交到计分板。Python 的requests处理 HTTP 提交最顺手import requests import time import re SCOREBOARD http://10.0.0.1/api/submit # 计分板地址按实际改 TOKEN your_team_token # 队伍 token FLAG_PATH /flag # 靶机上 flag 常见路径 def submit_flag(flag): 提交单个 flag返回是否成功 try: r requests.post(SCOREBOARD, data{token: TOKEN, flag: flag}, timeout3) return r.status_code 200 and success in r.text.lower() except requests.RequestException as e: print(f[!] 提交异常: {e}) return False def read_flag_via_ssh(ip, port, user, password): 通过 SSH 读取靶机 flag这里用 paramiko import paramiko try: cli paramiko.SSHClient() cli.set_missing_host_key_policy(paramiko.AutoAddPolicy()) cli.connect(ip, portport, usernameuser, passwordpassword, timeout5) _, stdout, _ cli.exec_command(fcat {FLAG_PATH}) flag stdout.read().decode().strip() cli.close() # flag 常见格式 flag{...}用正则兜底提取 m re.search(rflag\{[^}]\}, flag) return m.group(0) if m else flag except Exception as e: print(f[!] {ip} 读取失败: {e}) return None if __name__ __main__: # 主循环每 30 秒跑一轮按赛制调整 while True: for ip, port, user, pwd in [(192.168.1.10, 22, root, toor)]: flag read_flag_via_ssh(ip, port, user, pwd) if flag: ok submit_flag(flag) print(f[{ if ok else -}] {ip} flag {提交成功 if ok else 提交失败}) time.sleep(30)逻辑说明read_flag_via_ssh用 paramiko 建立 SSH 连接执行cat正则flag\{[^}]\}是兜底因为有些题目 flag 前后有干扰字符。submit_flag的timeout3很重要计分板被打崩时不能让提交线程卡死否则整个循环停摆。主循环的 30 秒间隔按赛制调整一般 flag 每 1 到 5 分钟刷新一轮间隔太短浪费资源太长漏分。提示flag 路径和提交接口每个比赛都不一样赛前一定要读规则文档把FLAG_PATH和SCOREBOARD改成实际值别拿模板硬套。3. 自动化防守封 IP、流量监控和权限维持3.1 用 iptables 脚本自动封禁高频扫描 IPAWD 里对手的扫描和利用流量有特征短时间内大量连接、特定路径爆破、异常 User-Agent。防守脚本的核心是「检测到就封」用iptables落地。下面这个脚本读 web 日志把一分钟内请求超过阈值的 IP 拉黑#!/bin/bash # auto_ban.sh - 根据 nginx 日志自动封禁高频 IP LOG/var/log/nginx/access.log THRESHOLD100 # 一分钟内请求数阈值 BAN_LIST/tmp/banned.txt # 取最近一分钟日志统计每个 IP 的请求数 awk -v d$(date -d 1 minute ago %d/%b/%Y:%H:%M) \ $0 ~ d {print $1} $LOG | sort | uniq -c | sort -rn | \ while read count ip; do if [[ $count -gt $THRESHOLD ]]; then # 已封过就跳过保证幂等 grep -q ^$ip$ $BAN_LIST 2/dev/null continue iptables -I INPUT -s $ip -j DROP echo $ip $BAN_LIST echo [] 已封禁 $ip请求数 $count fi done参数说明THRESHOLD是核心调参点设太低会误封正常用户和队友的扫描器设太高漏封。实战里我一般先设 200 观察一轮确认正常流量峰值后再往下调。iptables -I INPUT用-I插到链首保证规则优先生效。BAN_LIST做幂等避免重复封禁导致规则堆积。这里有个玄学问题有些比赛环境里iptables规则会被重置或者容器里根本没权限。常见做法是脚本里加一层检测iptables -L失败就降级用nft或直接改 nginx 配置deny。别死磕一种方案。3.2 权限维持改 SSH 配置和留后门的边界AWD 的防守不只是封 IP还要保证自己随时能进。对手打穿你的机器后常见操作是改 root 密码、删你的 SSH key、关 SSH 服务。所以脚本集合里要有一个「权限维持」脚本定期检查并恢复 SSH 配置#!/bin/bash # keep_access.sh - 定期恢复 SSH 访问权限 # 确保 root 登录和密码认证开启 sed -i s/^#*PermitRootLogin.*/PermitRootLogin yes/ /etc/ssh/sshd_config sed -i s/^#*PasswordAuthentication.*/PasswordAuthentication yes/ /etc/ssh/sshd_config # 检查 sshd 是否在跑不在就拉起 if ! pgrep -x sshd /dev/null; then systemctl start ssh 2/dev/null || /usr/sbin/sshd echo [] sshd 已重启 fi逻辑说明sed把被注释或改错的配置项强制改回可用状态pgrep -x sshd精确匹配进程名避免匹配到sshd相关的其他进程。systemctl失败时降级直接调/usr/sbin/sshd兼容没有 systemd 的容器环境。注意权限维持脚本的边界要清楚只恢复自己的访问不要去做影响服务可用性的操作。AWD 计分里服务 down 掉会扣分把 sshd 搞挂比被对手打穿还亏。3.3 用 crontab 把脚本串成自动巡检流水线单个脚本跑一次没用要串成定时任务。用crontab -e加几条# 每 2 分钟检查一次 SSH 访问 */2 * * * * /opt/awd/keep_access.sh /var/log/awd_keep.log 21 # 每 1 分钟跑一次自动封禁 * * * * * /opt/awd/auto_ban.sh /var/log/awd_ban.log 21 # 每 5 分钟备份一次幂等当天只备一次 */5 * * * * /opt/awd/batch_backup.sh /var/log/awd_backup.log 21参数说明*/2是每 2 分钟*是每分钟。频率别设太密auto_ban每分钟跑一次已经够设成每 10 秒会拖垮机器。日志重定向 ... 21把标准输出和错误都存下来出问题能回溯。这里踩过的坑是 crontab 环境变量和登录 shell 不一样脚本里用到的sshpass、iptables最好写绝对路径否则 cron 里报「command not found」。4. 避坑与排查脚本跑不起来时先看这几处4.1 现象脚本卡住不动没有任何输出原因SSH 首次连接等待指纹确认或者靶机被打挂后连接挂起。sshpass只解决密码交互不解决 host key 确认和超时。解决所有 ssh 命令加-o StrictHostKeyCheckingno -o ConnectTimeout5Python 的 paramiko 加timeout5并设置set_missing_host_key_policy(AutoAddPolicy())。超时参数是保命的没有它一个挂掉的靶机能卡死整个循环。4.2 现象备份出来的 tar.gz 解压报「归档文件损坏」原因tar 打包时把警告信息如tar: Removing leading /写进了标准输出和压缩流混在一起。或者 SSH 连接中途断开文件不完整。解决打包命令加2/dev/null把警告赶到标准错误本地重定向只接标准输出。备份后加一步校验tar tzf测试能否列出内容失败就删掉重备if ! tar tzf $BACKUP_ROOT/$ip.tar.gz /dev/null 21; then echo [-] $ip 备份损坏删除重试 rm -f $BACKUP_ROOT/$ip.tar.gz fi4.3 现象crontab 里脚本不执行手动跑却正常原因cron 的环境变量极简PATH里没有/usr/local/bin等目录sshpass、python3找不到。另外脚本没有执行权限。解决脚本里用绝对路径调命令或者在 crontab 顶部加PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。给脚本加执行权限chmod x。排查时先看/var/log/syslog或journalctl -u cron里的报错。4.4 现象自动封禁把队友或自己封了原因阈值设太低或者队友的扫描器、自己的 flag 提交脚本请求频率触发了阈值。iptables封禁是全局的封了自己就进不去。解决维护一个白名单文件封禁前先比对WHITELIST/opt/awd/whitelist.txt # 每行一个 IP grep -q ^$ip$ $WHITELIST continue白名单里放队友 IP、计分板 IP、自己的攻击机 IP。阈值先宽后紧观察一轮正常流量再调。4.5 现象flag 提交一直失败但 flag 读到了原因提交接口字段名不对、token 过期、或者计分板限流。有些比赛提交接口要 JSON 而不是表单有些要加Content-Type头。解决先用curl手动提交一次确认字段和格式curl -X POST http://10.0.0.1/api/submit \ -H Content-Type: application/json \ -d {token:xxx,flag:flag{test}}手动通了再改脚本。计分板限流的话提交循环加time.sleep(1)错峰别一秒打几十次。5. 进阶把脚本集合做成可配置的作战面板打到后面你会发现散装脚本管理起来很乱改个 IP 要动好几个文件。进阶做法是抽一个统一配置文件所有脚本读同一份config.yaml再用一个入口脚本调度。这样赛前改配置、赛中看日志、赛后复盘都清爽。配置文件长这样# config.yaml hosts: - ip: 192.168.1.10 port: 22 user: root pass: toor - ip: 192.168.1.11 port: 22 user: root pass: toor scoreboard: url: http://10.0.0.1/api/submit token: your_team_token interval: 30 defense: ban_threshold: 150 whitelist: - 10.0.0.1 - 192.168.1.100Python 读配置统一调度import yaml def load_config(pathconfig.yaml): with open(path, r, encodingutf-8) as f: return yaml.safe_load(f) cfg load_config() for h in cfg[hosts]: print(f目标 {h[ip]}:{h[port]} 用户 {h[user]}) print(f计分板 {cfg[scoreboard][url]}提交间隔 {cfg[scoreboard][interval]}s)参数说明yaml.safe_load比load安全不会执行任意对象构造。interval从配置读赛制变了不用改代码。白名单放配置里封禁脚本读同一个文件避免两处维护不一致。验证脚本集合是否可靠我一般做三步赛前用本地虚拟机搭两台靶机跑一遍全流程确认改密、备份、提交、封禁都通赛中先只开备份和权限维持观察十分钟确认不影响服务再开自动封禁赛后把日志拉出来复盘看哪一步漏了。这套流程跑顺了AWD 里你至少不会因为手忙脚乱丢分。我自己的习惯是赛前把脚本集合打包成一个目录git init做版本管理每场比赛开一个分支赛后把有效的改动合并回主干。这样打十几场下来脚本集合会越来越贴合实战而不是每次从零写。希望帮到你。本文还有配套的精品资源点击获取