Показаны сообщения с ярлыком rpc. Показать все сообщения
Показаны сообщения с ярлыком rpc. Показать все сообщения

вторник, 7 ноября 2017 г.

rpcrt4 security providers

Count of loaded providers stored in rpcrt4!LoadedProviders and list in rpcrt4!ProviderList
Structure of each provider can be partially recovered from function FindSecurityPackage:
struct _rpc_loaded_provider
{
  DWORD unk1;
  PVOID unk2;
  PSecurityFunctionTable table; 
  PVOID unk3;
  PVOID unk4;
}; // size of struct 0x14 for x86 and 0x28 for x64


It's interesting that the function of InitSecurityFunctionTable patches the contents of SECURITY_FUNCTION_TABLE. Sample of output from w8.1:

четверг, 2 ноября 2017 г.

how to find rpcrt4!GlobalRpcServer

I looked through sources of rpcview and found that they used some kind of brute-force in file RpcCore.c in function GetRpcServerAddressInProcess. It looks very strange and slow - they already has some code for pdb reading, so why not just ask address of ?GlobalRpcServer@@3PEAVRPC_SERVER@@EA ?

Anyway there is better way. Lets run my exref.pl in IDA Pro on rpcrt4.dll from windows 10 build 16278:
_I_RpcServerUseProtseq2W@20: 4EFACEB0 addr 4EFACEED
_RpcServerInqBindings@4: 4EFADA90 addr 4EFADAAC
_RpcServerRegisterIfEx@24: 4EFADCB0 addr 4EFADCCC
_RpcMgmtIsServerListening@4: 4EFAE470 addr 4EFAE48D
_RpcServerInterfaceGroupActivate@4: 4EFAE5B0 addr 4EFAE5C2
_RpcServerInterfaceGroupDeactivate@8: 4EFAE5E0 addr 4EFAE5F2
_I_RpcServerUseProtseqEp2W@24: 4EFB33E0 addr 4EFB33FF
_RpcServerUnregisterIf@12: 4EFB50B0 addr 4EFB50C5
_RpcServerRegisterIf3@32: 4EFB51F0 addr 4EFB5222
_RpcServerRegisterIf2@28: 4EFDFF40 addr 4EFDFF5C
_RpcServerInqBindingsEx@8: 4EFE0080 addr 4EFE0098
_RpcServerRegisterIf@12: 4EFE02E0 addr 4EFE02F5
_I_RpcServerRegisterForwardFunction@4: 4EFE03E0 addr 4EFE03F2
_RpcServerInterfaceGroupInqBindings@8: 4F0070D0 addr 4F0070E7
_RpcServerUseAllProtseqsEx@12: 4F007150 addr 4F00722C


wow, it seems that this will be easy
Lets look at exported function I_RpcServerRegisterForwardFunction:

понедельник, 3 ноября 2014 г.

w10tp kernel mode RPC

From the time of windows 8 there are yet new several drivers using kernel-mode rpc:
  • CEA.sys - "Event Aggregation Kernel Mode Library". Use interface D09BDEB5-6171-4A34-BFE2-06FA82652568 from BrokerLib.dll
  • fastfat.sys - use interface 04EEB297-CBF4-466B-8A2A-BFD6A2F10BBA from efssvc.dll
  • wfplwfs.sys - "WFP NDIS 6.30 Lightweight Filter Driver". Use interface C605F9FB-F0A3-4E2A-A073-73560F8D9E3E from bisrv.dll

пятница, 7 октября 2011 г.

w8 kernel mode RPC

я тут писал уже как-то про msrpc например
А теперь дискотека список драйверов от windows 8 и используемые ими RPC interfaces

afd.sys - использует 30ADC50C-5CBC-46CE-9A0E-91914789E23C
appid.sys - использует 8A7B5006-CC13-11DB-9705-005056C00008
dfsc.sys - использует 7F1343FE-50A9-4927-A778-0C5859517BAC
FWPKCLNT.SYS - использует 2 интерфейса:
  1. IkeRpcIKE A398E520-D59A-4BDD-AA7A-3C1E0303A511
  2. BfeRpcBFE DD490425-5325-4565-B774-7E27D6C09C24
