UTRGV · Security Engineer

Mauricio Martinez

Hands-on experience in vulnerability management, incident triage, and cloud computing. I like playing music, games, and look forward to becoming a homeowner and beekeeper.

Student Role
Student Analyst
UTRGV RSOC
Internship
Information Security Intern
Cameron County — Tenable Nessus scanning, XDR alert triage, XQL threat hunting
Student Role
Academic Assistant & Mentor
UTRGV — Mentored 21 students, providing guidance on programming and tooling setup.
Highlight
Homelab (Ongoing)
Windows Server 2025 with pfSense for firewall and VLAN segmentation, Wazuh for SIEM monitoring. Configured DHCP and DNS services, simulates IT & SOC system alerts.
Cloud / Azure
Virtual SOC Lab
Azure-hosted red/blue team training environment. Features PentAGI + Ollama AI pentesting on the red team, and Wazuh SIEM monitoring on the blue team against vulnerable Linux and Windows VMs.
Automation
banadi: AI-powered pentesting
Combines Claude Code, Dockerized security tooling, CVE intelligence, and LLM-assisted analysis into a modular offensive security workflow. Includes automated reconnaissance and vulnerability triage.
Vaquero Information Security Initiative
Vulnerability Management Workshop
Demonstrated OpenVAS, Nmap network discovery, and live SQL injection/path traversal attacks.
Vaquero Information Security Initiative
Open-Source Intelligence Framework
Created a comprehensive toolkit covering Identity Lookup, Breach Intelligence, and Geospatial tracking.

Homelab · Walkthrough

Prod Lab

Building an enterprise-style homelab on Proxmox — pfSense, Active Directory, and Wazuh.

Mauricio Martinez · July 2026 · Continuously updated

After my internship at the county, I decided to create a homelab/prod lab similar to how a standard enterprise might start its network architecture. This features a firewall, VLAN segmentations dividing servers and clients, Active Directory Domain Services, Wazuh security monitoring, and two client VMs acting like employee workstations. Since this prod lab is for demonstration purposes only, I’ll continuously update this site as I learn how modern operations can be built using free or open source softwares.

This EliteDesk features:

16 GBRAM
12vCPU
512 GBSSD
1NIC

My home network is on an unmanaged switch, so I cannot create VLAN segmentation to divide different networks. pfSense allows me to create both VLANs and firewall rules between them. This limits the number of virtual machines I can add to this network, so five running concurrently maximise the use of one desktop.

Subnets
SubnetPurpose
192.168.1.0/24WAN / Home network
10.10.10.1/24Servers
10.10.20.1/24Clients
Virtual machines
NameStatic/DynamicIPDNSvCPURAMStorage
pfSenseStaticWAN: 192.168.1.101
LAN: 10.10.0.1
192.168.1.112 GB32 GB
Windows Server 2025Static10.10.10.1010.10.10.1014 GB150 GB
Wazuh All-in-one ServerStatic10.10.10.1110.10.10.1026 GB80 GB
Windows 11 clientDynamic10.10.20.10010.10.10.1024 GB80 GB
Linux / Ubuntu clientDynamic10.10.20.10110.10.10.1024 GB80 GB
Total820 GB422 GB
Home network 192.168.1.0/24 (WAN) pfSense WAN 192.168.1.101 LAN 10.10.0.1 · vmbr1 VLAN 10 · Servers · 10.10.10.1/24 WinServer2025 AD DS · DNS · 10.10.10.10 WazuhServer SIEM · 10.10.10.11 VLAN 20 · Clients · 10.10.20.1/24 WinClient1 Windows 11 · 10.10.20.100 LinuxClient1 Ubuntu Desktop · 10.10.20.101

Top-down topology

Throughout creating this environment numerous times, I practice learning how to set up firewall rules, Active Directory DS, VLANs, DHCP rules, and virtualization by using Proxmox as the central host. Because I was guided by both AI and other public resources like Reddit, I was misled numerous times, forcing me to reverse, make exceptions, and — although it sounds like giving up, it helps me cement my understanding — reset and reimage the hypervisor. I now have a guided walkthrough of how to create this exact environment and will continuously update it as I continue to grow my hardware and curiosity.

