Red Team lab, part 3: GOAD Provisioving
GOAD provisioning host (VLAN 56)
The provisioning host orchestrates Packer, Terraform and Ansible. It sits on VLAN 56 so it can talk to the Windows VMs it builds. Host needs outbound internet during the build.
Keep the build time WAN allow rule and the Outbound NAT rule from Part 1 enabled all the way through the Terraform and Ansible install, removing both only once the full lab is verified working.
Create the VM #
- Create VM, attach Ubuntu Server ISO, NIC tag:160, vCPU:1 socket-4 cores, RAM:4 GB, Storage:40 GB.
- During install, assign a static IP at Ubuntu network menu inside 192.168.56.0/24 that does not collide with the GOAD hosts, for example 192.168.56.200 with gateway 192.168.56.1. DHCP is off on this VLAN, so set this manually in the installer.
Ubuntu installer network notes on this VLAN #
Work through the below if you hit "Temporary failure resolving" or "Network is unreachable" on the mirror screen.
- Nameserver: use pfSense's gateway 192.168.56.1, not a public resolver directly. Confirm pfSense's own DNS Resolver is enabled and listening on the AD_LAB interface.
- The build time firewall rule must allow any port, not just 443. The installer needs 53 for DNS and 80 for the HTTP mirror too.
- Outbound NAT must exist for VLAN 56 to WAN. An allow rule alone does not let return traffic route back. Without NAT you will see connections time out.
- IPv6: if the installer tries bracketed IPv6 addresses and fails with "Network is unreachable," your VLAN has no IPv6 routing, which is expected. Either set the mirror address to http://ipv4.archive.ubuntu.com/ubuntu/ to force IPv4 only DNS answers, or skip the mirror and fix IPv6 after boot.
- If all else fails, hit Done on the mirror screen and finish the install. You can apt update normally once booted, after applying the fixes above.
Log in as root #
This VM is a throwaway orchestration host inside an isolated lab VLAN, not a production server. Every tool in this build assumes root.
sudo -iRun everything from here on as root, in the same shell.
Disable IPv6 permanently if you hit the installer IPv6 issue above #
tee /etc/sysctl.d/99-disable-ipv6.conf <<EOF
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF
sysctl --system
ip addr show | grep inet6The last command should return nothing.
Remote access to this VM, use SSH #
This is a headless server with no X11 session. SPICE's clipboard feature requires an active X11 session to function, so it will never work here regardless of configuration.
apt install -y openssh-server
systemctl enable --now sshFrom your desktop, ssh root@192.168.56.5. This gives native copy paste and scroll through your own terminal. Install tmux and run all long running steps inside it, so a dropped SSH session does not kill an in progress build.
apt install -y tmux
tmux new -s goad
# reattach anytime with: tmux attach -t goadFix the locale #
If ./goad.sh errors with "Ansible could not initialize the preferred locale":
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANGUAGE=en_US.UTF-8
echo 'export LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANGUAGE=en_US.UTF-8' >> /root/.bashrcVerify with locale. All lines should read en_US.UTF-8.
Install dependencies #
apt update && apt install -y git python3 python3-venv python3-pip sshpass rsync openssh-clientClone GOAD repository #
cd /root
git clone https://github.com/Orange-Cyberdefense/GOAD.git
cd GOADEdit setup_proxmox.sh before running it for Python compatibility #
GOAD's shipped script pins ansible-core==2.12.6, which predates Python 3.12 and crashes with error '_AnsiblePathHookFinder' object has no attribute 'find_spec' on modern Python. If your Ubuntu install shipped Python 3.12 or newer, this pin will always break.
Open scripts/setup_proxmox.sh and modify the line:
python3 -m pip install ansible-core==2.12.6to:
python3 -m pip install "ansible-core>=2.20"2.20 is the first release with official Python 3.14 controller support.
Run the prerequisite script, from the repo root #
cd /root/GOAD
bash ./scripts/setup_proxmox.shRun this from the repo root and not from inside scripts directory, since it uses relative paths. This installs Packer, Terraform and the Ansible venv. Then runs ansible-galaxy install against ansible/requirements.yml.
Verify:
source .venv/bin/activate
ansible --version
packer version
terraform versionLaunch GOAD's interactive menu #
./goad.shShould launch cleanly with no locale or Ansible import errors. Exit the menu once confirmed, you will come back to run installs in Part 6.