macOS .Net Applications Injection

Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Hii ni muhtasari wa chapisho https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Angalia kwa maelezo zaidi!

Udukuzi wa .NET Core

Kuanzisha Kikao cha Udukuzi

Usimamizi wa mawasiliano kati ya kudukuzi na programu inayodukuliwa katika .NET unadhibitiwa na dbgtransportsession.cpp. Sehemu hii inaweka mabomba mawili yaliyopewa jina kwa kila mchakato wa .NET kama ilivyoonekana katika dbgtransportsession.cpp#L127, ambayo huanzishwa kupitia twowaypipe.cpp#L27. Mabomba haya yanamaliziwa na -in na -out.

Kwa kutembelea $TMPDIR ya mtumiaji, mtu anaweza kupata mabomba ya udukuzi yanayopatikana kwa ajili ya programu za .Net.

DbgTransportSession::TransportWorker inahusika na usimamizi wa mawasiliano kutoka kwa kudukuzi. Ili kuanzisha kikao kipya cha udukuzi, kudukuzi lazima atume ujumbe kupitia mabomba ya out ukiwa na muundo wa MessageHeader struct, ulioelezewa kwa undani katika msimbo wa chanzo wa .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];
}

Kuomba kikao kipya, muundo huu unajazwa kama ifuatavyo, ukiweka aina ya ujumbe kuwa MT_SessionRequest na toleo la itifaki kuwa toleo la sasa:

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

Kichwa hiki kisha kinatumwa kwa lengo kwa kutumia write syscall, ikifuatiwa na sessionRequestData struct inayojumuisha GUID kwa kikao:

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

Operesheni ya kusoma kwenye bomba la out inathibitisha mafanikio au kushindwa kwa kuanzisha kikao cha kurekebisha makosa:

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

Kusoma Kumbukumbu

Marudio ya kubugia yameanzishwa, kumbukumbu inaweza kusomwa kwa kutumia aina ya ujumbe MT_ReadMemory. Kazi ya kusoma kumbukumbu imefafanuliwa, ikitekeleza hatua zinazohitajika kutuma ombi la kusoma na kupata jibu.

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

Uthibitisho kamili wa dhana (POC) inapatikana hapa.

Kuandika Kumbukumbu

Vivyo hivyo, kumbukumbu inaweza kuandikwa kwa kutumia kazi ya writeMemory. Mchakato unahusisha kuweka aina ya ujumbe kuwa MT_WriteMemory, kisha kutoa anwani na urefu wa data, na hatimaye kutuma 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;
}

POC inapatikana hapa.

.NET Core Utekelezaji wa Kanuni

Ili kutekeleza kanuni, mtu anahitaji kutambua eneo la kumbukumbu lenye ruhusa za rwx, ambalo linaweza kufanywa kwa kutumia vmmap -pages:

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

Kupata mahali pa kubadilisha kidole cha kazi ni muhimu, na katika .NET Core, hii inaweza kufanywa kwa kulenga Dynamic Function Table (DFT). Jedwali hili, lililoelezwa katika jithelpers.h, hutumiwa na runtime kwa kazi za msaada wa kompilisheni ya JIT.

Kwa mifumo ya x64, unaweza kutumia utafutaji wa saini kupata marejeleo kwa ishara _hlpDynamicFuncTable katika libcorclr.dll.

Kazi ya kudebugi ya MT_GetDCB hutoa habari muhimu, ikiwa ni pamoja na anwani ya kazi ya msaada, m_helperRemoteStartAddr, inayoonyesha mahali pa libcorclr.dll katika kumbukumbu ya mchakato. Anwani hii kisha hutumiwa kuanza utafutaji wa DFT na kubadilisha kidole cha kazi na anwani ya shellcode.

Msimbo kamili wa POC kwa kuingiza katika PowerShell unapatikana hapa.

Marejeo

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated