- 网络安全
- 渗透测试
【免费下载链接】GOAD
game of active directory
GOAD(Game of Active Directory)在完成虚拟机创建之后,还需要通过 Ansible 完成整个 Active Directory 攻防环境的自动化配置,包括域控制器搭建、信任关系、用户/组数据导入、LAPS、ADCS、IIS/MSSQL、安全与漏洞场景等。本文以仓库中的 docs/olddocs/provisioning.md 为核心脉络,结合仓库源码中的main.yml、inventory、Dockerfile、goad.sh等真实实现,完整讲解从 Docker、Linux 主机或同网段 Linux VM 三种途径驱动 Ansible 配置 GOAD 的完整流程,并给出可复制的逐条命令与分步 playbook 清单。读完本文,你将能够独立完成 GOAD 实验室从vagrant up之后到"实验室可用"的全部配置工作,并掌握故障重放、默认账户禁用等运维技巧。
前置条件:虚拟机必须处于运行状态
Provisioning 的前提是虚拟机已经创建并处于运行状态。也就是说,在执行任何ansible-playbook命令之前,必须先在存放 Vagrantfile 的目录下完成:
pwd /opt/GOAD # 切换到克隆项目所在的 GOAD 目录 vagrant up # 创建并启动虚拟机(必须在包含 Vagrantfile 的目录下执行)只有vagrant up成功结束、所有 VM 处于 running 状态后,才能开始 Ansible 配置。这一点在仓库的 ansible/main.yml 的 playbook 编排中也体现了:main.yml首先通过 ansible/data.yml 读取每个实验室ad/<LAB>/data/config.json中的主机数据,再逐阶段执行配置任务,任何阶段都需要目标主机在线。
三种 Ansible 运行环境
GOAD 支持从以下任意一种环境发起配置,选择哪种取决于你的宿主机条件:
- Docker 容器:使用仓库根目录的 Dockerfile 构建专用镜像,容器通过
--network host共享宿主机网络,直接访问 192.168.56.1/24 网段上的实验虚拟机; - Linux 宿主机:在本机创建 Python 3.8+ 虚拟环境并安装 ansible-core 与 pywinrm;
- 与实验室同网段的 Linux VM:在装有 Host-Only 适配器的 Linux 虚拟机中,以与上述宿主机相同的方式运行。
官方实测的 Ansible 版本为ansible-core 2.12.6,Windows 主机通过 WinRM 连接,因此pywinrm是必需依赖。
方式一:在 Docker 容器中运行 Ansible
构建配置镜像
在项目根目录(Dockerfile 所在目录)执行:
cd /opt/goad sudo docker build -t goadansible .仓库根目录的 Dockerfile 定义了镜像内容,其关键步骤包括:
- 基于
ubuntu:22.04,安装python3-pip; pip install ansible-core==2.12.6与pip install pywinrm,与官方文档中"Tested with ansible-core (2.12)"保持一致;- 安装
sshpass lftp rsync openssh-client等传输与同步工具(实验室中 Linux 主机的连接与文件同步依赖它们); COPY ./ansible/requirements.yml .后执行ansible-galaxy install -r requirements.yml,把 ansible/requirements.yml 中声明的全部 Galaxy 依赖预装进镜像。
启动配置
sudo docker run -ti --rm --network host -h goadansible -v $(pwd):/goad -w /goad/ansible goadansible ansible-playbook -i ../ad/<LAB>/data/inventory -i ../ad/<LAB>/providers/<PROVIDER>/inventory main.yml逐项拆解这条命令:
| 参数 | 作用 |
|---|---|
-ti | 交互式终端,可实时观察 ansible 输出并随时中断 |
--rm | 容器退出后自动删除,不残留容器 |
--network host | 容器直接使用宿主机网络,从而能访问 Host-Only 网段的 VM(192.168.56.1/24) |
-h goadansible | 设置容器主机名,便于识别与日志分析 |
-v $(pwd):/goad | 将包含 GOAD 仓库的本地目录挂载到容器内/goad |
-w /goad/ansible | 将容器工作目录设为/goad/ansible,对应仓库的 ansible 目录 |
第一个-i | 指定全局 inventory(ad/<LAB>/data/inventory),用于描述实验场景与主机分组,不包含环境变量 |
第二个-i | 指定provider inventory(ad/<LAB>/providers/<PROVIDER>/inventory),用于填充 IP 等 provider 相关变量 |
main.yml | 配置入口 playbook,即 ansible/main.yml |
例如对 VirtualBox 提供者、GOAD 主实验室,实际命令为:
sudo docker run -ti --rm --network host -h goadansible -v $(pwd):/goad -w /goad/ansible goadansible ansible-playbook -i ../ad/GOAD/data/inventory -i ../ad/GOAD/providers/virtualbox/inventory main.yml方式二:在宿主机 / 同网段 Linux VM 上运行 Ansible
创建 Python 虚拟环境
官方文档要求Python >= 3.8。以 Ubuntu 为例:
sudo apt install git git clone <GOAD 仓库地址> cd GOAD/ansible sudo apt install python3.8-venv python3.8 -m virtualenv .venv source .venv/bin/activate从源码看,goad.sh 会自动检测 Python 版本并处理虚拟环境:python >= 3.8时继续,python >= 3.11时改用 requirements_311.yml 作为依赖清单。你可以直接使用这条脚本,也可以手动按下面步骤安装。
安装 ansible-core 与 pywinrm
python3 -m pip install --upgrade pip python3 -m pip install ansible-core==2.12.6 python3 -m pip install pywinrm- ansible-core 2.12.6是官方文档标注的测试版本;
- pywinrm必不可少,GOAD 的 Windows 域控制器与服务器全部通过 WinRM 协议连接(见下文 inventory 中的
ansible_connection=winrm)。
安装 Ansible Galaxy 依赖
仓库根目录的 requirements.yml(与 requirements_311.yml 内容对应)声明了以下集合与角色:
| 集合 / 角色 | 说明 |
|---|---|
ansible.windows(1.11.0) | Windows 域相关操作的核心集合 |
community.windows(1.11.0) | Windows 生态补充集合 |
chocolatey.chocolatey | 包管理(文档注明"不再需要",可保留兼容) |
community.general | 通用工具集合 |
community.crypto、community.mysql、scicore.guacamole、ansible.posix | 证书、MySQL、Guacamole 网关与 POSIX 工具 |
geerlingguy.mysql(角色) | MySQL 部署角色 |
安装命令:
ansible-galaxy install -r requirements.ymlInventory 结构:全局清单与 Provider 清单
GOAD 的 Ansible 设计采用双 inventory 叠加,文档中反复出现的两条-i参数各有分工,理解它们才能自由替换 LAB 与 PROVIDER。
全局 inventory:描述实验场景
以 GOAD 主实验室为例,ad/GOAD/data/inventory 负责声明:
domain_name=GOAD等全局变量(如admin_user、键盘布局、代理开关、DNS 转发器设置);WinRM 连接参数:
ansible_user=vagrant、ansible_password=vagrant、ansible_connection=winrm、ansible_winrm_server_cert_validation=ignore,以及两个重要的超时参数:ansible_winrm_operation_timeout_sec=400ansible_winrm_read_timeout_sec=500
这正是文档提到"Windows 安装延迟导致报错,等待几分钟重放即可"的底层原因——Windows 重启、组策略生效等操作耗时较长,需要放宽 WinRM 读写超时;
主机分组:
[domain]、[dc]、[server]、[parent_dc]、[child_dc]、[trust]、[adcs]、[iis]、[mssql]、[webdav]、[laps_*]、[update]、[no_update]、[defender_on]、[defender_off]、[extensions]等,每个分组上方的注释都标明了它被哪些 playbook 使用(如[adcs]用于adcs.yml,[iis]用于servers.yml)。
Provider inventory:描述运行环境
以 VirtualBox 为例,ad/GOAD/providers/virtualbox/inventory 定义了每台主机的 IP 与归属域信息:
[default] ; sevenkingdoms.local dc01 ansible_host={{ip_range}}.10 dns_domain=dc01 dict_key=dc01 ; north.sevenkingdoms.local dc02 ansible_host={{ip_range}}.11 dns_domain=dc01 dict_key=dc02 srv02 ansible_host={{ip_range}}.22 dns_domain=dc02 dict_key=srv02 ; essos.local dc03 ansible_host={{ip_range}}.12 dns_domain=dc03 dict_key=dc03 srv03 ansible_host={{ip_range}}.23 dns_domain=dc03 dict_key=srv03其中{{ip_range}}由 Terraform/Vagrant 生成的实际网段填充,dns_domain与dict_key供 ansible/data.yml 中的set_fact逻辑使用(例如根据ansible_host匹配出域适配器与 NAT 适配器的网卡名)。每个实验室(ad/下的DRACARYS、GOAD、GOAD-Light、GOAD-Mini、NHA、SCCM)都带有自己的一套data/inventory与providers/<PROVIDER>/inventory,替换<LAB>与<PROVIDER>即可适配不同场景。
一键执行完整配置
在宿主机(或同网段 Linux VM)上,最直接的方式是一次性执行完整 playbook:
ansible-playbook -i ../ad/<LAB>/data/inventory -i ../ad/<LAB>/providers/<PROVIDER>/inventory main.yml例如 VirtualBox + GOAD 实验室:
ansible-playbook -i ../ad/GOAD/data/inventory -i ../ad/GOAD/providers/virtualbox/inventory main.yml # 当虚拟机就绪后配置它们(适用于 virtualbox provider 与 goad 实验室)分步执行 playbook:完整顺序清单
文档强调:main.yml由多个独立部分构成,每部分可以单独重跑,但必须保持执行顺序。这适用于调试或安装中途出错后精确续跑的场景。以下是文档给出的完整清单(以 GOAD + virtualbox 为例,可用ANSIBLE_COMMAND变量复用命令前缀):
ANSIBLE_COMMAND="ansible-playbook -i ../ad/GOAD/data/inventory -i ../ad/GOAD/providers/virtualbox/inventory" $ANSIBLE_COMMAND build.yml # 安装基础组件并准备虚拟机 $ANSIBLE_COMMAND ad-servers.yml # 创建主域、子域并注册服务器 $ANSIBLE_COMMAND ad-parent_domain.yml # 创建父域 $ANSIBLE_COMMAND ad-child_domain.yml # 创建子域 sleep 5m $ANSIBLE_COMMAND ad-members.yml # 添加子域成员 $ANSIBLE_COMMAND ad-trusts.yml # 创建信任关系 $ANSIBLE_COMMAND ad-data.yml # 导入 AD 数据:用户/组等 $ANSIBLE_COMMAND ad-gmsa.yml # 运行 gMSA $ANSIBLE_COMMAND laps.yml # 运行 LAPS $ANSIBLE_COMMAND ad-relations.yml # 设置权限与域间组关系 $ANSIBLE_COMMAND adcs.yml # 在 essos 安装 ADCS $ANSIBLE_COMMAND ad-acl.yml # 设置 ACE/ACL $ANSIBLE_COMMAND servers.yml # 安装 IIS 与 MSSQL $ANSIBLE_COMMAND security.yml # 配置安全项(调整杀软开关) $ANSIBLE_COMMAND vulnerabilities.yml # 配置漏洞场景 $ANSIBLE_COMMAND reboot.yml # 全部重启注意ad-members.yml之前的sleep 5m:父域与子域建立后需要时间完成 DNS 收敛与复制,直接执行成员添加容易因网络/解析未就绪而失败。
这一顺序与 ansible/main.yml 的import_playbook编排完全对应。从main.yml源码可以看到完整的依赖链设计:
# 加载数据 - import_playbook: data.yml # 读取 ad/{{domain_name}}/data/ 下的配置 - import_playbook: build.yml # 准备服务器(common/键盘/更新等) # AD 阶段 - import_playbook: ad-servers.yml # 创建主域、子域并注册服务器 - import_playbook: ad-parent_domain.yml - import_playbook: ad-child_domain.yml - import_playbook: ad-members.yml - import_playbook: ad-trusts.yml # 信任关系 - import_playbook: ad-data.yml # 用户/组数据 - import_playbook: ad-gmsa.yml - import_playbook: laps.yml - import_playbook: localusers.yml # AD 关系与 ACL - import_playbook: ad-relations.yml - import_playbook: adcs.yml - import_playbook: ad-acl.yml # 服务器 - import_playbook: servers.yml # IIS + MSSQL # 安全与漏洞 - import_playbook: security.yml - import_playbook: vulnerabilities.yml - import_playbook: reboot.yml其中被注释掉的ad.yml、servers.yml、elk.yml等体现了项目演进痕迹,当前默认流程以ad-servers.yml为 AD 阶段的起点。main.yml同样先加载 ansible/data.yml,后者通过vars_files: "{{data_path}}/config.json"将 ad/GOAD/data/config.json 中的主机级配置(密码、主机名等)注入为可缓存的 facts,供ad-servers.yml中settings/admin_password、settings/hostname等角色消费。
另外,仓库 ansible/ansible.cfg 默认关闭了host_key_checking(避免首次 SSH 连接交互)与弃用警告,并开启show_per_host_start,让多主机执行输出更清晰。
实验室生命周期管理
配置完成后,日常启停非常简单:
vagrant halt # 停止所有虚拟机 vagrant up # 再次启动实验室(无需重新配置 Ansible)再次启动时,因为虚拟机磁盘上已保留了上次配置结果,不需要重放 playbook,直接vagrant up即可。
故障处理:重放 playbook
文档给出明确的容错策略:如果安装过程中出现错误,不要犹豫,直接重放主 playbook。绝大多数报错源于 Windows 安装过程的延迟(重启、服务启动、组策略等待),等待几分钟后重放即可恢复。这与 inventory 中放宽的 WinRM 超时(operation 400s / read 500s)相互印证——重试是最常用的恢复手段。
启用 / 禁用默认 vagrant 用户
重要安全说明:由于底层模板的原因,所有环境默认使用vagrant:vagrant凭据部署。这是实验环境,本质上是不安全的。但你可能不希望这个默认凭据被用于非预期解法,为此仓库提供了两个独立的 Ansible playbook 来开关该账户。
禁用默认用户:
ansible-playbook -i ../ad/<LAB>/data/inventory -i ../ad/<LAB>/providers/<PROVIDER>/inventory disable_vagrant.yml需要再次管理实验室时重新启用:
ansible-playbook -i ../ad/<LAB>/data/inventory -i ../ad/<LAB>/providers/<PROVIDER>/inventory enable_vagrant.yml从实现看,ansible/disable_vagrant.yml 对hosts: domain执行disable_user角色、对hosts: linux_domain以become: yes执行linux/disable_user角色,二者都传入username: "vagrant";ansible/enable_vagrant.yml 则对称地调用enable_user与linux/enable_user。这保证了 Windows 域成员与 Linux 域成员两类主机都能被统一管理。
脚本化封装:goad.sh 与 check.sh
文档最后提到,以上所有功能都被封装进了 goad.sh,并伴随 scripts/check.sh 与各类setup*.sh脚本,让环境准备更简单。
- goad.sh 会自动检测 Python 版本(>= 3.8 且 < 3.11 使用 requirements.yml,>= 3.11 使用 requirements_311.yml),创建
~/.goad/.venv、安装 Python 依赖与 Galaxy 集合,最后调用 goad.py 交互式驱动整个流程。例如禁用 vagrant 用户的等价命令:
./goad.sh -t disablevagrant -l GOAD -p vmware_esxi -m local- scripts/check.sh 是环境自检脚本(源自 DetectionLab 项目),按 provider 检查对应工具链:VirtualBox 检查
VBoxManage、vagrant(要求 >= 2.2.9)、vagrant-reload插件与磁盘/内存空间;VMware 额外检查vmrun、vagrant-vmware-desktop插件与vagrant-vmware-utility;VMware ESXi 检查ovftool、vagrant-vmware-esxi与vagrant-env插件;Proxmox 检查packer、terraform;云平台检查 AWS/Azure CLI、terraform与rsync。对 ansible 侧,它会核对ansible-core版本、pywinrm、ansible/ansible-galaxy可执行文件以及community.windows、community.general、ansible.windows集合是否齐备。用法为./check.sh <provider> <ansible_host>,其中<ansible_host>取docker或local,与本文的两种运行方式一一对应。
总结
GOAD 的 provisioning 以双 inventory(场景清单 + 环境清单)+main.yml多阶段编排为核心:先vagrant up保证虚拟机在线,再通过 Docker、宿主机或同网段 Linux VM 三种途径之一驱动 ansible-core 2.12.6 完成 AD 环境搭建;日常可一键main.yml全量配置,也可按 16 个步骤逐条续跑;出错的通用解法是等待后重放 playbook;最后用disable_vagrant.yml/enable_vagrant.yml控制默认凭据暴露面。结合 goad.sh 与 scripts/check.sh,即可把整套流程自动化、可复现地跑通。
- 网络安全
- 渗透测试
【免费下载链接】GOAD
game of active directory
相关推荐
GOAD SCCM 实验室:基于 Ansible + Terraform 自动搭建 MECM/SCCM 域渗透环境的完整实践
GOAD SCCM 实验室:基于 Ansible + Terraform 自动搭建 MECM/SCCM 域渗透环境的完整实践 本文以 GOAD 仓库中的 SCC
网络安全渗透测试InvenTree SCIM 2.0 用户/组自动供应(Provisioning)配置实战指南
InvenTree SCIM 2.0 用户/组自动供应(Provisioning)配置实战指南 导读 本文基于 InvenTree 开源库存管理系统官方文档与仓
后端前端企业应用ERPGOAD:主动目录渗透测试实验室搭建指南
GOAD:主动目录渗透测试实验室搭建指南 项目介绍 GOAD是一个专为安全研究人员和渗透测试者设计的Active Directory渗透测试环境项目。它提供了一
网络安全渗透测试
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考