- 网络安全
- 应用安全
【免费下载链接】monkey
Infection Monkey - An open-source adversary emulation platform
MonkeyZoo 是 Infection Monkey 项目自带的自动化渗透测试网络:通过 Terraform 在 Google Cloud Platform(GCP)上一键拉起一个由大量故意留有漏洞的虚拟机组成的隔离网络,用于回归测试各类 exploiter、评估真实场景下的扫描耗时、演练凭证窃取与多跳传播等攻防能力。阅读本文后,你将掌握从 GCP 服务账号配置、镜像构建、Terraform 状态后端设置,到terraform apply完成整网部署,以及登录两台 Monkey Island 主控机并配合黑盒测试运行测试的全部流程。
本文以 zoo_setup.md 为骨架,并补充仓库内 README.md、config.tf、monkey_zoo.tf、firewalls.tf 与 zoo_network.md 的源码级细节,供读者对照实操。
MonkeyZoo 是什么
根据 monkey_zoo 目录 README,MonkeyZoo 是一个"用 Terraform 部署在 GCP 上的测试网络"。Terraform 脚本允许你快速搭建一个布满脆弱主机的网络,用于:
- 回归测试 Monkey 的 exploiters:每个 exploiter 都有对应的靶机(如 Hadoop、Log4Shell、RDP、SMB、ZeroLogon、SNMP、PowerShell/WinRM、MSSQL、SSH 等);
- 评估真实场景下的扫描耗时:网络中专门布置了无漏洞的 "Scan" 机器(如 Nr. 21、Nr. 22)用于测试扫描性能基线;
- 演练复杂传播链:多跳利用(tunneling 机器链)、凭证窃取(mimikatz、浏览器凭证、SSH key steal)、凭证复用(credentials-reuse 子网)等。
安全警告(务必先行阅读):MonkeyZoo 是一个故意脆弱的网络。README 明确警告:不要把生产服务器加入同一网络,且必须保持网络对公网封闭。部署完成后建议及时销毁实例,避免被他人利用。
搭建前的准备
搭建分为"构建镜像"与"部署实例"两条工具链,对应需求如下(详见 zoo_setup.md 的 Requirements 小节):
通用要求
- 已下载本仓库,尤其是
envs/monkey_zoo目录(所有指令、Packer/Terraform 配置均在其中)。
构建镜像(Packer + Ansible)
- 安装
packer(HashiCorp 官方教程:get-started-install-cli); - 安装
ansible(Ansible 官方安装指南)。
部署实例(Terraform + S3)
- 安装
terraform(HashiCorp 官方教程:install-cli); - 准备一个S3 兼容的对象存储桶,用于存放 Terraform 状态(state);
- 具备访问该 S3 桶的access key(ID 与 Secret)。
使用 GCP
- 拥有一个 GCP 账号(若想一次测试整个网络,建议升级为付费账号,否则资源配额可能不足);
- 安装
gcloudCLI(Google Cloud SDK 官方安装文档,Linux 版)。
注:原文档中的安装链接为外部站点,本文不再罗列;各工具均按官方文档安装即可。
部署 MonkeyZoo 的完整步骤
整体流程为:配置 GCP 服务账号 → 获取官方镜像权限 → 配置 AWS 访问 → 配置 Terraform 后端 → (可选)用 Packer 构建镜像 → 修改 Terraform 变量 →terraform init/plan/apply部署。
步骤 1:为项目配置 GCP 服务账号
在 GCP 控制台的IAM & Admin → Service Accounts → + CREATE SERVICE ACCOUNT创建一个服务账号,用于向你的项目发起部署,并授予以下权限:
Compute Engine -> Compute Image User Compute Engine -> Compute Network Admin Compute Engine -> Compute Instance Admin (v1) Compute Engine -> Compute Security Admin如果图省事,也可以直接授予:
Project -> Owner但注意这会授予超出实际需要的权限,不推荐在共享环境中使用。
随后为该服务账号创建并下载 JSON 格式的 Service account key,放置在monkey_zoo/gcp_keys目录下并命名为gcp_key.json,即仓库内的 gcp_keys 目录。
(可选)多 Zoo 实例的服务账号模拟(impersonation):如果你要同时管理多个 Zoo 实例,可以为每个项目单独建一个服务账号,再建一个"管理员"服务账号并授予其模拟(impersonate)其他账号的能力,这样只需一把 key 即可管理所有项目。做法是:
- 在目标项目上启用IAM 和 Service Account Credentials API;
- 给管理员账号授予对每个项目服务账号的Service Account Token Creator权限,并使用该管理员账号的 key;
- 在 Terraform 变量中把
service_account_email设为要管理的那个项目服务账号。
对应到代码,config.tf 中service_account_email与credentials两个变量正是为此设计:provider 会通过impersonate_service_account以credentials对应的账号去模拟service_account_email指向的账号。
步骤 2:获取官方生产项目镜像的权限
MonkeyZoo 的机器镜像由维护方托管在官方项目guardicore-22050661中。你的服务账号需要被授予该项目的以下权限(需联系 Infection Monkey 开发者添加,参考官方技术文档获取使用与支持渠道):
Compute Engine -> Compute image user这一点对应 images.tf 中的写法:所有实例的启动盘镜像都通过data "google_compute_image"从project = local.monkeyzoo_project(即guardicore-22050661,见 config.tf 的locals块)拉取,例如:
data "google_compute_image" "hadoop-2" { name = "hadoop-2" project = local.monkeyzoo_project }如果你在步骤 5 选择自行构建镜像,也可以只使用自有项目内的镜像,无需官方项目权限。
步骤 3:配置 AWS 访问(用于 Terraform 状态存储)
首先在 AWS(或兼容 S3 的服务)生成 access key,然后通过以下两种方式之一配置环境:
方式 a:环境变量
export AWS_ACCESS_KEY_ID=<your-access-key-id> export AWS_SECRET_ACCESS_KEY=<your-secret-access-key>方式 b:AWS 配置文件
编辑或创建~/.aws/config,定义 profile:
[profile my-profile] output = text region = us-east-1编辑或创建~/.aws/credentials,写入该 profile 的密钥:
[my-profile] aws_access_key_id=<access-key> aws_secret_access_key=<secret-key>步骤 4:配置 Terraform 后端(S3)
修改仓库中 terraform/setup/state.tf(原文档写的是terraform/state.tf,当前仓库中该文件实际位于terraform/setup/子目录)的backend "s3"配置段,逐项确认:
| 字段 | 含义 |
|---|---|
endpoint | S3 API 的端点地址 |
profile | 若使用~/.aws/config,填写其中的 profile 名 |
bucket | S3 兼容桶的名称 |
key | 状态文件在该桶中存储的路径 |
region | 桶所在区域 |
更多字段细节可参考 Terraform 官方的 s3 backend 文档。
值得一提的源码佐证:该文件不仅定义了 backend 变量,还配套声明了状态存储基础设施本身——一个开启了版本控制(aws_s3_bucket_versioning)、AES256 服务端加密、并阻止公开访问的 S3 桶,外加一张用于状态锁的 DynamoDB 表(aws_dynamodb_table,以LockID为哈希键)。也就是说,先对setup/state.tf执行一次terraform apply把桶和锁表建好,再把主配置的 backend 指向该桶,可避免并发部署时状态竞争。
步骤 5:(可选)用 Packer 构建自定义镜像
默认情况下直接使用官方项目镜像即可部署;若需自行构建(例如定制系统版本或修改漏洞环境),从envs/monkey_zoo/packer目录执行:
packer init . packer build .packer build .会构建全部镜像;可通过-only参数限定构建范围,例如:
packer build -only googlecompute.tunneling-9,googlecompute.tunneling-10 . packer build -only googlecompute.tunneling-*常用附加标志(见 README.md):
-debug:关闭并行化并输出调试信息;-on-error=ask:脚本失败后允许编辑并重试;-force:覆盖已存在的镜像。
构建前请核对 variables.pkr.hcl 与 variables.auto.pkrvars.hcl 中的变量是否符合你的环境。关键变量包括:
project_id:镜像构建目标项目;account_file:服务账号 key 文件路径(默认指向../gcp_keys/gcp_key.json);zone:构建区域,默认europe-west1-b;machine_type:构建机规格,默认e2-standard-4;windows_source_image/linux_source_image:基础镜像,默认分别为windows-server-2016-dc-v20211216与ubuntu-2004-focal-v20230907;packer_username/packer_user_password:Packer 创建的构建账号与密码,默认packer_user/Passw0rd。
每个靶机镜像的定制脚本(Ansible playbook)位于 packer/tasks(如windows_install_mssql.yml、windows_install_apache_solr.yml、linux_install_python.yml等),构建定义文件为 packer 目录 下的各*.pkr.hcl。
步骤 6:修改 Terraform 部署配置
编辑 terraform/config.tf,必须提供:
project:部署目标 GCP 项目 ID(默认test-000000,务必改成你自己的项目);credentials:GCP 凭据。这里对应的是 JSON 字符串形式的凭据内容(Packer 的account_file是文件路径,二者不同)。你可以通过 Terraform 变量文件把gcp_key.json的内容传进来,例如在terraform.tfvars中写credentials = file("../gcp_keys/gcp_key.json")。
可选变量(均已带默认值,通常无需修改,除非你的项目区域不同):
| 变量 | 默认值 | 说明 |
|---|---|---|
region | europe-west1 | 部署区域 |
main_zone | europe-west1-a | 10.2.2.0/24 子网(.2网段)机器所在可用区 |
main1_zone | europe-west1-b | 10.2.3.0/24 子网(.3网段)机器所在可用区 |
tunneling_zone | europe-west1-a | tunneling 机器所在可用区 |
credentials_reuse_zone | europe-west1-b | credentials reuse 机器所在可用区 |
service_account_email | 空 | 要模拟的服务账号(配合步骤 1 的可选 impersonation) |
resource_policies | 空列表 | 附加到实例上的资源策略列表 |
从 monkey_zoo.tf 的源码可以看到 Zoo 的网络拓扑与 CIDR 规划:主网monkeyzoo含10.2.2.0/24(.2网段)与10.2.3.0/24(.3网段)两个子网,另有tunneling(10.2.1.0/28)、tunneling2(10.2.0.0/27)、powershell(10.2.4.0/24)、credential-reuse(10.2.4.0/24)与credential-reuse2(10.2.5.0/24)等隔离网络。机器列表与各机器 IP、凭证、漏洞说明可查阅 zoo_network.md。
防火墙策略在 firewalls.tf 中定义,值得注意的两点:
- islands-in规则只对带有
island标签的实例(即两台 MonkeyIsland 主控机)放行22/443/3389/5000端口的入站流量(来源0.0.0.0/0),其余靶机不对外暴露任何端口; - monkeyzoo-in / monkeyzoo-out规则仅允许
10.2.2.0/24、10.2.1.0/27、10.2.3.0/24、10.2.4.0/24内部网段互相访问,配合各隔离网络(tunneling、credentials-reuse)实现"只有特定机器才能到达特定目标"的拓扑约束——这正是多跳利用与凭证复用测试所需的网络隔离。
步骤 7:部署 Zoo
进入 terraform 目录并依次执行:
cd envs/monkey_zoo/terraform terraform init terraform plan # 审查将在 GCP 上创建的资源 terraform apply # 在网络上创建全部虚拟机terraform init:初始化后端与插件,读取 backend 配置连接 S3 状态桶;terraform plan:先审查变更(会显示将创建的 VPC、子网、防火墙与数十台实例),确认无误再执行;terraform apply:实际创建资源。Zoo 机器数量较多,apply 通常需要一段时间,期间注意 GCP 配额是否充足。
使用 MonkeyZoo islands(主控机)
部署完成后,网络中有两台 MonkeyIsland 主控机(见 zoo_network.md 与 zoo_network.md):
- island-linux-250(
10.2.2.250,Ubuntu 16.04,端口 22/443):从 GCP 控制台直接 SSH 登录; - island-windows-251(
10.2.2.251,Windows Server 2016,端口 3389/443):在 GCP 的 VM instances 页面点击该实例,先为自己的账户设置密码,再通过 RDP 登录。
两台岛屿机都预装了 MonkeyIsland 服务器、git、mongodb 等组件,且"只能通过 GCP 访问"(Only accessible through GCP),进一步印证了网络对外封闭的设计。
在 Zoo 中安装 Monkey Island
- 普通用户:按操作系统登录
island-linux-250(Linux)或island-windows-251(Windows),随后参考官方 setup guide 完成 Monkey Island 的安装与启动。 - 开发者:如需搭建开发环境,参考官方 development setup 文档(覆盖源码依赖、MongoDB、前端构建等步骤)。仓库内 monkey_island 安装脚本、install_mongo.sh 等即为相关依据。
用 MonkeyZoo 进行测试
黑盒测试(blackbox tests)
Zoo 的自动化回归入口是 blackbox 测试套件。该目录包含基于 pytest 的测试框架:测试配置定义在 test_configurations(如depth_1_a.py、depth_2_a.py、depth_3_a.py、depth_4_a.py、credentials_reuse_ssh_key.py、smb_pth.py、zerologon.py等),测试逻辑在 tests(如basic_test.py、exploitation.py),配合 island_client 通过 API 驱动 Island 下发配置并断言攻击结果。
手动测试
- 利用靶机:zoo_network.md 中大多数机器可用对应的 exploiter 攻击。进入 MonkeyIsland 的配置界面,把目标机器 IP 加入扫描/攻击目标列表;若使用暴力破解类 exploiter,还需填入表中列出的密码/凭证(用户名未列出时通常为
m0nk3y)。 - 复杂传播场景:多跳利用与凭证窃取等测试的网络拓扑示意图见 network_diagrams(如 tunneling 链、凭证复用链)。演练这类场景时需在配置中调大攻击深度(hops)与传播深度。
- 其他功能:Zoo 网络也适合验证其他特性——扫描性能(用无漏洞的 Scan 机器)、凭证收集器(mimikatz、Chrome/Chromium 浏览器凭证、SSH 密钥窃取)等,均可按 zoo_network.md 中的机器描述挑选合适靶机。
注意事项与最佳实践
- 网络封闭:Zoo 内机器默认只对 islands 暴露少量管理端口(22/443/3389/5000),靶机之间仅按测试拓扑互相可达;部署后请勿额外放行公网流量,也绝不将生产服务器加入该网络。
- 配额与成本:一次
terraform apply会创建数十台n1-standard-1/e2-standard-2规格实例,注意 GCP 项目配额;测试结束后建议terraform destroy清理,避免持续计费。 - 镜像权限:使用官方镜像时务必先完成步骤 2 的权限申请,否则
terraform plan会因无法读取镜像而报错。 - 状态锁:多成员协作部署同一 Zoo 时,S3 后端 + DynamoDB 锁表(setup/state.tf)可防止 state 并发写入;这也是该目录单独成
setup子目录的原因。
总结
MonkeyZoo 把"恶意软件测试网络"的搭建成本压缩到了几条 Terraform/Packer 命令:服务账号与镜像权限打通后,修改 config.tf 中的项目与凭据,terraform apply即得到一个由数十台脆弱主机、多段隔离子网与精确防火墙规则构成的攻防演练场。配合 blackbox 测试套件与 zoo_network.md 的机器清单,你可以持续对 Infection Monkey 的各个 exploiter、扫描器与传播机制做回归验证——这正是开源对抗模拟平台自我验证的关键基础设施。
- 网络安全
- 应用安全
【免费下载链接】monkey
Infection Monkey - An open-source adversary emulation platform
相关推荐
Nomad GCP 部署指南:使用 Packer 与 Terraform 在 Google Cloud 上搭建 HashiStack 集群
Nomad GCP 部署指南:使用 Packer 与 Terraform 在 Google Cloud 上搭建 HashiStack 集群 Nomad 是 Ha
任务调度云原生运维后端Infection Monkey终极指南:从零开始的渗透测试实战教程
Infection Monkey终极指南:从零开始的渗透测试实战教程 Infection Monkey是一款功能强大的开源攻击模拟平台,专为测试数据中心对边界突
网络安全应用安全使用 Packer 与 Terraform 在 AWS、Azure、GCP 上一键部署 Nomad HashiStack 沙箱集群
使用 Packer 与 Terraform 在 AWS、Azure、GCP 上一键部署 Nomad HashiStack 沙箱集群 本文基于 Nomad 仓库
任务调度云原生运维后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考