
Heavily-modified fork of David Buchanan's dlinject project. Injects arbitrary assembly (or precompiled binary) payloads directly into x86-64, x86, and ARM32 Linux processes without the use of ptrace by accessing /proc/<pid>/mem. Useful for certain post-exploitation scenarios, recovering content from process memory, etc..
asminject.py ist ein stark modifizierter Fork des dlinject-Projekts von David Buchanan. Es injiziert beliebige Assembly- (oder vorkompilierte Binär-) Payloads direkt in x86-64-, x86- und ARM32-Linux-Prozesse, indem es auf /proc/<pid>/mem zugreift, anstatt über ptrace anzuhängen. Nützlich zum Manipulieren vertrauenswürdiger Prozesse, für bestimmte Post-Exploitation-Szenarien, zum Wiederherstellen von Inhalten aus dem Prozessspeicher und zum Umgehen einiger Sicherheitskontrollen. Es kann in containerisierte Prozesse von außerhalb des Containers injizieren, solange man Root-Zugriff auf den Host hat.
Weitere Informationen über asminject.py und seine Ursprünge findest du auf der Bishop-Fox-Tool-Seite, einschließlich einer ausführlichen Abhandlung über die Arbeit, die das Tool inspiriert hat.
In diesem Dokument:
Separate, ausführlichere Dokumentation:
asminject.py ist wie dlinject, nur dass du damit jeden beliebigen Payload injizieren kannst, anstatt nur eine Bibliothek zu laden, und es funktioniert auf mehreren Architekturen.“asminject.py ist vage wie Frida, nur dass es nicht über die ptrace-Schnittstelle anhängt, sodass Prozesse es nicht blockieren können, indem sie sich selbst per ptrace überwachen.“asminject.py wurde für zwei primäre Szenarien im Penetrationstest innerhalb von Linux-Umgebungen geschrieben:
Stell dir zum Beispiel einen Penetrationstest vor, bei dem der Tester Root-Zugriff auf einen Server erlangt hat, der viele Container hostet. Einer der Container verarbeitet Banküberweisungen und enthält ein sehr robustes Endpunktsicherheitsprodukt. Wenn der Pentester versucht, die Banküberweisungsdaten von innerhalb des Containers zu ändern, erkennt die Endpunktsicherheitssoftware den Versuch und blockiert ihn. asminject.py ermöglicht es dem Pentester, beliebigen Code direkt in den Prozessspeicher der Bankensoftware oder sogar in das Endpunktsicherheitsprodukt von außerhalb des Containers zu injizieren. Wie ein Opfer von Descartes‘ „bösem Dämon“ ist die Sicherheitssoftware im Container hilflos, weil sie in einer Umgebung existiert, die vollständig unter der Kontrolle des Angreifers steht.
Das ursprüngliche dlinject.py wurde speziell dafür entwickelt, Linux-Shared-Libraries in einen bestehenden Prozess zu laden. asminject.py kann alles, was das Original konnte, und noch viel mehr. Es führt beliebigen Assembly-Code aus und enthält Vorlagen für eine Vielzahl von Angriffen. Es wurde außerdem neu gestaltet, um die Erkennung durch Sicherheitsmechanismen zu vermeiden, die sich an potenziell verdächtigen Aktivitäten wie Bibliotheksladeereignissen orientieren.
Das Verzeichnis practice dieses Repositorys enthält einfachen Schleifencode, der einen Zeitstempel und die Schleifeniteration auf der Konsole ausgibt, sodass du das Injizieren verschiedener Codetypen in einer kontrollierten Umgebung üben kannst. Diese Übungsschleifen werden in den übrigen Beispielen referenziert.
Die grundlegende Syntax für den Aufruf von asminject.py lautet:
# python3 ./asminject.py <target_process_id> <payload> \
--arch [x86-64|x86|arm32] --relative-offsets-from-binaries --stop-method "slow" \
--var <payload_variable_1_name> <payload_variable_1_value> \
# ... \
--var <payload_variable_n_name> <payload_variable_n_value>
In den meisten Fällen läuft jeder der in den Beispielen verwendeten Payloads auf jeder der unterstützten Architekturen.
Die meisten Linux-Distributionen enthalten ein Kernel-Sicherheitsmodul namens Yama, das den Zugriff auf die Nutzung der ptrace-Fähigkeit gegenüber anderen Prozessen steuert. Obwohl asminject.py nicht an der Debugger-Schnittstelle anhängt, benötigt es dennoch die Berechtigung, die ptrace-Fähigkeit zu nutzen. Wenn du Fehler bezüglich dieser Fähigkeit erhältst, überprüfe den Inhalt von /proc/sys/kernel/yama/ptrace_scope. Wenn dort der Wert 2 steht, führe den folgenden Befehl als root aus:
echo 1 > /proc/sys/kernel/yama/ptrace_scope
Werte von 3 oder höher können ohne Neustart nicht zurückgesetzt werden. Wenn du jedoch ein autorisierter Administrator eines Linux-Systems bist, auf dem jemand versehentlich /proc/sys/kernel/yama/ptrace_scope auf 3 gesetzt hat, oder einen autorisierten Penetrationstest in einer Umgebung durchführst, in der dieser Wert gesetzt wurde, schau in das Verzeichnis ptrace_scope_kernel_module für eine mögliche Problemumgehung, die keinen Neustart erfordert.
gcc-Befehl auf Betriebssystemebene aufzurufen.eval-artigen Ausführung von menschenlesbarem Skriptcode) Payloads bereitstellen, die diese Fähigkeit für noch mehr Heimlichkeit nutzen.dlinject.py übernommen wurde.asminject.py zu injizieren – weitere Forschung ist erforderlich.asminject.py den Bediener nach einer Codezeile fragen, sie injizieren, die resultierende Ausgabe zurückgeben und dann den Bediener nach einer weiteren Codezeile fragen.
asminject.py so in einen Prozess injiziert werden kann, dass Fridas Notwendigkeit, vorübergehend die Debugger-Schnittstelle aufzurufen, vermieden wird.asminject.py ausgeführt wird. Z. B. mit einem entfernten Gerät über Hardware wie einen PCI-Leech interagieren, extreme Randfälle ausnutzen wie Geräte, deren /proc/mem als Root über eine NFS-Freigabe zugänglich ist, usw.