ksecdd.sys - использует 4F32ADC8-6052-4A04-8701-293CCF2096F0
mrxsmb.sys - использует F2C9B409-C1C9-4100-8639-D8AB1486694A
netio.sys - использует 2 интерфейса:
  1. WinNsi 7EA70BCF-48AF-4F6A-8968-6A440754D5FA
  2. BiSrvSigna C605F9FB-F0A3-4E2A-A073-73560F8D9E3E
ntfs.sys - использует 04EEB297-CBF4-466B-8A2A-BFD6A2F10BBA
srvnet.sys - использует 3 интерфейса:
  1. XactSrvRPC 98716D03-89AC-44C7-BB8C-285824E51C4A
  2. IdSegSrv 1A0D010F-1C33-432C-B0F5-8CF4E8053099
  3. и один неопознанный 9D5F40FF-F1C2-4394-8671-9E56427FCD70. Используется впрочем единственный метод NotifyGroveler
tunnel.sys - использует 6F201A55-A24D-495F-AAC9-2F4FCE34DF99

суббота, 16 апреля 2011 г.

I_RpcInitNdrImports

а вот например в windows7 появилась в rpcrt4 такая любопытная ф-ция
Любопытна она тем, что вместе с I_RpcInitImports, I_RpcInitFwImports & I_RpcInitHttpImports возвращает некие таблицы с указателями на функции, причем в отличие от перечисленных возвращаемая таблица NdrPrivateCallbackTable расположена в секции .data, что делает ее хорошим кандидатом для установки разнообразных беспалевных хуков

Вызывается I_RpcInitNdrImports из ровно одного модуля - ole32.dll - в ф-ции NdrOleInitializeImports, которая в свою очередь вызывается из DllMain & NdrOleInitializeExtension

Возвращаемая структура выглядит примерно так (мне лениво прототипы функций выяснять, потому они описаны как PBYTE):

вторник, 12 апреля 2011 г.

rpc extensions

А вот например начиная с w7 rpcrt4.dll (и RpcEpMap.dll) при инициализации проверяют ключики реестра HKLM Software\Microsoft\Rpc\Extensions
И соотв-но строковые значения в этом ключе используются для загрузки .dll и последующего вызова из той .dll ф-ции I_RpcExtInitializeExtensionPoint (кроме ole32.dll)
Насколько я понял новые extensions туда вписать не получится, но например у уже имеющихся вполне спокойно можно изменить имя .dll и таким образом обеспечить inject во все процессы, использующие rpc
Значения по умолчанию:
  • NdrOleExtDll - Ole32.dll, точка входа NdrOleInitializeExtension
  • RemoteRpcDll - RpcRtRemote.dll
  • TrustRidDll - logoncli.dll

суббота, 6 ноября 2010 г.

vista sp2 & windows7 RPC interfaces

как самые прозорливые могли давно догадаться, многочисленные предыдущие простыни публиковались не просто так, а как запчасти к некоей более полной картине ужасного и страшного мира

Disclaimer

Есс-но все нижеописанное не является абсолютно полным и исчерпывающим списком всех возможных RPC интерфейсов windows. Соотв-но автор категорически не желает нести ответственность за допущенные неточности, ковырять неописанные интерфейсы, а также исправлять найденные ошибки и проч. и проч.
И вообще обновление данного списочка будет зависеть от вашего поведения например не менее 666 комментов и количества выпитого автором поить лучше всего Chivas Brothers Strathisla

Как эти данные были получены

Были взяты 2 свежепоставленные версии windows, а именно
  • vista ultimate sp2 32bit
  • windows7 home premium 32bit
на которых была запущена некая самописная тулза на основе rpcdump, но еще она умеет показывать процесс-владелец RPC endpoint (LPC порт, named pipe или сокет). Соотв-но так были получены списки rpc интерфейсов с их IID. Тулза непубличная и я вам ее не дам потому что вы все равно свиньи неблагодарные я вам ничего не должен например.
Далее на основе этих списков была запущена другая тулза (не менее непубличная), которая пыталась найти модуль, ответственный за регистрацию каждого из ранее найденных rpc интерфейсов. Поскольку она наверняка дико глючит и регулярно слушает радио радонеж, то модули нашлись далеко не все.
Далее был написан на perl crawler, который пытался через google найти описание найденных rpc интерфейсов - это было совершенно бесполезно, потому что кроме французов с http://www.hsc.fr/ressources/articles/win_net_srv/index.html эта тема похоже больше никем в этих ваших инторнетах не освещалась
Соотв-но для сборки всего вышеперечисленного был написан еще один perl script, которым уже и был сгенерирован

список

среда, 27 октября 2010 г.

rpcdump bug

нашел давеча в rpcdump баг - утечку памяти и ресурсов
Граждане не вызывают RpcMgmtEpEltInqDone после RpcMgmtEpEltInqBegin как советует документация.
Так что при запуске в отдельном быстро дохнущем процессе оно незаметно, но если тот же код скопипастить в свой сервис, который дергает опрос rpc интерфейсов периодически, то через некоторое время почувствуете легкое недомогание будет заметна утечка памяти

понедельник, 18 октября 2010 г.

ncalrpc interfaces under vista

а меж тем моя тулза для обнюхивания RPC интерфейсов практически работает и выдает под vista 32бита примерно следующее

пятница, 15 октября 2010 г.

port & alpc port owners

Я тут уже писал как можно получить список локальных RPC портов.В этом способе нет абсолютно ничего примечательного - через NtOpenDirectoryObject открываем директорию L"\\RPC control" и читаем с помощью NtQueryDirectoryObject пока не вернется STATUS_NO_MORE_ENTRIES.
Но еще хотелось бы иметь PID процесса-владельца этих ресурсов. Чтение доки не особо помогло - например есть такая официальная функция nt api ZwQueryInformationPort, которая имеет ровно один более чем бессмысленный classinfo PORT_INFORMATION_CLASS
Пришлось как обычно кряхтя слазить с печи и делать все самому

пятница, 8 октября 2010 г.

rpcss under windows 7

А вот например список rpc интерфейсов, которые регистрирует rpcss.dll под windows7:
  • IActivationKernel {9B8699AE-0E44-47B1-8E7F-86A461D7ECDC}
  • ILocalObjectExporter {E60C73E6-88F9-11CF-9AF1-0020AF6E72F4}
  • IOXIDResolver {99FCFEC4-5260-101B-BBCB-00AA0021347A}
  • ISCM {412F241E-C12A-11CE-ABFF-0020AF6E7A17}
  • ISCMActivator {00000136-0000-0000-C000-000000000046}
  • IMachineActivatorControl {C6F3EE72-CE7E-11D1-B71E-00C04FC3111A}
  • IRemoteActivation {4D9F4AB8-7D1C-11CF-861E-0020AF6E7C57}
  • ISystemActivator {000001A0-0000-0000-C000-000000000046}
  • IROT {B9E79E60-3D52-11CE-AAA1-00006901293F}
А epmp {e1af8308-5d1f-11c9-91a4-08002b14a0fa} и localepmp {0b0a6584-9e0f-11cf-a3cf-00805f68cb1b} там и нету. Начинаю испытывать легкое беспокойство

Update: под windows7 epmp, localepmp и DbgIdl живут в модуле RpcEpMap.dll

windbg & rpc

наткнулся тут давеча на очередной высер пыщъха - якобы windbg можно использовать как RPC monitor. Проверить изложенное проще простого:
!load rpcexts
!getendpointinfo
Searching for endpoint info ...
OpenRPCDebugEndpointInfoEnumeration failed: 1734
!listcalls
RPC_SERVER at 0x15c980
&RpcAddressDictionary(RPC_SIMPLE_DICT) - 0x15c980
Unable to get field cDictSize of type SIMPLE_DICT at 0x15c980
Более того - ровно то же самое windbg выдает на vista checked build.
Интересно он вообще проверяет хоть что-нть в своих обширных простынях, описывающих поток нездорового сознания ? Никогда не пытайтесь использовать русскоязычное мычание странных персонажей - всегда нужно сверяться с более правильными источниками

