Недавний выпуск PetitPotam от @topotam77 побудил меня вернуться к фаззингу Windows RPC. Я подумал, что было бы неплохо написать статью в блоге, рассказывающую о том, как можно влиться в эту область исследований.
RPC как цель для фаззинга?
Как вы знаете, RPC означает "Удалённый вызов процедур" и это не специфическая для Windows технология. Первые реализации RPC были представлены уже в UNIX-системах в восьмидесятых годах. Это позволило компьютерам общаться друг с другом по сети, и даже "использовалось как основа для сетевой файловой системы (NFS)" (источник: Wikipedia).
Реализация RPC, разработанная в Microsoft и используемая в Windows, называется DCE/RPC, что является сокращением от "Distributed Computing Environment / Remote Procedure Calls" (источник: Wikipedia). DCE/RPC - это лишь один из многих механизмов IPC (межпроцессных взаимодействий), используемых в Windows. Например, он используется для того, чтобы локальный процесс или даже удалённый клиент в сети мог взаимодействовать с другим процессом или службой на локальной или удалённой машине.
Как вы уже поняли, вопросы безопасности такого протокола особенно интересны. Уязвимости в сервере RPC могут иметь различные последствия, начиная от Отказа в обслуживании (DoS) до Удалённого выполнения кода (RCE), включая и Локальное повышение привилегий (LPE). В сочетании с тем, что код унаследованных RPC-серверов на Windows зачастую довольно старый (если исключить более современную модель DCOM), это делает его очень интересной целью для фаззинга.
Как фаззить Windows RPC?
Если говорить прямо, эта заметка не посвящена продвинутому и автоматизированному фаззингу. Другие, гораздо более талантливые люди нежели я, уже обсуждали эту тему. Скорее хочу показать как новичок может заняться подобным исследованием, не имея знаний в этой области.
Пентестеры используют Windows RPC каждый раз, когда работают в Windows/Active Directory с инструментами на базе impacket-утилит, возможно, не всегда полностью осознавая это. Использование Windows RPC, вероятно, стало более очевидным благодаря таким инструментам, как SpoolSample (он же "Printer Bug") от @tifkin_ или, в последствии, PetitPotam от @topotam77.
Если вы хотите узнать, как работают эти инструменты или хотите самостоятельно найти ошибки в Windows RPC, есть два основных подхода. Первый заключается в поиске интересных ключевых слов в документации и последующем экспериментировании путём модификации библиотеки impacket или написания RPC-клиента на C. Как объяснил @topotam77 в эпизоде 0x09 французского подкаста Hack'n Speak, этот подход был особенно эффективен при создании PetitPotam. Однако он имеет некоторые ограничения: главное из них заключается в том, что не все RPC-интерфейсы документированы, а существующая документация не всегда полная. Поэтому второй подход заключается в перечислении RPC-серверов непосредственно на машине с Windows с помощью такого инструмента, как RpcView.
RpcView
Если вы новичок в анализе RPC, то RpcView - лучший инструмент для начала работы. Он способен перечислить все RPC-серверы, запущенные на машине и представляет всю собранную информацию в виде симпатичного GUI. Когда вы ещё не знакомы с технической и/или абстрактной концепцией, возможность визуализировать всё таким образом является неоспоримым преимуществом.
Этот инструмент был первоначально разработан 4 французскими исследователями - Jean-Marie Borello, Julien Boutet, Jeremy Bouetard и Yoanne Girardin в 2017 году и до сих пор активно поддерживается. Его использование было продемонстрировано на PacSec 2017 в презентации A view into ALPC-RPC от Clément Rouault и Thomas Imbert. Эта презентация также сопровождалась инструментом RPCForge.
Загрузка и запуск RpcView в первый раз
Официальный репозиторий RpcView находится здесь: https://github.com/silverf0x/RpcView. После каждого коммита новый релиз автоматически собирается через AppVeyor. Таким образом вы всегда можете скачать последнюю версию здесь.
После распаковки 7z-архива вам нужно просто запустить RpcView.exe (лучше всего от имени администратора) и всё готово к работе. Однако если используемая вами версия Windows слишком свежая, вы получите ошибку, подобную приведённой ниже.
Согласно сообщению об ошибке, наша "версия среды выполнения" не поддерживается и мы должны отправить файл
Библиотека
Теперь, если мы посмотрим на файл README на GitHub, то увидим там раздел "Как добавить новую среду выполнения RPC". В нём говорится, что есть два способа решить эту проблему: первый - просто отредактировать файл
Компиляция RpcView
Мы видим, что наша среда выполнения RPC в настоящее время не поддерживается, поэтому нам придется обновить
1) Visual Studio 2019 (Community)
2) CMake >= 3.13.2
3) Qt5 == 5.15.2
Установка Visual Studio 2019
Вы можете скачать Visual Studio 2019 здесь или установить его с помощью Chocolatey.
В процессе работы вам также необходимо установить Windows SDK, он понадобится позже. Я использую следующий код PowerShell для поиска последней доступной версии SDK.
И устанавливаю его с помощью программы Chocolatey. Если вы хотите установить его вручную, вы также можете скачать веб-установщик здесь.
Как только Visual Studio будет установлена. Вам необходимо открыть "Visual Studio Installer".
И установить пакет "Desktop development with C++". Надеюсь, у вас надёжное подключение к Интернету и достаточно места на диске...
Установка CMake
Установка CMake проста - достаточно выполнить следующую команду с помощью Chocolatey. Но, опять же, вы можете скачать его с официального сайта и установить вручную.
Установка Qt
На момент написания статьи в README указано, что версия Qt, используемая проектом - 5.15.2. Настоятельно рекомендую использовать именно эту версию, иначе могут возникнуть проблемы в процессе компиляции.
Вопрос в том, как найти и скачать Qt версии 5 5.15.2? Вот тут всё становится несколько сложнее, потому что этот процесс несколько запутан. Во-первых, вам нужно зарегистрировать учётную запись здесь. Это позволит использовать их собственный веб-инсталлятор. Затем вам нужно загрузить программу установки здесь.
После запуска программы установки она предложит вам войти в систему под своей учётной записью.
После этого можете оставить всё по умолчанию. Однако на шаге "Select Components" убедитесь, что выбрали Qt 5.15.2 только для MSVC 2019 32 & 64 бит. Это уже 2,37 ГБ данных для загрузки, но если вы выберете всё - получится около 60 ГБ.
Если вам повезло, программа установки должна запуститься. Но если нет, вы столкнётесь с ошибкой, приведённой ниже. На момент написания статьи тикет был открыт на их трекере, но, похоже, они не спешат это исправлять.
Чтобы решить эту проблему, я написал быстрый и грязный сценарий PowerShell, который загружает все необходимые файлы непосредственно с ближайшего зеркала Qt. Возможно, это противоречит условиям использования, но что поделаешь! Я просто хочу сделать работу.
Если оставить все значения по-умолчанию, скрипт загрузит и извлечёт все необходимые файлы для Visual Studio 2019 (32 и 64 бита) в
Сборка RpcView
Мы готовы к работе. Однако не хватает последней детали: версии среды выполнения RPC. Когда я впервые попытался собрать RpcView из исходников, то был немного озадачен и не знал, какой номер версии должен быть. На самом деле всё очень просто (если знать, что делать...)
Вам просто нужно открыть свойства файла
Затем вы можете загрузить исходный код.
После этого мы должны отредактировать оба файла
Мы видим, что каждая версия представлена в виде longlong-значения. Например, версия 10.0.19041.1052 переводится как:
Если мы применим то же преобразование к номеру версии 10.0.19041.1081, то получим следующий результат.
Наконец, мы можем создать решение в Visual Studio и собрать его. Я покажу только процесс компиляции 64-битной версии, но если вы хотите скомпилировать 32-битную версию, вы можете обратиться к документации. В любом случае, процессы похожи.
Для следующих команд я предполагаю следующее:
- Qt установлен в
- CMake установлен в
- текущей рабочей директорией является папка с исходниками RpcView (например:
Кроме того, вы можете скачать последнюю версию с AppVeyor здесь, извлечь файлы и заменить
Если все прошло хорошо, RpcView наконец-то запустится!
Патчтинг RpcView
Если вы следили за происходящим, то, вероятно, заметили, что в итоге мы сделали всё это только для того, чтобы добавить числовое значение к двум библиотекам DLL. Конечно, есть более простой способ получить тот же результат. Мы можем просто исправить существующие DLL и заменить одно из существующих значений нашей собственной версией.
Для этого я открою обе DLL-библиотеки с помощью HxD. Мы знаем, что значение
Здесь нам просто нужно заменить значение
После сохранения файлов, RpcView должен быть готов к работе. Это грязный хак, но он работает. И это гораздо эффективнее, чем собирать проект из исходников!
Обновление: использование флага "force"
Как оказалось, вам даже не нужно проходить через все эти трудности. RpcView имеет недокументированный флаг командной строки
Честно говоря, я вообще не смотрел в код. Иначе наверняка увидел бы это. Урок усвоен. Спасибо @Cr0Eax за то, что обратил на это моё внимание. В любом случае, создание и исправление было хорошим испытанием, я думаю.
Начальная конфигурация
Теперь, когда RpcView запущен и работает, нам нужно немного настроить его, чтобы сделать пригодным для использования.
Частота обновления
Первое, что вы должны сделать - это снизить частоту обновления (особенно если вы запускаете его внутри виртуальной машины). Установите
Символы
На скриншоте ниже мы видим, что есть раздел, который должен перечислять все процедуры или функции, которые открыты через RPC-сервер. На самом деле он содержит только адреса.
Это не очень удобно, но есть одна замечательная особенность большинства исполняемых файлов Windows: Microsoft публикует связанные с ними PDB-файлы (Program DataBase).
Эти символы можно настроить через пункт меню Options > Configure Symbols. Здесь я установил значение
Единственная загвоздка заключается здесь в том, что RpcView (в отличие от других инструментов) не может автоматически загружать PDB-файлы. Поэтому нам необходимо загрузить их заранее.
Если вы загрузили Windows SDK, то этот шаг будет довольно прост. SDK включает инструмент под названием
После загрузки символов необходимо перезапустить RpcView. После этого вы должны увидеть, что имя каждой функции определено в разделе "Procedures".
Заключение
Этот пост уже длиннее, чем я предполагал, поэтому на этом закончу. Если вы новичок, то у вас уже есть все основы для начала работы. Основное преимущество инструмента на основе графического интерфейса заключается в том, что вы можете легко изучить и визуализировать некоторые внутренние компоненты и концепции, которые могут быть трудно понять в ином случае.
Если вам понравилась эта статья, не стесняйтесь сообщить мне в Twitter. Я лишь поверхностно остановился на этом, но это может стать началом серии статей, в которых я исследую Windows RPC. В следующей части объясню как взаимодействовать с сервером RPC. В частности, думаю, было бы неплохо использовать PetitPotam в качестве примера и показать как вы можете повторить это, основываясь на информации, которую вы получаете из RpcView.
---
Оригинал статьи: https://itm4n.github.io/fuzzing-windows-rpc-rpcview/
Переведено специально для xss.pro. Спасибо Azrv3l за наводку.
RPC как цель для фаззинга?
Как вы знаете, RPC означает "Удалённый вызов процедур" и это не специфическая для Windows технология. Первые реализации RPC были представлены уже в UNIX-системах в восьмидесятых годах. Это позволило компьютерам общаться друг с другом по сети, и даже "использовалось как основа для сетевой файловой системы (NFS)" (источник: Wikipedia).
Реализация RPC, разработанная в Microsoft и используемая в Windows, называется DCE/RPC, что является сокращением от "Distributed Computing Environment / Remote Procedure Calls" (источник: Wikipedia). DCE/RPC - это лишь один из многих механизмов IPC (межпроцессных взаимодействий), используемых в Windows. Например, он используется для того, чтобы локальный процесс или даже удалённый клиент в сети мог взаимодействовать с другим процессом или службой на локальной или удалённой машине.
Как вы уже поняли, вопросы безопасности такого протокола особенно интересны. Уязвимости в сервере RPC могут иметь различные последствия, начиная от Отказа в обслуживании (DoS) до Удалённого выполнения кода (RCE), включая и Локальное повышение привилегий (LPE). В сочетании с тем, что код унаследованных RPC-серверов на Windows зачастую довольно старый (если исключить более современную модель DCOM), это делает его очень интересной целью для фаззинга.
Как фаззить Windows RPC?
Если говорить прямо, эта заметка не посвящена продвинутому и автоматизированному фаззингу. Другие, гораздо более талантливые люди нежели я, уже обсуждали эту тему. Скорее хочу показать как новичок может заняться подобным исследованием, не имея знаний в этой области.
Пентестеры используют Windows RPC каждый раз, когда работают в Windows/Active Directory с инструментами на базе impacket-утилит, возможно, не всегда полностью осознавая это. Использование Windows RPC, вероятно, стало более очевидным благодаря таким инструментам, как SpoolSample (он же "Printer Bug") от @tifkin_ или, в последствии, PetitPotam от @topotam77.
Если вы хотите узнать, как работают эти инструменты или хотите самостоятельно найти ошибки в Windows RPC, есть два основных подхода. Первый заключается в поиске интересных ключевых слов в документации и последующем экспериментировании путём модификации библиотеки impacket или написания RPC-клиента на C. Как объяснил @topotam77 в эпизоде 0x09 французского подкаста Hack'n Speak, этот подход был особенно эффективен при создании PetitPotam. Однако он имеет некоторые ограничения: главное из них заключается в том, что не все RPC-интерфейсы документированы, а существующая документация не всегда полная. Поэтому второй подход заключается в перечислении RPC-серверов непосредственно на машине с Windows с помощью такого инструмента, как RpcView.
RpcView
Если вы новичок в анализе RPC, то RpcView - лучший инструмент для начала работы. Он способен перечислить все RPC-серверы, запущенные на машине и представляет всю собранную информацию в виде симпатичного GUI. Когда вы ещё не знакомы с технической и/или абстрактной концепцией, возможность визуализировать всё таким образом является неоспоримым преимуществом.
Скриншот взят с сайта https://rpcview.org/.
Этот инструмент был первоначально разработан 4 французскими исследователями - Jean-Marie Borello, Julien Boutet, Jeremy Bouetard и Yoanne Girardin в 2017 году и до сих пор активно поддерживается. Его использование было продемонстрировано на PacSec 2017 в презентации A view into ALPC-RPC от Clément Rouault и Thomas Imbert. Эта презентация также сопровождалась инструментом RPCForge.
Загрузка и запуск RpcView в первый раз
Официальный репозиторий RpcView находится здесь: https://github.com/silverf0x/RpcView. После каждого коммита новый релиз автоматически собирается через AppVeyor. Таким образом вы всегда можете скачать последнюю версию здесь.
После распаковки 7z-архива вам нужно просто запустить RpcView.exe (лучше всего от имени администратора) и всё готово к работе. Однако если используемая вами версия Windows слишком свежая, вы получите ошибку, подобную приведённой ниже.
Согласно сообщению об ошибке, наша "версия среды выполнения" не поддерживается и мы должны отправить файл
rpcrt4.dll команде разработчиков. Это сообщение может показаться немного загадочным для неофита, но беспокоиться не о чём, всё в полном порядке.Библиотека
rpcrt4.dll, как следует из её названия, буквально содержит "среду выполнения RPC". Другими словами, она содержит весь основной код, который позволяет RPC-клиенту и RPC-серверу взаимодействовать друг с другом.Теперь, если мы посмотрим на файл README на GitHub, то увидим там раздел "Как добавить новую среду выполнения RPC". В нём говорится, что есть два способа решить эту проблему: первый - просто отредактировать файл
RpcInternals.h и добавить нужную нам версию; второй - переделать rpcrt4.dll чтобы определить необходимые структуры (такие как RPC_SERVER). Реализация среды выполнения RPC меняется не так уж часто, поэтому первый вариант более подходит в нашем случае.Компиляция RpcView
Мы видим, что наша среда выполнения RPC в настоящее время не поддерживается, поэтому нам придется обновить
RpcInternals.h до нашей версии среды выполнения и собрать RpcView из исходников. Для этого нам понадобится следующее:1) Visual Studio 2019 (Community)
2) CMake >= 3.13.2
3) Qt5 == 5.15.2
Я настоятельно рекомендую использовать виртуальную машину для подобных установок. К вашему сведению, я также использую Chocolatey - менеджер пакетов Windows - для автоматизации установки некоторых инструментов (например, Visual Studio, инструменты GIT).
Установка Visual Studio 2019
Вы можете скачать Visual Studio 2019 здесь или установить его с помощью Chocolatey.
Код:
choco install visualstudio2019community
Код:
[string[]]$sdks = (choco search windbg | findstr "windows-sdk")
$sdk_latest = ($sdks | Sort-Object -Descending | Select -First 1).split(" ")[0]
Код:
choco install $sdk_latest
И установить пакет "Desktop development with C++". Надеюсь, у вас надёжное подключение к Интернету и достаточно места на диске...