1

Hypervisor setup (Proxmox)

Cleaning / wiping the bootable drive

In Windows, I’ve had trouble wiping the USB with both File Explorer and Disk Management. The best application I’ve been using is diskpart. While the USB is plugged in, open CMD and execute:

diskpart        # opens diskpart
list disk       # find USB drive
select disk #   # select USB
clean           # wipes USB
diskpart session showing list disk, select disk 3, and clean
diskpart: list, select, and clean the USB drive.

Download the latest Rufus here.
Download the latest Proxmox ISO here.

As a naming convention throughout this article, I will refer to the EliteDesk PC as a hypervisor. On a fresh USB stick, open Rufus and select both your USB and the Proxmox ISO. It’ll show an alert saying DD image writing mode will be used, ignore it. Click “Start” and unplug when completed.

Rufus with the USB device and Proxmox ISO selected
Rufus with the USB stick and Proxmox ISO selected.

Now in the hypervisor, plug in the bootable USB, monitor, and keyboard, and turn it on. Different computers have different keybinds to open the boot manager: F12, F11, F8, or Esc. At the boot manager, choose your USB drive and go through the installation process until you reach the networking settings.

Hostname:    homelab.internal
IP Address:  192.168.1.100    # static IP where you’ll reach your UI
Gateway:     192.168.1.1
DNS Server:  192.168.1.1
Note homelab is a placeholder for your internal domain name — but make sure it’s .internal.

After installation, open the UI on your desktop at 192.168.1.100:8006

Proxmox VE web interface showing the datacenter view
The Proxmox VE web UI after a fresh install.

Now verify we updated everything by going to the shell and running:

apt update
apt full-upgrade -y
2

Creating VMs

Create the vmbr1 VLAN network interface:

Datacenter → Node → Network → Create → Linux Bridge
Name:        vmbr1
VLAN aware:  Checked

Start by importing all the ISOs of the machines that will be running in this homelab:

ISO downloads
MachineDownload
pfSense Community Editionpfsense.org/download
Windows Server 2025microsoft.com — evaluate Windows Server 2025
Ubuntu 26.04 LTSubuntu.com/download/server
Windows 11microsoft.com/software-download/windows11
Ubuntu Desktopubuntu.com/download/desktop

To import all of the ISO files to Proxmox, go to:
Datacenter → Node → local → ISO Images → Upload

Proxmox ISO upload dialog showing Windows Server 2025 ISO uploading
Uploading an ISO to Proxmox local storage.

Now on the top right, click Create VM:

VM creation settings
pfSenseWinServer2025WazuhServerWinClient1LinuxClient1
General VM ID: 101
Name: pfSense
VM ID: 102
Name: WinServer2025
VM ID: 103
Name: WazuhServer
VM ID: 200
Name: WinClient1
VM ID: 201
Name: LinuxClient1
OS ISO: pfSense.iso ISO: Windows_Server_2025.iso
Type: Microsoft Windows
ISO: Ubuntu_Server_26-04.iso
Type: Linux
ISO: Windows_11.iso
Type: Microsoft Windows
ISO: Ubuntu_Desktop.iso
Type: Linux
System Defaults EFI Storage: local-lvm
TPM Storage: local-lvm
Defaults EFI Storage: local-lvm
TPM Storage: local-lvm
Defaults
Disks 32 GB
SSD Emulation: ✓
150 GB
SSD Emulation: ✓
80 GB
SSD Emulation: ✓
80 GB
SSD Emulation: ✓
80 GB
SSD Emulation: ✓
CPU Sockets: 1
Cores: 1
Type: host
Sockets: 1
Cores: 1
Type: host
Sockets: 2
Cores: 1
Type: host
Sockets: 2
Cores: 1
Type: host
Sockets: 2
Cores: 1
Type: host
Memory 2048 4096 6144 4096 4096
Network Bridge: vmbr0 ** Bridge: vmbr1
VLAN Tag: 10
Bridge: vmbr1
VLAN Tag: 10
Bridge: vmbr1
VLAN Tag: 20
Bridge: vmbr1
VLAN Tag: 20
** For pfSense, go to Hardware → Add → Network Device → Bridge: vmbr1 so that we have both interfaces.
3a

Configuring pfSense

Start pfSense.

Please select the WAN interface: vtnet0
Please select the LAN interface: vtnet1

Proceed through the installation until you restart and reach the console.

Configuring the WAN IP address
Set Interface(s) IP address →
Enter the number of the interface you wish to configure: 1 (WAN) →
Configure IPv4 address WAN interface via DHCP? N →
Enter the new WAN IPv4 address: 192.168.1.101 →
Enter the new WAN IPv4 subnet bit count: 24 →
For a WAN, enter the new WAN IPv4 upstream gateway address: 192.168.1.1 →
Should this gateway be set as the default gateway? Y →
Configure IPv6 address WAN interface via DHCP6? N →
Enter the new WAN IPv6 address: <blank> →
Do you want to enable the DHCP server on WAN? N →
Do you want to revert to HTTP as the webConfigurator protocol? N

Now the pfSense firewall is on a static IP (192.168.1.101).

Configuring the LAN IP address
Set Interface(s) IP address →
Enter the number of the interface you wish to configure: 2 (LAN) →
Configure IPv4 address LAN interface via DHCP? N →
Enter the new LAN IPv4 address: 10.10.0.1 →
Enter the new LAN IPv4 subnet bit count: 24 →
For a LAN, press <ENTER> for none: Press enter →
Configure IPv6 address LAN interface via DHCP6? N →
Enter the new LAN IPv6 address: <blank> →
Do you want to enable the DHCP server on LAN? N →
Do you want to revert to HTTP as the webConfigurator protocol? N

Now the pfSense firewall is on a static IP (10.10.0.1).

3b

Configuring VLANs

Press 1 to start configurations: Should VLANs be set up now? Y

VLAN creation
PromptVLAN 10VLAN 20
Enter the parent interface name for the new VLANvtnet1vtnet1
Enter the VLAN tag1020
Enter the WAN interface name:         vtnet0
Enter the LAN interface name:         vtnet1
Enter the Optional 1 interface name:  vtnet1.10
Enter the Optional 2 interface name:  vtnet1.20
Do you want to proceed? Y

Now we need to set up the IP address range and DHCP. Press 2.

Interface IP + DHCP configuration
PromptOPT1OPT2
Enter the number of the interface you wish to configure3 (OPT1)4 (OPT2)
Configure IPv4 address via DHCP?nn
Enter the new IPv4 address10.10.10.110.10.20.1
Enter the new IPv4 subnet bit count (1 to 32)2424
For a LAN, press <ENTER> for none<ENTER><ENTER>
Configure IPv6 address via DHCP6?nn
Enter the new IPv6 address. Press <ENTER> for none<ENTER><ENTER>
Do you want to enable the DHCP server on the interface?yy
Enter the start address of the IPv4 client address range10.10.10.10010.10.20.100
Enter the end address of the IPv4 client address range10.10.10.20010.10.20.200
Do you want to revert to HTTP as the webConfigurator protocol?nn

Now we need to reset the admin account and password by pressing 3.

Heads up pfSense restricts access to the Web UI through the WAN by default, so to get access without having to make a VM in its LAN, run pfctl -d to disable the firewall. Now we can access the pfSense Web UI at 192.168.1.101:443.
pfSense dashboard with WAN, LAN, OPT1, and OPT2 interfaces up
pfSense dashboard — all four interfaces up.

Interfaces → OPT1 and change the Description to SERVERS.
Interfaces → OPT2 and change the Description to CLIENTS.
Interfaces → WAN → uncheck “Block private networks and loopback” and “Block bogon networks.”
Firewall → Rules → WAN → add: pass TCP, source = 192.168.1.x (your PC) OR WAN subnets, dest = This Firewall (self), port 443.

