macOS .Net Applications Injection

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Hierdie is 'n opsomming van die berig https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Kyk daarvoor vir verdere besonderhede!

.NET Core-afstelwerk

Vestiging van 'n afstel-sessie

Die hantering van kommunikasie tussen die afsteler en die afstelobjek in .NET word bestuur deur dbgtransportsession.cpp. Hierdie komponent stel twee genoemde pype per .NET-proses op soos gesien in dbgtransportsession.cpp#L127, wat geïnisieer word via twowaypipe.cpp#L27. Hierdie pype word gesuffix met -in en -out.

Deur die gebruiker se $TMPDIR te besoek, kan daar afstelpype gevind word wat beskikbaar is vir die afstel van .Net-toepassings.

DbgTransportSession::TransportWorker is verantwoordelik vir die bestuur van kommunikasie vanaf 'n afsteler. Om 'n nuwe afstel-sessie te begin, moet 'n afsteler 'n boodskap stuur via die out-pyp wat begin met 'n MessageHeader-struktuur, wat in die .NET-bronkode in detail beskryf word:

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

Om 'n nuwe sessie aan te vra, word hierdie struktuur soos volg gevul, deur die boodskap tipe te stel as MT_SessionRequest en die protokol weergawe as die huidige weergawe:

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

Hierdie kop is dan oorgestuur na die teiken deur die write syscall, gevolg deur die sessionRequestData struktuur wat 'n GUID vir die sessie bevat:

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

'n Leesoperasie op die out pyp bevestig die sukses of mislukking van die opsporingsessie vestiging:

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

Lees van Geheue

Sodra 'n foutopsporingsessie tot stand gebring is, kan geheue gelees word deur die MT_ReadMemory boodskapstipe te gebruik. Die funksie readMemory word in detail beskryf en voer die nodige stappe uit om 'n leesversoek te stuur en die antwoord te ontvang:

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

Die volledige bewys van konsep (POC) is beskikbaar hier.

Skryf van Geheue

Op dieselfde manier kan geheue geskryf word met behulp van die writeMemory-funksie. Die proses behels die instelling van die boodskap tipe na MT_WriteMemory, die spesifisering van die adres en lengte van die data, en dan die stuur van die data:

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

Die betrokke POC is beskikbaar hier.

.NET Core Kode-uitvoering

Om kode uit te voer, moet 'n geheuegebied met rwx-permissies geïdentifiseer word, wat gedoen kan word deur gebruik te maak van vmmap -pages:

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

Die opsporing van 'n plek om 'n funksie-aanwyservariabele te oorskryf, is noodsaaklik, en in .NET Core kan dit gedoen word deur die Dinamiese Funksie Tabel (DFT) te teiken. Hierdie tabel, wat in jithelpers.h beskryf word, word deur die uitvoeringstyd gebruik vir JIT-samestellingshulpfunksies.

Vir x64-stelsels kan handtekeningsoektog gebruik word om 'n verwysing na die simbool _hlpDynamicFuncTable in libcorclr.dll te vind.

Die MT_GetDCB-ontlederfunksie verskaf nuttige inligting, insluitend die adres van 'n hulpfunksie, m_helperRemoteStartAddr, wat die ligging van libcorclr.dll in die prosesgeheue aandui. Hierdie adres word dan gebruik om 'n soektog na die DFT te begin en 'n funksie-aanwyser met die adres van die skulpkode te oorskryf.

Die volledige POC-kode vir inspuiting in PowerShell is beskikbaar hier.

Verwysings

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated