Ludus es un framework open source para automatizar la creación de entornos de Active Directory, usando Ansible + Vagrant + VirtualBox/VMware/Proxmox.
¿Por qué es especial? Porque combina lo que ya sabes (roles de Ansible, provisioners de Vagrant) con plantillas modulares para crear:
- Controladores de dominio (DCs)
- Miembros de dominio (workstations, servidores)
- Usuarios, grupos, GPOs, OUs
- Relaciones de confianza entre dominios
Todo con un solo archivo YAML, versionable y compartible. Tipo este ejemplo:
lab_name: hackplayers-lab network: domain: hackplayers.local net: 192.168.56.0/24 gateway: 192.168.56.1 nodes: - name: DC1 type: domain_controller ip: 192.168.56.10 ram: 4096 - name: WS1 type: workstation ip: 192.168.56.20 ram: 2048 users: - name: adminuser password: 'P@ssw0rd123!' groups: - Domain Admins - name: juanito password: '12345678' groups: - Domain Usersnetwork:
- Fase 1: Vagrant crea las máquinas virtuales (VirtualBox, VMware o Proxmox).
- Fase 2: Ansible promueve DCs, une workstations, crea usuarios, OUs, GPOs.
- Fase 3: Scripts custom (PowerShell) afinan detalles: ACLs, shares, backdoors si quieres.
Resultado: un bosque operativo, con Kerberos, LDAP, GPOs… como el de tu cliente, pero sin auditorías ni IDS.
¿El problema? Definir a mano toda la topología realista es lento y propenso a errores:
- ¿Cómo reflejas ACLs complejas?
- ¿Cómo simulas relaciones de confianza multi-bosque?
- ¿Cómo reproduces un path to DA detectado en un engagement real?
Ahí es donde entra la joya que os traemos hoy: LudusHound.
LudusHound es un parser en Go que toma tu base de datos de BloodHound y la convierte en un bosque AD funcional en Ludus. La idea es esa, exportar exactamente los objetos, ACLs y relaciones del dominio real para desplegarlos en tu lab.
No más “Creo que este GPO era así…”. Copias lo que has pillado con SharpHound tal cual. Solo unos sencillos pasos:
1. Conexión: LudusHound se conecta al Neo4j de BloodHound:
2. Extracción: obtiene nodos (users
, computers
, groups
, domains
) y edges (MemberOf
, HasSession
, AdminTo
).
3. Parsing: Genera:
- JSON con toda la info
- Plantilla YAML para Ludus
- Roles Ansible ajustados (ej: DCs, workstations, trusts)
4. Deploy: Con "ludus deploy"
montas la infraestructura real en cuestión de minutos.
Veamos un ejemplo muy tonto pero ilustrativo. Imaginaros que nuestra ingesta de Bloodhounf y posterior procesado genera este sencillo yaml:
lab_name: hackplayers-lab
network:
domain: hackplayers.local
net: 192.168.56.0/24
gateway: 192.168.56.1
dns: 192.168.56.10
nodes:
- name: DC01
type: domain_controller
ip: 192.168.56.10
ram: 4096
cpus: 2
- name: WS-HELP01
type: workstation
ip: 192.168.56.20
ram: 2048
cpus: 1
- name: WS-IT01
type: workstation
ip: 192.168.56.21
ram: 2048
cpus: 1
ous:
- name: IT
description: Unidad organizativa para IT
- name: HelpDesk
description: Unidad organizativa para Helpdesk
users:
- name: HelpDeskUser
password: 'P@ssw0rd123!'
ou: HelpDesk
groups:
- HelpDesk
- name: ServerAdminUser
password: 'Adm1nP@ss!'
ou: IT
groups:
- ServerAdmins
groups:
- name: HelpDesk
description: Grupo del helpdesk
- name: ServerAdmins
description: Admins de servidores
- name: Domain Admins
description: Administradores del dominio
acls:
# HelpDeskUser tiene GenericAll sobre ServerAdmins
- principal: HelpDeskUser
target: ServerAdmins
rights:
- GenericAll
# ServerAdmins tiene AddMember sobre Domain Admins
- principal: ServerAdmins
target: Domain Admins
rights:
- AddMember
scripts:
post_tasks:
- name: Crear carpeta compartida en WS-IT01
script: scripts/create_share.ps1
- name: Crear archivo de credenciales olvidadas
script: scripts/drop_plaintext_creds.ps1
- 1 Dominio:
hackplayers.local
- 1 DC (
DC01
) - 2 Workstations (
WS-HELP01
yWS-IT01
) - 1 usuario helpdesk que tiene
GenericAll
sobre un grupo de admins de servidores. - El grupo
ServerAdmins
puede añadir miembros aDomain Admins
. - Path final:
HelpDeskUser → ACL → ServerAdmins → AddMember → Domain Admins
GenericAll
+ AddMember
.Además añadiríamos como post-tareas dos scripts para dejar cosas jugosas (shares o ficheros con credenciales).
scripts/drop_plaintext_creds.ps1
# No es OPSEC, es un lab :)
$path = "C:\Users\Public\forgotten_creds.txt"
$content = "svc_backup : P@ssw0rd2024!"
Set-Content -Path $path -Value $content
Comentarios
Publicar un comentario