Установка CMake
Установка CMake проста - достаточно выполнить следующую команду с помощью Chocolatey. Но, опять же, вы можете скачать его с официального сайта и установить вручную.
Код:
choco install cmake
CMake также является частью Visual Studio, но я никогда не пытался скомпилировать RpcView с помощью этой встроенной версии.
Установка Qt
На момент написания статьи в README указано, что версия Qt, используемая проектом - 5.15.2. Настоятельно рекомендую использовать именно эту версию, иначе могут возникнуть проблемы в процессе компиляции.
Вопрос в том, как найти и скачать Qt версии 5 5.15.2? Вот тут всё становится несколько сложнее, потому что этот процесс несколько запутан. Во-первых, вам нужно зарегистрировать учётную запись здесь. Это позволит использовать их собственный веб-инсталлятор. Затем вам нужно загрузить программу установки здесь.
После запуска программы установки она предложит вам войти в систему под своей учётной записью.
После этого можете оставить всё по умолчанию. Однако на шаге "Select Components" убедитесь, что выбрали Qt 5.15.2 только для MSVC 2019 32 & 64 бит. Это уже 2,37 ГБ данных для загрузки, но если вы выберете всё - получится около 60 ГБ.
Если вам повезло, программа установки должна запуститься. Но если нет, вы столкнётесь с ошибкой, приведённой ниже. На момент написания статьи тикет был открыт на их трекере, но, похоже, они не спешат это исправлять.
Чтобы решить эту проблему, я написал быстрый и грязный сценарий PowerShell, который загружает все необходимые файлы непосредственно с ближайшего зеркала Qt. Возможно, это противоречит условиям использования, но что поделаешь! Я просто хочу сделать работу.
Если оставить все значения по-умолчанию, скрипт загрузит и извлечёт все необходимые файлы для Visual Studio 2019 (32 и 64 бита) в
C:\Qt\5.15.2\.Убедитесь, что 7-Zip установлен перед запуском этого скрипта!
Код:
# Update these settings according to your needs but the default values should be just fine.
$DestinationFolder = "C:\Qt"
$QtVersion = "qt5_5152"
$Target = "msvc2019"
$BaseUrl = "https://download.qt.io/online/qtsdkrepository/windows_x86/desktop"
$7zipPath = "C:\Program Files\7-Zip\7z.exe"
# Store all the 7z archives in a Temp folder.
$TempFolder = Join-Path -Path $DestinationFolder -ChildPath "Temp"
$null = [System.IO.Directory]::CreateDirectory($TempFolder)
# Build the URLs for all the required components.
$AllUrls = @("$($BaseUrl)/tools_qtcreator", "$($BaseUrl)/$($QtVersion)_src_doc_examples", "$($BaseUrl)/$($QtVersion)")
# For each URL, retrieve and parse the "Updates.xml" file. This file contains all the information
# we need to dowload all the required files.
foreach ($Url in $AllUrls) {
$UpdateXmlUrl = "$($Url)/Updates.xml"
$UpdateXml = [xml](New-Object Net.WebClient).DownloadString($UpdateXmlUrl)
foreach ($PackageUpdate in $UpdateXml.GetElementsByTagName("PackageUpdate")) {
$DownloadableArchives = @()
if ($PackageUpdate.Name -like "*$($Target)*") {
$DownloadableArchives += $PackageUpdate.DownloadableArchives.Split(",") | ForEach-Object { $_.Trim() } | Where-Object { -not [string]::IsNullOrEmpty($_) }
}
$DownloadableArchives | Sort-Object -Unique | ForEach-Object {
$Filename = "$($PackageUpdate.Version)$($_)"
$TempFile = Join-Path -Path $TempFolder -ChildPath $Filename
$DownloadUrl = "$($Url)/$($PackageUpdate.Name)/$($Filename)"
if (Test-Path -Path $TempFile) {
Write-Host "File $($Filename) found in Temp folder!"
}
else {
Write-Host "Downloading $($Filename) ..."
(New-Object Net.WebClient).DownloadFile($DownloadUrl, $TempFile)
}
Write-Host "Extracting file $($Filename) ..."
&"$($7zipPath)" x -o"$($DestinationFolder)" $TempFile | Out-Null
}
}
}
Сборка RpcView
Мы готовы к работе. Однако не хватает последней детали: версии среды выполнения RPC. Когда я впервые попытался собрать RpcView из исходников, то был немного озадачен и не знал, какой номер версии должен быть. На самом деле всё очень просто (если знать, что делать...)
Вам просто нужно открыть свойства файла
C:\Windows\System32\rpcrt4.dll и посмотреть версию файла. В моём случае это 10.0.19041.1081.Затем вы можете загрузить исходный код.
Код:
git clone https://github.com/silverf0x/RpcView
После этого мы должны отредактировать оба файла
.\RpcView\RpcCore\RpcCore4_64bits\RpcInternals.h и .\RpcView\RpcCore\RpcCore4_32bits\RpcInternals.h. В начале находится статический массив, который содержит все поддерживаемые версии.
C++:
static UINT64 RPC_CORE_RUNTIME_VERSION[] = {
0x6000324D70000LL, //6.3.9431.0000
0x6000325804000LL, //6.3.9600.16384
...
0xA00004A6102EALL, //10.0.19041.746
0xA00004A61041CLL, //10.0.19041.1052
}
Код:
0xA00004A61041 = 0x000A (10) || 0x0000 (0) || 0x4A61 (19041) || 0x041C (1052)
C++:
static UINT64 RPC_CORE_RUNTIME_VERSION[] = {
0x6000324D70000LL, //6.3.9431.0000
0x6000325804000LL, //6.3.9600.16384
...
0xA00004A6102EALL, //10.0.19041.746
0xA00004A61041CLL, //10.0.19041.1052
0xA00004A610439LL, //10.0.19041.1081
}
Наконец, мы можем создать решение в Visual Studio и собрать его. Я покажу только процесс компиляции 64-битной версии, но если вы хотите скомпилировать 32-битную версию, вы можете обратиться к документации. В любом случае, процессы похожи.
Для следующих команд я предполагаю следующее:
- Qt установлен в
C:\Qt\5.15.2\.- CMake установлен в
C:\Program Files\CMake\.- текущей рабочей директорией является папка с исходниками RpcView (например:
C:\Users\lab-user\Downloads\RpcView\).
Код:
mkdir Build\x64
cd Build\x64
set CMAKE_PREFIX_PATH=C:\Qt\5.15.2\msvc2019_64\
"C:\Program Files\CMake\bin\cmake.exe" ../../ -A x64
"C:\Program Files\CMake\bin\cmake.exe" --build . --config Release
Кроме того, вы можете скачать последнюю версию с AppVeyor здесь, извлечь файлы и заменить
RpcCore4_64bits.dll и RpcCore4_32bits.dll на версии, которые были скомпилированы и скопированы в .\RpcView\Build\x64\bin\Release\.Если все прошло хорошо, RpcView наконец-то запустится!

