
Ein einfacher ptrace-freier Shared-Library-Injektor für x64-Linux
Ein einfacher ptrace-freier Shared-Library-Injektor für x64-Linux.
linux_injector <mode> <pid> <file>
Modus
pid
Prozess-ID des Zielprozesses. Sie benötigen ptrace-Rechte für diesen (erforderlich für den Zugriff auf /proc/$pid/mem). Der Prozess wird nicht ptraced, sodass ein anderer Prozess ihn frei ptracen kann.
Datei
Für Modus 1: Zu injizierendes Modul, das im Remote-Prozess per dlopen geladen wird. Es sollte wahrscheinlich ein vollständiger Pfad sein, da andernfalls der entfernte LD_LIBRARY_PATH zur Auflösung verwendet wird.
Für Modus 2: Zu injizierendes Modul, das im Remote-Prozess per dlopen aus einem memfd geladen wird, in den der Inhalt kopiert wird.
Für Modus 3: Zu injizierender roher Shellcode. Der Shellcode wird an einer 16-Byte-ausgerichteten Adresse abgebildet und die Ausführung startet auf einem zufällig gekaperten Thread. Platzieren Sie Hooks oder erstellen Sie einen Thread und kehren Sie dann zurück.
Für die Übernahme des Kontrollflusses benötigt dieses Programm einen Kandidaten für die Übernahme. Der hier vorgestellte Code verwendet malloc; dies kann durch Bearbeiten von FUN_NAME und erneutes Kompilieren geändert werden. Stellen Sie sicher, dass die gehookte Funktion in unter 100 ms ausgeführt werden kann, damit sie nicht überschrieben wird, während sie ausgeführt wird. Das bedeutet, dass Aufrufe wie sleep oder wait schlechte Kandidaten für den anfänglichen Shellcode sind. Die betreffende Funktion muss außerdem länger als 0x50 sein, damit der Shellcode keine anderen Funktionen überschreibt.
Glibc und musl werden sowohl für den Ziel- als auch für den Quellprozess unterstützt. Der Zielprozess kann in einem Container laufen und eine andere libc verwenden. Die Modi 2 und 3 erfordern keine für den Zielprozess zugänglichen Pfade.
Modus 2 erfordert Linux 3.17.
Getestet auf Oracle Linux 7 (Modus 2 nicht unterstützt), Fedora 37 und Alpine Linux 3.17