Telephony tapsrv Arbitrary DWORD Write to RCE (TAPI Server Mode)
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Kada je Windows Telephony service (TapiSrv, tapisrv.dll) konfigurisan kao TAPI server, izlaže tapsrv MSRPC interfejs preko \pipe\tapsrv named pipe autentifikovanim SMB klijentima. Dizajnerska greška u asinhronoj isporuci događaja za udaljene klijente omogućava napadaču da pretvori mailslot handle u kontrolisani 4-bajtni zapis u bilo koji postojeći fajl koji je upisiv od strane NETWORK SERVICE. Taj primitiv se može povezati da pregazi Telephony admin listu i zloupotrebi admin-only arbitrary DLL load za izvršavanje koda kao NETWORK SERVICE.
Attack Surface
- Remote exposure only when enabled:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Server\DisableSharingmora dozvoliti deljenje (ili biti konfigurisan putemTapiMgmt.msc/tcmsetup /c <server>). Po defaultutapsrvje samo lokalni. - Interface: MS-TRP (
tapsrv) preko SMB named pipe, tako da napadač treba validnu SMB autentifikaciju. - Service account:
NETWORK SERVICE(manual start, on-demand).
Primitive: Mailslot Path Confusion → Arbitrary DWORD Write
ClientAttach(pszDomainUser, pszMachine, ...)inicijalizuje asinhronu isporuku događaja. U pull režimu, servis poziva:
CreateFileW(pszDomainUser, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
bez validacije da li je pszDomainUser mailslot putanja (\\*\MAILSLOT\...). Bilo koja postojeća putanja na fajl sistemu upisiva od strane NETWORK SERVICE je prihvaćena.
- Svaki asinhroni zapis događaja snima jedan jedini
DWORD=InitContext(kontrolisan od strane napadača u naknadnomInitializezahtevu) u otvoreni handle, dajući write-what/write-where (4 bytes).
Forcing Deterministic Writes
- Open target file:
ClientAttachsapszDomainUser = <existing writable path>(npr.C:\Windows\TAPI\tsec.ini). - Za svaki
DWORDkoji treba upisati, izvrši sledeću RPC sekvencu protivClientRequest:
Initialize(Req_Func 47): postaviInitContext = <4-byte value>ipszModuleName = DIALER.EXE(ili drugi top unos u per-user priority list).LRegisterRequestRecipient(Req_Func 61):dwRequestMode = LINEREQUESTMODE_MAKECALL,bEnable = 1(registruje line app, ponovo izračunava highest priority recipient).TRequestMakeCall(Req_Func 121): forsiraNotifyHighestPriorityRequestRecipient, generišući asinhroni događaj.GetAsyncEvents(Req_Func 0): dequeue/kompletira zapis.LRegisterRequestRecipientponovo sabEnable = 0(odregistruje).Shutdown(Req_Func 86) da sruši line app.- Kontrola prioriteta: “highest priority” recipient se bira poređenjem
pszModuleNameprotivHKCU\Software\Microsoft\Windows\CurrentVersion\Telephony\HandoffPriorities\RequestMakeCall(čitano dok se impersonira klijent). Ako je potrebno, ubaci svoj module name putemLSetAppPriority(Req_Func 69). - Fajl mora već postojati zato što se koristi
OPEN_EXISTING. Uobičajeni kandidati upisivi od straneNETWORK SERVICE:C:\Windows\System32\catroot2\dberr.txt,C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp\MpCmdRun.log,...\MpSigStub.log.
From DWORD Write to RCE inside TapiSrv
- Grant yourself Telephony “admin”: ciljanje
C:\Windows\TAPI\tsec.inii dodavanje[TapiAdministrators]\r\n<DOMAIN\\user>=1koristeći gore navedene 4-bajtne zapise. Pokreni novu sesiju (ClientAttach) da servis ponovo učita INI i postaviptClient->dwFlags |= 9za tvoj nalog. - Admin-only DLL load: pošalji
GetUIDllNamesadwObjectType = TUISPIDLL_OBJECT_PROVIDERIDi obezbedi putanju prekodwProviderFilenameOffset. Za admine, servis radiLoadLibrary(path)zatim poziva exportTSPI_providerUIIdentify:
- Radi sa UNC putanjama ka realnom Windows SMB share-u; neki napadački SMB serveri ne uspevaju sa
ERROR_SMB_GUEST_LOGON_BLOCKED. - Alternativa: polako ispusti lokalni DLL koristeći isti 4-bajtni primitiv, zatim ga učitaj.
- Payload: export se izvršava pod
NETWORK SERVICE. Minimalni DLL može pokrenuticmd.exe /c whoami /all > C:\Windows\Temp\poc.txti vratiti nenultu vrednost (npr.0x1337) tako da servis unload-uje DLL, potvrđujući izvršenje.
Hardening / Detection Notes
- Disable TAPI server mode osim ako nije neophodan; blokiraj udaljeni pristup
\pipe\tapsrv. - Sprovodi validaciju mailslot namespace (
\\*\MAILSLOT\) pre nego što se otvore putanje koje šalje klijent. - Zatvori ACL-e
C:\Windows\TAPI\tsec.inii prati izmene; alertuj naGetUIDllNamepozive koji učitavaju nenormalne putanje.
References
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


