воскресенье, 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 интерфейсы ?

5 комментариев:

  1. Получается, что один только я как мудак писал тулзу, которая путём анализа кода ищет и сканирует неэкспортируемые/недокументированные списки в rpcrt4.dll?

    ОтветитьУдалить
  2. ммм, мне ж плохо видно для каких целей она была написана :-). Кстати что она умеет делать ?

    Но вообще рекомендуется сначала читать документацию (например все вышеописанное было найдено за пару часов неспешного гугления), а потом можно краем глаза посмотреть чего линуксоиды намутили - в данном случае в samba тоже есть кое-что полезное (клиенты ко всяким мало-документированным rpc интерфейсам например там есть точно). Дизассемблер запускать никогда не поздно :-). Например еще в windbg есть plugin rpcexts.dll

    ОтветитьУдалить
  3. Тулза сейчас умеет:
    - Собственно, получать список всех интерфейсов.
    - Получать список методов для каждого интерфейса.
    - Декомпилировать MIDL с целью извлечения из него прототипа метода и пр. информации.
    - На основе полученной инфы автоматически генерировать код DLL-библиотеки для перехвата произвольных методов (патчинг адресов в MIDL_SERVER_INFO.DispatchTable).
    - В реальном времени мониторить регистрацию rpc-интерфейсов в контексте всех процессов и перехватывать нужные используя в качестве хендлеров сгенерированные DLL-ки.

    Я её планировал выложить вместе с 3-м nobunkum-ом как дополнение к небольшой статье про реверсинг приложений использующих rpc, но т.к. он получился полностью про малвари - пойдёт в 4-й номер.

    ОтветитьУдалить
  4. богато
    midl умеет декомпилить ida plugin mIDA, правда он без сорцов поставляется и 32bit only

    Полагаю что перехват регистрации осуществляется сплайсингом RpcServerRegisterIf[2|Ex] ?

    Выкладывай, с интересом заценю. Когда 4ый номер будет готов ? Про буткиты отличная статья в 3ем была

    ОтветитьУдалить
  5. Ага, про mIDA знаю/пользуюсь. Моя тулза, кстати, пока что тоже x32 only, но её портирование под x64 не должно стать большой проблемой: переписать код перехвата API и пересобрать.

    Да, перехват регистрации осуществляется через сплайсинг RpcServerRegisterIf[2|Ex] и RpcServerUseProtseq[Ex|Ep|If|IfEx] до кучи.

    Номер выйдет как обычно - "when it's done". Материалы для нескольких статей уже есть, но другие авторы пока что не очень шевелятся.

    ОтветитьУдалить