Патчтинг RpcView
Если вы следили за происходящим, то, вероятно, заметили, что в итоге мы сделали всё это только для того, чтобы добавить числовое значение к двум библиотекам DLL. Конечно, есть более простой способ получить тот же результат. Мы можем просто исправить существующие DLL и заменить одно из существующих значений нашей собственной версией.
Для этого я открою обе DLL-библиотеки с помощью HxD. Мы знаем, что значение
0xA00004A61041C присутствует в обоих файлах, поэтому можем поискать его. Значения хранятся с использованием little-endian упорядочивания байтов, поэтому на самом деле нам придется искать шестнадцатеричный шаблон 1C04614A00000A00.
Здесь нам просто нужно заменить значение
1C04 (0x041C = 1052) на 3904 (0x0439 = 1081), потому что остальная часть номера версии такая же (10.0.19041).После сохранения файлов, RpcView должен быть готов к работе. Это грязный хак, но он работает. И это гораздо эффективнее, чем собирать проект из исходников!
Обновление: использование флага "force"
Как оказалось, вам даже не нужно проходить через все эти трудности. RpcView имеет недокументированный флаг командной строки
/force, который можно использовать для отмены проверки версии RPC во время выполнения.
Код:
.\RpcView64\RpcView.exe /force
Честно говоря, я вообще не смотрел в код. Иначе наверняка увидел бы это. Урок усвоен. Спасибо @Cr0Eax за то, что обратил на это моё внимание. В любом случае, создание и исправление было хорошим испытанием, я думаю.
Начальная конфигурация
Теперь, когда RpcView запущен и работает, нам нужно немного настроить его, чтобы сделать пригодным для использования.
Частота обновления
Первое, что вы должны сделать - это снизить частоту обновления (особенно если вы запускаете его внутри виртуальной машины). Установите
10 секунд - вполне нормально. Вы даже можете установить этот параметр на "manual".
Символы
На скриншоте ниже мы видим, что есть раздел, который должен перечислять все процедуры или функции, которые открыты через RPC-сервер. На самом деле он содержит только адреса.
Это не очень удобно, но есть одна замечательная особенность большинства исполняемых файлов Windows: Microsoft публикует связанные с ними PDB-файлы (Program DataBase).
Эти символы можно настроить через пункт меню Options > Configure Symbols. Здесь я установил значение
srv*C:\SYMBOLS.
Единственная загвоздка заключается здесь в том, что RpcView (в отличие от других инструментов) не может автоматически загружать PDB-файлы. Поэтому нам необходимо загрузить их заранее.
Если вы загрузили Windows SDK, то этот шаг будет довольно прост. SDK включает инструмент под названием
symchk.exe, который позволяет получить PDB-файлы практически для любого EXE или DLL непосредственно с серверов Microsoft. Например, следующая команда позволяет загрузить символы для всех DLL в C:\Windows\System32\.
Код:
cd "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\"
symchk /s srv*c:\SYMBOLS*https://msdl.microsoft.com/download/symbols C:\Windows\System32\*.dll
После загрузки символов необходимо перезапустить RpcView. После этого вы должны увидеть, что имя каждой функции определено в разделе "Procedures".
Заключение
Этот пост уже длиннее, чем я предполагал, поэтому на этом закончу. Если вы новичок, то у вас уже есть все основы для начала работы. Основное преимущество инструмента на основе графического интерфейса заключается в том, что вы можете легко изучить и визуализировать некоторые внутренние компоненты и концепции, которые могут быть трудно понять в ином случае.
Если вам понравилась эта статья, не стесняйтесь сообщить мне в Twitter. Я лишь поверхностно остановился на этом, но это может стать началом серии статей, в которых я исследую Windows RPC. В следующей части объясню как взаимодействовать с сервером RPC. В частности, думаю, было бы неплохо использовать PetitPotam в качестве примера и показать как вы можете повторить это, основываясь на информации, которую вы получаете из RpcView.
---
Оригинал статьи: https://itm4n.github.io/fuzzing-windows-rpc-rpcview/
Переведено специально для xss.pro. Спасибо Azrv3l за наводку.