Dlinject es una biblioteca compartida (es decir, código arbitrario) inyectable en un proceso de Linux en vivo, sin la necesidad de ptrace.
Dlinject se creo Inspirado por Cexigua y linux-inject, entre otros.
¿Por qué?
- Porque puedo.
- Existen varias técnicas anti-ptrace, que esto evade simplemente al no usar ptrace.
- No me gusta ptrace.
- El uso a
LD_PRELOADveces puede ser complicado o imposible, si el proceso en el que desea inyectarse es generado por otro proceso con un entorno limpio.
Cómo funciona
- Envíe la señal de parada al proceso de destino. (Opcional)
- Localiza el
_dl_open()símbolo. - Recuperar
RIPyRSPvía/proc/[pid]/syscall. - Haga una copia de seguridad de parte de la pila y del código que estamos a punto de sobrescribir con nuestro código shell, leyendo
/proc/[pid]/mem. - Generar buffers de código de shell primario y secundario.
- Inserte el shellcode primario en
RIP, escribiendo a/proc/[pid]/mem. - El shellcode primario:
- Empuja registros comunes a la pila.
- Carga el shellcode secundario a través de
mmap(). - Salta al shellcode secundario.
- El shellcode secundario:
- Restaura la pila y el código del programa a sus estados originales.
- Pivota la pila (para que no toquemos la original).
- Llamadas
_dl_open()para cargar la biblioteca especificada por el usuario. Cualquier constructor se ejecutará en carga, como de costumbre. - Restaura el estado del registro, des-pivota la pila y salta de nuevo a donde estaba en el momento del original
SIGSTOP.
Limitaciones
- El envío
SIGSTOPpuede causar efectos secundarios no deseados, por ejemplo, si otro hilo está esperandowaitpid(). La--stopmethod=cgroup_freezeopción evita esto, pero requiere root (en la mayoría de las distribuciones, al menos). - No estoy completamente seguro de cómo interactuará esto con aplicaciones complejas de subprocesos múltiples. Ciertamente hay potencial de rotura.
x86-64Solo Linux (por ahora, se podría agregar soporte de 32 bits).- Requiere root o configuración de YAMA relajada (
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scopees útil al realizar pruebas). - Si el proceso de destino está protegido (por ejemplo, filtros seccomp), es posible que no tenga permiso para
mmap()el shellcode de la segunda etapa o paradlopen()la biblioteca.
Categorías: Depuración
INF.: Esta obra contiene una traducción total derivada de Dlinject de Github en inglés, publicada por sus editores bajo Licencia MIT.