macOS .Net Applications Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Questo è un riassunto del post https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Controllalo per ulteriori dettagli!
La gestione della comunicazione tra debugger e debuggee in .NET è gestita da dbgtransportsession.cpp. Questo componente imposta due pipe nominate per ogni processo .NET come visto in dbgtransportsession.cpp#L127, che vengono iniziate tramite twowaypipe.cpp#L27. Queste pipe sono suffisse con -in
e -out
.
Visitando il $TMPDIR
dell'utente, si possono trovare FIFO di debug disponibili per il debug delle applicazioni .Net.
DbgTransportSession::TransportWorker è responsabile della gestione della comunicazione da un debugger. Per avviare una nuova sessione di debug, un debugger deve inviare un messaggio tramite la pipe out
che inizia con una struct MessageHeader
, dettagliata nel codice sorgente di .NET:
Per richiedere una nuova sessione, questa struct viene popolata come segue, impostando il tipo di messaggio su MT_SessionRequest
e la versione del protocollo sulla versione attuale:
Questo header viene quindi inviato al target utilizzando la syscall write
, seguito dalla struct sessionRequestData
contenente un GUID per la sessione:
Un'operazione di lettura sul pipe out
conferma il successo o il fallimento dell'instaurazione della sessione di debug:
Una volta stabilita una sessione di debug, la memoria può essere letta utilizzando il tipo di messaggio MT_ReadMemory
. La funzione readMemory è dettagliata, eseguendo i passaggi necessari per inviare una richiesta di lettura e recuperare la risposta:
La prova di concetto completa (POC) è disponibile qui.
Allo stesso modo, la memoria può essere scritta utilizzando la funzione writeMemory
. Il processo prevede di impostare il tipo di messaggio su MT_WriteMemory
, specificare l'indirizzo e la lunghezza dei dati, e poi inviare i dati:
Il POC associato è disponibile qui.
Per eseguire codice, è necessario identificare una regione di memoria con permessi rwx, il che può essere fatto usando vmmap -pages:
Trovare un luogo per sovrascrivere un puntatore di funzione è necessario, e in .NET Core, questo può essere fatto mirato alla Dynamic Function Table (DFT). Questa tabella, dettagliata in jithelpers.h
, è utilizzata dal runtime per le funzioni di aiuto della compilazione JIT.
Per i sistemi x64, la ricerca delle firme può essere utilizzata per trovare un riferimento al simbolo _hlpDynamicFuncTable
in libcorclr.dll
.
La funzione di debug MT_GetDCB
fornisce informazioni utili, incluso l'indirizzo di una funzione di aiuto, m_helperRemoteStartAddr
, che indica la posizione di libcorclr.dll
nella memoria del processo. Questo indirizzo viene quindi utilizzato per avviare una ricerca per la DFT e sovrascrivere un puntatore di funzione con l'indirizzo del shellcode.
Il codice POC completo per l'iniezione in PowerShell è accessibile qui.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)