macOS .Net Applications Injection

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Ovo je sažetak posta https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Pogledajte ga za dalje detalje!

.NET Core Debugiranje

Uspostavljanje debugiranja

Komunikacija između debugera i debugiranog programa u .NET-u se upravlja preko dbgtransportsession.cpp. Ovaj komponenta postavlja dve nazvane cevi po .NET procesu, kako je prikazano u dbgtransportsession.cpp#L127, koje se iniciraju preko twowaypipe.cpp#L27. Ove cevi su sufiksirane sa -in i -out.

Posetom korisnikovom $TMPDIR, mogu se pronaći FIFO-ovi za debugiranje .Net aplikacija.

DbgTransportSession::TransportWorker je odgovoran za upravljanje komunikacijom od debugera. Da bi započeo novu sesiju debugiranja, debugger mora poslati poruku putem out cevi koja počinje sa MessageHeader strukturom, detaljno opisanom u izvornom kodu .NET-a:

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];
}

Da biste zatražili novu sesiju, ova struktura se popunjava na sledeći način, postavljajući tip poruke na MT_SessionRequest i verziju protokola na trenutnu verziju:

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);

Ova zaglavlje se zatim šalje cilju koristeći write sistemski poziv, praćeno strukturom sessionRequestData koja sadrži GUID za sesiju:

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

Operacija čitanja na out cevi potvrđuje uspeh ili neuspeh uspostavljanja sesije za debagovanje:

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

Čitanje memorije

Jednom kada je uspostavljena sesija za debagovanje, memorija se može čitati koristeći tip poruke MT_ReadMemory. Funkcija readMemory je detaljno opisana, izvodeći neophodne korake za slanje zahteva za čitanje i dobijanje odgovora:

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;
}

Potpuni dokaz koncepta (POC) dostupan je ovde.

Pisanje u memoriju

Slično tome, memorija se može pisati pomoću funkcije writeMemory. Postupak uključuje postavljanje tipa poruke na MT_WriteMemory, navođenje adrese i dužine podataka, a zatim slanje podataka:

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;
}

Povezani POC je dostupan ovde.

Izvršavanje koda u .NET Core

Da biste izvršili kod, potrebno je identifikovati memorijsku regiju sa dozvolama za čitanje, pisanje i izvršavanje (rwx), što se može uraditi pomoću komande vmmap -pages:

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

Lociranje mesta za prepisivanje pokazivača funkcije je neophodno, a u .NET Core-u to se može postići ciljanjem Dynamic Function Table (DFT). Ova tabela, detaljno opisana u jithelpers.h, koristi se od strane izvršnog okruženja za JIT kompilacijske pomoćne funkcije.

Za x64 sisteme, može se koristiti pretraga potpisa kako bi se pronašla referenca na simbol _hlpDynamicFuncTable u libcorclr.dll.

Debugger funkcija MT_GetDCB pruža korisne informacije, uključujući adresu pomoćne funkcije m_helperRemoteStartAddr, koja ukazuje na lokaciju libcorclr.dll u memoriji procesa. Ova adresa se zatim koristi za pretragu DFT i prepisivanje pokazivača funkcije sa adresom shell koda.

Ceo POC kod za ubacivanje u PowerShell može se pronaći ovde.

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated