macOS .Net Applications Injection
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Dies ist eine Zusammenfassung des Beitrags https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Überprüfen Sie ihn für weitere Details!
Die Handhabung der Kommunikation zwischen Debugger und Debuggee in .NET wird von dbgtransportsession.cpp verwaltet. Diese Komponente richtet zwei benannte Pipes pro .NET-Prozess ein, wie in dbgtransportsession.cpp#L127 zu sehen ist, die über twowaypipe.cpp#L27 initiiert werden. Diese Pipes sind mit -in
und -out
suffixiert.
Durch den Besuch des $TMPDIR
des Benutzers kann man Debugging-FIFOs finden, die für das Debuggen von .Net-Anwendungen verfügbar sind.
DbgTransportSession::TransportWorker ist verantwortlich für die Verwaltung der Kommunikation von einem Debugger. Um eine neue Debugging-Sitzung zu initiieren, muss ein Debugger eine Nachricht über die out
-Pipe senden, die mit einer MessageHeader
-Struktur beginnt, die im .NET-Quellcode detailliert beschrieben ist:
Um eine neue Sitzung anzufordern, wird diese Struktur wie folgt ausgefüllt, wobei der Nachrichtentyp auf MT_SessionRequest
und die Protokollversion auf die aktuelle Version gesetzt wird:
Dieser Header wird dann über den write
syscall an das Ziel gesendet, gefolgt von der sessionRequestData
Struktur, die eine GUID für die Sitzung enthält:
Ein Lesevorgang auf dem out
-Pipe bestätigt den Erfolg oder Misserfolg der Einrichtung der Debugging-Sitzung:
Sobald eine Debugging-Sitzung eingerichtet ist, kann der Speicher mit dem MT_ReadMemory
Nachrichtentyp gelesen werden. Die Funktion readMemory ist detailliert und führt die notwendigen Schritte aus, um eine Leseanforderung zu senden und die Antwort abzurufen:
Der vollständige Proof of Concept (POC) ist hier verfügbar.
Ähnlich kann der Speicher mit der Funktion writeMemory
beschrieben werden. Der Prozess umfasst das Setzen des Nachrichtentyps auf MT_WriteMemory
, das Festlegen der Adresse und der Länge der Daten und das anschließende Senden der Daten:
Der zugehörige POC ist hier verfügbar.
Um Code auszuführen, muss man einen Speicherbereich mit rwx-Berechtigungen identifizieren, was mit vmmap -pages: durchgeführt werden kann.
Einen Ort zu finden, um einen Funktionszeiger zu überschreiben, ist notwendig, und in .NET Core kann dies durch das Anvisieren der Dynamic Function Table (DFT) erfolgen. Diese Tabelle, die in jithelpers.h
detailliert beschrieben ist, wird von der Laufzeit für JIT-Kompilierungs-Hilfsfunktionen verwendet.
Für x64-Systeme kann die Signatur-Suche verwendet werden, um einen Verweis auf das Symbol _hlpDynamicFuncTable
in libcorclr.dll
zu finden.
Die Debugger-Funktion MT_GetDCB
liefert nützliche Informationen, einschließlich der Adresse einer Hilfsfunktion, m_helperRemoteStartAddr
, die den Standort von libcorclr.dll
im Prozessspeicher angibt. Diese Adresse wird dann verwendet, um eine Suche nach der DFT zu starten und einen Funktionszeiger mit der Adresse des Shellcodes zu überschreiben.
Der vollständige POC-Code für die Injektion in PowerShell ist hier zugänglich.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)