3c

Configuring firewall rules

Firewall → Aliases → Ports

pfSense port aliases: AD_mgmt with ports 88, 135, 389, 445, 636, 3268, 3269, 464 and mgmt with 443, 80, 22
Port aliases — AD_mgmt (Kerberos, RPC EPM, LDAP/LDAPS, SMB, Global Catalog, kpasswd) and mgmt (443, 80, 22).
Note Include 464 (Kerberos kpasswd) in the AD_mgmt alias now. It’s easy to miss because the domain join in Stage 8 still succeeds without it — but the forced password change at a user’s first logon will silently fail.

Firewall → Rules

pfSense WAN firewall rules
WAN rules — UI access from WAN, deny all other WAN traffic to pfSense, diagnostics ping check.
pfSense LAN firewall rules
LAN rules — anti-lockout, DNS to pfSense resolver, and deny/allow rules for the SERVERS subnet.
pfSense SERVERS firewall rules
SERVERS rules — pass DNS to pfSense resolver, deny pfSense management, deny traffic to Clients and home WAN, allow internet access for OS/Wazuh updates.
pfSense CLIENTS firewall rules
CLIENTS rules — DNS/AD management/RPC/NTP to the AD DC, Wazuh agent traffic (ports 1514–1515) to the Wazuh server, deny rules, and internet access.

Also add 10.10.10.10 (AD DS) to the default DNS servers for the client subnet:

Services → DHCP Server → CLIENTS interface → DNS Servers field → set to 10.10.10.10 → Save → Apply Changes
4

Windows Server 2025, AD, and AD DS

Turn on the WinServer2025 VM and go through the installation steps. Choose the Desktop Experience.

Windows Server 2025 setup with Standard Evaluation (Desktop Experience) selected
Windows Server 2025 Standard Evaluation (Desktop Experience).

Once finished, we need to set a static IP and gateway.
Open Control Panel → Network and Sharing Center → Change adapter settings → Ethernet

Ethernet Status dialog with Properties button highlighted
Ethernet Status → Properties.
Ethernet Properties with Internet Protocol Version 4 highlighted
Ethernet Properties → Internet Protocol Version 4 (TCP/IPv4).
IPv4 properties with static IP 10.10.10.10, gateway 10.10.10.1, DNS 10.10.10.10
Static addressing for the domain controller.

Now the server has a static IP of 10.10.10.10, gateway 10.10.10.1, and DNS 10.10.10.10 (itself). And we can change the name of the computer by going to Server Manager → Local Server → Computer name

Server Manager Local Server panel with computer name highlighted
Server Manager → Local Server.

Now go to Change → Computer name: WinServer2025 — then restart to apply changes.

System Properties and Computer Name/Domain Changes dialogs renaming to WinServer2025
Renaming the computer to WinServer2025.

Now we need to create the Domain Controller.
In Server Manager → Manage → Add Roles and Features → go until you reach Server Roles and check “Active Directory Domain Services”. Continue and Install.

Add Roles and Features wizard with Active Directory Domain Services checked
Selecting the Active Directory Domain Services role.

Now promote the server to a domain controller by clicking the flag at the top right in the Dashboard:

Post-deployment configuration flag with Promote this server to a domain controller link
“Promote this server to a domain controller.”

Select “Add a new forest” and use your homelab.internal domain name.

AD DS configuration wizard with Add a new forest selected and root domain name homelab.internal
Deployment configuration — add a new forest.

Navigate through the Wizard and hit Install, it’ll reboot after.

DNS Forwarder:
DNS Manager → server → Properties → Forwarders → add 10.10.10.1 (pfSense resolver). This gives the DC external resolution while it stays authoritative for the domain.

DNS server Forwarders tab with 10.10.10.1 added
DNS forwarder pointing at the pfSense resolver.
5

Wazuh all-in-one server

Start the WazuhServer VM and navigate through the installer until you reach Network configuration:

Ubuntu installer IPv4 configuration with address 10.10.10.11, gateway 10.10.10.1, name server 10.10.10.10
Manual IPv4 configuration — 10.10.10.11 on the SERVERS subnet.
Ubuntu installer profile configuration with server name and username wazuhserver
Profile configuration for the Wazuh server.

After reboot, remove installation media in Hardware, log in, and run:

sudo apt update && sudo apt full-upgrade -y
curl -sO https://packages.wazuh.com/4.14/wazuh-install.sh
sudo bash ./wazuh-install.sh -a

Credentials will be posted after installation, but you can also find them here in case you cleared it:

sudo tar -O -xvf wazuh-install-files.tar \
  wazuh-install-files/wazuh-passwords.txt

Now on the WinServer2025 VM, navigate to https://10.10.10.11 and change the password, which must fit the requirements:

  • Between 8–64 characters
  • Contain at least one upper and lowercase letter
  • A number
  • A symbol of either .*+?-
6

Client VMs

6aWinClient1

Start the WinClient VM.

  1. When asked for product key, select “I don’t have a product key”.
  2. Select Windows 11 Pro.
  3. Name the device: WinClient1
  4. Set up for work or school.
  5. When it asks to sign into Microsoft, hit Shift + F10 and run start ms-cxh:localonly
  6. Who’s going to use this PC?: Employee 1 · Password: employee1
  7. For all of the security questions, I put employee1 as the answer.
Windows 11 setup with Windows 11 Pro selected
Selecting Windows 11 Pro during client setup.

Verify that DNS is set:

Resolve-DNSName homelab.internal

6bLinuxClient1

Start LinuxClient1.

  1. Hostname: LinuxClient1
  2. Domain name: homelab.internal
  3. Username: employee2

After going through the wizard, reboot and then run:

sudo apt update && sudo apt full-upgrade -y
7

Wazuh agents

In the WinServer2025 VM, log into the Wazuh dashboard and go to + Deploy new agent.

For WinClient1 and WinServer2025:

  1. Select MSI 32/64 bits.
  2. Server address: 10.10.10.11
  3. Agent name: WinClient1 or WinServer2025
  4. In the respective VM, run PowerShell as administrator and run the command.
  5. Run NET START Wazuh
PowerShell installing the Wazuh agent MSI and starting the Wazuh service
Installing and starting the Wazuh agent on WinClient1.

For LinuxClient1:

  1. Select DEB amd64.
  2. Server address: 10.10.10.11
  3. Agent name: LinuxClient1
  4. Copy the command to the terminal.
  5. Run sudo systemctl daemon-reload
  6. Run sudo systemctl enable wazuh-agent
  7. Run sudo systemctl start wazuh-agent
Kali terminal downloading and installing the Wazuh agent deb package and enabling the service
Installing and enabling the Wazuh agent on LinuxClient1.

Now both devices should be visible in the Wazuh Agents dashboard.

Wazuh Agents dashboard showing WinClient1 and LinuxClient1 active
All agents enrolled and active.
8

Separating admin and user privileges

Up to this point both clients were running on local accounts with full administrative rights — which is exactly what you don’t want in a real environment. The goal here is least privilege: employees log in with domain accounts that can’t install software or change system settings, and administrative rights are granted through a single Active Directory group rather than handed out per machine. Both the Windows and the Linux client authenticate against the same domain, so one group membership controls elevation everywhere.

8aOrganizing the domain

On WinServer2025, open Server Manager → Tools → Active Directory Users and Computers. Before creating any accounts, build an OU structure so accounts, computers, and groups stay separated — this is what Group Policy will later be scoped against.

  1. Right click homelab.internalNew → Organizational UnitProd Lab
  2. Right click Prod LabNew → Organizational UnitAccounts, Computers, Groups
  3. Right click AccountsNew → Organizational UnitUsers, Admins
  4. Right click ComputersNew → Organizational UnitWorkstations, Servers
Active Directory Users and Computers tree showing the Prod Lab OU containing Accounts (Users, Admins), Computers (Workstations, Servers), and Groups
The Prod Lab OU structure.

In the Groups OU, go to New → Group and create both security groups:

