macOS .Net Applications Injection

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Це краткий огляд публікації 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:

struct MessageHeader {
MessageType   m_eType;        // Message type
DWORD         m_cbDataBlock;  // Size of following data block (can be zero)
DWORD         m_dwId;         // Message ID from sender
DWORD         m_dwReplyId;    // Reply-to Message ID
DWORD         m_dwLastSeenId; // Last seen Message ID by sender
DWORD         m_dwReserved;   // Reserved for future (initialize to zero)
union {
struct {
DWORD         m_dwMajorVersion;   // Requested/accepted protocol version
DWORD         m_dwMinorVersion;
} VersionInfo;
...
} TypeSpecificData;
BYTE          m_sMustBeZero[8];
}

Для запиту нової сесії ця структура заповнюється наступним чином, встановлюючи тип повідомлення на MT_SessionRequest та версію протоколу на поточну версію:

static const DWORD kCurrentMajorVersion = 2;
static const DWORD kCurrentMinorVersion = 0;

// Configure the message type and version
sSendHeader.m_eType = MT_SessionRequest;
sSendHeader.TypeSpecificData.VersionInfo.m_dwMajorVersion = kCurrentMajorVersion;
sSendHeader.TypeSpecificData.VersionInfo.m_dwMinorVersion = kCurrentMinorVersion;
sSendHeader.m_cbDataBlock = sizeof(SessionRequestData);

Цей заголовок потім надсилається на цільовий об'єкт за допомогою системного виклику write, за яким слідує структура sessionRequestData, що містить GUID для сеансу:

write(wr, &sSendHeader, sizeof(MessageHeader));
memset(&sDataBlock.m_sSessionID, 9, sizeof(SessionRequestData));
write(wr, &sDataBlock, sizeof(SessionRequestData));

Операція читання на каналі out підтверджує успішне або невдачне встановлення сеансу налагодження:

read(rd, &sReceiveHeader, sizeof(MessageHeader));

Читання пам'яті

Після встановлення сеансу налагодження, пам'ять можна читати за допомогою типу повідомлення MT_ReadMemory. Функція readMemory детально описана, виконуючи необхідні кроки для відправлення запиту на читання та отримання відповіді:

bool readMemory(void *addr, int len, unsigned char **output) {
// Allocation and initialization
...
// Write header and read response
...
// Read the memory from the debuggee
...
return true;
}

Повний доказ концепції (POC) доступний тут.

Запис у пам'ять

Аналогічно, пам'ять можна записати за допомогою функції writeMemory. Процес включає встановлення типу повідомлення на MT_WriteMemory, вказівку адреси та довжини даних, а потім відправлення даних:

bool writeMemory(void *addr, int len, unsigned char *input) {
// Increment IDs, set message type, and specify memory location
...
// Write header and data, then read the response
...
// Confirm memory write was successful
...
return true;
}

Асоційований POC доступний тут.

Виконання коду .NET Core

Для виконання коду потрібно ідентифікувати область пам'яті з дозволами rwx, що можна зробити за допомогою vmmap -pages:

vmmap -pages [pid]
vmmap -pages 35829 | grep "rwx/rwx"

Знаходження місця для перезапису вказівника функції є необхідним, і в .NET Core це можна зробити, спрямовуючись на Dynamic Function Table (DFT). Ця таблиця, детально описана в jithelpers.h, використовується рантаймом для функцій-помічників компіляції JIT.

Для систем x64 можна використовувати пошук сигнатури для знаходження посилання на символ _hlpDynamicFuncTable в libcorclr.dll.

Функція відладки MT_GetDCB надає корисну інформацію, включаючи адресу функції-помічника m_helperRemoteStartAddr, що вказує на місце розташування libcorclr.dll в пам'яті процесу. Цю адресу потім використовують для початку пошуку DFT та перезапису вказівника функції адресою shellcode.

Повний код POC для впровадження в PowerShell доступний тут.

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated