
Heavily-modified fork of David Buchanan's dlinject project. Injects arbitrary assembly (or precompiled binary) payloads directly into x86-64, x86, and ARM32 Linux processes without the use of ptrace by accessing /proc/<pid>/mem. Useful for certain post-exploitation scenarios, recovering content from process memory, etc..
asminject.py es un fork muy modificado del proyecto dlinject de David Buchanan. Inyecta cargas útiles (payloads) de código ensamblador arbitrario (o binarios precompilados) directamente en procesos Linux x86-64, x86 y ARM32 mediante el acceso a /proc/<pid>/mem en lugar de adjuntarse a través de ptrace. Resulta útil para manipular procesos de confianza, ciertos escenarios posteriores a la explotación, recuperar contenido de la memoria de los procesos y evadir algunos controles de seguridad. Puede inyectar en procesos contenerizados desde fuera del contenedor, siempre que tengas acceso root en el host.
También puedes leer más sobre asminject.py y sus orígenes en su página de herramientas de Bishop Fox, incluido un análisis detallado del trabajo que inspiró la herramienta.
En este documento:
Documentación aparte, más detallada:
asminject.py es como dlinject, excepto que te permite inyectar cualquier carga útil que quieras en lugar de solo cargar una librería, y funciona en múltiples arquitecturas."asminject.py es vagamente como Frida, excepto que no se adjunta a través de la interfaz ptrace, por lo que los procesos no pueden bloquearlo aplicándose ptrace a sí mismos."asminject.py fue escrito para dos escenarios principales en pruebas de penetración en entornos Linux:
Por ejemplo, considera una prueba de penetración en la que el evaluador ha obtenido acceso root a un servidor que aloja muchos contenedores. Uno de los contenedores procesa transferencias bancarias y tiene instalado en su interior un producto de seguridad de endpoint muy robusto. Cuando el evaluador intenta modificar los datos de la transferencia bancaria desde dentro del contenedor, el software de seguridad de endpoint detecta y bloquea el intento. asminject.py permite al evaluador inyectar código arbitrario directamente en la memoria del proceso del software bancario o incluso en el producto de seguridad de endpoint desde fuera del contenedor. Como una víctima del "genio maligno" de Descartes, el software de seguridad dentro del contenedor es impotente, porque existe en un entorno totalmente bajo el control del atacante.
El dlinject.py original fue diseñado específicamente para cargar librerías compartidas de Linux en un proceso existente. asminject.py hace todo lo que hacía el original y mucho más. Ejecuta código ensamblador arbitrario e incluye plantillas para una variedad de ataques. También ha sido rediseñado para ayudar a evitar la detección por parte de mecanismos de seguridad que se basan en actividades potencialmente sospechosas, como los eventos de carga de librerías.
El directorio practice de este repositorio incluye código de bucle básico que muestra una marca de tiempo y la iteración del bucle en la consola, para que puedas practicar la inyección de varios tipos de código en un entorno controlado. Estos bucles de práctica se mencionan en los ejemplos restantes.
La sintaxis básica para invocar asminject.py es:
# python3 ./asminject.py <target_process_id> <payload> \
--arch [x86-64|x86|arm32] --relative-offsets-from-binaries --stop-method "slow" \
--var <payload_variable_1_name> <payload_variable_1_value> \
# ... \
--var <payload_variable_n_name> <payload_variable_n_value>
En la mayoría de los casos, cualquiera de las cargas útiles utilizadas en los ejemplos se ejecutará en cualquiera de las arquitecturas compatibles.
La mayoría de las distribuciones de Linux incluyen un módulo de seguridad del kernel llamado Yama que controla el acceso al uso de la capacidad ptrace contra otros procesos. Aunque asminject.py no se adjunta a la interfaz del depurador, aun así requiere permiso para usar la capacidad ptrace. Si recibes errores sobre esta capacidad, verifica el contenido de /proc/sys/kernel/yama/ptrace_scope. Si está establecido en 2, ejecuta el siguiente comando como root:
echo 1 > /proc/sys/kernel/yama/ptrace_scope
Los valores de 3 o superiores no pueden desactivarse sin reiniciar. Sin embargo, si eres un administrador autorizado de un sistema Linux en el que alguien ha establecido accidentalmente /proc/sys/kernel/yama/ptrace_scope en 3, o estás realizando una prueba de penetración autorizada de un entorno donde se ha establecido ese valor, consulta el directorio ptrace_scope_kernel_module para ver una posible solución alternativa que no requiere reinicio.
gcc a nivel de sistema operativo.eval de código de script legible por humanos), proporcionar cargas útiles que aprovechen esta capacidad para lograr un sigilo aún mayor.dlinject.py.asminject.py - se requiere más investigación.asminject.py podría solicitar al operador una línea de código para inyectar, inyectarla, devolver el resultado obtenido y luego solicitar al operador otra línea de código.
asminject.py de una manera que evite la necesidad de Frida de invocar temporalmente la interfaz del depurador.asminject.py/proc/mem