Skip to content
ADscan Docs

🛡️ GPO Abuse — Immediate Scheduled Task

Plant a SYSTEM-level Immediate Scheduled Task on every machine linked to a writable GPO, and roll it back cleanly.

ADscan implements GPO abuse via the Immediate Scheduled Task technique, fully native (no New-GPOImmediateTask, no pygpoabuse subprocess). When an operator-controlled principal can write to a Group Policy Container, ADscan plants a Computer-side Immediate Scheduled Task. At the next gpupdate /force (or the next 90–120 min refresh window), every machine linked to that GPO executes the task as NT AUTHORITY\SYSTEM.

¿Qué hace este ataque?

Approvecha que el principal autenticado tiene permisos de escritura sobre un GPO (GenericAll, GenericWrite, WriteDACL, WriteOwner o WriteProperty sobre gPCFileSysPath / gPCMachineExtensionNames / versionNumber). ADscan deposita un ScheduledTasks.xml de tipo Immediate Task en SYSVOL, sincroniza la versión del GPO en LDAP y gpt.ini, y deja que el cliente de Group Policy de cada máquina enlazada lo ejecute en su próximo ciclo.

Cuándo se aplica

Pre-condiciones:

  • Credencial válida en el dominio.
  • Al menos un GPC con uno de estos derechos sobre el principal o sobre algún grupo en su tokenGroups:
    • GenericAll, GenericWrite, WriteDACL, WriteOwner
    • WriteProperty:gPCFileSysPath
    • WriteProperty:gPCMachineExtensionNames
    • WriteProperty:versionNumber
  • Acceso a SYSVOL del DC (SMB).

ADscan rechaza el ataque si el principal pertenece al grupo Protected Users (RC4/NTLM/unconstrained delegation están bloqueados; el vector no se completa de forma fiable).

Cómo lo ejecuta ADscan

  1. Discovery centralizada (graph-driven). El collector LDAP nativo de ADscan enumera todos los groupPolicyContainer, lee nTSecurityDescriptor con SD_FLAGS_DACL y persiste cada GPO como nodo kind="GPO" en attack_graph.json, junto con las aristas ACL (GenericAll / GenericWrite / WriteDACL / WriteOwner), las MemberOf y los enlaces GPLink a OUs, dominio y sites. El motor de attack-paths surface los GPOs escribibles como findings automáticamente — el wizard exploit-gpo-abuse aplica un filtro fino sobre el grafo (membresía transitiva del principal + relaciones ACL relevantes) sin emitir LDAP adicional.
  2. Wizard (Rich + questionary). Tabla con riesgo (CRITICAL si toca Tier 0), panel de impacto con SOMs enlazadas y advertencia roja si afecta a OU=Domain Controllers o al raíz del dominio, selección de payload, dry-run opcional.
  3. Mutación (write-ahead ledger).
    • mkdir \\<dc>\SYSVOL\<dom>\Policies\{GUID}\Machine\Preferences\ScheduledTasks\
    • Subida de ScheduledTasks.xml (Immediate Task, run-as NT AUTHORITY\SYSTEM).
    • Bump gpt.ini Version= y LDAP versionNumber (mitad Machine), merge de los CSE GUIDs en gPCMachineExtensionNames.
  4. Rollback. Cada paso registra una entrada en el ledger antes de aplicarse. Al cierre de sesión, o tras exploit-gpo-rollback, ADscan revierte el SYSVOL byte a byte y restaura los atributos LDAP.

Toda la pila es asíncrona y nativa: kerbad para Kerberos, badldap para LDAP (con fallback automático LDAPS → LDAP), aiosmb para SYSVOL, winacl para parsear DACLs.

Impacto

Ejecución de comandos como NT AUTHORITY\SYSTEM en cada máquina enlazada al GPO. Cuando el GPO está enlazado a OUs con servidores de alto valor o a OU=Domain Controllers, el camino directo a Domain Admin es trivial — por eso ADscan marca esos GPOs como CRITICAL y exige confirmación explícita.

Rollback automático

ADscan revierte todas las mutaciones SYSVOL/LDAP y verifica que el estado posterior sea idéntico al previo (gpt.ini original, versionNumber original, gPCMachineExtensionNames original, sin ScheduledTasks.xml). El ledger conserva los change_id para auditoría incluso después de la sesión.

Si dejas la persistencia activa para escalar a DA, el rollback diferido se ejecutará automáticamente al cerrar la sesión salvo que ya lo hayas lanzado con exploit-gpo-rollback <ledger_id>.

Ejemplo CLI

adscan> exploit-gpo-abuse
[ Comprobando viabilidad… ]
  Dominio:  example.local
  Usuario:  alice
  DC:       dc01.example.local (10.0.0.10)

[ Enumerando GPOs escribibles… ]

┌───┬──────────────────────────┬───────────────────────┬──────────┬────────┬────────┬──────────┐
│ # │ GPO                      │ Derechos              │ Vía      │ # SOMs │ Tier 0 │ Riesgo   │
├───┼──────────────────────────┼───────────────────────┼──────────┼────────┼────────┼──────────┤
│ 1 │ Workstation Hardening    │ GenericAll            │ S-1-…    │   2    │        │ MEDIUM   │
│ 2 │ Servers Baseline         │ WriteDACL             │ S-1-…    │   4    │        │ HIGH     │
│ 3 │ Default Domain Policy    │ GenericWrite          │ S-1-…    │   1    │   ✓    │ CRITICAL │
└───┴──────────────────────────┴───────────────────────┴──────────┴────────┴────────┴──────────┘

? Selecciona el GPO a explotar:  Servers Baseline (4 SOMs, HIGH)

╭─ Vista previa de impacto ────────────────────────────────────────╮
│ GPO: Servers Baseline                                            │
│ Linked SOMs:                                                     │
│   OU=Servers,DC=example,DC=local                                 │
│   OU=AppServers,OU=Servers,DC=example,DC=local                   │
│ Riesgo: HIGH                                                     │
╰──────────────────────────────────────────────────────────────────╯

? ¿Continuar? Esto modificará SYSVOL y LDAP en este DC.  Yes
? Selecciona payload: Comando crudo (RawCommandPayload)
? Comando: net localgroup administrators alice /add
? ¿Ejecutar en modo dry-run primero? Yes

[ DRY RUN — sin mutaciones ]
  • LDAP versionNumber += 1, merge CSE GUIDs
  • mkdir \\dc01\SYSVOL\example.local\Policies\{…}\Machine\Preferences\ScheduledTasks
  • write ScheduledTasks.xml + gpt.ini bump

? ¿Aplicar de verdad ahora? Yes
✔ Immediate Scheduled Task plantada (4 cambios registrados, ledger id: …).
? ¿Ejecutar rollback ahora? No  → rollback diferido al cierre de sesión.

Para revertir manualmente:

adscan> exploit-gpo-rollback <ledger_id>

Referencias

Find this useful?
Pass it to the next pentester running an AD engagement
Running 2+ AD engagements/year?
Get PRO free — beta access·Free in exchange for feedback
Automated PDF reports. Save ≥1 day per engagement.

ADscan — AD pentest automation for security consultants

🛡️ GPO Abuse — Immediate Scheduled Task | ADscan