
Injizieren einer Shared Library (d.h. beliebigen Code) in einen laufenden Linux-Prozess ohne ptrace
Füge eine dynamische Bibliothek (d.h. beliebigen Code) in einen laufenden Linux-Prozess ein, ohne ptrace. Inspiriert von Cexigua und linux-inject und anderen.
.___.__ .__ __ __
__| _/| | |__| ____ |__| ____ _____/ |_ ______ ___.__.
/ __ | | | | |/ \ | |/ __ \_/ ___\ __\ \____ < | |
/ /_/ | | |_| | | \ | \ ___/\ \___| | | |_> >___ |
\____ | |____/__|___| /\__| |\___ >\___ >__| /\| __// ____|
\/ \/\______| \/ \/ \/|__| \/
source: https://github.com/DavidBuchanan314/dlinject
usage: dlinject.py [-h] [--stopmethod {sigstop,cgroup_freeze,none}]
pid /path/to/lib.so
Inject a shared library into a live process.
positional arguments:
pid The pid of the target process
/path/to/lib.so Path of the shared library to load (note: must be
relative to the target process's cwd, or absolute)
optional arguments:
-h, --help show this help message and exit
--stopmethod {sigstop,cgroup_freeze,none}
How to stop the target process prior to shellcode
injection. SIGSTOP (default) can have side-effects.
cgroup freeze requires root. 'none' is likely to cause
race conditions.
Weil ich es kann.
Es gibt verschiedene Anti-ptrace-Techniken, die dieses Tool umgeht, indem es ptrace einfach nicht verwendet.
Ich mag ptrace nicht.
Die Verwendung von LD_PRELOAD kann manchmal knifflig oder unmöglich sein, wenn der Prozess, in den Sie injizieren möchten, von einem anderen Prozess mit einer sauberen Umgebung erzeugt wird.
Sende das Stoppsignal an den Zielprozess. (optional)
Lokalisiere das Symbol _dl_open().
Rufe RIP und RSP über /proc/[pid]/syscall ab.
Erstelle ein Backup eines Teils des Stacks und des Codes, den wir mit unserem Shellcode überschreiben werden, indem wir aus /proc/[pid]/mem lesen.
Erstelle primäre und sekundäre Shellcode-Puffer.
Füge primären Shellcode an der Stelle von RIP ein, indem wir in /proc/[pid]/mem schreiben.
Der primäre Shellcode:
mmap().Der sekundäre Shellcode:
_dl_open() auf, um die vom Benutzer angegebene Bibliothek zu laden. Konstruktoren werden beim Laden wie üblich ausgeführt.Das Senden von SIGSTOP kann unerwünschte Nebenwirkungen verursachen, z.B. wenn ein anderer Thread auf waitpid() wartet. Mit der Option --stopmethod=cgroup_freeze wird dies vermieden, erfordert aber root-Rechte (zumindest auf den meisten Distributionen).
Ich bin mir nicht ganz sicher, wie sich dies mit komplexen Multithread-Anwendungen verhält. Es besteht definitiv Potenzial für Brüche.
Nur für x86-64 Linux (vorerst - 32-Bit-Unterstützung könnte möglicherweise hinzugefügt werden).
Erfordert root oder eine lockere YAMA-Konfiguration (echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope ist beim Testen nützlich).
Wenn der Zielprozess in einer Sandbox läuft (z.B. seccomp-Filter), hat er möglicherweise keine Berechtigung, den zweiten Shellcode zu mmap() oder die Bibliothek zu dlopen().
SIGSTOP