понедельник, 4 октября 2010 г.

RPC servers hijack

Внезапно придумал тут предельно простой и наверняка дико баянистый способ зная UUID RPC интерфейса найти его DispatchTable с адресами функций и сделать с ними всякое.
Для начала давайте внимательно посмотрим на прототип функции RpcServerRegisterIf2

ept_lookup

я тут все выходные бухал и гадил в комментах ломал голову над одним простым вопросом - вот например у нас есть GUID RPC интерфейса и мы хотим подключиться по сети к некоей машине, на которой как мы считаем есть этот RPC сервер. Через какой именно механизм мы сможем найти порт/транспорт, куда нужно дико ломиться например ?
Посему выходные были безнадежно испорчены проведены в отладчике и дизассемблере, зато теперь я в общих чертах знаю ответ но вам не скажу - через загадочный сервис rpcss, который сама MS в целях конспирации называет почему-то "Distributed COM Services" (так в version info rpcss.dll написано, ага)
Итого механизм примерно такой - rpcss.dll слушает named pipe с именем epmapper (рекомендую погуглить - результаты феерические), на котором висит интерфейс Endpoint Mapper
Дальше дело техники и опыта, по крайней мере теперь известно в каком модуле и примерно куда можно ставить грязные хуки и все такое. С другой стороны эту IFObjList извлечь стат. анализом весьма непросто будет
Насколько я понял в той же rpcss.dll живет и другая полезная штука - Running Object Table

Дичайше поражает в механизме RPC практически полное отсутствие документации - например интерфейс Endpoint Mapper якобы описан в некоей книге DCE 1.1: Remote Procedure Call, которую якобы можно скачать нахаляву, но при этом требуют номер телефона и вообще слишком много персональных данных.
Руссинович в своем 5ом издании (в 3ем впрочем тоже) посвятил RPC целых 5 (!) страниц и ровно 2 картинки. А власти скрывают !

Самое угарное что при регистрации этого интерфейса в rpcss перед вызовом стандартной RpcServerRegisterIf2 вызывается некая традиционно недокументированная функция I_RpcSystemFunction001, бгг

вторник, 28 сентября 2010 г.

msrpc.sys exports

А вот например начиная с vista  rpc еще и в ядре живет в драйвере msrpc.sys
Список драйверов на чистой windows 7, имеющих в своем импорте ссылки на msrpc:
  • afd.sys
  • appid.sys
  • fwpkclnt.sys
  • ksecdd.sys
  • netio.sys
  • ntfs.sys
  • srvnet.sys
  • tcpip.sys
  • tunnel.sys
На висте правда список значительно скромнее:
  • fwpkclnt.sys
  • netio.sys
  • tcpip.sys
Собственно сами экспортируемые символы (они одинаковы на vista, vista sp2 & w7, так что в одну табличку все свел и отличаются они только битностью)

воскресенье, 26 сентября 2010 г.

RPC enumeration

Поскольку в ответ на критическую заметку про ловлю stuxnet мне кинули предъяву в духе "а ты кто такой и сам ловить RPC интерфейсы не умеешь", то пришлось озаботиться данным вопросом
Гугл сказал мне что технология для rpc interfaces enumeration уже 9 лет как известна - rpctools
Используются при этом три вещи:
  • список зарегистрированных в системе rpc ports, который можно посмотреть например в WinObj в директории \RPC Control
  • совершенно официальная функция RpcMgmtInqIfIds из RPCRT4.dll
  • пара не менее официальных функций RpcMgmtEpEltInqBegin & RpcMgmtEpEltInqNext
Далее берется список well known ms rpc named pipes и можно найти интерфейсы, которых на чистой машине быть не должно

Процесс можно автоматизировать даже, я думаю - написать к тому же perlу xs модуль для выгребания имен портов из \RPC Control (через ф-ции NtOpenDirectoryObject & NtQueryDirectoryObject) и вызывать ifids.exe для всех из них. Можно также запросить в каких процессах эти порты открыты (Process Explorer так умеет делать например)

Возвращаясь к исходному вопросу - какой онтевирус умеет проверять зарегистрированные в системе RPC интерфейсы ?