ADes-Security/ADes-Scanner

GitHub: ADes-Security/ADes-Scanner

一款无需代理的 Active Directory 安全扫描器,通过 106 项检查和 ACL 攻击路径分析帮助企业发现域环境中的安全风险。

Stars: 3 | Forks: 0

# ADes-Scanner ![许可证](https://img.shields.io/badge/license-AGPL%20v3-blue.svg) ![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg) ![检查](https://img.shields.io/badge/checks-106-orange.svg) **ADes-Scanner** 是 [ADes](https://github.com/ADes-Security) 项目的 Active Directory 扫描引擎:它通过 LDAP/NTLM 连接到 AD 域(无需 agent,无需加入域,可在 Linux 上运行)并执行分为 4 个类别(Kerberos、权限、账户规范、网络协议)的 106 项安全检查,同时还会构建 BloodHound 风格的 ACL 图。 此代码库**仅包含扫描器**:没有工单系统,没有一键修复,也没有 AI 助手。不过,它包含一个小型 Web GUI(仪表盘、漏洞、攻击路径、ACL 图、历史记录、技术报告),以便在不使用 CLI 的情况下可视化结果。 ## 概览

Dashboard ADes-Scanner Liste des vulnérabilités

Chemins d'attaque vers les actifs Tier 0

*针对新搭建的 Samba4 AD 实验室(域 `lab.local`)进行的真实扫描。* ## 安装与启动 `start.sh` (Linux/macOS) 和 `start.bat` (Windows) 会安装依赖项,然后启动 GUI 或 CLI。 **Web GUI** — 仪表盘位于 http://localhost:8000 : ``` ./start.sh gui # ou : start.bat gui ./start.sh gui --port 8080 # port personnalisé ``` **CLI** — 传递给脚本的参数会原封不动地传递给 `ades_scan.py`: ``` ./start.sh --dc-host 10.0.0.10 --domain corp.local --username svc-ades --json-out scan.json ``` ``` start.bat --dc-host 10.0.0.10 --domain corp.local --username svc-ades --json-out scan.json ``` 如果未提供 `--password`,系统将以交互方式提示输入密码。`--no-acl` 允许跳过 ACL 图的构建(这是最耗时的步骤)。 仅手动安装依赖项:`pip install -r requirements.txt`(用于 LDAP/NTLM 的 `ldap3`,用于 SMB 和 GPP cPassword 解密的 `impacket` + `pycryptodome`,用于 GUI 的 `cryptography`、`fastapi`/`uvicorn`/`jinja2`)。 ## 作为库使用 ``` from scanner.connector import ADConnector from scanner.scanner import ADScanner connector = ADConnector( host="10.0.0.10", domain="corp.local", username="svc-ades", password="...", ).connect() result = ADScanner(connector).scan() print(result.risk_score, result.risk_grade) for finding in result.sorted_findings: print(finding.severity.value, finding.check_id, finding.title) ``` ## 架构 | 模块 | 职责 | |---|---| | `scanner/connector.py` | `ADConnector` — LDAP 连接,NTLM,`search()`,读取 SMB/SYSVOL | | `scanner/scanner.py` | `ADScanner` — 执行所有检查 + 构建 ACL 图 | | `scanner/checks/` | 106 项检查,每项检查一个文件,每个文件返回 `list[Finding]` | | `scanner/models.py` | `Finding`, `ScanResult`, `Severity`, `CheckCategory` | | `scanner/acl_graph.py` | DACL 二进制解析器(纯 Python,无需 impacket) — BloodHound 风格的 ACL 图 | | `scanner/attack_paths.py` | 用于计算攻击路径的静态 + 动态 (ACL) 规则 | | `scanner/scan_store.py` | 扫描历史记录的 SQLite 持久化 | | `scanner/diff.py` | `compute_diff(before, after)` — 新增/已解决/已修改的 findings | | `scanner/verification.py` | 修复后的定向重新扫描,与参考扫描合并 | | `api/main.py` | GUI 的 FastAPI 入口点 (`uvicorn api.main:app`) | | `api/state.py` | 共享状态:内存中的扫描,Jinja2 模板,特定于域的视觉标识 | | `api/routers/scanner.py` | GUI 路由:`/`, `/scan`, `/vulnerabilities`, `/attack-paths`, `/acl`, `/history`, `/report/tech`, `/scans`, `/scans/diff` | | `templates/` | Jinja2 页面(设计系统“Cyber-Kinetic Command”,自托管,无 CDN) | ## 添加检查 1. 创建继承自 `BaseCheck` 的 `scanner/checks/<名称>.py` 2. 定义 `check_id` 和 `category = CheckCategory.` 3. 通过 `self.connector.search()` 实现 `run(self) -> list[Finding]` 4. 对 `userAccountControl` 位掩码使用扩展 LDAP 过滤器 `1.2.840.113556.1.4.803` 5. 在 `scanner/checks/__init__.py` → `ALL_CHECKS` 中注册检查 ## 测试 ``` pytest tests/ -v ``` ## 许可证 AGPLv3 — 见 [LICENSE](LICENSE)。 ## 关于 ADes 此扫描器是 [ADes](https://github.com/ADes-Security) 产品的核心,这是一个完整的 Active Directory 强化平台(扫描、技术/执行报告、带回滚的修复、本地 AI 助手)。此代码库是其扫描引擎的开源提取版本。
标签:Active Directory, Plaso, Python, SNMP, StruQ, Web报告查看器, 安全规则引擎, 攻击路径分析, 无后门, 模拟器, 逆向工具