Telephony tapsrv Arbitrary DWORD Write to RCE (TAPI Server Mode)
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Windows Telephony service (TapiSrv, tapisrv.dll) が TAPI server として構成されている場合、認証済みの SMB クライアントに対して \\pipe\\tapsrv named pipe 上で tapsrv MSRPC インターフェース を公開します。リモートクライアント向けの非同期イベント配信にある設計上のバグにより、攻撃者は mailslot ハンドルを任意の既存ファイルに対する 制御可能な 4 バイト書き込み(NETWORK SERVICE によって書き込み可能なファイル) に変換できます。このプリミティブを連鎖させて Telephony の管理者リストを書き換え、管理者専用の任意 DLL ロードを悪用して NETWORK SERVICE としてコードを実行できます。
Attack Surface
- リモート公開は有効化時のみ:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Server\DisableSharingが共有を許可している(またはTapiMgmt.msc/tcmsetup /c <server>で設定されている)必要があります。デフォルトではtapsrvはローカル限定です。 - インターフェース: MS-TRP (
tapsrv) が SMB named pipe 上で動作するため、攻撃者は有効な SMB 認証を必要とします。 - サービスアカウント:
NETWORK SERVICE(手動開始、オンデマンド)。
Primitive: Mailslot Path Confusion → Arbitrary DWORD Write
ClientAttach(pszDomainUser, pszMachine, ...)が非同期イベント配信を初期化します。プルモードでは、サービスは次を実行します:
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 バイト) が得られます。
Forcing Deterministic Writes
- ターゲットファイルを開く:
ClientAttachをpszDomainUser = <existing writable path>(例:C:\Windows\TAPI\tsec.ini)で呼び出す。 - 書き込みたい各
DWORDについて、ClientRequestに対して次の RPC シーケンスを実行する:
Initialize(Req_Func 47):InitContext = <4-byte value>を設定し、pszModuleName = DIALER.EXE(または per-user 優先リストの上位の別モジュール)を指定。LRegisterRequestRecipient(Req_Func 61):dwRequestMode = LINEREQUESTMODE_MAKECALL,bEnable = 1(ラインアプリを登録し、最高優先受信者を再計算)。TRequestMakeCall(Req_Func 121):NotifyHighestPriorityRequestRecipientを強制し、非同期イベントを生成。GetAsyncEvents(Req_Func 0): キューから取り出して書き込みを完了。LRegisterRequestRecipientを再度bEnable = 0で呼び出して登録解除。Shutdown(Req_Func 86) でラインアプリを終了。- 優先度制御: “highest priority” の受信者は
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.
From DWORD Write to RCE inside TapiSrv
- 自分に Telephony “admin” を付与:
C:\Windows\TAPI\tsec.iniをターゲットにして、上記の 4 バイト書き込みで[TapiAdministrators]\r\n<DOMAIN\\user>=1を追記します。サービスが INI を再読み込みしてあなたのアカウントに対してptClient->dwFlags |= 9を設定するように、新しいセッション(ClientAttach)を開始します。 - 管理者専用の DLL ロード:
GetUIDllNameをdwObjectType = TUISPIDLL_OBJECT_PROVIDERIDで送信し、dwProviderFilenameOffset経由でパスを渡します。管理者の場合、サービスはLoadLibrary(path)を行い、エクスポートTSPI_providerUIIdentifyを呼び出します:
- UNC パスで実在する Windows SMB 共有を指定して機能します;一部の攻撃者 SMB サーバは
ERROR_SMB_GUEST_LOGON_BLOCKEDを返すことがあります。 - 代替手段: 同じ 4 バイト書き込みプリミティブを使ってローカルに DLL を徐々に書き込み、それをロードする。
- ペイロード: エクスポートは
NETWORK SERVICE権限で実行されます。最小の DLL であればcmd.exe /c whoami /all > C:\Windows\Temp\poc.txtを実行し、サービスが DLL をアンロードするように非ゼロ値(例:0x1337)を返して実行を確認できます。
Hardening / Detection Notes
- 必要がない限り TAPI server mode を無効化し、リモートからの
\pipe\tapsrvへのアクセスをブロックする。 - クライアントが供給するパスを開く前に mailslot 名前空間検証(
\\*\MAILSLOT\)を強制する。 C:\Windows\TAPI\tsec.iniの ACL を厳格化し、変更を監視する;デフォルト以外のパスをロードするGetUIDllName呼び出しを検出してアラートを上げる。
References
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


