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
c684fb0629
commit
ed645fa5c1
@ -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
|
||||
@ -83,9 +83,65 @@ rpcdump.py <IP> -p 135
|
||||
|
||||
[rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools)의 **rpcdump.exe**는 이 포트와 상호작용할 수 있습니다.
|
||||
|
||||
## MSRPC 인터페이스의 자동 퍼징
|
||||
|
||||
MS-RPC 인터페이스는 크고 종종 문서화되지 않은 공격 표면을 노출합니다. 오픈 소스 [MS-RPC-Fuzzer](https://github.com/warpnet/MS-RPC-Fuzzer) PowerShell 모듈은 James Forshaw의 `NtObjectManager`를 기반으로 하여 *동적으로* Windows 바이너리에 이미 존재하는 인터페이스 메타데이터에서 RPC 클라이언트 스텁을 생성합니다. 스텁이 존재하면 모듈은 변형된 입력으로 각 프로시저를 폭격하고 결과를 기록하여 **IDL을 한 줄도 작성하지 않고 RPC 엔드포인트의 재현 가능한 대규모 퍼징을 가능하게 합니다.**
|
||||
|
||||
### 1. 인터페이스 목록 작성
|
||||
```powershell
|
||||
# Import the module (download / git clone first)
|
||||
Import-Module .\MS-RPC-Fuzzer.psm1
|
||||
|
||||
# Parse a single binary
|
||||
Get-RpcServerData -Target "C:\Windows\System32\efssvc.dll" -OutPath .\output
|
||||
|
||||
# Or crawl the whole %SystemRoot%\System32 directory
|
||||
Get-RpcServerData -OutPath .\output
|
||||
```
|
||||
`Get-RpcServerData`는 UUID, 버전, 바인딩 문자열(명명된 파이프 / TCP / HTTP) 및 **모든 인터페이스에 대한 전체 프로시저 프로토타입**을 추출하여 `rpcServerData.json`에 저장합니다.
|
||||
|
||||
### 2. 퍼저 실행
|
||||
```powershell
|
||||
'.\output\rpcServerData.json' |
|
||||
Invoke-RpcFuzzer -OutPath .\output `
|
||||
-MinStrLen 100 -MaxStrLen 1000 `
|
||||
-MinIntSize 9999 -MaxIntSize 99999
|
||||
```
|
||||
관련 옵션:
|
||||
|
||||
* `-MinStrLen` / `-MaxStrLen` – 생성된 문자열의 크기 범위
|
||||
* `-MinIntSize` / `-MaxIntSize` – 변형된 정수의 값 범위 (오버플로우 테스트에 유용)
|
||||
* `-Sorted` – **매개변수 의존성**을 존중하는 순서로 절차를 실행하여 한 호출의 출력이 다음 호출의 입력으로 사용될 수 있도록 함 (도달 가능한 경로를 극적으로 증가시킴)
|
||||
|
||||
퍼저는 2가지 전략을 구현합니다:
|
||||
|
||||
1. **기본 퍼저** – 무작위 원시 값 + 복합 유형에 대한 기본 인스턴스
|
||||
2. **정렬된 퍼저** – 의존성 인식 정렬 (참조: `docs/Procedure dependency design.md`)
|
||||
|
||||
모든 호출은 `log.txt`에 원자적으로 기록됩니다; 충돌 후 **마지막 줄은 즉시 문제를 일으킨 절차를 알려줍니다**. 각 호출의 결과는 세 개의 JSON 파일로 분류됩니다:
|
||||
|
||||
* `allowed.json` – 호출이 성공하고 데이터를 반환함
|
||||
* `denied.json` – 서버가 *Access Denied*로 응답함
|
||||
* `error.json` – 기타 오류 / 충돌
|
||||
|
||||
### 3. Neo4j로 시각화하기
|
||||
```powershell
|
||||
'.\output\allowed.json' |
|
||||
Import-DataToNeo4j -Neo4jHost 192.168.56.10:7474 -Neo4jUsername neo4j
|
||||
```
|
||||
`Import-DataToNeo4j`는 JSON 아티팩트를 그래프 구조로 변환합니다:
|
||||
|
||||
* RPC 서버, 인터페이스 및 프로시저는 **노드**입니다.
|
||||
* 상호작용(`ALLOWED`, `DENIED`, `ERROR`)은 **관계**입니다.
|
||||
|
||||
Cypher 쿼리를 사용하여 위험한 프로시저를 빠르게 찾아내거나 충돌 이전의 정확한 호출 체인을 재생할 수 있습니다.
|
||||
|
||||
⚠️ 퍼저는 *파괴적*입니다: 서비스 충돌 및 BSOD를 예상하십시오 – 항상 격리된 VM 스냅샷에서 실행하십시오.
|
||||
|
||||
|
||||
### 자동화된 인터페이스 열거 및 동적 클라이언트 생성 (NtObjectManager)
|
||||
|
||||
PowerShell 전문가 **James Forshaw**는 오픈 소스 *NtObjectManager* 모듈 내에서 대부분의 Windows RPC 내부를 노출했습니다. 이를 사용하면 IDL, MIDL 또는 수동 언마샬링 없이 몇 초 만에 모든 RPC 서버 DLL / EXE를 **완전한 기능의 클라이언트 스텁**으로 변환할 수 있습니다.
|
||||
PowerShell 전문가 **James Forshaw**는 오픈 소스 *NtObjectManager* 모듈 내에서 대부분의 Windows RPC 내부를 공개했습니다. 이를 사용하면 IDL, MIDL 또는 수동 언마샬링 없이 몇 초 만에 모든 RPC 서버 DLL / EXE를 **완전한 기능을 갖춘 클라이언트 스텁**으로 변환할 수 있습니다.
|
||||
```powershell
|
||||
# Install the module once
|
||||
Install-Module NtObjectManager -Force
|
||||
@ -110,7 +166,7 @@ public int EfsRpcOpenFileRaw(out Marshal.NdrContextHandle ctx, string FileName,
|
||||
// marshals parameters & calls opnum 0
|
||||
}
|
||||
```
|
||||
PowerShell 도우미 `Get-RpcClient`는 **대화형 클라이언트 객체**를 생성하여 절차를 즉시 호출할 수 있습니다:
|
||||
PowerShell 도우미 `Get-RpcClient`는 **대화형 클라이언트 객체**를 생성할 수 있어 즉시 프로시저를 호출할 수 있습니다:
|
||||
```powershell
|
||||
$client = Get-RpcClient $rpcinterfaces[0]
|
||||
Connect-RpcClient $client -stringbinding 'ncacn_np:127.0.0.1[\\pipe\\efsrpc]' `
|
||||
@ -123,20 +179,18 @@ $client.EfsRpcOpenFileRaw([ref]$ctx, "\\\127.0.0.1\test", 0)
|
||||
```
|
||||
인증(Kerberos / NTLM) 및 암호화 수준(`PacketIntegrity`, `PacketPrivacy`, …)은 `Connect-RpcClient` cmdlet을 통해 직접 제공될 수 있습니다 – 이는 고급 권한 명명된 파이프를 보호하는 **보안 설명자**를 우회하는 데 이상적입니다.
|
||||
|
||||
---
|
||||
|
||||
### 컨텍스트 인식 RPC 퍼징 (MS-RPC-Fuzzer)
|
||||
|
||||
정적 인터페이스 지식은 훌륭하지만, 진정으로 원하는 것은 *컨텍스트 핸들*과 복잡한 매개변수 체인을 이해하는 **커버리지 기반 퍼징**입니다. 오픈 소스 **MS-RPC-Fuzzer** 프로젝트는 바로 그 워크플로우를 자동화합니다:
|
||||
정적 인터페이스 지식은 훌륭하지만, 실제로 원하는 것은 *컨텍스트 핸들*과 복잡한 매개변수 체인을 이해하는 **커버리지 기반 퍼징**입니다. 오픈 소스 **MS-RPC-Fuzzer** 프로젝트는 바로 그 워크플로우를 자동화합니다:
|
||||
|
||||
1. 대상 바이너리(`Get-RpcServer`)에 의해 내보내진 모든 인터페이스/절차를 열거합니다.
|
||||
1. 대상 바이너리에서 내보낸 모든 인터페이스/프로시저를 열거합니다(`Get-RpcServer`).
|
||||
2. 각 인터페이스에 대한 동적 클라이언트를 생성합니다(`Format-RpcClient`).
|
||||
3. 원래 **NDR 유형**을 존중하면서 입력 매개변수(넓은 문자열 길이, 정수 범위, 열거형)를 무작위화합니다.
|
||||
4. 한 호출에 의해 반환된 *컨텍스트 핸들*을 추적하여 후속 절차에 자동으로 공급합니다.
|
||||
3. 원래 **NDR 유형**을 존중하면서 입력 매개변수(와이드 문자열 길이, 정수 범위, 열거형)를 무작위화합니다.
|
||||
4. 한 호출에서 반환된 *컨텍스트 핸들*을 추적하여 후속 프로시저에 자동으로 공급합니다.
|
||||
5. 선택한 전송(ALPC, TCP, HTTP 또는 명명된 파이프)에 대해 대량 호출을 실행합니다.
|
||||
6. 종료 상태/결함/타임아웃을 기록하고 *인터페이스 → 절차 → 매개변수* 관계 및 충돌 클러스터를 시각화하기 위해 **Neo4j** 가져오기 파일을 내보냅니다.
|
||||
6. 종료 상태/오류/타임아웃을 기록하고 *인터페이스 → 프로시저 → 매개변수* 관계 및 충돌 클러스터를 시각화하기 위해 **Neo4j** 가져오기 파일을 내보냅니다.
|
||||
|
||||
예시 실행(명명된 파이프 대상):
|
||||
예제 실행(명명된 파이프 대상):
|
||||
```powershell
|
||||
Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
|
||||
-MinLen 1 -MaxLen 0x400 `
|
||||
@ -147,16 +201,15 @@ Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
|
||||
|
||||
> ⚠️ 많은 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/)
|
||||
- [https://0xffsec.com/handbook/services/msrpc/](https://0xffsec.com/handbook/services/msrpc/)
|
||||
- [MS-RPC-Fuzzer (GitHub)](https://github.com/warpnet/MS-RPC-Fuzzer)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user