BrocktonPointSolutions/ADScan

GitHub: BrocktonPointSolutions/ADScan

一款模块化的 Active Directory 安全扫描工具,通过 LDAP/LDAPS/SMB 协议对域环境进行全面漏洞检测并生成带风险评分的 HTML 报告。

Stars: 0 | Forks: 0

# ADScan **Active Directory 漏洞扫描器** — 一款模块化的 Python 工具,通过 LDAP、LDAPS 和/或 SMB 连接到域控制器,运行全面的安全检查组,并生成包含风险评分的独立 HTML 仪表板报告。 ## 功能特性 - **多协议支持**:LDAP、LDAPS、SMB(用户可选;默认为全部三种) - **灵活认证**:密码或 Pass-the-Hash(NTLM `LM:NT` 或仅 `NT`) - **风险评分**:初始 100 分,根据发现的问题扣分(最低 0 分),等级 A–F - **HTML 报告**:完全自包含,支持亮/暗模式切换,严重性标签,可折叠的发现卡片 - **模块化**:在 `checks/` 中放入新的 `check_*.py` 文件 — 运行时自动发现 - **21 个检查类别**,涵盖最关键的 AD 攻击面 ## 安装 ``` git clone https://github.com/BrocktonPointSolutions/ADScan.git cd ADScan pip install -r requirements.txt ``` ### 依赖要求 | 包 | 用途 | |---------|---------| | `ldap3` | LDAP / LDAPS 连接 | | `impacket` | SMB 连接, Pass-the-Hash | | `pyOpenSSL` | LDAPS 证书处理 | ## 用法 ``` python adscan.py -d -u -p [options] python adscan.py -d -u --hash [options] ``` ### 选项 | 标志 | 描述 | 默认值 | |------|-------------|---------| | `-d / --domain` | 目标域 FQDN (例如 `corp.local`) | 必填 | | `-u / --user` | 用户名 | 必填 | | `-p / --password` | 密码 | — | | `--hash` | NTLM 哈希 (`LM:NT` 或 `NT`) | — | | `--dc` | 域控制器 IP/主机名 | 自动解析 | | `--protocol` | `ldap` \| `ldaps` \| `smb` \| `all` | `all` | | `-o / --output` | 输出 HTML 文件路径 | `adscan_report.html` | | `-v / --verbose` | 详细控制台输出 | 关 | ### 示例 ``` # 密码认证,所有协议 python adscan.py -d corp.local -u alice -p 'P@ssw0rd!' --dc 10.10.10.5 # Pass-the-hash (仅限 NT) python adscan.py -d corp.local -u alice --hash aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c # 仅 LDAPS,自定义输出 python adscan.py -d corp.local -u alice -p 'Secret1' --protocol ldaps -o results/scan.html ``` ## 检查模块 所有检查位于 `checks/check_*.py` 并自动加载。 | # | 模块 | 类别 | 关键检查 | 最大扣分 | |---|--------|----------|------------|--------------| | 1 | `check_password_policy.py` | 密码策略 | 最小长度、复杂度、锁定、可逆加密、最大期限 | 30 | | 2 | `check_unconstrained_delegation.py` | 委派 | 非 DC 计算机/用户的非约束委派 | 20 | | 3 | `check_constrained_delegation.py` | 委派 | 约束委派 (S4U2Proxy)、协议转换 | 15 | | 4 | `check_privileged_accounts.py` | 特权账户 | DA/EA/SA 成员资格、过时成员、永不过期密码、描述、内置管理员、krbtgt 年龄 | 40 | | 5 | `check_kerberos.py` | Kerberos | 可 Kerberoast 账户、AS-REP Roasting、仅 DES、高价值组合 | 45 | | 6 | `check_adcs.py` | ADCS / PKI | ESC1–ESC3, ESC6, ESC8–ESC11, ESC13, ESC15–ESC16、弱密钥大小、注册者 ACL | 80 | | 7 | `check_domain_trusts.py` | 域信任 | 无 SID 筛选的双向信任、林信任、外部信任 | 30 | | 8 | `check_account_hygiene.py` | 账户卫生 | 过时用户/计算机、从未登录、PASSWD_NOTREQD、可逆加密、旧密码、重复 SPN | 45 | | 9 | `check_protocol_security.py` | 协议安全 | LDAP 签名/通道绑定、DC OS 版本、域/林功能级别、NTLMv1/WDigest 指导 | 30 | | 10 | `check_gpo.py` | 组策略 | 已禁用、孤立、未链接、空 GPO;过多的 GPO 数量 | 20 | | 11 | `check_laps.py` | LAPS | 旧版 LAPS 和 Windows LAPS 架构检测、无 LAPS 密码的计算机、LAPS 覆盖率 % | 25 | | 12 | `check_dns_infrastructure.py` | DNS 与基础设施 | 通配符 DNS 记录、LLMNR/NetBIOS-NS 指导、AD 站点和服务子网 | 20 | | 13 | `check_domain_controllers.py` | 域控制器 | 单 DC 检测、DC 上的旧版 OS、FSMO 角色、RODC 密码复制、DC 所有者 | 30 | | 14 | `check_acl_permissions.py` | ACL / 权限 | ESC4, ESC5, ESC7, DCSync 权限、受保护用户组、RBCD 委派 ACL | 70 | | 15 | `check_optional_features.py` | 可选功能 | AD 回收站、特权访问管理 (PAM) | 15 | | 16 | `check_replication.py` | 复制健康状况 | 站点数量、站点链接间隔、nTDSDSA 对象、空站点 | 15 | | 17 | `check_service_accounts.py` | 服务账户 | gMSA 采用情况、作为服务账户的用户账户、adminCount=1 的服务账户 | 25 | | 18 | `check_misc_hardening.py` | 杂项加固 | 机器账户配额、墓碑生存期、来宾账户、Schema/EA 成员资格、审计指导 | 46 | | 19 | `check_deprecated_os.py` | 已弃用 OS | EOL 工作站 (XP/Vista/7/8/8.1)、EOL 服务器 (2003/2008/2008R2)、临近 EOL (2012/2012R2) | 55 | | 20 | `check_legacy_protocols.py` | 旧版协议 | SMBv1 检测、SMB 签名指导、空会话指导、NTLMv1/WDigest 指导 | 25 | ## 评分 | 分数 | 等级 | 含义 | |-------|-------|---------| | 90–100 | **A** | 优秀 — 极少发现 | | 75–89 | **B** | 良好 — 需要一些改进 | | 60–74 | **C** | 一般 — 存在明显安全缺口 | | 40–59 | **D** | 较差 — 存在重大漏洞 | | 0–39 | **F** | 危急 — 需立即修复 | 扣分按每个发现应用。分数不会低于 0。 ## 添加新检查 1. 创建 `checks/check_.py` 2. 定义所需接口: ``` CHECK_NAME = "Human Readable Name" # displayed in report CHECK_ORDER = 99 # run order (lower = earlier) def run_check(connector, verbose=False): findings = [] # Use connector.ldap_search() for all LDAP queries findings.append({ "title": "Finding title", "severity": "critical|high|medium|low|info", "deduction": 10, # points deducted from score "description": "...", "recommendation": "...", "details": ["list", "of", "affected", "objects"], }) return findings ``` 3. 运行 `adscan.py` — 检查将被自动发现。无需注册。 ### 连接器 API ``` # LDAP 搜索 results = connector.ldap_search( base_dn, # e.g. connector.base_dn ldap_filter, # e.g. "(objectClass=user)" attributes, # list of attribute names scope="SUBTREE", # SUBTREE | ONELEVEL | BASE ) # 返回字典列表,错误或无结果时返回 [] # 有用属性 connector.base_dn # e.g. "DC=corp,DC=local" connector.smb_conn # impacket SMB connection (may be None) ``` ## 报告 HTML 报告(默认为 `adscan_report.html`)是完全自包含的 — 不需要 CDN 或互联网连接。它包括: - **评分仪表**,带有字母等级和颜色编码 - **严重性摘要**标签(Critical / High / Medium / Low / Info) - **可折叠的发现卡片** — 每个都包含标题、严重性徽章、扣分、描述、建议和受影响对象列表 - **亮/暗模式切换**(偏好设置通过 `localStorage` 保存) ## 架构 ``` ADScan/ ├── adscan.py # CLI entry point, orchestrates checks and report ├── requirements.txt ├── lib/ │ ├── __init__.py │ ├── connector.py # LDAP / LDAPS / SMB connection management │ └── report.py # HTML report generation └── checks/ ├── __init__.py # Auto-discovery loader ├── check_password_policy.py ├── check_unconstrained_delegation.py ├── check_constrained_delegation.py ├── check_privileged_accounts.py ├── check_kerberos.py ├── check_adcs.py ├── check_domain_trusts.py ├── check_account_hygiene.py ├── check_protocol_security.py ├── check_gpo.py ├── check_laps.py ├── check_dns_infrastructure.py ├── check_domain_controllers.py ├── check_acl_permissions.py ├── check_optional_features.py ├── check_replication.py ├── check_service_accounts.py ├── check_misc_hardening.py ├── check_deprecated_os.py └── check_legacy_protocols.py ``` ## 免责声明 ADScan 仅用于授权的安全评估。在扫描 Active Directory 环境之前,请务必获得书面许可。未经授权的使用可能违反计算机犯罪法。
标签:Active Directory, AD安全, HTML报告, Impacket, LDAP, LDAPS, PE 加载器, Plaso, Python, SCADA, SMB, SNMP, StruQ, Web报告查看器, 二进制发布, 内存取证对抗, 加密, 反取证, 哈希传递, 域控制器, 域环境, 安全评估, 开源工具, 数据展示, 无后门, 模拟器, 漏洞扫描器, 红队, 网络安全, 逆向工具, 错误配置检测, 隐私保护