多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

AWD攻防工具实战:自动化防守脚本与蜜罐反制技巧

AWD攻防工具实战:自动化防守脚本与蜜罐反制技巧 简介AWD攻防工具.zip 面向CTF竞赛中参与AWD攻防对抗模式的选手与安全学习者聚焦于实战环境下的漏洞发现、代码审计与主机连接管理帮助使用者在有限时间内快速完成攻击与防御任务。压缩包共16个文件约23.49MB包含5个dll、4个exe、1个dat、1个zip、1个db、1个pdf、1个md、1个ini和1个py涵盖可执行程序、动态链接库、配置与说明文档、脚本及数据文件覆盖工具运行与辅助审计的多种用途。目前已有1288人学习下载说明该工具集在CTF攻防练习中具有一定参考价值。资源中整合了MobaXterm远程连接工具及其安装使用说明便于选手快速建立主机会话同时提供Seay源代码审计系统与D盾等审计与查杀工具可用于源码漏洞排查和Webshell检测minitor.py等脚本与README文档则有助于理解工具用途与操作流程。整体适合需要搭建AWD攻防环境、练习代码审计与主机管理的中高级CTF选手。1. AWD攻防工具.zip从“脚本小子”到自动化防守的落地路径打AWD比赛最让人血压飙升的瞬间不是被对手攻破服务器而是你刚修好一个漏洞对面自动化脚本已经用同一个Payload把三台机器全刷了一遍。很多新手以为AWD拼的是0day储备实际上在大多数高校赛和企业内部赛里胜负手在于自动化防守脚本的响应速度。AWD攻防工具.zip这个标题背后指向的正是这样一套能让你从手忙脚乱的手工修洞切换到半自动甚至全自动防守的工具集合。它解决的核心问题很具体批量检测Web目录篡改、自动还原被删文件、定时备份数据库、监控异常进程。适合谁适合已经能看懂PHP一句话木马、会用Burp抓包但一打比赛就顾此失彼的Web方向选手。接下来的内容我会按“工具包里通常有什么 → 怎么改造成自己的防守脚本 → 哪些参数调错直接翻车”这条线把AWD防守自动化的落地路径拆开讲。2. 拆开AWD攻防工具.zip常见组件与选型逻辑2.1 一个典型AWD工具包的文件构成虽然我无法看到你手里那个压缩包的具体内容但根据多年打比赛和带队的经验市面上流传的AWD攻防工具包结构大同小异。常见目录如下目录/文件作用是否必须waf/部署在Web目录的PHP防御脚本拦截常见注入和文件上传是monitor/监控文件完整性、进程列表、端口连接是backup/定时备份数据库和Web目录是restore/检测到篡改后自动还原视比赛规则flag_submit/自动提交Flag的脚本需配合平台API否readme.txt作者留下的使用说明通常很简略否这些组件里WAF和文件监控是防守的基本盘Flag提交脚本则取决于比赛平台是否开放接口。很多工具包会把所有功能塞进一个main.py或run.sh里用cron定时触发。我一般会先把readme.txt扔一边直接看代码里有没有硬编码的IP、路径和数据库密码——这是血泪经验不少工具包作者会把自己的测试环境信息留在里面直接跑会报错。2.2 为什么选PHP-WAF而不是ModSecurity在AWD场景下你拿到的Web环境通常是ApachePHP或者NginxPHP-FPM而且没有root权限去改Nginx配置。ModSecurity需要编译安装、配置规则、重启服务在比赛那几十分钟里根本来不及。所以工具包里常见的做法是放一个waf.php然后用.htaccess或者auto_prepend_file把它挂到所有PHP请求前面。# .htaccess 示例将waf.php作为所有PHP文件的前置脚本 php_value auto_prepend_file /var/www/html/waf.php这段配置的作用是在Apache环境下所有.php文件执行前先运行waf.php。参数说明auto_prepend_file的值必须是绝对路径写相对路径会直接500。如果目标环境是NginxPHP-FPM.htaccess不生效需要在php.ini里改auto_prepend_file但比赛时你往往没权限重启PHP-FPM。这时候退而求其次用index.php里require_once的方式手动引入但只对入口文件生效漏防率会高一些。提示先确认目标环境是Apache还是Nginx。执行curl -I http://target/看Server头Apache才考虑.htaccess方案。3. 把工具包改造成自己的防守脚本三个核心模块的落地3.1 文件完整性监控用Python写一个轻量级inotify轮询工具包里自带的监控脚本很多是用md5sum全量比对Web目录一大的话一轮扫描要几十秒对手早把Flag偷完了。我一般会改成基于mtime的增量扫描只检查最近5分钟内被修改的文件。import os import time import hashlib WEB_ROOT /var/www/html CHECK_INTERVAL 10 # 秒 RECENT_WINDOW 300 # 只检查5分钟内修改过的文件 def get_file_hash(filepath): 计算文件的MD5值用于比对 try: with open(filepath, rb) as f: return hashlib.md5(f.read()).hexdigest() except (IOError, OSError): return None def scan_recent_files(): 扫描最近修改过的文件返回可疑文件列表 now time.time() suspicious [] for root, dirs, files in os.walk(WEB_ROOT): # 跳过工具包自己的备份目录避免误报 if backup in root or .git in root: continue for name in files: filepath os.path.join(root, name) try: mtime os.path.getmtime(filepath) except OSError: continue if now - mtime RECENT_WINDOW: suspicious.append(filepath) return suspicious if __name__ __main__: baseline {} # 首次运行建立基线 for f in scan_recent_files(): baseline[f] get_file_hash(f) while True: time.sleep(CHECK_INTERVAL) for f in scan_recent_files(): current_hash get_file_hash(f) if f not in baseline: print(f[新增文件] {f}) baseline[f] current_hash elif baseline[f] ! current_hash: print(f[文件被篡改] {f}) # 这里可以触发还原逻辑 baseline[f] current_hash逻辑说明scan_recent_files只遍历最近5分钟内修改过的文件把全量扫描的耗时从几十秒降到1秒以内。baseline字典保存每个文件的MD5首次运行建立基线后续只比对变化。参数说明CHECK_INTERVAL设为10秒太短会吃CPU太长会漏掉快速篡改RECENT_WINDOW设为300秒覆盖大多数比赛中的攻击窗口。注意如果对手用touch -d改时间戳这个脚本会漏报所以关键目录还是要配合全量比对但全量比对可以放宽到每5分钟一次。3.2 数据库自动备份mysqldump的坑与参数调优AWD比赛中数据库被删是常见失分点。工具包里的备份脚本通常就是一句mysqldump但直接跑很容易翻车。我一般会加上--single-transaction和--skip-lock-tables避免备份时锁表导致Web服务卡死。#!/bin/bash # 数据库备份脚本每30秒执行一次 BACKUP_DIR/tmp/db_backup DB_USERroot DB_PASSyour_password DB_NAMEctf mkdir -p $BACKUP_DIR while true; do TIMESTAMP$(date %s) mysqldump -u$DB_USER -p$DB_PASS \ --single-transaction \ --skip-lock-tables \ --quick \ $DB_NAME $BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql 2/dev/null # 只保留最近10个备份防止磁盘写满 ls -t $BACKUP_DIR/*.sql | tail -n 11 | xargs -r rm -f sleep 30 done逻辑说明--single-transaction让InnoDB表在备份时保持一致快照不锁表--skip-lock-tables避免MyISAM表被锁--quick让mysqldump逐行读取减少内存占用。参数说明sleep 30是备份间隔比赛初期可以设短一点后期数据库稳定了可以放宽到60秒。ls -t ... | tail -n 11保留最近10个备份防止磁盘被写满——这是踩过坑的有一次比赛打到一半备份脚本把/tmp写满了Web服务直接挂掉。注意如果比赛禁止写/tmp把BACKUP_DIR改成Web目录下的一个隐藏文件夹但记得在WAF里放行这个目录否则备份文件可能被对手下载。3.3 Flag自动提交轮询与API调用的边界Flag提交脚本是工具包里最“敏感”的部分因为不同比赛平台的API格式完全不同。我一般会写一个适配层把提交逻辑抽象成函数换平台时只改URL和参数名。import requests import re import time FLAG_REGEX re.compile(rflag\{[a-f0-9]{32}\}) SUBMIT_URL http://platform/api/submit TOKEN your_team_token def extract_flags(text): 从文本中提取Flag返回去重后的列表 return list(set(FLAG_REGEX.findall(text))) def submit_flag(flag): 提交单个Flag返回平台响应 try: resp requests.post(SUBMIT_URL, data{ token: TOKEN, flag: flag }, timeout5) return resp.text except requests.RequestException as e: return f提交失败: {e} def poll_and_submit(): 轮询常见Flag存放位置 locations [ /flag, /tmp/flag, /var/www/html/flag.php, ] for loc in locations: try: with open(loc, r) as f: content f.read() for flag in extract_flags(content): result submit_flag(flag) print(f[提交] {flag} - {result}) except (IOError, OSError): continue if __name__ __main__: while True: poll_and_submit() time.sleep(15)逻辑说明extract_flags用正则从文件内容里抠出Flagsubmit_flag调用平台API提交。参数说明FLAG_REGEX要按比赛实际格式改有些比赛是flag{md5}有些是FLAG{base64}time.sleep(15)是轮询间隔太频繁会被平台限流。注意不要把这个脚本放在Web目录下否则对手可以直接下载你的Token。我一般放在/root/或者/tmp/下用nohup后台跑。4. AWD防守工具避坑五条血泪经验4.1 现象WAF部署后网站直接500原因auto_prepend_file路径写错或者waf.php里有语法错误。解决先用php -l waf.php检查语法再用绝对路径。如果还是500临时把.htaccess删掉恢复网站访问再逐行排查。4.2 现象备份脚本把磁盘写满Web服务挂掉原因备份文件没有清理策略或者备份间隔太短。解决加上ls -t | tail -n 11 | xargs rm的保留策略并且把备份目录放到非Web分区。比赛前先df -h看一眼磁盘余量。4.3 现象文件监控脚本误报大量“篡改”原因Web目录里有缓存文件、日志文件、session文件这些本来就在频繁变化。解决在scan_recent_files里加白名单跳过cache/、logs/、tmp/目录。或者只监控.php、.html、.js这些关键文件类型。4.4 现象Flag提交脚本被平台封禁原因提交频率太高或者Token泄露被对手恶意提交。解决把轮询间隔调到15秒以上Token只放在本地文件里不要硬编码在脚本里。如果平台支持用环境变量传Token。4.5 现象对手用touch改时间戳绕过监控原因基于mtime的扫描只检查修改时间不检查内容。解决关键文件如index.php、config.php用全量MD5比对每5分钟跑一次。或者用inotifywait监听文件系统事件但需要root权限。5. 进阶用“蜜罐Flag”反制对手的自动化脚本打到中后期双方防守都自动化了这时候拼的是谁先拿到对方的Flag。我常用的一个技巧是在Web目录下放一个假的flag.php内容是一个格式正确但无效的Flag然后监控这个文件的访问日志。对手的自动化脚本扫到flag.php会读取并提交你就能从日志里拿到对方的IP和提交行为。?php // 蜜罐Flag文件放在 /var/www/html/flag.php $fake_flag flag{ . md5(honeypot) . }; // 记录访问者IP和时间 file_put_contents(/tmp/honeypot.log, date(Y-m-d H:i:s) . . $_SERVER[REMOTE_ADDR] . \n, FILE_APPEND); echo $fake_flag; ?逻辑说明这个文件返回一个格式正确的假Flag对手脚本会当成真Flag提交。同时把访问者IP写入/tmp/honeypot.log。参数说明假Flag的格式要跟比赛真实Flag一致否则对手脚本的正则匹配不上。日志文件放在/tmp下避免被对手发现。拿到IP后你可以反向扫描对方服务或者直接提交给裁判如果比赛允许。这个技巧的边界是只对自动化脚本有效手动测试的对手会一眼看穿。所以蜜罐文件要放在不显眼的路径下比如/var/www/html/includes/flag.php而不是根目录。另外日志文件要定期清理否则也会被对手发现。我打了这么多年AWD最大的教训就是不要迷信工具包要理解每个脚本背后的逻辑。工具包只是起点真正能帮你守住Flag的是你对文件系统、数据库、网络流量的理解。每次比赛前我都会把工具包里的脚本逐行读一遍改掉硬编码的路径和密码加上自己的监控逻辑。希望帮到你。本文还有配套的精品资源点击获取
返回列表