Skip to main content
Glama
ad_scenarios.py7.34 kB
"""Active Directory red team scenarios.""" from .base import BaseScenarioBuilder class ADScenarioBuilder(BaseScenarioBuilder): """Builder for Active Directory red team scenarios.""" def build_basic_ad_lab(self) -> "ADScenarioBuilder": """Build a basic AD lab with DC and workstations.""" range_id = self.range_id # Domain Controller self.add_vm( vm_name=f"{range_id}-ad-dc-win2022-server-x64", hostname=f"{range_id}-DC01", # Shortened to avoid Windows 15-char limit template="win2022-server-x64-template", vlan=10, ip_last_octet=11, ram_gb=8, cpus=4, windows={"sysprep": False}, domain={"fqdn": "ludus.domain", "role": "primary-dc"}, ) # Windows 11 Workstations for i in range(1, 3): self.add_vm( vm_name=f"{range_id}-ad-win11-22h2-enterprise-x64-{i}", hostname=f"{range_id}-WS{i}", # Shortened to avoid Windows 15-char limit template="win11-22h2-x64-enterprise-template", vlan=10, ip_last_octet=20 + i, ram_gb=8, cpus=4, windows={ "chocolatey_packages": ["vscodium", "googlechrome"], "chocolatey_ignore_checksums": True, "office_version": 2021, "office_arch": "64bit", }, domain={"fqdn": "ludus.domain", "role": "member"}, # Note: sysprep will run automatically for domain members (ensures unique SIDs) ) # Attacker (Kali) self.add_vm( vm_name=f"{range_id}-kali", hostname=f"{range_id}-kali", template="kali-x64-desktop-template", vlan=99, ip_last_octet=1, ram_gb=8, cpus=4, linux=True, testing={"snapshot": False, "block_internet": False}, ) # Network rules - Allow attacker to reach domain self.add_network_rule( "Allow kali to all windows", vlan_src=99, vlan_dst=10, protocol="all", ports="all", action="ACCEPT", ) # Allow domain to reach kali on specific ports for port in [80, 443, 8080]: self.add_network_rule( f"Allow windows to kali on {port}", vlan_src=10, vlan_dst=99, protocol="tcp", ports=port, action="ACCEPT", ) # SIEM Server for detection tracking self.add_siem_server(vlan=10, ip_last_octet=100) # Add SIEM agents to all VMs (except SIEM server itself) self.add_siem_agents_to_all_vms() return self def build_ad_with_file_server(self) -> "ADScenarioBuilder": """Build AD lab with file server for lateral movement.""" self.build_basic_ad_lab() range_id = self.range_id # File Server self.add_vm( vm_name=f"{range_id}-fileserver-win2019-server-x64", hostname=f"{range_id}-FILESERVER-2019", template="win2019-server-x64-template", vlan=10, ip_last_octet=15, ram_gb=8, cpus=4, domain={"fqdn": "ludus.domain", "role": "member"}, ) # Ensure SIEM agents are on all VMs self.add_siem_agents_to_all_vms() return self def build_ad_with_sql_server(self) -> "ADScenarioBuilder": """Build AD lab with SQL Server for credential theft.""" self.build_basic_ad_lab() range_id = self.range_id # SQL Server self.add_vm( vm_name=f"{range_id}-sqlserver-win2022-server-x64", hostname=f"{range_id}-SQL01", # Shortened to avoid Windows 15-char limit template="win2022-server-x64-template", vlan=10, ip_last_octet=12, ram_gb=16, cpus=4, domain={"fqdn": "ludus.domain", "role": "member"}, ) # Ensure SIEM agents are on all VMs self.add_siem_agents_to_all_vms() return self def build_ad_forest(self) -> "ADScenarioBuilder": """Build multi-domain AD forest for advanced attacks.""" range_id = self.range_id # Root Domain Controller self.add_vm( vm_name=f"{range_id}-root-dc-win2022-server-x64", hostname=f"{range_id}-ROOTDC01", # Shortened to avoid Windows 15-char limit template="win2022-server-x64-template", vlan=10, ip_last_octet=11, ram_gb=8, cpus=4, windows={"sysprep": False}, domain={"fqdn": "root.ludus.domain", "role": "primary-dc"}, ) # Child Domain Controller self.add_vm( vm_name=f"{range_id}-child-dc-win2022-server-x64", hostname=f"{range_id}-CHILDDC01", # Shortened to avoid Windows 15-char limit template="win2022-server-x64-template", vlan=10, ip_last_octet=12, ram_gb=8, cpus=4, windows={"sysprep": False}, domain={"fqdn": "child.root.ludus.domain", "role": "primary-dc"}, ) # Workstations in root domain for i in range(1, 3): self.add_vm( vm_name=f"{range_id}-root-win11-{i}", hostname=f"{range_id}-ROOT-WS{i}", # Shortened to avoid Windows 15-char limit template="win11-22h2-x64-enterprise-template", vlan=10, ip_last_octet=20 + i, ram_gb=8, cpus=4, domain={"fqdn": "root.ludus.domain", "role": "member"}, ) # Workstations in child domain for i in range(1, 3): self.add_vm( vm_name=f"{range_id}-child-win11-{i}", hostname=f"{range_id}-CHILD-WS{i}", # Shortened to avoid Windows 15-char limit template="win11-22h2-x64-enterprise-template", vlan=10, ip_last_octet=30 + i, ram_gb=8, cpus=4, domain={"fqdn": "child.root.ludus.domain", "role": "member"}, ) # Attacker self.add_vm( vm_name=f"{range_id}-kali", hostname=f"{range_id}-kali", template="kali-x64-desktop-template", vlan=99, ip_last_octet=1, ram_gb=8, cpus=4, linux=True, ) # Network rules self.add_network_rule( "Allow kali to all windows", vlan_src=99, vlan_dst=10, protocol="all", ports="all", action="ACCEPT", ) # SIEM Server for detection tracking self.add_siem_server(vlan=10, ip_last_octet=100) # Add SIEM agents to all VMs self.add_siem_agents_to_all_vms() return self

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/tjnull/Ludus-FastMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server