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 RIPy RSPví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á esperando waitpid(). 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-64 Solo 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 para dlopen()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.