自动部署一个小型、故意配置不安全、脆弱的 Windows 域,用于 RDP 蜜罐。
使用基于 libvirt 与 QEMU/KVM 的自托管虚拟化运行(但可以轻松定制用于基于云的解决方案)。
用于自动(无需用户交互)从零搭建一个小型 Windows 域,以便进行 RDP 蜜罐测试。
包含一个域控制器、一台桌面计算机和一个配置好的 Graylog 服务器,用于记录攻击者的行为。
Packer:下载必要的安装介质并自动设置无人值守的基础虚拟机镜像。
Terraform:使用 packer 准备好的虚拟机镜像,配置 libvirt 虚拟化基础设施(网络 + 虚拟机)。
Ansible:自动配置基础设施(域控制器、桌面、Graylog),无需用户交互。
完成 Packer+Terraform+Ansible 流程后,配置好的 Windows 域应已启动并运行。您可以将桌面的 RDP 服务连接到公网,然后通过 Graylog 监控事件。
运行系统的特性包括:
虚拟化需要宿主系统具备一定的性能:
已在 Ubuntu 18.04 LTS 主机上测试。
首先,克隆仓库:
git clone https://github.com/tothi/ad-honeypot-autodeploy
cd ad-honeypot-autodeploy
在开始使用 Packer 之前,设置初始密码(注意复杂性要求):
./init_passwords.sh
现在构建初始镜像。
cd packer
Packer 脚本应自动下载 Windows Server 2016 和 Ubuntu 安装介质。VirtIO 需要通过附带的 get-virtio.sh 脚本下载:
./get-virtio.sh
Windows 10 需要手动获取临时下载链接并保存到 ISO 文件夹。可以从这里获取下载链接。选择英文(国际版)64 位版本,并将 ISO 保存为 ISO/Win10_21H2_EnglishInternational_x64.iso。
为了在 Graylog 的世界地图上显示 IP 位置,需要 MaxMind GeoIP 数据库。由于许可条款,无法重新分发,因此您需要手动下载(注册后)从 MaxMind 网站获取。免费版本 GeoLite2 应该可用,请获取“GeoLite2 City”数据库的 MMDB 格式(下载 GZIP 并解压),并将其放在 resources/GeoLite2-City.mmdb。
如果您没有 Packer,请从 packer.io 网站获取最新版本(下载预编译二进制文件)或尝试将 Hashicorp 仓库添加到您的软件包管理系统(对 Terraform 也很有用)。
如果重新构建镜像,不要忘记清理之前的构建:
rm -fr output_*
如果想重新下载镜像,请删除 packer_cache:
rm -fr packer_cache
完成这些准备步骤后,并行运行 Packer 构建:
./packer-build-all.sh

镜像应在合理的时间内准备就绪(约 20-30 分钟,取决于宿主硬件性能)。
现在可以使用 Terraform 部署基础设施。
如果您没有 Terraform(>=0.13),请获取(请参阅上面 Packer 部分的安装方法)。
Terraform libvirt 提供者 应在 apply 阶段从 Terraform Registry 自动下载。
进入 Terraform 文件夹:
cd ../terraform
初始化工作目录(仅首次使用需要):
terraform init
构建并启动基础设施(“应用更改”):
terraform apply
请注意,如果运行 terraform apply 的用户不是 root,则需要 sudo 权限来运行 /usr/sbin/iptables(无需密码)。

短时间后(约 2-3 分钟),网络和虚拟机将启动并运行。如果出现任何故障,terraform destroy 可能不够,可能需要手动取消定义资源。
警告:您应保护您的私有网络。此处提供的 terraform 配置(main.tf)仅包含自定义防火墙规则,适用于我自己的测试环境(阻止从 192.168.3.0/24 蜜罐网络到 192.168.0.0/16 目标流量)。
接下来是配置阶段。
进入 ansible 文件夹:
cd ../ansible
推荐的安装方法是在 Python venv 虚拟环境中安装最新的 Ansible 及一些必需的附加依赖项:
python3 -m venv venv
. ./venv/bin/activate
pip3 install -r requirements.txt
以后使用时,只需激活 venv:
. ./venv/bin/activate
如果当前会话不再需要,只需运行 deactivate。
您应该将一个 SSH 公钥(文件名为 id.pub,使用 ssh-keygen 生成)放入 ansible 文件夹,以便使用 ubuntu 用户访问 Ubuntu Graylog 机器(ansible 会将其添加到 ~ubuntu/.ssh/authorized_keys)。
wordlist.txt 文件包含一些填充域用户的(故意设置的弱)密码,可以根据需要自定义。
运行配置阶段:
ansible-playbook -i hosts setup-domain.yml -v

20-25 分钟后,一切准备就绪。
根据 libvirt 网络配置(NAT),主机可以访问公网(如果您的宿主系统允许)。
可以通过宿主系统访问主机。实际上,使用 SSH socks 隧道和 proxychains 进行 RDP 或 WinRM 访问非常方便。
例如,如果您的 libvirt 主机 IP 为 192.168.0.10,通过以下命令创建监听 localhost:5000 的 socks 隧道:
ssh 192.168.0.10 -D5000 -NTv
然后访问 Windows 10 桌面(使用配置了 :5000 隧道的 /etc/proxychains.conf):
proxychains xfreerdp /v:192.168.3.112 /u:administrator
或者,通过 SSH ProxyJump 和自定义转发隧道,在本地访问 Graylog Ubuntu 服务器上监听 :9000 的 Graylog Web 界面:
ssh -J 192.168.0.10 [email protected] -NTv -L9000:127.0.0.1:9000
然后打开 URL http://localhost:9000,即可访问 Graylog Web 界面。
要激活 RDP 蜜罐,只需允许公网访问 192.168.3.112:3389(例如,在路由器上配置端口转发,在宿主机上配置 iptables 规则;我的辅助脚本是 rdp_public.sh),然后持续观察 Graylog。;)
| 主机名 | IP 地址 | 操作系统 | 角色 |
|---|
| dc1 | 192.168.3.100 | Windows Server 2016 | 域控制器 |
| desktop12 | 192.168.3.112 | Windows 10(版本 2004) | 域成员工作站 |
| graylog | 192.168.3.191 | Ubuntu 18.04 LTS | Graylog 服务器 |
| kali | 192.168.3.192 | Kali Rolling(2022.3) | 攻击操作机 |