macOS .Net Applications Injection
Це краткий огляд публікації https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Перевірте його для отримання додаткових деталей!
Відлагодження .NET Core
Встановлення сеансу відлагодження
Обробка комунікації між відлагоджувачем та відлагоджуваним в .NET керується dbgtransportsession.cpp. Цей компонент налаштовує два іменовані канали для кожного процесу .NET, як показано в dbgtransportsession.cpp#L127, які ініціюються через twowaypipe.cpp#L27. Ці канали мають суфікси -in
та -out
.
Відвідавши $TMPDIR
користувача, можна знайти доступні для відлагодження FIFO для додатків .Net.
DbgTransportSession::TransportWorker відповідає за управління комунікацією від відлагоджувача. Для ініціювання нового сеансу відлагодження відлагоджувач повинен надіслати повідомлення через канал out
, починаючи з структури MessageHeader
, детально описаної в вихідному коді .NET:
Для запиту нової сесії ця структура заповнюється наступним чином, встановлюючи тип повідомлення на MT_SessionRequest
та версію протоколу на поточну версію:
Цей заголовок потім надсилається на цільовий об'єкт за допомогою системного виклику write
, за яким слідує структура sessionRequestData
, що містить GUID для сеансу:
Операція читання на каналі out
підтверджує успішне або невдачне встановлення сеансу налагодження:
Читання пам'яті
Після встановлення сеансу налагодження, пам'ять можна читати за допомогою типу повідомлення MT_ReadMemory
. Функція readMemory детально описана, виконуючи необхідні кроки для відправлення запиту на читання та отримання відповіді:
Повний доказ концепції (POC) доступний тут.
Запис у пам'ять
Аналогічно, пам'ять можна записати за допомогою функції writeMemory
. Процес включає встановлення типу повідомлення на MT_WriteMemory
, вказівку адреси та довжини даних, а потім відправлення даних:
Асоційований POC доступний тут.
Виконання коду .NET Core
Для виконання коду потрібно ідентифікувати область пам'яті з дозволами rwx, що можна зробити за допомогою vmmap -pages:
Знаходження місця для перезапису вказівника функції є необхідним, і в .NET Core це можна зробити, спрямовуючись на Dynamic Function Table (DFT). Ця таблиця, детально описана в jithelpers.h
, використовується рантаймом для функцій-помічників компіляції JIT.
Для систем x64 можна використовувати пошук сигнатури для знаходження посилання на символ _hlpDynamicFuncTable
в libcorclr.dll
.
Функція відладки MT_GetDCB
надає корисну інформацію, включаючи адресу функції-помічника m_helperRemoteStartAddr
, що вказує на місце розташування libcorclr.dll
в пам'яті процесу. Цю адресу потім використовують для початку пошуку DFT та перезапису вказівника функції адресою shellcode.
Повний код POC для впровадження в PowerShell доступний тут.
Посилання
Last updated