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 ์ง€์›ํ•˜๊ธฐ

When the Windows Telephony service (TapiSrv, tapisrv.dll) is configured as a TAPI server, it exposes the tapsrv MSRPC interface over the \pipe\tapsrv named pipe to authenticated SMB clients. A design bug in the asynchronous event delivery for remote clients lets an attacker turn a mailslot handle into a controlled 4-byte write to any pre-existing file writable by NETWORK SERVICE. That primitive can be chained to overwrite the Telephony admin list and abuse an admin-only arbitrary DLL load to execute code as 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)**๊ฐ€ ๋ฐœ์ƒํ•จ.

๊ฒฐ์ •์  ์“ฐ๊ธฐ ๊ฐ•์ œ ๋ฐฉ๋ฒ•

  1. ๋Œ€์ƒ ํŒŒ์ผ ์—ด๊ธฐ: ClientAttach๋ฅผ pszDomainUser = <existing writable path>(์˜ˆ: C:\Windows\TAPI\tsec.ini)๋กœ ํ˜ธ์ถœ.
  2. ๊ฐ DWORD๋ฅผ ์“ฐ๋ ค๋ฉด ClientRequest์— ๋Œ€ํ•ด ๋‹ค์Œ RPC ์‹œํ€€์Šค๋ฅผ ์‹คํ–‰:
  • Initialize (Req_Func 47): InitContext = <4-byte value>์™€ pszModuleName = DIALER.EXE(๋˜๋Š” per-user priority ๋ฆฌ์ŠคํŠธ์˜ ์ƒ์œ„ ํ•ญ๋ชฉ) ์„ค์ •.
  • 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๊ณผ ๋น„๊ตํ•˜์—ฌ ์„ ํƒ(ํด๋ผ์ด์–ธํŠธ๋กœ ์œ„์ž„(impersonate)ํ•œ ์ƒํƒœ์—์„œ ์ฝ์Œ). ํ•„์š”์‹œ 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 ์“ฐ๊ธฐ์—์„œ TapiSrv ๋‚ด๋ถ€ RCE๋กœ

  1. ์ž๊ธฐ ์ž์‹ ์—๊ฒŒ Telephony โ€œadminโ€ ๊ถŒํ•œ ๋ถ€์—ฌ: C:\Windows\TAPI\tsec.ini๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์œ„์˜ 4๋ฐ”์ดํŠธ ์“ฐ๊ธฐ๋ฅผ ์ด์šฉํ•ด [TapiAdministrators]\r\n<DOMAIN\\user>=1์„ ์ถ”๊ฐ€. ์„œ๋น„์Šค๊ฐ€ INI๋ฅผ ๋‹ค์‹œ ์ฝ๊ณ  ๊ณ„์ •์— ๋Œ€ํ•ด ptClient->dwFlags |= 9์„ ์„ค์ •ํ•˜๋„๋ก ์ƒˆ๋กœ์šด ์„ธ์…˜(ClientAttach)์„ ์‹œ์ž‘.
  2. ๊ด€๋ฆฌ์ž ์ „์šฉ DLL ๋กœ๋“œ ์˜ค์šฉ: GetUIDllName์„ dwObjectType = TUISPIDLL_OBJECT_PROVIDERID๋กœ ๋ณด๋‚ด๊ณ  dwProviderFilenameOffset๋กœ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณต. ๊ด€๋ฆฌ์ž๋ผ๋ฉด ์„œ๋น„์Šค๋Š” LoadLibrary(path)๋ฅผ ํ˜ธ์ถœํ•œ ๋’ค ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜ TSPI_providerUIIdentify๋ฅผ ํ˜ธ์ถœ:
  • UNC ๊ฒฝ๋กœ๋กœ ์‹ค์ œ Windows SMB ๊ณต์œ ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๋™์ž‘; ์ผ๋ถ€ ๊ณต๊ฒฉ์ž SMB ์„œ๋ฒ„๋Š” ERROR_SMB_GUEST_LOGON_BLOCKED๋กœ ์‹คํŒจํ•จ.
  • ๋Œ€์•ˆ: ๋™์ผํ•œ 4๋ฐ”์ดํŠธ ์“ฐ๊ธฐ ์›์‹œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๋กœ์ปฌ์— DLL์„ ์ฒœ์ฒœํžˆ ์ƒ์„ฑํ•œ ๋’ค ๋กœ๋“œ.
  1. ํŽ˜์ด๋กœ๋“œ: ํ•ด๋‹น export๋Š” NETWORK SERVICE ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋จ. ์ตœ์†Œํ•œ์˜ DLL์€ cmd.exe /c whoami /all > C:\Windows\Temp\poc.txt๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์„œ๋น„์Šค๊ฐ€ DLL์„ ์–ธ๋กœ๋“œํ•˜๋„๋ก ๋น„์˜(้ž0) ๊ฐ’์„ ๋ฐ˜ํ™˜(์˜ˆ: 0x1337)ํ•˜๋ฉด ์‹คํ–‰ ํ™•์ธ ๊ฐ€๋Šฅ.

ํ•˜๋“œ๋‹ / ํƒ์ง€ ๋ฉ”๋ชจ

  • ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด TAPI server ๋ชจ๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™”; \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 ์ง€์›ํ•˜๊ธฐ