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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
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)**가 발생함.
결정적 쓰기 강제 방법
- 대상 파일 열기:
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 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로
- 자기 자신에게 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을 천천히 생성한 뒤 로드.
- 페이로드: 해당 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.iniACL을 잠그고 변경을 모니터링; 기본 경로가 아닌 경로로 로드하는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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
HackTricks

