Asdjdh/ad-lab-forge
GitHub: Asdjdh/ad-lab-forge
一个自动化构建随机化、可评分的 Active Directory 红队盲打靶场的编排框架。
Stars: 0 | Forks: 0
# ad-lab-forge
`ad-lab-forge` 在 VMware 中构建一个完全**无人值守**的 Windows Server 域控制器,
**由非管理员 Windows 主机通过 WinRM/NTLM 驱动**,然后使用两个知名的外部生成器(BadBlood + Vulnerable-AD)部署一个**随机化**的漏洞
Active Directory,最后**封存一份标准答案**,以便对该实验室进行“盲打”攻击并进行客观评分。
## 概述
该框架负责编排一次性 AD 攻击靶场的整个生命周期:
1. **无人值守的 OS 安装** — 使用 `autounattend.xml` 应答文件安装 Windows Server 并配置自动登录,启用 WinRM + RDP,并(如果存在)安装 VMware Tools。
2. **主机驱动的配置** — 一个小型的 Python 编排器(`lab_build.py`)通过 WinRM 在客户机内部推送并运行
PowerShell,因此主机永远不需要本地管理员权限或加入域。
3. **提升** — 客户机自行提升为林根 DC(以 SYSTEM 身份脱离运行,从而在 dcpromo 重启后继续执行),可选择添加 AD CS(企业根 CA),并建立一个大学风格的
OU/组/服务账户结构。
4. **武装盲打层** — 外部的**随机化**生成器开始运行,因此每次构建都会产生
一组不同的错误配置和攻击路径。
5. **“顶点”加固** — 剥离简单/已知的攻击点(AS-REP roasting、易破解的 Kerberoast、弱服务
凭据),只留下深层的、链式的、涌现的攻击路径。
6. **封存标准答案** — 构建器只对武装后的状态进行一次枚举,并生成一份答案以及
机器可读的攻击图,它们会被带外移出,因此攻击者永远不会看到它们。
## 独特之处
- **非管理员主机控制。** 主机完全通过 WinRM/NTLM 驱动客户机(`lab_build.py`,
`winrm_run.py`) — 主机上无需本地管理员权限,无需 TrustedHosts 折腾,无需加入域。文件以
分块的 base64 形式推送;长时间运行的步骤作为独立的 SYSTEM 计划任务运行,以便在重启后继续存活。
- **随机化 → 真正的盲打。** 易受攻击的表面来自两个*外部*随机化
生成器(BadBlood、Vulnerable-AD)。因为实验室的作者不是这些
生成器的作者,且每次运行都不同,因此攻击过程可以是真正的盲打。
- **封存的标准答案评分。** 武装完成后,构建器会将确切的易受 roast 攻击的账户、
委派、`adminCount=1` 主体和危险的 ACE 记录到答案中,此外还有一个紧凑的 JSON
**攻击图**,包含的 Python 求解器(`graph_solve.py`、`verify_path.py`)使用该图来确认
存在从据点到 Domain Admin 的路径以及其长度。这使得盲打尝试可以被客观地
评分。
- **快照回合重置。** 对武装后的 VM 拍摄快照(例如 `vmrun snapshot`),以便每次攻击“回合”都可以
重置为相同的初始状态;假设被攻破的据点可以在任何还原后重新建立。
(拍摄快照是一个手动步骤,未在此仓库中编写脚本。)
## 架构
```
Non-admin Windows host VMware guest: LAB-DC01 (Windows Server)
────────────────────── ────────────────────────────────────────
lab_build.py / winrm_run.py ──WinRM/NTLM──▶ PowerShell (run / push / detached SYSTEM task)
│ │
│ push + run *.ps1 ├─ promote-dc.ps1 forest root DC (+reboot)
│ ├─ add-adcs.ps1 Enterprise Root CA
│ ├─ theme-ou.ps1 OUs / groups / svc accounts
│ ├─ fetch-tools.ps1 pull BadBlood + Vulnerable-AD
│ ├─ arm-vulns.ps1 run the randomized generators
│ ├─ create-foothold.ps1 assumed-breach low-priv user
│ ├─ plant-deep-path.ps1 one deliberate deep ACL chain
│ ├─ harden-apex.ps1 strip easy wins
│ ├─ enum-acls.ps1 emit attack-graph.json
│ └─ seal-groundtruth.ps1 write answer-key.txt
▼
graph_solve.py / verify_path.py ◀── attack-graph.json (analyzed off the DC, out-of-band)
```
## 前置条件
- 一台装有 **VMware Workstation** 的 Windows 主机(Pro 或 Player 版本;编排器使用 VMware NAT 来连接
客户机)。
- 主机上安装了带有 **`pywinrm`** 的 Python 3(`pip install pywinrm`)。
- Windows Server 安装 ISO(此应答文件针对 **Windows Server 2025 Standard** — 对于其他版本,请调整
`autounattend/autounattend.xml` 中的镜像名称)。
- 客户机可以访问互联网(以便 `fetch-tools.ps1` 可以从 GitHub 拉取外部生成器)。
- 一个隔离的实验网段。**切勿**将其连接到任何生产或校园网络。
## 快速入门
```
# 1) 配置(宿主机端) — 显示了占位符;请修改它们
$env:DC_IP = "192.168.56.10" # guest IP on the VMware NAT segment
$env:DC_ADMIN_USER = "Administrator"
$env:DC_ADMIN_PASSWORD= "CHANGEME-Admin-Pass" # must match autounattend.xml
$env:LAB_DOMAIN = "lab.local"
$env:LAB_NETBIOS = "LAB"
$env:DC_DSRM_PASSWORD = "CHANGEME-DSRM-Pass"
# 2) 从 ./autounattend 构建 autounattend ISO(首先替换 __ADMIN_PASSWORD__)并启动 VM。
# install-tools.ps1 会在首次登录时自动运行(VMware Tools、WinRM、RDP),然后重启。
# 3) 提升 DC。promote-dc.ps1 会重启 guest,因此请以 SYSTEM 身份 DETACHED 运行它,然后等待:
python lab_build.py detach promote-dc.ps1 PromoteDC
python lab_build.py wait-domain 1200 # poll until the forest is up
# 4) 配置并装备 forest(按顺序同步运行):
python lab_build.py run add-adcs.ps1
python lab_build.py run theme-ou.ps1
python lab_build.py run fetch-tools.ps1
python lab_build.py run arm-vulns.ps1
python lab_build.py run plant-deep-path.ps1
python lab_build.py run create-foothold.ps1
python lab_build.py run harden-apex.ps1
python lab_build.py run enum-acls.ps1
python lab_build.py run seal-groundtruth.ps1
# 5) 通过带外(out-of-band)方式从 DC 提取封装好的 attack-graph.json,然后对其进行分析:
$env:ATTACK_GRAPH = ".\attack-graph.json"
python graph_solve.py
python verify_path.py
```
### 配置参考(环境变量)
| 变量名 | 用于 | 示例默认值 |
|---------------------|-------------------------------------------|------------------------|
| `DC_IP` | `lab_build.py`, `winrm_run.py` | `192.168.56.10` |
| `DC_ADMIN_USER` | `lab_build.py`, `winrm_run.py` | `Administrator` |
| `DC_ADMIN_PASSWORD` | `lab_build.py`, `winrm_run.py`, unattend | `CHANGEME-Admin-Pass` |
| `DC_DSRM_PASSWORD` | `promote-dc.ps1` | `CHANGEME-DSRM-Pass` |
| `LAB_DOMAIN` | 大部分 `.ps1`, `lab_build.py wait-domain` | `lab.local` |
| `LAB_NETBIOS` | `promote-dc.ps1`, `enum-acls.ps1` | `LAB` |
| `LAB_OU_ROOT` | `theme-ou.ps1`, `plant-deep-path.ps1` | `LAB` |
| `LAB_DC_NAME` | `seal-groundtruth.ps1`, `enum-acls.ps1` | `LAB-DC01` |
| `LAB_CA_NAME` | `add-adcs.ps1` | `LAB-Root-CA` |
| `LAB_SUBNET24` | `promote-dc.ps1`, `diag.ps1` | `192.168.56` |
| `SVC_PASSWORD` | `theme-ou.ps1` | `CHANGEME-Svc-Pass` |
| `FOOTHOLD_SAM` | 据点/加固/枚举/求解脚本 | `j.kareem` |
| `FOOTHOLD_PASSWORD` | `create-foothold.ps1`, `harden-apex.ps1` | `CHANGEME-Foothold-Pass` |
| `DA_TARGET_SAM` | `plant-deep-path.ps1` (**必需**) | *(无 — 每次构建时设置)* |
| `ATTACK_GRAPH` | `graph_solve.py`, `verify_path.py` | `attack-graph.json` |
## 脚本参考
| 文件 | 用途 |
|-----------------------------|---------|
| `lab_build.py` | 主机→客户机 WinRM/NTLM 编排器:`run`, `push` (分块 base64), `detach` (SYSTEM 任务), `wait-domain`, `wait-file`。 |
| `winrm_run.py` | 最小化的一次性“在客户机中运行此 PowerShell”助手(内联 / 文件 / 标准输入)。 |
| `autounattend/autounattend.xml` | 无人值守的 Windows Server 安装:磁盘布局、自动登录、RDP、首次登录引导。 |
| `autounattend/install-tools.ps1` | 客户机首次登录引导:安装 VMware Tools,启用 WinRM + RDP,标记完成,重启。 |
| `promote-dc.ps1` | 为网卡设置静态 IP,安装 AD DS + DNS,提升为新的林根 DC(自动重启)。作为 SYSTEM 任务脱离运行。 |
| `add-adcs.ps1` | 安装 AD CS 企业根 CA + Web Enrollment(EAP-TLS 表面 + ADCS ESC 表面)。 |
| `theme-ou.ps1` | 创建大学风格的 OU 树、角色/WiFi 安全组,并播种服务账户。 |
| `fetch-tools.ps1` | 在客户机内部下载 BadBlood 和 Vulnerable-AD(未在此处捆绑)。 |
| `arm-vulns.ps1` | 运行随机化生成器(BadBlood 批量对象 + `Invoke-VulnAD`)。 |
| `create-foothold.ps1` | 创建假设被攻破的低权限“学生”账户(给定的攻击入口)。 |
| `plant-deep-path.ps1` | 在 BadBlood 的干扰信息中植入一条深思熟虑的、深层的、可解决的 `GenericAll` ACL 链。 |
| `harden-apex.ps1` | 剥离简单的攻击点(AS-REP、Kerberoast、弱服务凭据);只留下深层的涌现路径 + ADCS ESC 路径。 |
| `enum-acls.ps1` | 以 DA 身份枚举危险的 ACE + 成员身份 → 紧凑的 `attack-graph.json`。 |
| `seal-groundtruth.ps1` | 编写武装状态答案(易受 roast 攻击的账户、委派、adminCount、危险 ACE)。 |
| `graph_solve.py` | 离线分析:哪些主体可以通过 ACL 图到达 Domain Admin,以及深度如何。 |
| `verify_path.py` | 离线:从图中确认并打印据点→DA 的路径。 |
| `diag.ps1` | 客户机健全性诊断(身份、网络配置文件、互联网、ADDS 状态)。 |
## 安全 / 道德声明
本项目构建一个**合成的、隔离的、一次性的** Active Directory 实验室,仅用于**授权的**
安全培训和自学。它是故意设置漏洞的,**绝对不可**将其暴露于
生产网络、真实用户数据或任何未经您明确授权测试的系统。生成的所有
名称、域和账户都是虚构的。请将实验室保留在隔离的网段中,并将
封存的答案视为带外材料(它们已被 git 忽略,永远不应被发布)。
## 许可证
MIT — 查看 [LICENSE](./LICENSE)。
标签:Active Directory, AI合规, AWS 安全, IPv6, Libemu, OpenCanary, Plaso, PowerShell, Terraform 安全, Windows Server, WinRM, 红队训练, 自动化靶场, 虚拟化, 逆向工具