gianlucabinetti/ecitadel-2026-scripts

GitHub: gianlucabinetti/ecitadel-2026-scripts

面向蓝队防御竞赛的跨平台自动化脚本工具包,提供基线采集、系统加固、入侵检测和持续监控的完整工作流。

Stars: 0 | Forks: 0

# eCitadel 2026 - 蓝队防御工具包 这是为 **eCitadel 2026**(一项蓝队网络防御竞赛)编写的一套跨平台防御脚本。在该赛制中,目标是在固定的时间窗口内,在红队试图主动攻陷机器的同时,保持一系列**计分服务**在线。 我编写了本仓库中的 bootstrap、triage、harden 和 watchdog 脚本,以便为我的团队在环境中的不同操作系统上提供一致的起点。在比赛期间,我个人负责防御 **Fedora 43** 主机,关于我在该机器上遵循的执行指南,请参阅 [Fedora runbook](./Runbooks/Runbook_Fedora.md)。 ## 这展示了什么 - **跨平台安全加固** - Debian 13、Fedora 43 (+ SELinux)、pfSense/FreeBSD 和 Windows Server 2022(注册表、WDigest、LLMNR/NBT-NS、NTLMv2、审核策略) - **基线与差异比对分析** - 在可疑的入侵发生后,捕获变更前的干净快照并与当前状态进行比对,而不是去猜测发生了什么变化 - **持续监控** - 具有可调间隔的后台 watchdog 和统一的告警日志 - **感知评分的变更管理** - 每一项更改都经过了 dry-run 预演或可逆,并明确列出了一份需要避免的“看似是很好的加固,但会导致扣分”的操作清单 ## 为什么工作流程要按此顺序 比赛当天的操作顺序是 **bootstrap → triage → harden → watchdog**,这个顺序是刻意为之的: - **Triage 在 harden 之前运行**,以便基线能捕获机器的干净状态。在更改之后获取的基线对于发现红队修改了什么内容毫无用处。 - **Harden 始终优先进行 dry-run。** 在计分环境中,过于激进的更改(关闭计分端口,限制评分引擎无法协商的 SSH 加密算法)会立即导致扣分,因此在应用之前先进行预览是默认操作,而不是事后补充。 - **Watchdog 在整个时间窗口内运行**,以便持续浮现入侵信号,而不是仅在有人碰巧去查看时才发现。 下方的[评分安全规则](#scoring-safety-rules--do-not-do-these)之所以存在,是因为在这种赛制中扣分最快的方式不是红队攻击,而是你在加固时破坏了自己计分的服务。 ## 目录结构 ``` eciv-scripts/ ├── bootstrap/ │ ├── bootstrap-debian.sh First-run setup for Debian 13 │ ├── bootstrap-fedora.sh First-run setup for Fedora 43 │ └── bootstrap-pfsense.sh (manual see pfSense notes below) │ ├── harden/ │ ├── harden-debian.sh Debian 13 hardening (10 sections) │ ├── harden-fedora.sh Fedora 43 hardening (11 sections + SELinux) │ ├── harden-pfsense.sh pfSense / FreeBSD hardening │ └── harden-windows.ps1 Windows Server 2022 (combined 18 sections) │ ├── triage/ │ ├── triage-linux.sh Debian + Fedora triage (shared) │ ├── triage-pfsense.sh pfSense triage │ └── triage-windows.ps1 Windows Server 2022 triage │ └── watchdog/ ├── watchdog-linux.sh Debian + Fedora continuous monitor ├── watchdog-pfsense.sh pfSense continuous monitor └── watchdog-windows.ps1 Windows Server 2022 continuous monitor ``` ## 比赛当天的操作顺序 在你们 6 小时的比赛窗口开始后,尽快在每个系统上运行此序列。 如果并行执行,每个系统的总设置时间约为 10-15 分钟。 ### 步骤 1 - Bootstrap(安装工具 + 部署脚本) ``` # Debian 13 sudo bash bootstrap/bootstrap-debian.sh # Fedora 43 sudo bash bootstrap/bootstrap-fedora.sh # pfSense - 无需 bootstrap 脚本;工具已预装 # 通过 scp 或 GUI 文件管理器手动将脚本复制到 pfSense ``` ### 步骤 2 - Triage(在安全加固之前捕获干净的基线) ``` # Linux (Debian 或 Fedora) bash ~/.rrintel/bin/triage-linux.sh # pfSense sh triage/triage-pfsense.sh # Windows Server 2022 (提权 PowerShell) .\triage\triage-windows.ps1 ``` ### 步骤 3 - Harden ``` # Debian 13 sudo bash ~/.rrintel/bin/harden-debian.sh --dry-run # review first sudo bash ~/.rrintel/bin/harden-debian.sh # apply sudo systemctl reload ssh # Fedora 43 sudo bash ~/.rrintel/bin/harden-fedora.sh --dry-run sudo bash ~/.rrintel/bin/harden-fedora.sh sudo systemctl reload sshd # pfSense sudo sh harden/harden-pfsense.sh --dry-run sudo sh harden/harden-pfsense.sh # 然后在以下位置确认 SSH 设置:System > Advanced > Admin Access # Windows Server 2022 (提权 PowerShell) .\harden\harden-windows.ps1 -DryRun .\harden\harden-windows.ps1 # 重启或注销以完全激活 WDigest, LLMNR, NBT-NS, NTLMv2 更改 ``` ### 步骤 4 - 启动 watchdog(在后台完整运行 6 小时) ``` # Linux nohup bash ~/.rrintel/bin/watchdog-linux.sh > /dev/null 2>&1 & # pfSense nohup sh watchdog/watchdog-pfsense.sh > /dev/null 2>&1 & # Windows (提权 PowerShell - 后台作业) Start-Job { & .\watchdog\watchdog-windows.ps1 } ``` ### 步骤 5 - 在整个比赛期间检查告警 ``` # Linux / pfSense tail -f ~/.rrintel/ALERTS.log # Windows Get-Content $env:USERPROFILE\.rrintel\ALERTS.log -Wait ``` ### 步骤 6 - 在红队活动后重新进行 Triage ``` # Linux bash triage/triage-linux.sh --compare # Windows .\triage\triage-windows.ps1 -Compare # pfSense sh triage/triage-pfsense.sh --compare ``` ## 核心脚本选项 ### harden-debian.sh / harden-fedora.sh | 选项 | 效果 | |--------|--------| | `--dry-run` | 显示将要发生的更改,不执行任何实际操作 | | `MIN_LEN=16` | 覆盖最小密码长度 | | `MAX_AGE=45` | 覆盖 PASS_MAX_DAYS | | `LOCKOUT_N=3` | 覆盖登录失败锁定阈值 | | `DO_SSHD=0` | 跳过 SSH 加固部分 | | `DO_SYSCTL=0` | 跳过 sysctl 部分 | ### harden-windows.ps1 | 参数 | 效果 | |-----------|--------| | `-DryRun` | 仅预览 | | `-MinLen 16` | 最小密码长度 | | `-LockoutThr 3` | 账户锁定阈值 | | `-RenameAdminTo 'sysop17'` | 重命名内置管理员账户 | | `-DisableBuiltInAdmin -NewAdminUser 'sysop17'` | 在验证替换账户后禁用 RID 500 | | `-SkipRegistry` | 跳过所有注册表部分 | | `-SkipAuditPolicy` | 跳过 auditpol 配置 | ### watchdog-linux.sh | 变量 | 默认值 | 效果 | |----------|---------|--------| | `INTERVAL` | 30 | 检查之间的间隔秒数 | | `SUID_INTERVAL` | 10 | 每隔 N 个周期运行一次 SUID 扫描 | | `FAILTHRESH` | 10 | 触发告警的登录失败次数 | ## 评分安全规则 - 绝对不要做这些 | 操作 | 原因 | |--------|---------| | 在 sshd 中设置 `PasswordAuthentication no` | 会锁定评分引擎 | | 批量重置密码 | 会破坏所有基于 AD 的计分服务 | | 在不知道计分端口的情况下启用防火墙 | 会丢弃计分服务 = 扣分 | | 在未确认服务未计分的情况下禁用服务 | 直接扣分 | | 虚拟机回滚/恢复 | 违反竞赛规则 §行为准则,会导致扣分 | | 对其他队伍进行攻击性扫描 | **立即取消资格** | | 运行评分代理干扰 | **立即取消资格** | ## 关键的加密算法/MAC 警告 (SSH) `harden-debian.sh` 和 `harden-fedora.sh` 将 SSH 加密算法和 MAC 限制为 现代算法。如果评分引擎使用旧版本的 OpenSSH 客户端连接 并失败,您将在认证日志中看到 sshd 断开连接。 **快速修复 - 移除加密算法限制而无需重新运行完整脚本:** ``` sudo sed -i '/^Ciphers /d; /^MACs /d; /^KexAlgorithms /d' /etc/ssh/sshd_config sudo sshd -t && sudo systemctl reload ssh ``` ## 告警文件位置 ``` ~/.rrintel/ALERTS.log - all systems ~/.rrintel/watchdog-linux-.log - full watchdog log (Linux) ~/.rrintel/watchdog-pfsense-.log - full watchdog log (pfSense) ~/.rrintel/watchdog-windows-.log - full watchdog log (Windows) ~/.rrintel/harden---.log - hardening run log ~/.rrintel/triage// - triage snapshots ``` ## 运行手册 - [Fedora 43 - 我负责防御的机器](./Runbooks/Runbook_Fedora.md) ## 范围与免责声明 本仓库记录了在授权且获得批准的竞赛环境中进行的**防御性**操作。计分服务的详细信息(主机 IP、计分端口)被刻意省略,因为这些会在比赛开始时分发。分享这些脚本是为了作为方法论的参考(bootstrap、基线、harden、监控),而不是作为适用于任何特定环境的即插即用工具。
标签:AI合规, Cutter, TLS, 安全竞赛, 知识库安全, 系统加固, 跨平台运维, 防御工具