macOS .Net Applications Injection
Reading time: 5 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Hii ni muhtasari wa chapisho https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Angalia kwa maelezo zaidi!
.NET Core Debugging
Kuweka Kikao cha Ufuatiliaji
Usimamizi wa mawasiliano kati ya debugger na debuggee katika .NET unashughulikiwa na dbgtransportsession.cpp. Kipengele hiki kinaanzisha bomba mbili zenye majina kwa kila mchakato wa .NET kama inavyoonekana katika dbgtransportsession.cpp#L127, ambazo zinaanzishwa kupitia twowaypipe.cpp#L27. Mabomba haya yanaishia na -in
na -out
.
Kwa kutembelea $TMPDIR
ya mtumiaji, mtu anaweza kupata FIFOs za ufuatiliaji zinazopatikana kwa ajili ya programu za .Net.
DbgTransportSession::TransportWorker inawajibika kwa usimamizi wa mawasiliano kutoka kwa debugger. Ili kuanzisha kikao kipya cha ufuatiliaji, debugger lazima itume ujumbe kupitia bomba la out
linaloanza na muundo wa MessageHeader
, ulioelezwa 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];
}
Ili kuomba kikao kipya, muundo huu unajazwa kama ifuatavyo, ukipanga aina ya ujumbe kuwa MT_SessionRequest
na toleo la protokali 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 syscall ya write
, ikifuatiwa na muundo wa sessionRequestData
unao zawadi ya GUID kwa ajili ya 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 kuanzishwa kwa kikao cha ufuatiliaji:
read(rd, &sReceiveHeader, sizeof(MessageHeader));
Kusoma Kumbukumbu
Mara tu kikao cha ufuatiliaji kimeanzishwa, kumbukumbu inaweza kusomwa kwa kutumia ujumbe wa MT_ReadMemory
aina. Kazi readMemory inaelezewa kwa undani, ikifanya 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) upo hapa.
Kuandika Kumbukumbu
Vivyo hivyo, kumbukumbu inaweza kuandikwa kwa kutumia kazi ya writeMemory
. Mchakato unahusisha kuweka aina ya ujumbe kuwa MT_WriteMemory
, kubainisha anwani na urefu wa data, na kisha 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 inayohusiana inapatikana here.
.NET Core Code Execution
Ili kutekeleza msimbo, mtu anahitaji kubaini 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 kiashiria cha kazi ni muhimu, na katika .NET Core, hii inaweza kufanywa kwa kulenga Dynamic Function Table (DFT). Meza hii, iliyoelezwa katika jithelpers.h
, inatumika na runtime kwa kazi za msaada wa JIT compilation.
Kwa mifumo ya x64, utafutaji wa saini unaweza kutumika kupata rejeleo kwa alama _hlpDynamicFuncTable
katika libcorclr.dll
.
Kazi ya debuggger MT_GetDCB
inatoa taarifa muhimu, ikiwa ni pamoja na anwani ya kazi ya msaada, m_helperRemoteStartAddr
, ikionyesha mahali pa libcorclr.dll
katika kumbukumbu ya mchakato. Anwani hii kisha inatumika kuanza utafutaji wa DFT na kubadilisha kiashiria cha kazi na anwani ya shellcode.
Msimbo kamili wa POC kwa sindano katika PowerShell unapatikana hapa.
Marejeleo
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.