Security groups
Group nameScopeTypePurpose
SG-Standard-UsersGlobalSecurityEveryday employee accounts — no elevation
SG-IT-AdminsGlobalSecurityGrants local admin on domain-joined machines

Now in the Users OU, go to New → User and create the two employee accounts:

  1. First name Employee, last name 1, user logon name employee1
  2. First name Employee, last name 2, user logon name employee2
  3. For both, set a password and check “User must change password at next logon”.

Select both users → right click → Add to a group → type SG-Standard-Users.
Then, in the main Users container (the built-in one, not the Prod Lab OU), double click AdministratorMember Of tab → Add → type SG-IT-AdminsCheck Names → OK → Apply → OK.

8bWinClient1

Join the workstation to the domain: Settings → System → About → Domain or workgroup → Change, then under Member of select Domain and enter homelab.internal.

Computer Name/Domain Changes dialog with computer name WinClient1 and Member of Domain set to homelab.internal
Joining WinClient1 to homelab.internal.

Click OK, enter the Administrator credentials, and restart when prompted.

  1. After reboot, at the login screen click Other user.
  2. Sign in as HOMELAB\Administrator with the domain admin password.
  3. Open Settings → System → About. Under “Device specifications”, the Domain field should read homelab.internal.

While signed in as HOMELAB\Administrator, right click Start → Computer ManagementLocal Users and Groups → Groups → double click Administrators. The member list should only have:

  • Administrator
  • HOMELAB\Domain Admins

If employee1 is listed, remove it → Apply → OK.

To grant elevation through the group instead, stay in the Administrators properties window and click AddLocations → homelab.internal → OK → type SG-IT-AdminsCheck Names → OK → Apply → OK.

Finally, disable the local Employee 1 account so the machine can only be used with the AD account. In Computer Management go to Local Users and Groups → UsersEmployee 1 Properties → check “Account is disabled”Apply → OK.

8cLinuxClient1

Install the domain join and SSSD tooling:

sudo apt update
sudo apt install -y realmd sssd sssd-tools libnss-sss libpam-sss \
  libsss-sudo adcli samba-common-bin krb5-user packagekit
Note If the installer asks for a realm name, enter HOMELAB.INTERNAL in all caps — Kerberos realms are case sensitive.

Verify the realm, DNS, and domain discovery before joining:

cat /etc/krb5.conf | grep default_realm
nslookup homelab.internal
realm discover homelab.internal
sudo realm join -U Administrator homelab.internal

Now edit /etc/sssd/sssd.conf with sudo nano /etc/sssd/sssd.conf so SSSD handles sudo rules and creates home directories:

[sssd]
services = nss, pam, sudo

[domain/homelab.internal]
fallback_homedir = /home/%u
sudo_provider = ad
sudo systemctl restart sssd
sudo systemctl enable sssd

Enable automatic home directory creation:

sudo pam-auth-update --enable mkhomedir

Then configure sudo for the AD admins group — the Linux equivalent of adding SG-IT-Admins to local Administrators on Windows:

echo '%sg-it-admins ALL=(ALL:ALL) ALL' | sudo tee /etc/sudoers.d/domain-admins
sudo chmod 440 /etc/sudoers.d/domain-admins
sudo visudo -c -f /etc/sudoers.d/domain-admins
Note The group is written lowercase as %sg-it-admins — SSSD normalizes AD group names to lowercase, so the casing used in Active Directory won’t match here.

Last, disable the local employee2 account so the workstation can only be used with the domain account:

sudo usermod -L employee2
sudo usermod -s /usr/sbin/nologin employee2

Now log out and back in with the username employee2 and the AD password. This creates a home directory for employee2 and gives that account no admin privileges — matching the standard user on the Windows side.

Future implementations

  • Send client telemetry to Wazuh server.
  • Start Group Policy and configure permissions for clients.
  • Utilize a UTM.
  • Utilize an endpoint management platform to manage applications installed on clients.
  • Utilize a managed switch to expand the homelab by adding more VMs through other devices like a RPi.
Mauricio Martinez · Home