
Un semplice iniettore di librerie condivise senza ptrace per Linux x64
Un semplice iniettore di librerie condivise senza ptrace per Linux x64.
linux_injector <mode> <pid> <file>
modalità
pid
ID del processo target. È necessario avere i diritti ptrace su di esso (richiesto per accedere a /proc/$pid/mem). Non viene sottoposto a ptrace, quindi un altro processo può tracciarlo liberamente.
file
Per la modalità 1: modulo da iniettare, verrà caricato tramite dlopen nel processo remoto. Dovrebbe probabilmente essere un percorso completo, perché altrimenti viene usata la LD_LIBRARY_PATH remota per la risoluzione.
Per la modalità 2: modulo da iniettare, verrà caricato tramite dlopen nel processo remoto da un memfd, in cui verrà copiato il contenuto.
Per la modalità 3: shellcode grezzo da iniettare. Verrà mappato a un indirizzo allineato a 16 byte e l'esecuzione inizierà su un thread dirottato casuale. Posiziona hook o crea un thread, quindi ritorna.
Per l'hijacking del flusso di controllo, questo programma necessita di un candidato all'hijacking. Il codice qui presentato usa malloc; questo può essere modificato editando FUN_NAME e ricompilando. Assicurati che la funzione hookata possa girare in meno di 100ms, così non verrà sovrascritta durante l'esecuzione. Questo significa che chiamate come sleep o wait sono pessime candidate per lo shellcode iniziale. La funzione in questione deve inoltre essere più lunga di 0x50 affinché lo shellcode non sovrascriva altre funzioni.
Glibc e musl sono supportati sia per il processo target che per quello sorgente. Il processo target può essere in esecuzione in un container e può usare una libc diversa. Le modalità 2 e 3 non richiederanno alcun percorso accessibile al processo target.
La modalità 2 richiede Linux 3.17.
Testato su Oracle Linux 7 (modalità 2 non supportata), Fedora 37 e Alpine Linux 3.17