
Un inyector de bibliotecas compartidas sin ptrace para Linux x64
Un sencillo inyector de bibliotecas compartidas sin ptrace para Linux x64.
linux_injector <mode> <pid> <file>
mode
pid
ID del proceso objetivo. Debe tener derechos de ptrace sobre él (requerido para acceder a /proc/$pid/mem). No está bajo ptrace, por lo que otro proceso puede aplicarle ptrace libremente.
file
Para el modo 1: módulo a inyectar; se cargará mediante dlopen en el proceso remoto. Debería ser probablemente una ruta completa, porque de lo contrario se usa el LD_LIBRARY_PATH remoto para la resolución.
Para el modo 2: módulo a inyectar; se cargará mediante dlopen en el proceso remoto desde un memfd, donde se copiará el contenido.
Para el modo 3: shellcode crudo a inyectar. Se te mapeará en una dirección alineada a 16 bytes y comenzarás la ejecución en un hilo secuestrado aleatorio. Coloca hooks o crea un hilo, y luego retorna.
Para el secuestro del flujo de control, este programa necesita un candidato de secuestro. El código presentado aquí usa malloc; esto se puede cambiar editando FUN_NAME y recompilando. Asegúrate de que la función enganchada pueda ejecutarse en menos de 100 ms, para que no sea sobrescrita mientras se ejecuta. Esto significa que llamadas como sleep o wait son malos candidatos para el shellcode inicial. La función en cuestión también debe tener más de 0x50 bytes de longitud para que el shellcode no sobrescriba otras funciones.
Glibc y musl son compatibles tanto para el proceso objetivo como para el proceso de origen. El proceso objetivo puede estar ejecutándose en un contenedor y puede usar una libc diferente. Los modos 2 y 3 no requieren ninguna ruta accesible para el proceso objetivo.
El modo 2 requiere Linux 3.17.
Probado en Oracle Linux 7 (modo 2 no compatible), Fedora 37 y Alpine Linux 3.17.