Telephony tapsrv — довільний запис DWORD до RCE (TAPI Server Mode)
Tip
Вчіться та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 Discord group, telegram group, слідкуйте за @hacktricks_live на X/Twitter, або перегляньте сторінку LinkedIn і YouTube channel.
- Діліться hacking tricks, надсилаючи PRs до репозиторіїв github HackTricks і HackTricks Cloud.
Коли Windows Telephony service (TapiSrv, tapisrv.dll) налаштовано як TAPI server, він експонує tapsrv MSRPC interface over the \pipe\tapsrv named pipe для автентифікованих SMB клієнтів. Помилка в дизайні механізму асинхронної доставки подій для віддалених клієнтів дозволяє нападнику перетворити дескриптор mailslot на контрольований 4-байтовий запис у будь-який існуючий файл, доступний для запису NETWORK SERVICE. Цей примітив можна зв’язати, щоб перезаписати список адміністраторів Telephony і зловживати завантаженням довільного DLL, доступним лише для адміністраторів, щоб виконати код від імені NETWORK SERVICE.
Поверхня атаки
- Віддалений доступ лише коли увімкнено:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Server\DisableSharingмає дозволяти спільний доступ (або налаштовано черезTapiMgmt.msc/tcmsetup /c <server>). За замовчуваннямtapsrvдоступний лише локально. - Інтерфейс: MS-TRP (
tapsrv) через SMB named pipe, тому нападнику потрібна дійсна SMB аутентифікація. - Обліковий запис сервісу:
NETWORK SERVICE(ручний запуск, за вимогою).
Примітив: плутанина шляху mailslot → довільний запис DWORD
ClientAttach(pszDomainUser, pszMachine, ...)ініціалізує доставку асинхронних подій. У pull-режимі сервіс виконує:
CreateFileW(pszDomainUser, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
не перевіряючи, що pszDomainUser є шляхом до mailslot (\\*\MAILSLOT\...). Приймається будь-який існуючий шлях у файловій системі, доступний для запису NETWORK SERVICE.
- Кожен асинхронний запис події зберігає один
DWORD=InitContext(керований нападником у наступному запитіInitialize) у відкритий дескриптор, що дає примітив write-what/write-where (4 bytes).
Примусове детерміноване записування
- Відкрийте цільовий файл:
ClientAttachзpszDomainUser = <existing writable path>(наприклад,C:\Windows\TAPI\tsec.ini). - Для кожного
DWORD, який потрібно записати, виконайте цю послідовність RPC протиClientRequest:
Initialize(Req_Func 47): встановітьInitContext = <4-byte value>іpszModuleName = DIALER.EXE(або інший верхній запис у per-user priority list).LRegisterRequestRecipient(Req_Func 61):dwRequestMode = LINEREQUESTMODE_MAKECALL,bEnable = 1(реєструє line app, перераховує отримувача з найвищим пріоритетом).TRequestMakeCall(Req_Func 121): примушуєNotifyHighestPriorityRequestRecipient, генеруючи асинхронну подію.GetAsyncEvents(Req_Func 0): витягує/завершує запис.LRegisterRequestRecipientзнову зbEnable = 0(скасовує реєстрацію).Shutdown(Req_Func 86) щоб згорнути line app.- Контроль пріоритету: отримувач із «найвищим пріоритетом» обирається порівнянням
pszModuleNameзHKCU\Software\Microsoft\Windows\CurrentVersion\Telephony\HandoffPriorities\RequestMakeCall(читається під час успадкування контексту клієнта). За потреби вставте ім’я вашого модуля черезLSetAppPriority(Req_Func 69). - Файл повинен уже існувати, оскільки використовується
OPEN_EXISTING. Типові кандидати, доступні для записуNETWORK SERVICE:C:\Windows\System32\catroot2\dberr.txt,C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp\MpCmdRun.log,...\MpSigStub.log.
Від запису DWORD до RCE всередині TapiSrv
- Надати собі права Telephony “admin”: ціль —
C:\Windows\TAPI\tsec.ini, додайте[TapiAdministrators]\r\n<DOMAIN\\user>=1використовуючи вищенаведені 4-байтові записи. Розпочніть нову сесію (ClientAttach), щоб сервіс перечитав INI і встановивptClient->dwFlags |= 9для вашого облікового запису. - Завантаження DLL тільки для адміністраторів: надішліть
GetUIDllNameзdwObjectType = TUISPIDLL_OBJECT_PROVIDERIDі передайте шлях черезdwProviderFilenameOffset. Для адміністраторів сервіс виконаєLoadLibrary(path), а потім викличе експортTSPI_providerUIIdentify:
- Працює з UNC-шляхами до реального Windows SMB share; деякі зловмисні SMB-сервери повертають
ERROR_SMB_GUEST_LOGON_BLOCKED. - Альтернатива: повільно створити локальний DLL за допомогою того самого примітива 4-байтового запису, а потім завантажити його.
- Payload: експорт виконується під привілеями
NETWORK SERVICE. Мінімальний DLL може виконатиcmd.exe /c whoami /all > C:\Windows\Temp\poc.txtі повернути ненульове значення (наприклад,0x1337), щоб сервіс розвантажив DLL, підтверджуючи виконання.
Заходи захисту та виявлення
- Вимкніть TAPI server mode, якщо він не потрібен; блокпостійте віддалений доступ до
\pipe\tapsrv. - Перевіряйте namespace mailslot (
\\*\MAILSLOT\) перед відкриттям шляхів, переданих клієнтом. - Жорстко обмежте ACL для
C:\Windows\TAPI\tsec.iniі моніторте зміни; сповіщуйте при викликахGetUIDllName, що завантажують шляхи, відмінні від стандартних.
Джерела
Tip
Вчіться та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 Discord group, telegram group, слідкуйте за @hacktricks_live на X/Twitter, або перегляньте сторінку LinkedIn і YouTube channel.
- Діліться hacking tricks, надсилаючи PRs до репозиторіїв github HackTricks і HackTricks Cloud.


