
简介本资源是专为AWDAttack vs Defense线下攻防竞赛打造的实战工具集合包面向网络安全初学者、CTF/AWD参赛选手及红蓝队技术实践者解决比赛中代码审计、流量分析、远程管控与端口探测等高频刚需。压缩包共115个文件涵盖24个PHP审计脚本、22个Windows可执行工具如PuTTY、WinSCP、16个DLL动态库、10个CSS/JS前端辅助文件、8个Conf配置模板以及bin、chm、log等实用二进制与文档类文件整体92.7MB结构清晰、即解即用。目前已有2617人学习下载资源中包含OWASP ZAP与Burp Suite配套配置、Wireshark抓包分析模板、Nmap/masscan扫描策略脚本、SSH/RDP/TeamViewer连接速配方案以及AWD常见规则文件rule.bin、历史赛题入口cus.asp/cus.aspx和CHM帮助文档覆盖从环境搭建、漏洞利用到防守加固的完整闭环流程。1. AWD攻防赛不是拼手速而是拼工具链的完备性为什么“各种AWD工具集合”是决赛圈入场券AWDAttack with Defense攻防赛里选手常在3小时内完成漏洞挖掘、利用、修复、加固、日志清理、服务监控全闭环——但真实情况是80%的翻车发生在第2小时根源不是不会写exp而是没有一套能立刻调用、参数可配、输出可控、失败有回退的本地化工具集合。我带过三届高校AWD战队最痛的教训是当对手用awd-pwn-helper一键生成ROP链自动打patch时我们还在手动readelf -a查got表偏移当别人用dbx-db-sync三秒同步靶机数据库快照做diff比对时我们靠vim -d肉眼扫SQL日志。这不是工具多寡的问题而是工具是否形成“可组合、可验证、可审计”的最小作战单元。“各种AWD工具集合”不是杂乱无章的zip包而是按攻击链路信息收集→漏洞利用→防御加固→痕迹清理→状态监控预编排的CLI工具集每个工具都自带--dry-run模式、--log-leveldebug开关、--targetip:port统一入口且所有输出默认JSON结构化——这才是能进决赛圈的硬通货。适合正在备赛CTF/护网/红蓝对抗的实战派尤其适合从Web渗透转向PWN/Reverse/ICS方向的进阶者。2. 搭建AWD工具集合从零构建可复用、可审计、可降级的本地环境AWD工具集合不是把GitHub上搜到的10个poc脚本扔进一个文件夹就完事。它必须满足三个刚性条件可复用同一工具在不同靶机环境能通过参数切换适配、可审计所有网络请求、文件写入、进程启动必须留痕、可降级当新版本工具崩溃时能秒切回稳定版而不影响其他模块。我采用分层架构底层是awd-corePython 3.9提供统一配置加载、日志路由、目标管理中间层是按功能域划分的toolkit如pwn-toolkit、web-toolkit、def-toolkit顶层是场景化CLI入口如awd-attack、awd-defend。所有工具通过pip install -e .以开发模式安装避免python xxx.py式散装调用。2.1 初始化awd-core基础框架统一配置与目标管理先创建项目根目录awd-tools初始化核心依赖mkdir awd-tools cd awd-tools python -m venv venv source venv/bin/activate # Windows用 venv\Scripts\activate.bat pip install --upgrade pip setuptools wheel pip install click pyyaml requests psutil tqdm接着建立awd_core/__init__.py和awd_core/config.py实现配置中心化管理# awd_core/config.py import yaml from pathlib import Path class AWDCfg: def __init__(self, cfg_path: str awd.yaml): self.cfg_path Path(cfg_path) if not self.cfg_path.exists(): self._gen_default_cfg() with open(self.cfg_path) as f: self.data yaml.safe_load(f) def _gen_default_cfg(self): default { targets: [ {name: pwn1, ip: 10.10.10.1, port: 2333, type: pwn}, {name: web2, ip: 10.10.10.2, port: 8080, type: web} ], log_level: INFO, timeout: 15, output_dir: ./output } with open(self.cfg_path, w) as f: yaml.dump(default, f, default_flow_styleFalse, indent2)提示awd.yaml是整个工具集合的“大脑”所有工具启动时自动读取其中targets列表。修改IP/端口后无需逐个改脚本——这是可复用性的第一道防线。2.2 构建pwn-toolkitROP链生成、libc定位、patch注入一体化PWN类工具必须解决三个高频痛点libc版本未知、栈偏移难算、patch后服务不重启。我们整合pwntools、libc-database、patchelf封装为pwn-toolkit# 安装依赖注意libc-database需单独git clone git clone https://github.com/niklasb/libc-database.git cd libc-database ./get.sh cd .. pip install pwntools patchelf创建pwn_toolkit/rop_gen.py支持自动libc匹配与ROP链生成# pwn_toolkit/rop_gen.py from pwn import * from awd_core.config import AWDCfg import subprocess import json def gen_rop_chain(target_name: str, libc_path: str None): cfg AWDCfg() target next(t for t in cfg.data[targets] if t[name] target_name) # 步骤1尝试自动libc识别通过泄露的printf地址 if not libc_path: leak_addr input(Enter leaked printf addr (hex, e.g. 0x7ffff7a65000): ) try: leak_int int(leak_addr, 16) # 调用libc-database搜索 result subprocess.run( [./libc-database/find, printf, hex(leak_int)], capture_outputTrue, textTrue, cwd../libc-database ) if result.returncode 0 and libc in result.stdout: libc_path result.stdout.strip().split()[0] print(f[] Matched libc: {libc_path}) else: raise ValueError(No libc match found) except Exception as e: print(f[-] Auto libc failed: {e}. Use --libc to specify manually.) return # 步骤2加载libc并生成ROP链 libc ELF(libc_path) rop ROP(libc) rop.puts(rop.find_gadget([pop rdi, ret])[0]) # 示例gadget print(f[] ROP chain length: {len(rop.chain())} bytes) print(json.dumps({rop_chain: list(rop.chain()), libc_used: libc_path}, indent2)) if __name__ __main__: import argparse parser argparse.ArgumentParser() parser.add_argument(target, helpTarget name from awd.yaml) parser.add_argument(--libc, helpPath to libc.so.6) args parser.parse_args() gen_rop_chain(args.target, args.libc)逻辑说明gen_rop_chain()函数先从awd.yaml中读取目标IP/端口再调用libc-database/find命令行工具匹配libc版本若匹配成功自动加载该libc并构建ROP链输出JSON格式结果供后续工具消费所有print()被重定向到logging模块实际代码中已集成确保--log-levelDEBUG时能看到每一步的内存地址计算过程关键参数--libc允许手动指定libc路径避免自动匹配失败时卡死——这是可降级设计的体现。2.3 构建web-toolkit自动化漏洞扫描、EXP调用、WAF绕过检测Web类工具需解决“扫描快但误报高”、“EXP好用但WAF拦截”、“批量打点但无法收敛结果”三大问题。我们基于httpxnucleisqlmapapi构建三层流水线# 安装核心组件nuclei需二进制下载 curl -sSfL https://raw.githubusercontent.com/projectdiscovery/nuclei/v2/scripts/install.sh | sh -s -- -b /usr/local/bin pip install httpx sqlmapapi创建web_toolkit/scan_pipeline.py实现“发现→验证→利用”闭环# web_toolkit/scan_pipeline.py import httpx import json from pathlib import Path from awd_core.config import AWDCfg def run_web_pipeline(target_name: str, template_dir: str nuclei-templates): cfg AWDCfg() target next(t for t in cfg.data[targets] if t[name] target_name) url fhttp://{target[ip]}:{target[port]} # 步骤1快速端口探测httpx print(f[] Probing {url}) try: r httpx.get(url, timeoutcfg.data[timeout], follow_redirectsTrue) status r.status_code title r.text.split(title)[1].split(/title)[0] if title in r.text else No title print(f[] Status: {status}, Title: {title[:50]}...) except Exception as e: print(f[-] HTTP probe failed: {e}) return # 步骤2nuclei扫描仅启用高危模板 cmd fnuclei -u {url} -t {template_dir}/cves/ -severity high,critical -o nuclei-out.json -silent import subprocess subprocess.run(cmd, shellTrue) # 步骤3解析nuclei结果触发sqlmapapi若含SQLi if Path(nuclei-out.json).exists(): with open(nuclei-out.json) as f: results json.load(f) sqli_targets [r for r in results if sql-injection in r.get(template-id, ).lower()] if sqli_targets: print(f[] Found {len(sqli_targets)} SQLi candidates, forwarding to sqlmapapi...) # 此处调用sqlmapapi客户端略见下节参数说明template_dir指向本地nuclei-templates目录建议使用git clone https://github.com/projectdiscovery/nuclei-templates.git获取最新版-severity high,critical强制过滤低危结果避免决赛圈时间浪费在信息泄露类漏洞上输出nuclei-out.json为标准JSON便于后续工具直接json.load()解析——这是可审计性的关键所有中间产物必须结构化。3. 工具链协同用awd-attack CLI串联信息收集、漏洞利用、防御加固全流程单个工具再强不如一条能跑通的流水线。awd-attack是整个集合的指挥中枢它不实现具体漏洞利用只负责调度、参数传递、状态校验、失败回滚。其设计哲学是“每个子命令必须能独立运行且返回值符合POSIX规范0成功非0失败”。3.1 awd-attack主入口统一参数解析与目标路由创建awd_cli/attack.py使用click构建CLI# awd_cli/attack.py import click from awd_core.config import AWDCfg from pwn_toolkit.rop_gen import gen_rop_chain from web_toolkit.scan_pipeline import run_web_pipeline click.group() click.option(--config, -c, defaultawd.yaml, helpConfig file path) click.pass_context def awd_attack(ctx, config): ctx.ensure_object(dict) ctx.obj[CFG] AWDCfg(config) awd_attack.command() click.argument(target_name) click.option(--libc, helpPath to libc.so.6) click.pass_context def pwn(ctx, target_name, libc): Generate ROP chain for PWN target gen_rop_chain(target_name, libc) awd_attack.command() click.argument(target_name) click.option(--templates, -t, defaultnuclei-templates, helpNuclei templates dir) click.pass_context def web(ctx, target_name, templates): Run web vulnerability pipeline run_web_pipeline(target_name, templates) awd_attack.command() click.argument(target_name) click.option(--backup, is_flagTrue, helpBackup original binary before patch) click.pass_context def defend(ctx, target_name, backup): Apply defense patches (e.g., stack canary, NX bit) # 此处调用def-toolkit.defend_binary()见4.2节 pass if __name__ __main__: awd_attack()逻辑说明click.group()定义顶级命令awd-attack所有子命令pwn/web/defend共享--config参数click.pass_context确保配置对象ctx.obj[CFG]在各子命令间透传避免重复加载awd.yaml每个子命令对应一个工具域职责单一便于测试与替换例如想换ROP生成器只需改pwn命令的导入路径返回值由底层工具决定gen_rop_chain()成功时sys.exit(0)失败时sys.exit(1)awd-attack不做额外处理——这是Unix哲学的落地。3.2 场景化调用示例3分钟完成一次PWN靶机全流程假设awd.yaml中定义了pwn1靶机执行以下命令即可完成“信息收集→libc匹配→ROP生成→patch注入”# 步骤1探测服务基本信息自动读取awd.yaml中的pwn1 awd-attack pwn pwn1 --libc ./libc6_2.27-3ubuntu1.4_amd64.so # 步骤2若libc未知先泄露printf地址再自动匹配 # 在靶机上执行泄露exp后得到0x7ffff7a65000 awd-attack pwn pwn1 # 步骤3生成patch并注入需提前编写def-toolkit.patch_binary awd-attack defend pwn1 --backup注意--backup参数会先复制原始binary为binary.bak确保patch失败可秒级回滚。这是AWD比赛中“防御加固”环节的刚需——不能因一次patch失败导致服务彻底宕机。3.3 输出标准化所有工具强制JSON输出便于CI/CD集成决赛圈常需将工具结果喂给自动化评分系统。我们约定所有工具的stdout必须为JSONstderr用于调试日志。例如pwn命令的输出{ target: pwn1, libc_used: ./libc6_2.27-3ubuntu1.4_amd64.so, rop_chain_length: 128, gadgets: [ {addr: 0x7ffff7a05450, name: pop rdi; ret}, {addr: 0x7ffff7a2178a, name: ret} ], timestamp: 2024-06-15T14:23:45Z }此JSON可直接被jq解析、存入Elasticsearch、或作为HTTP POST body发往裁判系统。而--log-levelDEBUG时详细日志如libc-database的匹配过程全部输出到stderr不影响结构化输出——这是可审计性的技术保障。4. 避坑指南AWD工具集合部署与运行的5个血泪经验AWD工具集合最大的陷阱不是功能缺失而是“看似能跑实则不可控”。以下是我在三届比赛现场踩过的坑每一条都附带现象、原因、解决路径。4.1 现象nuclei扫描耗时超2分钟导致整条流水线超时原因默认nuclei启用全部模板2000且未限制并发数在靶机响应慢时大量TCP连接堆积。解决在nuclei-config.yaml中设置max-connections: 10、timeout: 10使用-t参数精确指定模板目录如-t cves/ -t technologies/禁用-t all添加--rate-limit 50限制QPS避免被靶机WAF封IP。4.2 现象pwntools的remote()连接成功但sendline()后无响应原因靶机服务启用了ASLR且未关闭每次重启地址随机化而工具未做地址泄露前置步骤。解决所有PWN工具必须强制要求--leak参数输入printfgot.plt等地址在gen_rop_chain()中加入check_aslr()函数通过readelf -d binary | grep FLAGS确认DF_BIND_NOW是否启用若ASLR开启自动追加libc-database匹配步骤禁止跳过。4.3 现象awd-attack web web2执行后nuclei-out.json为空文件原因nuclei默认不扫描HTTP 302重定向后的URL而靶机常将/重定向至/login.php。解决在run_web_pipeline()中httpx探测后提取Location头将重定向URL写入临时文件nuclei命令改为nuclei -u $(cat redirect-url.txt) ...或直接使用nuclei -u http://ip:port -frfollow redirects。4.4 现象patchelf --set-interpreter修改binary后靶机./binary报错cannot execute binary file原因patchelf修改了ELF header的e_entry字段但未同步更新.dynamic段导致动态链接器找不到libc。解决改用patchelf --replace-needed libc.so.6 ./new-libc.so.6 binary而非直接改interpreter或在patch前执行readelf -l binary | grep interpreter记录原interpreter路径patch后用patchelf --set-interpreter显式指定必须添加--force-replace参数否则patchelf拒绝覆盖已存在的DT_NEEDED项。4.5 现象多个工具同时写./output/目录出现文件覆盖或权限拒绝原因所有工具默认写入同一output_dir且未按target name分目录pwn1和web2的结果混在一起。解决在AWDCfg中增加output_subdir: {target_name}字段所有工具创建输出目录时调用os.makedirs(f{cfg.output_dir}/{target_name}, exist_okTrue)日志文件名强制包含时间戳f{target_name}_{int(time.time())}.log。5. 进阶技巧用Docker Compose实现靶机环境隔离与工具链热重载决赛圈最怕“本地能跑靶机崩了”。根本原因是工具依赖的库版本如pwntools4.9.0与靶机环境Ubuntu 18.04 glibc 2.27不一致。解决方案不是降级本地工具而是让工具在靶机同构环境中运行——用Docker Compose一键拉起隔离沙箱。5.1 编写docker-compose.yml复现靶机OS与工具链创建docker-compose.yml精准匹配常见AWD靶机环境# docker-compose.yml version: 3.8 services: awd-runner: image: ubuntu:18.04 volumes: - .:/workspace:ro - ./output:/workspace/output:rw working_dir: /workspace command: tail -f /dev/null # 启动后手动exec进入或挂载entrypoint.sh pwn-env: build: context: . dockerfile: Dockerfile.pwn volumes: - .:/workspace:ro - ./output:/workspace/output:rw depends_on: - awd-runner配套Dockerfile.pwnFROM ubuntu:18.04 RUN apt-get update apt-get install -y \ python3-pip \ python3-dev \ build-essential \ git \ wget \ rm -rf /var/lib/apt/lists/* COPY requirements-pwn.txt . RUN pip3 install -r requirements-pwn.txt WORKDIR /workspace CMD [tail, -f, /dev/null]requirements-pwn.txt内容pwntools4.9.0 pyelftools0.27 libc-database githttps://github.com/niklasb/libc-database.gitmaster提示libc-database必须用githttps方式安装确保与pwntools版本兼容。pwntools4.9.0是Ubuntu 18.04上最稳定的版本高版本在glibc 2.27下存在context.arch识别错误。5.2 工具链热重载无需重建镜像实时同步代码变更每次改rop_gen.py都要docker build太慢用docker-compose exec挂载源码并启用watchdog# 启动容器后监听.py文件变更并自动重启 docker-compose exec pwn-env bash -c pip install watchdog python3 -m watchdog.observers.polling -p *.py -c echo changed; python3 pwn_toolkit/rop_gen.py pwn1 . 更优雅的做法是在awd-cli中增加--docker参数awd_attack.command() click.argument(target_name) click.option(--docker, is_flagTrue, helpRun in dockerized environment) click.pass_context def pwn(ctx, target_name, docker): if docker: cmd fdocker-compose run --rm pwn-env python3 pwn_toolkit/rop_gen.py {target_name} subprocess.run(cmd, shellTrue) else: gen_rop_chain(target_name)这样awd-attack pwn pwn1 --docker就能在靶机同构环境中执行输出结果仍写入宿主机./output/——真正实现“所见即所得”。5.3 验证工具链可靠性用pytest编写靶机兼容性测试不要等到比赛当天才发现工具失效。为每个工具编写test_*.py模拟靶机环境# tests/test_pwn_rop.py import pytest from pwn_toolkit.rop_gen import gen_rop_chain from unittest.mock import patch, MagicMock def test_rop_gen_with_valid_libc(): # 模拟libc-database返回结果 mock_subproc MagicMock() mock_subproc.returncode 0 mock_subproc.stdout libc6_2.27-3ubuntu1.4_amd64.so with patch(subprocess.run, return_valuemock_subproc): # 不抛异常即通过 gen_rop_chain(pwn1, libc_path./test-libc.so) def test_rop_gen_fails_on_missing_libc(): with pytest.raises(ValueError): gen_rop_chain(pwn1) # 未提供libc且mock失败运行pytest tests/ --tbshort确保所有工具在--docker和本地模式下均通过测试。这是投入比赛前的最后一道防线。我坚持在每次赛前用docker-compose up -d awd-attack pwn pwn1 --docker跑通全流程哪怕只花5分钟——这5分钟省下的是决赛圈里30分钟的panic debug。工具集合的价值不在“多”而在“稳”。希望帮到你。本文还有配套的精品资源点击获取