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, 安全竞赛, 知识库安全, 系统加固, 跨平台运维, 防御工具