macOS .Net Applications Injection
Reading time: 5 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Це резюме поста https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Перевірте його для отримання додаткових деталей!
.NET Core Debugging
Встановлення сесії налагодження
Обробка зв'язку між налагоджувачем і налагоджуваним у .NET управляється dbgtransportsession.cpp. Цей компонент налаштовує два іменовані канали для кожного процесу .NET, як видно в dbgtransportsession.cpp#L127, які ініціюються через twowaypipe.cpp#L27. Ці канали мають суфікси -in
та -out
.
Відвідавши $TMPDIR
користувача, можна знайти FIFOs для налагодження .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 доступний тут.
References
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.