mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/135-pentesting-msrpc.md'] t
This commit is contained in:
parent
f62dbf42d3
commit
b1a7068b44
@ -10,13 +10,13 @@ RPC 엔드포인트 매퍼는 TCP 및 UDP 포트 135, TCP 139 및 445에서 SMB(
|
||||
```
|
||||
135/tcp open msrpc Microsoft Windows RPC
|
||||
```
|
||||
## MSRPC는 어떻게 작동합니까?
|
||||
## MSRPC는 어떻게 작동하나요?
|
||||
|
||||
클라이언트 애플리케이션에 의해 시작된 MSRPC 프로세스는 로컬 스텁 프로시저를 호출한 다음 클라이언트 런타임 라이브러리와 상호 작용하여 요청을 서버로 준비하고 전송하는 과정을 포함합니다. 여기에는 매개변수를 표준 네트워크 데이터 표현 형식으로 변환하는 것이 포함됩니다. 서버가 원격인 경우 전송 프로토콜의 선택은 런타임 라이브러리에 의해 결정되어 RPC가 네트워크 스택을 통해 전달되도록 합니다.
|
||||
클라이언트 애플리케이션에 의해 시작된 MSRPC 프로세스는 로컬 스텁 프로시저를 호출한 다음 클라이언트 런타임 라이브러리와 상호작용하여 요청을 서버로 준비하고 전송하는 과정을 포함합니다. 여기에는 매개변수를 표준 네트워크 데이터 표현 형식으로 변환하는 것이 포함됩니다. 서버가 원격인 경우 전송 프로토콜의 선택은 런타임 라이브러리에 의해 결정되어 RPC가 네트워크 스택을 통해 전달되도록 보장합니다.
|
||||
|
||||

|
||||
|
||||
## **노출된 RPC 서비스 식별**
|
||||
## **노출된 RPC 서비스 식별하기**
|
||||
|
||||
TCP, UDP, HTTP 및 SMB를 통한 RPC 서비스의 노출은 RPC 로케이터 서비스 및 개별 엔드포인트를 쿼리하여 확인할 수 있습니다. rpcdump와 같은 도구는 **IFID** 값으로 표시되는 고유한 RPC 서비스의 식별을 용이하게 하여 서비스 세부정보 및 통신 바인딩을 드러냅니다:
|
||||
```
|
||||
@ -26,7 +26,7 @@ Annotation: Messenger Service
|
||||
UUID: 00000000-0000-0000-0000-000000000000
|
||||
Binding: ncadg_ip_udp:<IP>[1028]
|
||||
```
|
||||
RPC 로케이터 서비스에 대한 접근은 특정 프로토콜을 통해 활성화됩니다: ncacn_ip_tcp 및 ncadg_ip_udp는 포트 135를 통해 접근하기 위해 사용되며, ncacn_np는 SMB 연결을 위해, ncacn_http는 웹 기반 RPC 통신을 위해 사용됩니다. 다음 명령어는 주로 포트 135에 초점을 맞춰 MSRPC 서비스에 대한 감사 및 상호작용을 위해 Metasploit 모듈을 활용하는 예를 보여줍니다:
|
||||
RPC 로케이터 서비스에 대한 접근은 특정 프로토콜을 통해 활성화됩니다: ncacn_ip_tcp 및 ncadg_ip_udp는 포트 135를 통해 접근할 때 사용되며, ncacn_np는 SMB 연결을 위해, ncacn_http는 웹 기반 RPC 통신을 위해 사용됩니다. 다음 명령어는 주로 포트 135에 초점을 맞춰 MSRPC 서비스를 감사하고 상호작용하는 Metasploit 모듈의 활용을 예시합니다:
|
||||
```bash
|
||||
use auxiliary/scanner/dcerpc/endpoint_mapper
|
||||
use auxiliary/scanner/dcerpc/hidden
|
||||
@ -34,7 +34,7 @@ use auxiliary/scanner/dcerpc/management
|
||||
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
|
||||
rpcdump.py <IP> -p 135
|
||||
```
|
||||
모든 옵션은 `tcp_dcerpc_auditor`를 제외하고 포트 135에서 MSRPC를 타겟팅하기 위해 특별히 설계되었습니다.
|
||||
모든 옵션은 `tcp_dcerpc_auditor`를 제외하고 포트 135에서 MSRPC를 타겟팅하도록 특별히 설계되었습니다.
|
||||
|
||||
#### 주목할 만한 RPC 인터페이스
|
||||
|
||||
@ -65,13 +65,13 @@ rpcdump.py <IP> -p 135
|
||||
|
||||
### IP 주소 식별
|
||||
|
||||
[https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver)를 사용하여 [Airbus 연구](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)에서 _**IOXIDResolver**_ 인터페이스 내의 _**ServerAlive2**_ 메서드를 악용하는 것이 가능합니다.
|
||||
[https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver)를 사용하면 [Airbus research](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)에서 제공하는 _**ServerAlive2**_ 메서드를 _**IOXIDResolver**_ 인터페이스 내에서 악용할 수 있습니다.
|
||||
|
||||
이 메서드는 HTB 박스 _APT_에서 **IPv6** 주소와 같은 인터페이스 정보를 얻는 데 사용되었습니다. [여기](https://0xdf.gitlab.io/2021/04/10/htb-apt.html)에서 0xdf APT 작성물을 확인할 수 있으며, 여기에는 _stringbinding_을 사용하는 [Impacket](https://github.com/SecureAuthCorp/impacket/)의 rpcmap.py를 사용하는 대체 방법이 포함되어 있습니다.
|
||||
이 방법은 HTB 박스 _APT_에서 **IPv6** 주소로 인터페이스 정보를 얻는 데 사용되었습니다. [여기](https://0xdf.gitlab.io/2021/04/10/htb-apt.html)에서 0xdf APT 작성물을 확인할 수 있으며, 여기에는 _stringbinding_을 사용하는 [Impacket](https://github.com/SecureAuthCorp/impacket/)의 rpcmap.py를 사용하는 대체 방법이 포함되어 있습니다.
|
||||
|
||||
### 유효한 자격 증명으로 RCE 실행
|
||||
### 유효한 자격 증명을 사용한 RCE 실행
|
||||
|
||||
유효한 사용자의 자격 증명이 있는 경우 [dcomexec.py](https://github.com/fortra/impacket/blob/master/examples/dcomexec.py)를 사용하여 원격 코드 실행이 가능합니다.
|
||||
유효한 사용자의 자격 증명이 있는 경우 [dcomexec.py](https://github.com/fortra/impacket/blob/master/examples/dcomexec.py)에서 원격 코드를 실행할 수 있습니다.
|
||||
|
||||
**사용 가능한 다양한 객체로 시도하는 것을 잊지 마세요**
|
||||
|
||||
@ -83,7 +83,77 @@ rpcdump.py <IP> -p 135
|
||||
|
||||
[rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools)의 **rpcdump.exe**는 이 포트와 상호작용할 수 있습니다.
|
||||
|
||||
## 참고 문헌
|
||||
### 자동화된 인터페이스 열거 및 동적 클라이언트 생성 (NtObjectManager)
|
||||
|
||||
PowerShell 전문가 **James Forshaw**는 오픈 소스 *NtObjectManager* 모듈 내에서 대부분의 Windows RPC 내부를 노출했습니다. 이를 사용하면 IDL, MIDL 또는 수동 언마샬링 없이 몇 초 만에 모든 RPC 서버 DLL / EXE를 **완전한 기능의 클라이언트 스텁**으로 변환할 수 있습니다.
|
||||
```powershell
|
||||
# Install the module once
|
||||
Install-Module NtObjectManager -Force
|
||||
|
||||
# Parse every RPC interface exported by the target binary
|
||||
$rpcinterfaces = Get-RpcServer "C:\Windows\System32\efssvc.dll"
|
||||
$rpcinterfaces | Format-Table Name,Uuid,Version,Procedures
|
||||
|
||||
# Inspect a single procedure (opnum 0)
|
||||
$rpcinterfaces[0].Procedures[0] | Format-List *
|
||||
```
|
||||
전형적인 출력은 매개변수 유형을 **MIDL**에 나타나는 그대로 노출합니다 (예: `FC_C_WSTRING`, `FC_LONG`, `FC_BIND_CONTEXT`).
|
||||
|
||||
인터페이스를 알게 되면 **컴파일할 준비가 된 C# 클라이언트**를 **생성할 수** 있습니다:
|
||||
```powershell
|
||||
# Reverse the MS-EFSR (EfsRpc*) interface into C#
|
||||
Format-RpcClient $rpcinterfaces[0] -Namespace MS_EFSR -OutputPath .\MS_EFSR.cs
|
||||
```
|
||||
생성된 스텁 안에는 다음과 같은 메서드가 있습니다:
|
||||
```csharp
|
||||
public int EfsRpcOpenFileRaw(out Marshal.NdrContextHandle ctx, string FileName, int Flags) {
|
||||
// marshals parameters & calls opnum 0
|
||||
}
|
||||
```
|
||||
PowerShell 도우미 `Get-RpcClient`는 **대화형 클라이언트 객체**를 생성하여 절차를 즉시 호출할 수 있습니다:
|
||||
```powershell
|
||||
$client = Get-RpcClient $rpcinterfaces[0]
|
||||
Connect-RpcClient $client -stringbinding 'ncacn_np:127.0.0.1[\\pipe\\efsrpc]' `
|
||||
-AuthenticationLevel PacketPrivacy `
|
||||
-AuthenticationType WinNT # NTLM auth
|
||||
|
||||
# Invoke the procedure → returns an authenticated context handle
|
||||
$ctx = New-Object Marshal.NdrContextHandle
|
||||
$client.EfsRpcOpenFileRaw([ref]$ctx, "\\\127.0.0.1\test", 0)
|
||||
```
|
||||
인증(Kerberos / NTLM) 및 암호화 수준(`PacketIntegrity`, `PacketPrivacy`, …)은 `Connect-RpcClient` cmdlet을 통해 직접 제공될 수 있습니다 – 이는 고급 권한 명명된 파이프를 보호하는 **보안 설명자**를 우회하는 데 이상적입니다.
|
||||
|
||||
---
|
||||
|
||||
### 컨텍스트 인식 RPC 퍼징 (MS-RPC-Fuzzer)
|
||||
|
||||
정적 인터페이스 지식은 훌륭하지만, 진정으로 원하는 것은 *컨텍스트 핸들*과 복잡한 매개변수 체인을 이해하는 **커버리지 기반 퍼징**입니다. 오픈 소스 **MS-RPC-Fuzzer** 프로젝트는 바로 그 워크플로우를 자동화합니다:
|
||||
|
||||
1. 대상 바이너리(`Get-RpcServer`)에 의해 내보내진 모든 인터페이스/절차를 열거합니다.
|
||||
2. 각 인터페이스에 대한 동적 클라이언트를 생성합니다(`Format-RpcClient`).
|
||||
3. 원래 **NDR 유형**을 존중하면서 입력 매개변수(넓은 문자열 길이, 정수 범위, 열거형)를 무작위화합니다.
|
||||
4. 한 호출에 의해 반환된 *컨텍스트 핸들*을 추적하여 후속 절차에 자동으로 공급합니다.
|
||||
5. 선택한 전송(ALPC, TCP, HTTP 또는 명명된 파이프)에 대해 대량 호출을 실행합니다.
|
||||
6. 종료 상태/결함/타임아웃을 기록하고 *인터페이스 → 절차 → 매개변수* 관계 및 충돌 클러스터를 시각화하기 위해 **Neo4j** 가져오기 파일을 내보냅니다.
|
||||
|
||||
예시 실행(명명된 파이프 대상):
|
||||
```powershell
|
||||
Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
|
||||
-MinLen 1 -MaxLen 0x400 `
|
||||
-Iterations 100000 `
|
||||
-OutDir .\results
|
||||
```
|
||||
단일 경계 초과 쓰기 또는 예기치 않은 예외는 이를 유발한 정확한 opnum + 퍼즈된 페이로드와 함께 즉시 드러납니다. 이는 안정적인 개념 증명 익스플로잇의 완벽한 시작점입니다.
|
||||
|
||||
> ⚠️ 많은 RPC 서비스는 **NT AUTHORITY\SYSTEM**으로 실행되는 프로세스에서 실행됩니다. 여기서 메모리 안전성 문제는 일반적으로 로컬 권한 상승 또는 (SMB/135를 통해 노출될 경우) *원격 코드 실행*으로 이어집니다.
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
- [Automating MS-RPC vulnerability research (2025, Incendium.rocks)](https://www.incendium.rocks/posts/Automating-MS-RPC-Vulnerability-Research/)
|
||||
- [MS-RPC-Fuzzer – context-aware RPC fuzzer](https://github.com/warpnet/MS-RPC-Fuzzer)
|
||||
- [NtObjectManager PowerShell module](https://github.com/googleprojectzero/sandbox-attacksurface-analysis-tools/tree/master/NtObjectManager)
|
||||
|
||||
- [https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)
|
||||
- [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
|
||||
|
Loading…
x
Reference in New Issue
Block a user