Telephony tapsrv Arbitrary DWORD Write to RCE (TAPI Server Mode)
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Wenn der Windows Telephony service (TapiSrv, tapisrv.dll) als TAPI server konfiguriert ist, exponiert er die tapsrv MSRPC interface über die \pipe\tapsrv named pipe für authentifizierte SMB-Clients. Ein Designfehler in der asynchronen Event-Zustellung für entfernte Clients erlaubt es einem Angreifer, einen mailslot-Handle in einen kontrollierten 4-Byte-Schreibzugriff auf jede bereits vorhandene Datei, die von NETWORK SERVICE beschreibbar ist, zu verwandeln. Dieses Primitive kann verkettet werden, um die Telephony-Admin-Liste zu überschreiben und eine Admin-only arbitrary DLL load auszunutzen, um Code als NETWORK SERVICE auszuführen.
Attack Surface
- Remote-Zugriff nur wenn aktiviert:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Server\DisableSharingmuss Sharing erlauben (oder überTapiMgmt.msc/tcmsetup /c <server>konfiguriert sein). Standardmäßig isttapsrvnur lokal. - Interface: MS-TRP (
tapsrv) über SMB named pipe, daher benötigt der Angreifer gültige SMB-Authentifizierung. - Service-Konto:
NETWORK SERVICE(manuell startbar, on-demand).
Primitive: Mailslot Path Confusion → Arbitrary DWORD Write
ClientAttach(pszDomainUser, pszMachine, ...)initialisiert die asynchrone Event-Zustellung. Im Pull-Modus führt der Service:
CreateFileW(pszDomainUser, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
aus, ohne zu prüfen, dass pszDomainUser ein mailslot-Pfad (\\*\MAILSLOT\...) ist. Jeder existierende Dateisystempfad, der von NETWORK SERVICE beschreibbar ist, wird akzeptiert.
- Jeder asynchrone Event-Schreibvorgang schreibt ein einzelnes
DWORD=InitContext(angreiferkontrolliert im nachfolgendenInitialize-Request) in den geöffneten Handle und ergibt damit einen write-what/write-where (4 bytes).
Forcing Deterministic Writes
- Ziel-Datei öffnen:
ClientAttachmitpszDomainUser = <existing writable path>(z. B.C:\Windows\TAPI\tsec.ini). - Für jedes zu schreibende
DWORDführe die folgende RPC-Sequenz gegenClientRequestaus:
Initialize(Req_Func 47): setzeInitContext = <4-byte value>undpszModuleName = DIALER.EXE(oder einen anderen Top-Eintrag in der per-user priority list).LRegisterRequestRecipient(Req_Func 61):dwRequestMode = LINEREQUESTMODE_MAKECALL,bEnable = 1(registriert die line app, rekalkuliert den highest priority recipient).TRequestMakeCall(Req_Func 121): erzwingtNotifyHighestPriorityRequestRecipient, was das asynchrone Event erzeugt.GetAsyncEvents(Req_Func 0): deqeuue/complete des Schreibvorgangs.LRegisterRequestRecipienterneut mitbEnable = 0(unregistrieren).Shutdown(Req_Func 86) um die line app abzubauen.- Priority-Kontrolle: Der “highest priority” recipient wird durch Vergleich von
pszModuleNamemitHKCU\Software\Microsoft\Windows\CurrentVersion\Telephony\HandoffPriorities\RequestMakeCallbestimmt (gelesen während der Impersonation des Clients). Falls nötig, füge deinen Modulnamen viaLSetAppPriority(Req_Func 69) ein. - Die Datei muss bereits existieren, weil
OPEN_EXISTINGverwendet wird. Übliche vonNETWORK SERVICEbeschreibbare Kandidaten:C:\Windows\System32\catroot2\dberr.txt,C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp\MpCmdRun.log,...\MpSigStub.log.
From DWORD Write to RCE inside TapiSrv
- Sich selbst Telephony “admin”rechte geben: Ziel
C:\Windows\TAPI\tsec.iniund anhängen von[TapiAdministrators]\r\n<DOMAIN\\user>=1mittels der oben beschriebenen 4-Byte-Schreibvorgänge. Starte eine neue Session (ClientAttach), sodass der Service die INI neu einliest undptClient->dwFlags |= 9für dein Konto setzt. - Admin-only DLL load: sende
GetUIDllNamemitdwObjectType = TUISPIDLL_OBJECT_PROVIDERIDund übergebe einen Pfad überdwProviderFilenameOffset. Für Admins führt der ServiceLoadLibrary(path)aus und ruft dann den ExportTSPI_providerUIIdentifyauf:
- Funktioniert mit UNC-Pfaden zu einem echten Windows SMB-Share; einige böse SMB-Server des Angreifers schlagen mit
ERROR_SMB_GUEST_LOGON_BLOCKEDfehl. - Alternative: lege langsam eine lokale DLL mit demselben 4-Byte-Write-Primitive ab und lade diese.
- Payload: Der Export läuft unter
NETWORK SERVICE. Eine minimale DLL kanncmd.exe /c whoami /all > C:\Windows\Temp\poc.txtausführen und einen non-zero Rückgabewert (z. B.0x1337) zurückgeben, sodass der Service die DLL entlädt — damit ist die Ausführung bestätigt.
Hardening / Detection Notes
- Deaktiviere TAPI server mode, sofern nicht benötigt; blockiere Remote-Zugriff auf
\pipe\tapsrv. - Validiere die mailslot-Namespace (
\\*\MAILSLOT\...) bevor client-seitig gelieferte Pfade geöffnet werden. - Schütze die ACLs von
C:\Windows\TAPI\tsec.iniund überwache Änderungen; löse Alerts beiGetUIDllName-Aufrufen aus, die non-default Pfade laden.
References
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.


