
Inietta una libreria condivisa (cioè codice arbitrario) in un processo Linux in esecuzione, senza ptrace
Inietta una libreria condivisa (cioè codice arbitrario) in un processo Linux live, senza ptrace. Ispirato da Cexigua e linux-inject, tra gli altri.
.___.__ .__ __ __
__| _/| | |__| ____ |__| ____ _____/ |_ ______ ___.__.
/ __ | | | | |/ \ | |/ __ \_/ ___\ __\ \____ < | |
/ /_/ | | |_| | | \ | \ ___/\ \___| | | |_> >___ |
\____ | |____/__|___| /\__| |\___ >\___ >__| /\| __// ____|
\/ \/\______| \/ \/ \/|__| \/
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.
Perché posso.
Esistono varie tecniche anti-ptrace, che questo metodo elude semplicemente non usando ptrace.
Non mi piace ptrace.
Usare LD_PRELOAD a volte può essere complesso o impossibile, se il processo in cui si vuole iniettare è generato da un altro processo con un ambiente pulito.
Invia il segnale di stop al processo target. (opzionale)
Localizza il simbolo _dl_open().
Recupera RIP e RSP tramite /proc/[pid]/syscall.
Crea un backup di una parte dello stack e del codice che stiamo per sovrascrivere con il nostro shellcode, leggendo da /proc/[pid]/mem.
Genera buffer di shellcode primario e secondario.
Inserisce lo shellcode primario in RIP, scrivendo su /proc/[pid]/mem.
Lo shellcode primario:
mmap().Lo shellcode secondario:
_dl_open() per caricare la libreria specificata dall'utente. Eventuali costruttori verranno eseguiti al caricamento, come di consueto.SIGSTOP.Inviare SIGSTOP può causare effetti collaterali indesiderati, ad esempio se un altro thread è in attesa su waitpid(). L'opzione --stopmethod=cgroup_freeze evita questo problema, ma richiede i permessi di root (almeno sulla maggior parte delle distribuzioni).
Non sono del tutto sicuro di come questo interagirà con applicazioni multi-thread complesse. C'è sicuramente il potenziale per malfunzionamenti.
Solo Linux x86-64 (per ora – il supporto a 32 bit potrebbe essere aggiunto in futuro).
Richiede i permessi di root o una configurazione YAMA rilassata (echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope è utile per i test).
Se il processo target è in una sandbox (es. filtri seccomp), potrebbe non avere i permessi per chiamare mmap() per lo shellcode secondario, o per dlopen() la libreria.