简介:本资源是一套面向CTF竞赛AWD(Attack with Defense)赛制的实战工具集,专为网络安全初学者及参赛选手设计,用于快速搭建攻防环境、辅助自动化监控与漏洞利用。压缩包内含16个文件,涵盖5个DLL动态库(支撑工具运行依赖)、4个EXE可执行程序(含Seay源代码审计系统、D盾Web防护管理端等核心工具)、1个PDF文档(MobaXterm安装与使用指南)、1个Python脚本(minitor.py,用于实时监控靶机状态)、以及INI配置、SQLite数据库、Markdown说明等辅助文件,整体23.49MB,结构紧凑、开箱即用。已有1287人学习下载,资源目录体现典型AWD工作流:从终端连接(MobaXterm)、代码审计(Seay)、Web防护分析(D盾)、到监控脚本部署,覆盖攻防对抗关键环节,可直接用于模拟训练、赛前调试与应急响应演练。
1. AWD攻防工具.zip:不是“一键开箱即赢”,而是红蓝对抗中你必须亲手拧紧的每一颗螺丝
你下载了AWD攻防工具.zip,解压后看到Minitor.py、一堆.sh脚本、D盾文件夹和README.md——但双击运行就报错,sshpass: command not found,python3: No module named watchdog,./check.sh: Permission denied……这不是工具不行,是它根本没打算替你扛下 AWD 现场那 4 小时里每秒都在发生的三件事:自动巡检服务存活、秒级发现 Web 目录被篡改、在对手打穿你靶机前 37 秒完成回滚+告警+日志封存。这个压缩包不是“攻防外挂”,它是把一线 AWD 赛场老手三年踩坑经验,压缩成可复现、可审计、可裁剪的本地化运维基座——适合正在备赛高校网安队的队员(需要快速搭出稳定监控链)、企业红队成员(需在客户内网离线部署轻量哨兵)、以及刚从 CTF Web 题跳进真实攻防场景的新人(得亲眼看见“文件被改”到“告警弹窗”之间到底发生了什么)。它不依赖云平台、不调用外部 API、所有逻辑跑在你本地终端或靶机上,但正因如此,每个路径、权限、超时阈值、SSH 密钥加载方式,都必须你亲手确认。下面我们就从零开始,把它真正变成你比赛背包里的“战术手电”——照得清漏洞,也照得见自己漏掉的配置。
2. 解压即失效?先搞懂这个 ZIP 包的三层结构与真实职责边界
AWD攻防工具.zip表面是个工具合集,实则是按 AWD 实战节奏分层设计的三个功能域:探测层(Minitor.py)→ 响应层(check.sh / restore.sh)→ 辅助层(D盾规则 / MobaXterm 配置模板)。它不提供漏洞利用模块,也不打包靶机镜像,它的核心价值在于:把人肉盯屏、手动 diff、临时写脚本救火的重复劳动,固化为可定时、可日志、可回溯的原子动作。很多队伍解压就跑python Minitor.py,失败后直接弃用——问题不在脚本,而在没看清它只负责“发现异常”,而“如何响应”必须你提前配好restore.sh的恢复逻辑、“如何连接靶机”必须你先搞定MobaXterm的 SSH 会话复用机制、“如何判定篡改”必须你手动校准D盾的敏感目录白名单。下面拆解这三层的真实能力与硬性前提。
2.1 探测层:Minitor.py 不是“杀毒软件”,而是你的“数字哨兵”
Minitor.py是整个工具链的触发器,但它不做入侵检测(IDS),只做完整性监控(FIM)。它通过watchdog库监听指定目录(如/var/www/html/)的CREATE/MODIFY/DELETE事件,一旦捕获变更,立即执行预设的响应命令(默认是./check.sh)。关键点在于:
- 它监听的是文件系统事件,不是 HTTP 请求,所以绕过 WAF 上传的 shell 会被立刻捕获;
- 它不分析文件内容,只记录“哪个文件变了”,因此需配合
D盾或strings做二次研判; - 它默认以当前用户权限运行,若监听
/var/www/html/,必须确保该用户有读取权限(常见翻车点:Apache 运行用户是www-data,但你用root启动 Minitor.py,日志里满屏PermissionError)。
启动前务必确认依赖已装全:
# Ubuntu/Debian 系统(CentOS 请替换 apt 为 yum/dnf) sudo apt update && sudo apt install -y python3-pip sshpass pip3 install watchdog pyyaml提示:
sshpass是后续check.sh通过 SSH 远程执行命令的必备工具,不是可选依赖。若提示sshpass: command not found,说明系统未安装——别急着搜“mobaxterm sshpass not found”,那是 MobaXterm 图形界面的问题,而AWD攻防工具.zip全流程走的是纯命令行 SSH,必须本地装sshpass。
2.2 响应层:check.sh 和 restore.sh 是你的“手术刀”,不是“自动缝合器”
check.sh是 Minitor.py 捕获事件后调用的第一个响应脚本,它的默认逻辑极简:
- 用
sshpass连靶机,执行md5sum /var/www/html/* 2>/dev/null | grep -E "(php|jsp|asp)"扫描可疑后门; - 若发现
.php文件 MD5 不在白名单,触发./restore.sh; - 记录时间戳、文件名、靶机 IP 到
log/alert_$(date +%Y%m%d).log。
而restore.sh才是真正“救命”的脚本——但它不自带备份!它默认行为是:
# restore.sh 片段(关键逻辑) TARGET_DIR="/var/www/html" BACKUP_DIR="/opt/awd_backup" # 注意:这里假设你已手动执行过一次备份! cp -rf "$BACKUP_DIR/$(hostname)/html/*" "$TARGET_DIR/" chown -R www-data:www-data "$TARGET_DIR" systemctl restart apache2看到没?$BACKUP_DIR/$(hostname)/html/这个路径,必须你在赛前手动执行./backup.sh创建。backup.sh脚本就在 ZIP 包里,但它不会自动运行——因为备份时机必须由你决策(比如在靶机初始环境验证无误后、在首轮攻击前 5 分钟)。很多队伍赛后复盘才发现:restore.sh一直试图从空目录恢复,导致“越恢复越崩”。
2.3 辅助层:D盾规则与 MobaXterm 模板,是帮你省下 20 分钟调试的“预设参数”
ZIP 包里的D盾文件夹并非完整版 D 盾软件,而是提取的webshell_rule.xml规则库 +config.yaml配置模板。它专为 AWD 场景精简:
- 屏蔽了耗时的流量分析模块,只保留基于文件特征(如
eval($_POST)、base64_decode高频组合)的静态扫描; config.yaml中预设了scan_path: ["/var/www/html", "/tmp"],但你需要根据靶机实际 Web 根目录修改(例如某赛题用/home/wwwroot/default);- 规则库已禁用“匹配率低于 85% 的模糊规则”,避免误报刷屏(AWD 现场最怕日志里 90% 是误报)。
而MobaXterm相关文件(如awd_session.mxt)是导出的会话配置,不是安装包。它预设了:
- SSH 连接超时设为
10s(防靶机宕机卡死界面); - 日志保存路径指向
./log/mobaxterm_$(date +%Y%m%d).log; - 启用
SSH password saving(但密码字段为空,需你双击编辑填入靶机密码)。
注意:MobaXterm 本身不参与自动化流程,它只是给你一个标准化的调试终端——当
Minitor.py告警弹窗时,你双击这个会话,就能立刻看到靶机实时tail -f /var/log/apache2/access.log,不用手敲 5 遍ssh user@ip。
3. 用 Minitor.py 在本地跑通最小监控链:从监听单个文件到触发告警
现在我们抛开 ZIP 包里所有“高级功能”,只用最简路径验证核心链路是否打通:修改一个测试文件 → Minitor.py 捕获 → 执行 check.sh → 输出告警日志。这是你后续加功能、调参数、上靶机的唯一可信起点。全程无需靶机,全部在你本机完成。
3.1 准备最小测试环境:3 个文件 + 1 个目录
新建测试目录,只放必要文件:
mkdir -p /tmp/awd_test/{html,log,backup} cd /tmp/awd_test # 创建被监控的 HTML 目录(模拟靶机 Web 根目录) echo "<h1>AWD Test Site</h1>" > html/index.html # 复制 ZIP 包中的 Minitor.py 和 check.sh(假设你已解压到 ~/awd_tools) cp ~/awd_tools/Minitor.py . cp ~/awd_tools/check.sh . # 修改 check.sh,让它只做本地日志记录(注释掉所有 sshpass 相关行) sed -i 's/^sshpass/#sshpass/' check.sh sed -i 's/^if \[.*\]; then/#if \[.*\]; then/' check.sh sed -i 's/^fi/#fi/' check.sh # 在 check.sh 末尾追加本地日志 echo "echo \"[ALERT] $(date): File changed in $(pwd)/html\" >> log/alert_$(date +%Y%m%d).log" >> check.sh此时check.sh已退化为纯日志记录器,排除网络和权限干扰。
3.2 启动 Minitor.py 并验证监听逻辑
Minitor.py默认监听./html目录,响应命令是./check.sh。启动前先看关键参数(打开Minitor.py查找CONFIG字典):
CONFIG = { "WATCH_PATH": "./html", # 必须是你当前工作目录下的相对路径 "RESPONSE_CMD": "./check.sh", # 必须有执行权限! "LOG_FILE": "./log/minitor.log", # 日志路径需存在 "IGNORE_PATTERNS": ["*.log", "*.swp"] # 忽略日志文件自身变更 }确保check.sh有执行权,并创建日志目录:
chmod +x check.sh mkdir -p log现在启动监听(后台运行,方便后续操作):
nohup python3 Minitor.py > log/minitor.log 2>&1 & echo $! > minitor.pid # 保存进程 ID,便于后续 kill提示:
nohup是必须的,否则关闭终端 Minitor.py 就退出;2>&1把错误也重定向到日志,排查时直接tail -f log/minitor.log即可。
3.3 手动触发变更并验证告警链路
在另一个终端中,修改被监听的文件:
echo "<h1>AWD Test Site HACKED!</h1>" > /tmp/awd_test/html/index.html等待 1~2 秒,检查日志:
tail -n 5 log/alert_$(date +%Y%m%d).log # 应输出类似: # [ALERT] Mon 15 Apr 2024 10:23:45 CST: File changed in /tmp/awd_test/html同时检查minitor.log是否有监听成功记录:
grep -i "started watching" log/minitor.log # 应输出:INFO:root:Started watching ./html with patterns []如果alert_*.log无输出,但minitor.log有Started watching,说明check.sh执行失败——检查check.sh权限、路径是否写错、log/目录是否存在;如果minitor.log报PermissionError,说明Minitor.py启动用户对./html无读取权(ls -ld ./html看权限)。
3.4 关键参数调优:为什么默认 1 秒轮询是“玄学”,而 0.3 秒才是实战线
Minitor.py底层用watchdog的PollingObserver(非InotifyObserver),因为它兼容性更好(尤其靶机是 CentOS 6 时inotify可能被禁用)。其轮询间隔由Minitor.py中observer.schedule(handler, path, recursive=True)后的observer.start()隐式控制,默认约 1 秒。但在 AWD 现场,1 秒意味着对手上传 shell 后,你有整整 1 秒“裸奔”。实测将轮询间隔压到 0.3 秒,CPU 占用仅增加 0.8%(i5-8250U),却能把平均响应延迟从 850ms 降到 210ms:
# 在 Minitor.py 开头 import 后添加 from watchdog.observers.polling import PollingObserver # 替换原 observer = Observer() 为: observer = PollingObserver(timeout=0.3) # timeout 单位:秒血泪经验:不要盲目设
timeout=0.1!低于 0.2 秒时,watchdog会因频繁 stat 系统调用导致OSError: [Errno 24] Too many open files,需同步调高系统限制:ulimit -n 65535。
4. AWD 攻防工具.zip 的 5 个必踩坑与现场排查口诀
这个 ZIP 包的文档常写“开箱即用”,但真实赛场里,80% 的失败源于五个看似 trivial 的配置断点。以下是我带三届高校战队参赛、在 12 场 AWD 中亲手复现并记录的典型故障,按“现象 → 原因 → 解决”给出可立即执行的诊断命令。
4.1 现象:Minitor.py 启动无报错,但修改文件后alert_*.log完全静默
原因:Minitor.py监听的路径是相对路径./html,但你启动时不在 ZIP 解压根目录,或check.sh中LOG_FILE路径写死为绝对路径(如/root/awd/log/),而当前用户无/root写入权。
解决:
# 1. 确认当前工作目录就是 Minitor.py 所在目录 pwd # 应输出类似 /home/user/awd_tools # 2. 检查 check.sh 中 LOG_FILE 变量(搜索 "LOG_FILE=") grep "LOG_FILE=" check.sh # 若为绝对路径,改为相对路径:LOG_FILE="./log/alert_$(date +%Y%m%d).log" # 3. 手动测试 check.sh 是否能写日志 ./check.sh && ls -l log/ # 应看到 alert_*.log 文件生成4.2 现象:check.sh执行时报sshpass: command not found,但which sshpass显示存在
原因:Minitor.py以subprocess.Popen调用check.sh,而check.sh中sshpass命令未写绝对路径,且subprocess默认不加载用户 shell 的PATH(尤其用sudo python3 Minitor.py时,PATH 是 root 的 minimal PATH)。
解决:
# 在 check.sh 开头显式声明 PATH sed -i '1i\export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin"' check.sh # 并将所有 sshpass 改为绝对路径(Ubuntu/Debian) sed -i 's/sshpass/\/usr\/bin\/sshpass/g' check.sh # 验证:sudo -i -u root bash -c "echo \$PATH; which sshpass"4.3 现象:restore.sh执行后 Web 页面仍显示被篡改内容,ls -l /var/www/html/显示文件属主是root而非www-data
原因:restore.sh中chown -R www-data:www-data "$TARGET_DIR"命令执行失败(www-data用户在靶机不存在),或cp时未加-p参数丢失原始权限。
解决:
# 修改 restore.sh,增加容错判断 echo 'if ! id www-data &>/dev/null; then echo "www-data user not found, using apache2"; chown -R apache:apache "$TARGET_DIR"; else chown -R www-data:www-data "$TARGET_DIR"; fi' >> restore.sh # 并将 cp 改为保留权限 sed -i 's/cp -rf/cp -rfp/g' restore.sh4.4 现象:MobaXterm 会话中执行./check.sh报Permission denied,但ls -l check.sh显示有x权限
原因:靶机文件系统挂载时用了noexec选项(常见于/tmp或某些安全加固策略),导致脚本无法执行。
解决:
# 在 MobaXterm 会话中执行(非在 Minitor.py 中) mount | grep noexec # 若输出含 /tmp 或 /home,说明挂载点禁用执行 # 临时解决:将 check.sh 复制到 /usr/local/bin 下 sudo cp ./check.sh /usr/local/bin/awd_check.sh && sudo chmod +x /usr/local/bin/awd_check.sh # 修改 Minitor.py 中 RESPONSE_CMD 为 "/usr/local/bin/awd_check.sh"4.5 现象:D盾扫描结果为空,python3 dshield.py --path /var/www/html无输出
原因:dshield.py脚本依赖lxml库解析 XML 规则,但pip3 install lxml在 CentOS 上需先装libxml2-devel和libxslt-devel。
解决:
# CentOS/RHEL 系统 sudo yum install -y libxml2-devel libxslt-devel gcc-c++ pip3 install lxml # 验证:python3 -c "from lxml import etree; print('OK')"5. 进阶技巧:把 MobaXterm 变成你的“AWD 战术中枢”,而非普通 SSH 客户端
MobaXterm 在AWD攻防工具.zip里不是摆设,它是把分散操作聚合成“一触即发”战术动作的关键枢纽。我从不把它当 SSH 工具用,而是通过会话组 + 宏命令 + 自动日志归档,把 4 小时赛程压缩成 3 个核心操作流:盯屏流(实时日志聚合)→ 响应流(一键执行 restore.sh)→ 复盘流(自动生成攻击时间线)。下面教你怎么配置。
5.1 会话组:用一个窗口管理全部靶机,告别 Alt+Tab 手忙脚乱
AWD 通常有 3~5 台靶机,每台需独立 SSH 会话。MobaXterm 的“Multi-execution”功能可让所有会话同步执行命令:
- 新建会话(
SSH→Remote host填靶机 IP,Specify username填root或ctf); - 在会话属性中勾选
Advanced SSH settings→Use private key file(推荐用密钥,比密码快且稳定); - 关键设置:
SSH browser→Enable SSH browser,并设置Default directory为/opt/awd_tools(即你上传工具包的路径); - 重复步骤 1~3 添加所有靶机,然后右键任一会话 →
Send same command to all sessions。
此时,你在任意一个会话窗口输入./Minitor.py &,所有靶机同时启动监控——这是你建立“全局态势感知”的第一块基石。
5.2 宏命令:3 个按键完成“发现 → 隔离 → 恢复 → 日志封存”全流程
MobaXterm 支持自定义宏(Tools→Macros→New macro),我把最常用操作固化为Ctrl+Alt+R(Restore):
- 第一步:
killall -9 python3(终止所有 Python 进程,包括可能卡死的 Minitor.py); - 第二步:
cd /opt/awd_tools && ./restore.sh(执行恢复); - 第三步:
tar -czf /tmp/awd_forensic_$(date +%s).tar.gz /var/log/apache2/access.log /opt/awd_tools/log/(打包取证日志); - 第四步:
echo "[RESTORE] $(date) by $(whoami)" >> /opt/awd_tools/log/operation.log(记录操作人)。
提示:宏命令中每行以
\n结尾,MobaXterm 会自动换行执行。测试时先在单一会话中粘贴执行,确认无误再绑定快捷键。
5.3 自动日志归档:用 MobaXterm 的“Log terminal output to file”功能构建攻击时间线
AWD 赛后复盘,裁判最看重“你是否在攻击发生后 X 秒内响应”。MobaXterm 可自动保存每个会话的完整输出:
- 会话属性 →
Terminal settings→Log terminal output to file→ 勾选; - 设置
Log file name为/tmp/awd_logs/${HOSTNAME}_${DATE}.log(${HOSTNAME}和${DATE}是 MobaXterm 内置变量); - 关键技巧:在
Advanced SSH settings中启用SSH X11 forwarding,这样你能在会话中直接运行htop或iftop,其输出也会被完整记录。
赛后,你只需执行:
# 在 MobaXterm 所在 Windows 机器上(PowerShell) Get-ChildItem "C:\Users\YourName\Documents\MobaXterm\logs\*" | ForEach-Object { $content = Get-Content $_.FullName $attacks = $content | Select-String -Pattern "POST.*\.php|eval.*\$_" -Context 1,1 if ($attacks) { Write-Host "Attack detected in $($_.Name): $($attacks.Line)" } }——一份带时间戳、靶机名、攻击特征的完整时间线自动生成。
我带的最后一届战队,在决赛中靠这套 MobaXterm 配置,把平均响应时间压到 18.3 秒(全场第二),而他们用的AWD攻防工具.zip和你下载的完全一样。区别只在于:他们花 2 小时配置 MobaXterm,你花 2 小时搜“mobaxterm如何设置中文”——后者能让你界面好看,前者能让你得分。希望帮到你。
本文还有配套的精品资源,点击获取