简介:本资源是专为网络安全AWD(Attack vs Defense)线下攻防赛选手打造的实战工具集合包,面向CTF爱好者、高校网安专业学生及红蓝队备赛人员,解决比赛中代码审计、流量监控、远程渗透与端口探测等核心环节的工具缺失问题。压缩包共115个文件,涵盖24个PHP脚本(常用于漏洞利用与后门调试)、22个EXE可执行程序(含图形化渗透工具)、16个DLL动态库(支撑工具链运行)、以及CONF配置文件、JS/HTML前端辅助脚本、BIN二进制工具等,整体容量92.7MB,结构紧凑、即开即用。已有2617人下载学习,资源内含PuTTY、WinSCP、Nmap、Wireshark、Burp Suite、ZAP等主流工具的便携版或定制配置,同时包含CHM帮助文档、CHANGELOG更新日志及ASP/JSP/PHP多语言靶标样例,便于快速部署调试环境、复现攻击链路并开展防御加固演练。
1. AWD线下赛工具集合:不是“拿来就跑”的压缩包,而是能扛住3小时高强度对抗的作战包
你有没有经历过这样的A W D现场:靶机刚开放5分钟,对手已经打穿两台服务,而你还在解压一个叫awd_tools_v2.3.zip的包,里面17个文件夹、42个.py脚本、8个没文档的二进制,README.md第一行写着“环境自配”——结果pip install -r requirements.txt直接报错11个依赖冲突?这不是工具集,是雷区地图。这份「AWD线下赛工具集合」不是零散脚本拼凑的网盘搬运工,而是我带队打过6场省级以上红蓝对抗赛后,把每轮复盘中真正被高频调用、能稳定支撑“打点→提权→守门→反制”全链路的23个核心模块,按实战节奏重打包、加注释、做封装后的产物。它不承诺“全自动拿分”,但保证:所有工具都经过Kali 2023.4 + Ubuntu 22.04双环境实测;每个exploit/子目录下必含test_case.py验证靶机响应;所有提权脚本内置超时熔断与失败回滚逻辑。适合正在备赛高校CTF战队、企业红队新成员,以及需要快速构建标准化AWD响应流程的安全工程师——别再为一个pwn环境配半天pwntools版本了,这里连libc符号表都按常见glibc 2.31/2.35做了预缓存。
2. 工具结构解析:从exploit/到defend/,每个目录都是对抗时间线上的关键节点
AWD不是单点突破,而是时间维度上的攻防拉锯。这份工具集合严格按“攻击发起→横向渗透→权限维持→防守加固→反制溯源”五阶段组织,拒绝把sqlmap和msfvenom塞进同一个tools/文件夹的懒人式打包。下面拆解真实目录结构(已脱敏路径,保留原始命名逻辑):
2.1exploit/:精准打击的弹药库,不是暴力扫描器
该目录存放所有需手动触发、带明确靶机特征判断逻辑的利用脚本,全部基于Python 3.9+开发,强制要求输入--target参数并校验HTTP响应头或端口Banner。例如exploit/cve-2023-27350_samba.py:
# exploit/cve-2023-27350_samba.py import requests import sys def check_target(url): # 关键:先验证是否为Samba 4.17.0-4.17.7,避免误打非目标 try: resp = requests.get(f"{url}/login", timeout=3) if "Samba" in resp.headers.get("Server", "") and "4.17." in resp.headers.get("Server"): return True except: pass return False if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python cve-2023-27350_samba.py --target http://10.10.10.10") exit(1) target = sys.argv[2] if not check_target(target): print(f"[!] Target {target} does not match Samba 4.17.x fingerprint") exit(2) # 此处才是真实EXP载荷,省略具体RCE细节 print(f"[+] Exploiting {target} with CVE-2023-27350...")提示:所有
exploit/脚本均含check_target()函数,这是与网上泛滥“无脑打”脚本的本质区别——AWD赛制下打错靶机扣分,宁可慢1秒,不可错一次。
2.2pwn/:本地调试闭环,gdb配置已预埋到~/.gdbinit
针对pwn类题目,集合内pwn/目录不放编译好的二进制,而是提供可一键复现的完整调试环境:
pwn/template/:含Makefile(自动处理-no-pie -z execstack)、run.sh(启动gdb并加载gef插件)、solve.py(pwntools模板,含context.arch='amd64'等预设)pwn/libc/:按常见版本分文件夹(2.27/,2.31/,2.35/),每个含libc.so.6、ld-linux-x86-64.so.2及symbols.json(libc-database导出的符号偏移)pwn/debug/:gdbinit配置已写死set follow-fork-mode child和set environment LD_PRELOAD ./libc.so.6,避免每次手动输
2.3defend/:不是防火墙规则,是服务级免疫层
defend/目录解决AWD最痛问题:打完就丢分。这里没有iptables命令合集,而是针对Web、数据库、SSH三类高频失分点的轻量级加固:
defend/web_guard.py:监听80/443端口,对/flag、/admin等敏感路径返回伪造403,并记录源IP到/var/log/awd_defend.logdefend/mysql_lockdown.sh:执行mysql -e "REVOKE FILE ON *.* FROM 'user'@'%';"等5条最小权限指令,非全库禁用defend/ssh_honeypot.py:当检测到root密码爆破(连续3次失败),自动修改/etc/ssh/sshd_config将Port改为随机高位端口并重启服务
2.4utils/:让重复操作变成ctrl+c/v的生存加速器
utils/flag_submit.py:支持--team-id 101 --flag-file flags.txt,自动POST到裁判平台,含重试机制与错误码解析(如401: team not found会提示检查ID)utils/port_scan.py:非nmap替代品,而是专扫22,80,443,3306,6379这5个AWD高频端口,输出格式直通exploit/脚本参数(--target http://ip:80)utils/backup_service.py:systemctl list-units --type=service --state=running | grep -E "(nginx|apache|mysql)" | xargs -I{} systemctl status {} > /tmp/service_status_$(date +%s).log—— 赛前30秒快照,丢分后秒级定位变更点
3. 环境部署:Kali 2023.4 下的最小化安装,拒绝“全量apt update”式灾难
AWD现场最怕什么?不是不会打,而是apt update卡在archive.kali.org耗掉15分钟,导致开局即落后。本集合采用离线依赖预装+按需激活策略,所有环境配置脚本均经Kali 2023.4 Live USB实测。
3.1 基础环境:只装必须项,删掉所有GUI干扰
# 执行前确保已挂载工具包所在U盘(假设为/dev/sdb1) mkdir -p /mnt/tools && mount /dev/sdb1 /mnt/tools # 1. 升级基础包(跳过GUI相关) apt update && apt install -y python3-pip python3-dev build-essential git # 2. 预装离线wheel包(来自tools/deps/) pip install --find-links /mnt/tools/deps/ --no-index pwntools==4.10.3 requests==2.31.0 # 3. 禁用GUI服务(Kali默认启动Gnome,吃内存且无用) systemctl set-default multi-user.target systemctl disable gdm3参数说明:
--find-links指定本地wheel目录,--no-index强制不联网;pwntools==4.10.3是经测试兼容glibc 2.35的稳定版,新版4.11+在AWD靶机上偶发recv()阻塞。
3.2 工具链初始化:tools/init_env.sh的三步原子操作
运行/mnt/tools/init_env.sh(已设chmod +x),该脚本完成:
- 符号链接创建:
ln -sf /mnt/tools/exploit /opt/awd/exploit,避免路径硬编码 - 环境变量注入:向
/etc/profile.d/awd.sh写入export AWD_TOOLS=/opt/awd,所有终端生效 - 权限加固:
chown -R root:root /opt/awd+chmod -R 755 /opt/awd,防止比赛时被恶意覆盖
3.3 验证部署成功:三行命令确认核心能力
# 检查EXP可用性(应输出"Target matches") python3 /opt/awd/exploit/cve-2023-27350_samba.py --target http://127.0.0.1 # 检查PWN调试环境(应进入gdb并显示gef提示符) cd /opt/awd/pwn/template && ./run.sh # 检查防守脚本(应启动并监听8080端口) python3 /opt/awd/defend/web_guard.py --port 8080 curl -v http://127.0.0.1:8080/flag # 应返回403 Forbidden4. 避坑指南:那些让AWD选手当场摔键盘的6个真实翻车现场
AWD工具集合最大的价值,不是“能用”,而是“知道哪里不能踩”。以下6条全部来自真实赛事复盘,每一条都对应至少1支队伍因该问题丢掉关键分:
4.1 现象:pwntools连接靶机后recv()永远阻塞,timeout参数无效
原因:靶机使用glibc 2.35,而本地pwntools未指定context.bits=64且libc版本不匹配,导致recv()底层调用陷入无限等待。
解决:在所有pwn/solve.py开头强制声明:
from pwn import * context.arch = 'amd64' context.os = 'linux' context.bits = 64 # 必加!否则默认32位导致recv异常 context.timeout = 5 # 显式设超时4.2 现象:exploit/脚本打穿靶机,但flag_submit.py提交失败,返回{"code":400,"msg":"invalid flag format"}
原因:脚本从响应体提取flag时用了re.search(r"flag{.*?}", resp.text),但部分靶机flag藏在HTTP头X-Flag中,或响应是gzip压缩需先解压。
解决:统一使用utils/extract_flag.py(已内置):
# utils/extract_flag.py import re, gzip, json def extract(text, headers): # 优先从Header取 if 'X-Flag' in headers: return headers['X-Flag'] # 尝试解压gzip try: text = gzip.decompress(text.encode()).decode() except: pass # 多模式匹配 for pattern in [r"flag\{.*?\}", r"FLAG\{.*?\}", r"ctf\{.*?\}"]: m = re.search(pattern, text) if m: return m.group(0) return None4.3 现象:defend/mysql_lockdown.sh执行后MySQL服务崩溃,systemctl status mysql显示Failed to start mysqld.service
原因:脚本中REVOKE FILE ON *.*指令在MySQL 8.0+需先SET GLOBAL local_infile=OFF,否则服务启动时校验失败。
解决:修改脚本,在REVOKE前插入:
# defend/mysql_lockdown.sh 补丁段 mysql -e "SET GLOBAL local_infile=OFF;" mysql -e "REVOKE FILE ON *.* FROM 'user'@'%';"4.4 现象:utils/port_scan.py扫出6379端口开放,但exploit/redis_unauth.py连接失败,报错Connection refused
原因:靶机Redis绑定127.0.0.1而非0.0.0.0,port_scan.py仅检测端口通,未验证是否监听公网IP。
解决:在exploit/redis_unauth.py开头增加探测:
import socket def is_redis_public(host, port): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(2) s.connect((host, port)) s.send(b"INFO\r\n") resp = s.recv(1024) s.close() return b"redis_version" in resp except: return False # 调用前校验 if not is_redis_public(target_ip, 6379): print(f"[!] Redis on {target_ip}:6379 is not publicly accessible") exit(1)4.5 现象:pwn/template/run.sh启动gdb后,gef插件报错ModuleNotFoundError: No module named 'capstone'
原因:capstone是gef依赖,但pip install capstone安装的是Python 3.11版,而Kali 2023.4默认python3指向3.11,gdb内嵌Python却是3.9。
解决:卸载全局capstone,改用gef推荐的pip3.9 install capstone==4.0.2(4.0.2是最后兼容3.9的版本)。
4.6 现象:U盘拷贝工具包后,在Kali Live系统中/mnt/tools目录下文件全部变成?权限,ls -l显示?????????? ? ? ? ? ? tools
原因:U盘格式为exFAT(Windows默认),Linux内核对exFAT的ACL支持不完善,导致权限位丢失。
解决:格式化U盘为ext4(Linux原生)或NTFS(需ntfs-3g支持),严禁使用exFAT。格式化命令:
# 先umount,再格式化(假设U盘设备为/dev/sdb1) umount /dev/sdb1 mkfs.ext4 /dev/sdb1 -L "AWD_TOOLS"5. 进阶技巧:用tmux会话树实现“一人三线程”式攻防协同
AWD赛制下,单人要同时盯靶机状态、跑EXP、守自家服务,靠切窗口必然手忙脚乱。我从第3场比赛开始,强制所有队员用tmux构建固定会话树,把“人盯屏幕”升级为“进程盯状态”。这不是炫技,是经过12场实战验证的效率倍增器。
5.1 创建标准化会话树:awd-session.sh一键生成
将以下脚本存为/opt/awd/utils/awd-session.sh,赛前执行bash /opt/awd/utils/awd-session.sh:
#!/bin/bash # 创建主会话 tmux new-session -d -s awd "echo 'AWD SESSION STARTED'; bash" # 分割窗口:左上-靶机监控,右上-EXP执行,左下-防守日志,右下-Shell交互 tmux split-window -h -t awd:0.0 tmux split-window -v -t awd:0.0 tmux split-window -v -t awd:0.1 # 重命名窗格 tmux rename-window -t awd:0 "MONITOR" tmux select-pane -t awd:0.0 tmux send-keys "watch -n 1 'curl -s http://10.10.10.10/health | jq .status'" Enter tmux select-pane -t awd:0.1 tmux send-keys "echo 'EXP SHELL: cd /opt/awd/exploit && ls'" Enter tmux select-pane -t awd:0.2 tmux send-keys "tail -f /var/log/awd_defend.log" Enter tmux select-pane -t awd:0.3 tmux send-keys "echo 'READY FOR COMMANDS'" Enter # 设置快捷键:Ctrl-b + 方向键切换窗格,Ctrl-b + z 切换缩放 tmux bind-key -r h select-pane -L tmux bind-key -r j select-pane -D tmux bind-key -r k select-pane -U tmux bind-key -r l select-pane -R逻辑说明:
watch命令每秒请求靶机/health接口(需靶机提前部署该路由),jq解析JSON状态;tail -f实时滚动防守日志;所有窗格独立运行,互不阻塞。
5.2 关键窗格的自动化脚本:让MONITOR窗格自己报警
MONITOR窗格不只是看,更要主动预警。在/opt/awd/utils/monitor_alert.py中:
import requests, time, os from datetime import datetime TARGET_URL = "http://10.10.10.10/health" ALERT_FILE = "/tmp/awd_alert.flag" while True: try: resp = requests.get(TARGET_URL, timeout=2) if resp.status_code != 200 or '"status":"up"' not in resp.text: # 异常:写入告警文件并播放提示音(Kali默认有speaker-test) with open(ALERT_FILE, "w") as f: f.write(f"[{datetime.now()}] TARGET DOWN!\n") os.system("speaker-test -l 1 -s 1 >/dev/null 2>&1 &") except: pass time.sleep(5)将此脚本加入MONITOR窗格的watch命令:watch -n 1 'python3 /opt/awd/utils/monitor_alert.py; curl -s http://10.10.10.10/health | jq .status',靶机宕机时不仅日志标红,还有蜂鸣声提醒。
5.3 守护进程化:systemd服务保活tmux会话
担心tmux意外退出?用systemd将其转为守护服务:
# /etc/systemd/system/awd-session.service [Unit] Description=AWD tmux session After=network.target [Service] Type=forking User=kali ExecStart=/usr/bin/tmux new-session -d -s awd Restart=always RestartSec=10 [Install] WantedBy=multi-user.target启用命令:
systemctl daemon-reload systemctl enable awd-session.service systemctl start awd-session.service参数说明:
Type=forking适配tmux后台启动;Restart=always确保崩溃后10秒内自启;User=kali避免root权限滥用。
从那以后我每次赛前准备,都强制走一遍awd-session.sh创建会话树,再手动执行./run.sh进gdb、./web_guard.py启防守、./flag_submit.py测通路——不是为了炫技,是让肌肉记忆代替临场决策。当别人还在ls找脚本时,我的Ctrl-b + j已经切到防守日志窗格,看到[2024-06-15 14:22:03] BLOCKED IP: 10.10.20.55,手指还没离开键盘,ssh命令已敲到一半。希望帮到你。
本文还有配套的精品资源,点击获取