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)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Коли 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)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


