- Features
- server⨠allow `ludus_extensions` key to store arbitrary yaml data in a range config
Bug Fixes- serverπ Updated the range creation logic in the API to ensure proper file ownership when a range is created from a blueprint
- serverπ Include global collections in range validation
- serverπ automatically prefix source adds with userID to improve UX
- serverπ correct dynamic inventory behavior to respect force_ip values
- serverπ enhance sysprep process to handle Edge AppX package issues
- clientπ client exits with exit code 1 if there is a failure from the server
- serverπ fix offline license file validity setting
Documentation- π update guac client docs
- Features
- server⨠rewrite the dynamic inventory module for efficiency
Bug Fixes- serverπ switch from shell to command tasks when adding users to the system to prevent character issues with single quotes
- serverπ wait for nss-lookup.target when starting services to try to prevent DNS errors during service start
Documentation- π update guacamole private role documentation
- Features
- server⨠allow role dependancies to be roles on the router
Bug Fixes- installπ default to installing and syncing the bsl source
- installπ refresh the PATH in the current Powershell session when installing ludus client on windows
- serverπ don't default router min ram if ram is defined but min ram isn't
- serverπ correct error messages when range configs use roles the user does not have access to
- serverπ better handling for user defined role resolution when router object is not defined
Refactor- serverπ¨ use logger for sources logging
Documentation- π add minimum package age in light of javascript supply chain attacks
- π update GOAD env guide to use the BSL source method
- Release notes
Ludus 2.2.0: Sources
Add blueprints, templates, and roles/collections from trusted sources to your Ludus host β shipping with native GOAD, a no-Defender Windows 11 template, and every Bad Sector Labs template and role pre-installed.
Erik HunstadRead full notes βFeatures- sourcesβ¨ Sources feature to easily share blueprints, templates, and roles
- sources⨠Improve ansible collection management (you can `rm` now!)
Bug Fixes- clientπ Fix update scope to allow for 2.x updates
- serverπ don't leak file handles in the touch function
- serverπ protect the SSO Oauth endpoint from being proxied
- serverπ properly clean up template dir if no template name could be extracted
- serverπ resolve router vm_name and hostname before validation
- serverπ don't return early when template add --force is used and remove template
- serverπ use new hack to hide dynamic wallpaper powershell console window that works on windows 10 and 11
- serverπ Unify installed-ansible detection in one scan
- serverπ more robust time sync after domain join
Refactor- serverπ¨ validate vm_name and hostname in range configs to be valid hostnames
- serverπ¨ use safer ansible command calling to prevent command injection
Documentation- π Add sources documentation
- π Document global scope and removal for collections
Testing- sourcesπ¨ Cover vendored deps and scope detection in CI
Miscellaneous Tasks- π€ Rewrite CI to use parallel tasks across multiple VMs
- π€ Rewrite CI setup to create parallel templates and cluster VMs for testing automatically
- Features
- install⨠remove data pool and format options on Debian installs (installer sets); add admin password confirmation
- β¨ Make server ports configurable via config.yml
- β¨ Add optional more detailed range list/status output
Bug Fixes- serverπ only consider *pkr.hcl and *pkr.json files in template directories
- installπ print credentials on successfull install (existing proxmox)
- π fix variable overlap that caused wrong WireGuard port to be used during install
- π start ludus-admin service after install complete to not overwrite initial admin user in Wireguard. Also don't overwrite wg0.conf if it exists
- π enhance ludus-install-status script to wait for root API key and initial admin user creation
- π update access restrictions for PocketBase endpoints to include /admin path
- π sequence service startup correctly to prevent database locking and overwrites
- Features
- install⨠Enumerate datastores on existing Proxmox hosts
- install⨠remove data pool and format options on Debian installs (installer sets); add admin password confirmation
- β¨ Make server ports configurable via config.yml
- β¨ add inactivity shutdown for idle ranges (enterprise)
- β¨ add --browser-data flag to antisandbox enable (enterprise)
Bug Fixes- serverπ only consider *pkr.hcl and *pkr.json files in template directories
Other- π¦ fix entitlement constraint application for plugin binaries
- Features
- server⨠Add log history for range deploys and template builds (`--history` and `--id` to `ludus range logs` and `ludus template logs`)
- server⨠add per-user resource quota enforcement (enterprise)
Bug Fixes- apiπ scope abort, etc-hosts, and RDP to range instead of user
- installπ auto-detect boot disk in grub-pc rescue
Documentation- π add usage section to MCP server docs
- π expand MCP page to cover skills and combined usage
- π fix typo in proxmox roles commands
- π update description of wireguard_vlan_default to show default is REJECT
- Features
- api⨠add GET /api/v2/openapi endpoint for MCP spec discovery
Bug Fixes- apiπ re-buffer request body before admin proxy to prevent body doubling
- serverπ don't allow users to config VMs with the same IP as the subnet router
- serverπ use user uploaded or ACME certs before self signed proxmox certs for Ludus API/web UI
- serverπ only strip known extensions from uploaded ansible role files, to perserve namespace.rolename structure
Documentation- π add MCP server documentation
- π fast track agent PRs π
- π update docs to reflect current install status ouput
Styling- serverπ print actual error on failed user delete
- installπ tweak install status output format
Miscellaneous Tasks- templatesπ§Ή bump kali version to 2026.1
- Bug Fixes
- serverπ handle powered off routers during range sharing with better error message; add tests to CI
- serverπ only update packer plugin if proxmox version > 9.1
- installπ show admin API key in ludus-install-status
- serverπ do not error when sharing a range that has never been deployed (access will be granted upon deploy correctly)
- Features
- server⨠allow comma separated ports in network rules
- server⨠TPM enabled templates now default to the disk format of the first disk of the VM which allows snapshots for qcow2 on dir setups (default for ludus)
Bug Fixes- clusterπ fix early return that prevented ACLs from being applied correctly to new range resource pools only in cluster mode
- serverπ do not require the acting user to have a default range for user rm action
- serverπ default office_arch value to '64bit' to allow office_version to be specified without an office_arch
Documentation- π update cli docs
- π add pocketbase logs section
Miscellaneous Tasks- clusterπ€ fix cluster ACL check
- π€ fix escaping on iptables checks for integration test
- Features
- server⨠don't require all `defaults` to be defined in a range config
Bug Fixes- server:bug: cluster fix sdn-routes to use replace vs add to not fail if route exists
- serverπ handle deleted default ranges with grace and verbose helpful errors
Documentation- π fix link to sso page
- π update cluster migration docs
- π fix link to templates page
- Features
- server⨠allow users to specify VMIDs for power actions
Bug Fixes- serverπ better unqiue value enforcement for ranges
- serverπ make sure the data directory is accessible to the ludus user
- clientπ better error handling
- windowsπ add ACLs to C:\ludus
- serverπ adjust protection of c:\ludus
- serverπ fix c:\ludus protections 2
- api,clientπ auto-reassign default range when current default is deleted
Refactor- serverπ¨ update snapshot management to use default router name variable
- installπ¨ change install to better display errors and use API to get creds vs file read
Documentation- serverπ better error message for edge reinstall edge cases
- π update cluster documentation to reflect reality of default, not top level key for range target_node
- π document default wireguard firewall behavior change
- [**breaking**] π add docs for creating an admin user with root api key
- Features
- β¨ add template OS detection to template status endpoint
Bug Fixes- serverπ fix issue deleting a range with VMs deployed in it
- serverπ fix issue saving allowed ips and domains in testing mode
- serverπ fix potential race when destroying a range with VMs
- installπ validate that initial admin user does not exist on system during form
- serverπ quote password during user creation to prevent issues with special chars
- serverπ allow roles on the router for pro users
- serverπ fix nexus cache deployment
- serverπ fix entitlement check when entitlements are empty
- serverπ fix issue downloading plugins due to path concatination logic bug
- serverπ allow 4TB role uploads instead of 38MB
- clientπ properly handle 413 errors
Other- π¦ allow specifying version in dev script
Documentation- π add GOAD DRACARYS and update GOAD docs
- π add API changes to the 1->2 docs page
- π correct the api spec to reflect reality
- π update template troubleshooting steps to be more complete
- π add role catalog documentation
- π fix duplicate category specification
Miscellaneous Tasks- π€ add test for deleting a range with VMs deployed
- Bug Fixes
- serverπ ignore stderr from ansible-galaxy sub-commands that caused JSON parsing errors on systems with warnings or errors in their ansible setups
- server[**breaking**] π change wireguard_vlan_default to REJECT and always REJECT VM traffic to Ludus host IP
- serverπ use the impersonated user's default range if no range is specified in the request when impersonating a user (restores 1.x functionality)
- serverπ fix user impersonation null error
Refactor- serverπ¨ move off depricated GetFile to GetReader for blueprints
Documentation- π fix debug env variable setting commands
- π update set-environement command for pocketbase
- π add more steps to existing cluster upgrade
- Bug Fixes
- serverπ truncate netbios names to 15 characters when creating AD domains
- serverπ fix issue with deployments on powered-off ranges; users can now deploy a range from a powered off state and it will work
- serverπ don't fail when delete default range is selected but the default range does not exist during user delete
- serverπ properly handle blueprints when a user is deleted; make any owned blueprints owned by ROOT and remove user from shared blueprints before deleting
- installπ fix blueprint migration error check
- serverπ fix router availibility check
- serverπ fix router availibility check
- serverπ fix missing user db field for onboarding tracking
Refactor- serverπ¨ remove slog, use logger
Documentation- π add note about ludus_admin group membership for user promotion
- π use new API docs
- π update docs
- π fix redirects for new doc layout
Styling- serverπ make error for cluster mode check less scary
Miscellaneous Tasks- π€ run cluster tests for any start-at tags
- π€ increase cluster install timeout
- π€ move to self-hosted keygen for plugins
- π€ fix release creation, specify package uuids
- π€ allow untag of latest to fail
- Bug Fixes
- installπ fix windows install-client.ps1 to only install completions once to the profile
- serverπ fix vm_names with equal prefix colliding during selection in deployment
Documentation- π update docs to reflect Debian 13/Proxmox 9 support
- π fix capitalization on LeHack 2025 commands
- π add ghostwritter role to docs
- π fix link from proxmox page to create user page
- π add new roles for Splunk Universal Forwarder, Splunk Enterprise, and Zeek
- π remove interactive PC builder due to price volatility
- π update roles page to add ludus_win_privesc and fix ghostwriter typo
- π add Ludus 2 (beta) docs
- π update cluster docs; add SSO docs; add pocketbase docs; clean up docs
Styling- templatesπ fix Ubuntu spelling in template descriptions
Miscellaneous Tasks- templatesπ§Ή update debian13 URL and checksum
- Bug Fixes
- templatesDisable KasmVNC blacklist to fix remote access; bump kasmvnc release to latest
- templatesπ update kali to 2025.3; change kali mirror to cloudflare
Documentation- π update docs to reflect Debian 13/Proxmox 9 support
- π update Shadow Steps env guide
- π add wsus roles to roles page
- π add template troubleshooting page
- π update template wording to reflect proxmox terms; datastore -> pool
- π add vectr roles and netbox role
- π add nemisis role
- π TPM snapshots are now supproted for qcow2 in PVE 9.1
- π add brmkit.ludus_guacamole role to roles page
- π fix debian typos
Styling- π fix debian typo
Miscellaneous Tasks- templatesπ§Ή update debian13 url and checksum
- Bug Fixes
- installπ timeout after 5 seconds for tty bonce and ignore errors to keep install moving along
- serverπ force `access_grants_array` to be an empty array if none
Documentation- π update docs to reflect Debian 13/Proxmox 9 support
Styling- clientπ use better language to describe power commands
Miscellaneous Tasks- templatesπ§Ή update template URLs for windows 2012r2 and ubuntu 24.04 server
- Features
- server⨠official Debian 13/Proxmox 9 support
- templates⨠add Debian 13 template
- client⨠allow setting the Product string for anti-sandbox
Bug Fixes- installπ on existing proxmox, always try to enable the NAT interface in the event the installer is run more than once
- installπ fix bash completion during install or upgrade
- installπ add passlib python package to enable user creation for flare vm template
- serverπ make additional DC deployments more resilient
Refactor- serverπ¨ add RunWithOutput function required by plugins
- serverπ¨ Handle older OSes such as Windows 7
Documentation- π update install docs to include git
- π add python3-debian to requirements before install
- π update CI docs with manual VM setup commands
- π document changes to pveproxy to overcome API timeouts
Performance- serverβ‘ decrease dnsmasq lease time to 5m and set timeout to 30s for proxmox API calls
- serverβ‘ update dynamic inventory for slow API responses
- serverβ‘ add leaky bucket algo to license checks
- serverβ‘ use exponential backoff for service restarts
Styling- serverπ clean up extra spaces
Miscellaneous Tasks- π€ update CI for Debian 13
- Features
- install⨠support Debian 13/Proxmox 9 during install [UNTESTED]
Bug Fixes- installπ fix bash completion install check as root on a machines without the pkg-config command
- installπ allow pip installs no matter the python version
- serverπ fix issue with when clause on zip command for RDP files
- serverπ fix bug that prevented access grant/revoke from taking effect immediately
Documentation- π fix typo in lehack snapshot command
- π add ASR and MDI roles
- π fix link to config from networking page
- π add ludus-impersonator.sh link
- π add ludus_badblood and ludus_adtimeline_syncthing to roles page
Miscellaneous Tasks- π€ allow a retry for template build kickoff
- Features
- server⨠add iptables_commands to router key to allow users to run arbitrary iptables commands at the end of each firewall deploy
- install⨠use the host's first non-local DNS server as upstream for DNS in vmbr100; default to 1.1.1.1 if no non-local DNS is found
- server⨠allow users to be added to Ludus hosts that don't have an internet connection
Bug Fixes- serverπ only try to zip RDP files if RDP files exist
- clientπ only write to a file when success, otherwise print errors
- serverπ default dynamic wallpaper vars to true for older range configs
- installπ install the BSL fork of the proxmox packer plugin during ludus install
- installπ fix blank proxmox web ui after install
- installπ fix permissions for network access to allow new windows templates to build
Refactor- templatesπ¨ update windows templates to modern packer standards
- serverπ¨ The feature ansible.windows.win_domain_membership has been depreciated
Documentation- π add steps for troubleshooting range access grant issues
- π document the fix for a blank proxmox web ui
- π update ansible role developer page
- π update help message for --limit to reflect not needing localhost
- π Added ludus_sliver and ludus_redirector to the roles doc page
- Bug Fixes
- serverπ fix edge case in dynamic inventory detection when an admin user has no VMs in their range but does have at least one ADMIN VM
- templatesπ fix debian 10 package mirror settings now that it is not supported
Refactor- installπ¨ better handling of the qemu-server 8.3.14 bug during install
- Bug Fixes
- serverπ fix AccessNetwork role check to allow direct ISO downloads to PVE for all ludus users
- antisandbox: π Fix issue with unquoted vendor string causing VMs to fail to boot after anti-sandbox enable
Documentation- templatesπ update tpm template READMEs to reflect their support in Ludus >= 1.9.7
- π specify that custom templates require the qemu guest agent
Miscellaneous Tasks- π§Ή ignore .ansible directories
Features- antisandbox: β¨ Add Windows 11 24H2 LTSC antisandbox template
- Features
- server⨠add yaml-language-server to example/default range config and documentation
- server⨠switch to our fork of the packer proxmox plugin which supports tpm and cpu type
- client⨠tune non-verbose log output for templates to show the download of isos when iso_download_pve is set to true
- server⨠block any range VM from accessing the host by default
- server⨠only expose the current range's pool of VMs to ansible
- client⨠add --all option to `ludus range inventory` command if the users wants a full inventory of all VMs they have access to (admins)
- antisandbox: β¨ Improve antisandbox evasion with additional tweaks (registry) as well as more comprehensive CPU changes, and better hardware naming to appear more realistic
Bug Fixes- serverπ create empty log on user creation to prevent range log errors before a deployment for a new user
- serverπ prevent admin users from removing VMs of other ranges if the VMs have the same name as the VM(s) in the range the admin is removing
- templatesπ fix tpm templates to work with custom proxmox plugin
Refactor- serverπ¨ change default range config to use office 2021 and choco packages instead of install_additional_tools
Documentation- π update BarbHack env guide; update snapshot wording for other env guides
- π fix Barbhack Kali IP
Styling- serverπ when setting a password via ludus, make it clear that this does not change the password in proxmox
Miscellaneous Tasks- π€ use office 2021 as the 2019 installer is no longer working on unpatched win11 22h2
- Bug Fixes
- serverπ fix Ludus share setup
- serverπ add anon_share_access GPO to available GPOs
- serverπ fix bug when an action is taken as root for a user a file could be owned by root if it did not exist previously
- serverπ fix bug creating RDP files on ranges without domains defined
- serverπ fix permission issue that prevented users from seeing the summary page of the host
- serverπ fix issue with CentOS and Ubuntu 20.04 getting a static IP
- serverπ update Kali to 2025.1c since they lost their apt signing key
- serverπ better failed_when detection for AdGuardHome install
- serverπ fix issue with Almalinux getting a static IP
- serverπ fix issue that caused GPOs specified in the config to not get applied correctly
Refactor- serverπ¨ remove install_additional_tools from default range and config example as users should specify their own choco packages explicitly
- serverπ¨ fix formatting for almalinux group_vars file
Documentation- π fix typo in anon_share_access gpo
- π add file share page
- π update network diagram
- π Fix link for cicd
- π update GOAD docs to user the --user flag when snapshotting ranges
- π remove old doc page for SANS
- π add KMS docs
- π add Splunk attach range env guide
- π update anti-sandbox page with new features and tip for older CPUs to avoid BSOD
Features- antisandbox: β¨ updated custom QEMU package to 9.2.0-5
- antisandbox: β¨ allow users to set custom CPU types
- antisandbox: β¨ allow users to set custom SystemBiosVersion string
- antisandbox: β¨ allow users to vendors other than Dell (HP, Lenovo, IBM, Google)
- antisandbox: β¨ allow users to persist CPU and SystemBiosVersion changes across reboots
- antisandbox: β¨ changed SMBIOS values (type 3 and 4) to get rid of even more QEMU strings
- bug: Bug Fixes
- client:bug: fix issue with cli uploading the config during edit if the editor forks
- server:bug: if autologon_user is defined but does not exist in AD, use the default DA account to query the Domain Users SID for multilingual support
- server:bug: merge in fallback IP change method for older/slower hardware (extra VM reboot required) (thanks @esp0xdeadbeef!)
books: Documentation- :books: add kms details to networking docs
- :books: add link to flare troubleshooting on the malware lab page
- :books: merged in flare troubleshooting page
- Features
- client⨠add KMS commands
- server⨠add license to version output
Bug Fixes- clientπ fix anti-sandbox endpoint
- serverπ only append one templates worth of debug logs if a build fails and the user requested verbose logs
- clientπ fix snapshot rm with userID arg
- serverπ make sure files written during ansible execution are owned by ludus when run as root
- installerπ validate that the proxmox node does not contain spaces or dots
- serverπ fix issue getting latest office installer version
Documentation- π add pc builder to bare metal page
- π update docs for SANS environment
- π update GOAD docs to user the --user flag when snapshotting ranges
- π remove old doc page for SANS
- π add KMS docs
- π add Splunk attack range env guide
Styling- serverπ fix task name
- serverπ set license message for community license
- serverπ change license message on server
- Features
- server⨠allow users to control traffic to/from the WireGuard subnet with network rules
- server⨠refuse to overwrite existing PAM users during Ludus user creation
- server⨠allow users to specify packages to install on linux machines
Bug Fixes- serverπ make the RDP user group addition during domain-join multilingual
- installerπ disable ipv6 since GitHub doesn't support it (and we pull packages from GitHub during install)
- serverπ fix issue with multilingual domain users sid resolution
Documentation- π add mythic role to roles page
- π update google cloud page to reflect new install and node name changes
- π update bare metal docs with 128GB ram link and sheet link
Performance- serverβ‘ don't refresh inventory unless a vm has been cloned
Miscellaneous Tasks- π§Ή add repomix config and bundle files
- Features
- client⨠allow LUDUS_EDITOR env var to specify the editor to use for range config edits
- server⨠add disable_defender GPO
- server⨠leave telemetry enabled by default
- server⨠disable first run popups on Chrome and Edge
- server⨠force an OS (windows, linux, or macOS) key for each VM during config validation
- server,client⨠add snapshot API endpoints (list, create, rollback, and remove) and CLI commands to allow the management of arbitrary snapshots for VMs
Bug Fixes- serverπ don't allow users to specify deploy tags that don't exist
- serverπ Don't allow the ROOT API Key to be used for ansible actions
Documentation- π add note about putting manually built templates in the SHARED pool
Performance- serverβ‘ set the winrm timeout to 900 for slower CPUs
- Features
- server⨠don't block any DNS requests by default (lists are still present, just not enabled)
- antisandbox: β¨ hold apt packages after custom install
- antisandbox: β¨ don't allow users to enable on other user's ranges without impersonation
Bug Fixes- clientπ allow users to update the client binary without an API key
- serverπ prevent users from deleting core ansible roles that ludus uses
- serverπ add missing collection in requirements for share creation
- serverπ better automatic ipv6 detection and warning for outbound WireGuard configs
Documentation- π update tags docs
- π update defaults for example antisandbox config
Performance- serverβ‘ set Windows DNS cache to 2 seconds
Styling- clientπ better choco error message
- Features
- server⨠add a SMB share at 192.0.2.3 that hosts two shares, readonlyshare and readwriteshare
- server⨠create RDP files for user specified autologon users
- server⨠enable network sharing for windows VMs
Bug Fixes- clientπ fix external editor temp path on Windows
- serverπ fix issue getting router to action during range access operations
Documentation- π add juiceshop role to roles page
- π improve building from source docs
- π improve updating docs
- π add tags docs
- Features
- templates⨠add ubuntu 24.04 server template
- client⨠provide a helpful error when choco hashes don't match
- server⨠allow range numbers to be reserved and not used via a config setting
- server⨠allow users to disable dynamic wallpaper on windows with `defaults.enable_dynamic_wallpaper: false`
Bug Fixes- templatesπ fix ubuntu 24.04 desktop url
- installπ don't tell the user the install will reboot the box if it is an existing proxmox install
- serverπ fix rare bug with secondary-dc deployment
- serverπ make sure vm objects have a template and name before casting them
- serverπ fix access grant error if source user had a custom router name
Refactor- serverπ¨ better handling of existing plugins
Documentation- π add enterprise documentation
- π update anti-sandbox docs
- π add note about impersonation to GOAD docs
- π fix spacing on roles header
- π document the enable_dynamic_wallpaper option
Testing- π¨ add required items to defaults for integration test
- Features
- server⨠add force_ip boolean config option for VMs without qemu-guest-agent
- server⨠add support for autologon_user and autologon_password in the range config
- server⨠add arg that skips all dep checking for speed during dev testing
- server⨠don't require localhost in the --limit option for a deploy (add it automatically)
- client⨠save config incase edits are rejected by server; allow changes to be used as a starting point
- client⨠throw a verbose error if a template build fails due to missing ansible role
- client⨠add 'range config edit' command
Bug Fixes- installπ don't fail if install can't get interface names
- templatesπ update debain 10 URL and hash
- serverπ fix issue with older ubuntu when setting static ip
Performance- templatesβ‘ add ngen tasks to improve windows template first boot performance
Documentation- π add more roles to roles directory
- π add instructions to restart the ludus server to pick up config changes
- π update API docs
Miscellaneous Tasks- π€ add force_ip and autologon values to integration test
- π¦ add dev scripts to easily build all of Ludus for local testing
- π¦ update dependencies
- Features
- server⨠add force_ip boolean config option for VMs without qemu-guest-agent
Bug Fixes- templatesπ fix links for Windows 2016 and 2019 templates
- clientπ fix client update on Windows
- templatesπ update win10 enterprise template to 22h2 as 21h1 is no longer avilable from official sources
- serverπ refuse to do power operations if the ROOT API key is being used
- serverπ fix access actions if defaults are defined
- installπ restart dnsmasq on proxmox install to resolve issues with DHCP
- serverπ don't require outbound_wireguard_vlans for outbound wireguard actions
Documentation- π simplify wireguard command
- π add detail around manually created templates
- π fix configuration link
- Bug Fixes
- serverπ fix plugin paths
Refactor- serverπ¨ expose GetProxmoxClientForUser for plugins
Performance- serverβ‘ make the API 100x faster by lowering the bcrypt hash cost without sacrificing security (newly created Ludus users only)
- serverβ‘ use SQLite3 Shared cache and WAL mode
Miscellaneous Tasks- π§Ή update dependencies
- Bug Fixes
- serverπ fix a bug in the pre 1.4.0 compatibility layer for the router that prevented upgrades when a range was not in testing mode
- installπ wait up to 10 seconds for the root api key to be generated before trying to print it while tailing the final logs (avoid race condition)
- installer scriptπ fix version identification crash in windows powershell client installer
- range-managementπ make domain joining user add to RDU group multilingual
Refactor- π¨ use correct syntax for variables in plays during ludus install
Documentation- π add bagelByt3s.ludus_adfs to roles page
Miscellaneous Tasks- templatesπ§Ή bump kali to 2024.4
- Features
- server⨠make windows domain groups support any language
Refactor- serverπ¨ allow community plugins for standard and admin server; only run enterprise plugin for standard server
Miscellaneous Tasks- π€ fix enterprise keygen uploads
- π€ fix enterprise plugin building for binary compatibility with server
Revert- ciβͺ enable additional tools now that chrome MSI is fixed by Google
- Features
- client⨠add self-update command
- server⨠automate enterprise plugin download/activation
Bug Fixes- installerπ fix command not found error if pkg-config is not installed
- templatesπ fix Kali python-apt bug
Documentation- π document the lack of support for advanced nic configs
- π update docs to reflect the deny-by-default testing mode
Miscellaneous Tasks- π€ Don't upload the ludus-server to keygen since we don't have self-updates for the server
- π€ build enterprise plugin when a tag is created
- Features
- server⨠allow users to expose admin API globally via config
- client⨠check if there is an API key set via env when running the api key command to prevent user confusion
- client⨠add taskoutput command to client
Bug Fixes- serverπ fix issue with role depends_on not being used
- π don't update windows DNS if machine is domain joined (GOAD fix)
- π use win_shell vs win_powershell as win_shell sets stdout on the registered variable
- π fix bash-completion sourcing error
- π make removing a user more idempotent
Documentation- π update docs (minor fixes)
- π update GOAD environment guides
- π fix hyper-v image alignment
Miscellaneous Tasks- π€ googlechrome choco is broken, skip it
- π€ add keygen-upload step and update git-cliff
- Features
- β¨ add 'global_role_vars' top level config key to range configs
- β¨ Add support for notifications on range build success/failure
Bug Fixes- π remove extra dot net check during choco install
- π fix multiple IP bug on Ubuntu VMs
- π fix nexus build issue by pinning version to working version
Miscellaneous Tasks- π§Ή bump kasmvnc to latest on kali template
Build- π¦ build server with CGO so it can load plugins
- Bug Fixes
- π don't allow user ID of '0' as proxmox doesn't correctly create a pool called '0'
- π update .NET framework to 4.8 when necessary to satisfy chocolatey 2.0 requirements (thanks @coffeegist!)
- π Clean up .NET install before chocolatey if .NET does not exist or is too old
- π fix kali to use vda vs sda with new scsi controller for better disk speeds
Documentation- π update links to use .md (prevent 404s), update deps
Features- β¨ add Ubuntu 24.04 Desktop template
Miscellaneous Tasks- π§Ή bump Go dependencies
Performance- β‘ update templates to use virtio type drives for speed improvements
Styling- π add logo to backgrounds
- π fix machine domain entry in backgrounds to show full DNS name of domain
Build- π¦ build client without CGO to prevent glibc issues on older Linux OSs
- Bug Fixes
- π update ubuntu 22.04 url and checksum
- π set env vars on Proxmox installs where they are not set to prevent issues with network detection
- π check that the template object is not nil (half created templates?) before casting to prevent crash
- π pin packer plugin versions to prevent upstream bugs from breaking Ludus
Documentation- π add NetExec lab env guide
- π documentation updates to improve the new user experience
- π add tailscale and velociraptor community roles
- π update baremetal page to reflect the K8 being gone
Features- β¨ add install script for Windows
- β¨ add plugin support to Ludus server to support a unified open-core codebase
Styling- π Add message about the time it takes to add a user when creating a user
- Bug Fixes
- π fix issues with zsh in the install script
- π default to accepting self-singed proxmox cert during install
- π fix --only-roles (broke during 1.5.0 changes)
Documentation- π update docs for new installer/local client (1.5.0)
Features- β¨ add win2019 no security updates template
- β¨ increase timeout for win2019 with security updates
- β¨ output full error message when unable to log into proxmox
- β¨ log to ansible log when validating the range config to give users full details
Miscellaneous Tasks- π§Ή bump kasmvnc version for kali
- Features
- β¨ new interactive installer
- β¨ depends_on for roles
- β¨ global roles
- β¨ add install script
- β¨ add 32 bit ARM linux client and checksum file to releases
- β¨ allow users to run the client completions arg without an API key
Bug Fixes- π update jdk dependency for Nexus cache to work with latest Nexus release
- π tell the user there will be no logs in parallel mode when building multiple templates
- π fix datastore permissions for existing proxmox installs
- π allow completions to work without API key
Documentation- π add outbound WireGuard documentation
- π add enterprise configuration tab to configuration page
- π document depends_on for roles
Miscellaneous Tasks- π§Ή update Kali to 2024.2
Performance- β‘ change default upstream DNS over HTTPS to 1.1.1.1 to prevent the need to bootstrap with regular DNS
Refactor- π¨ update stress-test script to not re-deploy ranges if run more than once
Styling- π capitalize testing API responses
- π fix ansible-lint issues
- Documentation
- π update packet capture documentation
- π update docusaurus
- π add VC++ tasks to fix errors with SCCM install in GOAD (thanks @zeroone1337)
Features- β¨ add -v flag to 'templates log' command and don't print debug messages by default
Styling- π change wording of office install check to prevent users from thinking there was a failure during the check
- π add 'Build complete!' message to the end of the packer log
- Bug Fixes
- π fix missing ludus-install-status for existing proxmox, and make ludus-install-status a script vs alias for easier use
Documentation- π add tail tip and user tip to SCCM env guide
- π Add Debian install screen to docs
- π add links to client binaries to docs
- π fix typos on bare metal page
- Bug Fixes
- π default action_ips to a blank array to handle the case where all VMs are set to be blocked from the internet
- π make sure the ansible log file is owned by the calling user, not root, during user actions
Documentation- π add SCCM env guide
- π add option to use host machine to setup Nexus cache
- π add warning about the time it takes to build flare/remnux in the malware lab
Miscellaneous Tasks- π§Ή update rocky 8 URL and hash
- Bug Fixes
- π fix edge case where firewall service detection could throw an ansible error
- π fix typo in roles page (@brimston3)
- π fix commando and flare templates to allow for user defined datastores
- π allow client to specify users when running power commands
- π fix win11-23h2 template to use the user specified proxmox_storage_pool vs hardcoded local
- π add 4 hour timeouts to flare, commando, and remnux templates for slower machines
Features- β¨ regenerate SSH host keys for all Linux templates on first boot
- Features
- β¨ allow users to define `always_blocked_networks` in their config to protect LAN or other networks
- β¨ allow users to define the timezone for all VMs in their range
Bug Fixes- π correctly clean up range access grants when deleting a user
- π allow 'all' as a vlan_dst in the range config network rules
- π remove existing access grants for a deleted user to prevent unintended access when the range number is re-assigned
- π fix bug that prevented the ability to impersonate other users when running testing allow/deny commands
- π fix issue where range list all would return a stale, incorrect number of VMs for users
- π fix bug that prevented the ability to impersonate other user when running testing status
- π fix issue with access_grants_array being NoneType and causing a template error with ansible
Documentation- π fix bloodhound spelling on roles page
- π More specific requirements (passmark score)
- π link to proxmox page from install
- π include dnsmasq in network troubleshooting
- π increase width of docs content, for the configuration page make the width of content 100%
- π update security docs
Refactor- π¨ refactor bginfo task to use ansible vs powershell
- π¨ change router firewall to default drop traffic, total refactor of how testing mode works
Styling- π change RANGE NUMBER to RANGE NETWORK in `range list` output which is more useful for users
- π filter debug errors during template builds and replace them with a nice `waiting for the VM to boot` message
- Bug Fixes
- π put the generated config file in the same directory as the ludus binary, not the pwd
- π ignore empty strings when checking for roles when the user supplies --only-roles
- π fix checks for if the response had been set already (default status code is 200, not 0)
Documentation- π update roles page with new exchange role link
- π add ludus_emux role to roles page
Features- β¨ fail if --only-roles is used and the roles don't exist on the server for the user
- β¨ allow force during range access revoke
- β¨ store range access grant in DB even if router is not accessible
Styling- π better error message when a deploy is run with an active deployment in progress
- Bug Fixes
- π don't hang up on restarting getty if it takes longer than 5 seconds
- π Add domainadmin user to Enterprise Admins, Schema Admins, and Group Policy Creator Owners groups
Documentation- π Update roles pages
- π Add recommended hardware to bare metal page and RAID0 video
- π Fix links on docs pages
- π add link to developer page on role page
- Bug Fixes
- π better defaults for get-firewall-status for windows VMs (again)
Documentation- π make API documentation more clear for /user endpoint and /user/apikey endpoint
- π Edits to GOAD environment guides for clarity
- π add api-key troubleshooting; add roles docs page; rename quick start and environment guides to remove spaces
Refactor- π¨ check that firewall_service_running is defined before checking its boolean state
- π¨ move golang dep only used for CI to ci script
Styling- π fix typo in RDP help message
- Bug Fixes
- π check for ansible path vs english error message to support other languages
- π use user defined datastore for EFI disk on Windows 11 template
- π don't set a default iso_storage_pool for Windows 11 template as it is not overwritten by env var
- π check that the firewall service is running before adding rules to the firewall on windows
- π allow config set force value to be unset without an error
Documentation- π add malware lab env guide
- π add step to ensure WireGuard port is open in Azure
- π add update tip for GOAD SCCM env guide
Features- β¨ add commando-vm template
- β¨ add flare-vm template
- β¨ add remnux template
Performance- β‘ ignore time setting errors (command vm/flare vm) on windows machines during testing stop
Refactor- π¨ better error handling for failed range creation during user creation
- π¨ change default ludus nat interface to vmbr1000 to allow users to manually select it in the proxmox interface
- π¨ add the RangeAccessObject to initial DB create
Styling- π use FQDNs for ansible tasks
- Bug Fixes
- π allow roles to be installed for other users from local dirs
- π fix bug that would prevent older ubuntu VMs from deploying due to not having /etc/cloud
Documentation- π update goad docs to put kali in the same subnet as windows for LLMNR attacks; remove manual goad sccm step now that pull is merged
- π add share to range cli docs
- π add note about instance size to Azure docs
- π remind users they need to actually remember creds when installing operating systems
- π link to bare metal guide in proxmox page
- π link to security page at the end of quickstart
- π add prevent_user_ansible_add to install docs
Features- β¨ check and fix the ownership of the ludus.db on server start
- β¨ add prompt to `user apikey` command to prevent accidental apikey resets
- β¨ add Ubuntu 20.04 template
Performance- β‘ force VMs to be removed during range rm
Styling- π better error messages for DB permissions failures
- Bug Fixes
- π persist iptables rules after access action
- π prevent the ludus-admin server from any actions besides user actions
Documentation- π add wifi warning to install step
- π make sure all roles are owned by ludus before updating them
- π add network troubleshooting docs page
- π add /range/access endpoint to api documentation
- π add sharing doc page; add ansible testing to ansible page; style prompts
- π update SSH access firewall rule to un-hardcode range second octet
- π fix styling in code samples
- Bug Fixes
- π allow for configs where no VMs have internet blocked during testing
- π fix error rearming windows VMs with < 30 days remaining
- π make sure SSH is installed during Ludus install
- π respect the setJSON flag in isAdmin
- π fix race condition when removing a range that would cause incomplete removal
Documentation- π add updating docs
- π add Elastic guide
- π add powerhell to Hyper-V docs to enable virt support
- π add GOAD SCCM env guide
- π add info about SSH access to security documentation
Features- β¨ add --limit option to range deploy command
- β¨ add --only-roles option to range deploy command
- β¨ validate Windows hostname (first 15 chars) are unique to prevent issues with AD
- β¨ allow balloon RAM size to be a float (not exposed to users via config)
- β¨ allow admins to disable ansible role/collection add ability by standard users
- β¨ allow admins to share ranges between users via the cli/API
Miscellaneous Tasks- π€ allow retry on server update during ci
- π§Ή bump all deps to current versions
- π§Ή move from community.windows to microsoft.ad for AD tasks
Performance- β‘ attempt to skip inventory refresh if VM is not deployed
- β‘ change the router to be 2 core and .5/2GB RAM (balloon)
Refactor- π¨ create the LUDUS_DEFAULTS chain in separate task
- π¨ new users get the lowest available range number
Styling- π modify help message of user add to reflect actual limits of userid
- π use ansible FQDNs in configure-router
- π capitalize results and errors from testing API endpoints
Testing- π¨ add stress testing script and config
- Bug Fixes
- π use OS agnostic path separator to support template uploads on windows
Documentation- π update GOAD guide and user creation warning
- π update ADCS guide with ansible-galaxy instructions
- π add discord link
- π add DNS tip for GOAD setup
- π fix issue with ADCS role install
Miscellaneous Tasks- π§Ή fix typo in testing error message when config IPs don't match inventory
- Documentation
- π update contributing gude
- π add docs for existing proxmox servers
Miscellaneous Tasks- π§Ή remove stale changelog file
- π€ allow upload and release if jobs are skipped
Styling- π remove the v in version prints to prevent vv1.x.x
Build- π¦ rm video files after doc build to reduce server binary size
- Features
- β¨ support installing Ludus on existing proxmox installations
- β¨ add 'ludus_nat_interface' to ludus config.yml to support existing proxmox installs
Bug Fixes- π fix kali install issue with dpkg/GRUB
- π fix panic on nil conversion of VM properties during `range list`
- π fix config schema not accepting ranges of ip_last_octets in network rules
- π increase timeout values for winrm for slower systems
Miscellaneous Tasks- π§Ή remove ntp during setup now that chrony is installed
- π€ add 'start-at' tags to CI
- π€ force time sync at start of all ci jobs
- π€ add integration test to CI
Refactor- π¨ move the CLI's VM unreachable detection code to utils and run it during 'range errors'
- Bug Fixes
- π delete built system templates when the user asks to rm them (but keep template files)
- π small fixes with testing mode, longer timeout for VS install
- π template name uniqueness is now enforced; non-admins cannot delete other users templates
- π allow users to overwrite their own templates (was broken due to duplicate name checks)
Documentation- π fix links in README
- π server manual build wording change
- π specify the need to have .pkr. as part of packer filenames (may have other json or hcl files that are not the packer file)
Features- β¨ add 'errors' command and automatic error parsing to CLI
- β¨ client now checks if the template path is a directory; fix long help for template rm
Miscellaneous Tasks- π€ add template tests, use the status for power tests vs sleeps
- π€ fix user test CI to not change the PW as its needed...
- π€ fix ci user tests and power tests
- π€ fix retries in template tests
- π€ fix template test
- π€ ci fixes for job retries; make testing mode tests more robust
- π§Ή clean up old directories from .gitignore (now unused)
- π€ add tests for duplicate template names
- π€ add templates tests for force uploading a template that does not belong to the user
Refactor- π¨ change the isAdmin check to take a bool to set or not set response JSON
- Features
- β¨ allow for meta/version.yml to specify a version of the role for roles added from local directories
- β¨ add -v flag to 'templates log' command and don't print debug messages by default
Bug Fixes- π force a time sync on Windows VMs when stopping testing to get past 'time change was to big' error
- π ignore errors while setting time after testing stop on Windows VMs
- π allow client to update VMs for other users when --user is specified
Documentation- π add enterprise configuration tab to configuration page
- π add outbound WireGuard documentation
Styling- π capitalize testing API responses
- π fix typo in template validation message for range config
Refactor- π¨ update stress-test script to not re-deploy ranges if run more than once
Chore- π§Ή remove legacy code for user SSH keys from pre 1.0