Lamento el título confuso, pero lo que pregunto es esto: ¿Podría ejecutar código de shell desde C (o cualquier otro lenguaje de programación) en un script de desbordamiento de búfer programado en Java (o cualquier otro lenguaje de programación)? )?
La respuesta rápida a tu pregunta confusa es "sí".
Los ataques de desbordamiento de búfer toman algunos pasos. Existe la fase de entrega (la vulnerabilidad), la inyección de exploits (que obtiene el control del Puntero de instrucciones), la ejecución (el puntero de instrucciones para ejecutar el código del atacante) y el código de shell (la carga útil que el atacante desea ejecutar).
La entrega del exploit es completamente trivial. Los atacantes escriben el código de entrega en cualquier idioma en el que sean competentes. No importa en qué idioma esté escrito el código de entrega, porque el idioma simplemente tiene que poder entregar valores de bytes específicos en el búfer en el punto del desbordamiento. Diferentes idiomas tienen diferentes formas de expresar los valores de bytes. Muchos ataques en estos días se entregan en URL, que son cadenas de texto que son perfectamente capaces de especificar valores de bytes exactos. He visto un ataque entregado dentro de un código de barras, que es inteligente, pero aún trivial.
El paso de inyección de exploits casi siempre utiliza el lenguaje de máquina binario de la máquina víctima para explotar la vulnerabilidad. El atacante encuentra una forma de cargar bytes específicos en el búfer en el punto correcto, de modo que cuando la función que contiene el búfer regresa, carga los bytes del atacante en el puntero de instrucciones en lugar de los bytes que se supone que están allí.
Una vez que el atacante tiene el control del puntero de instrucciones, se debe configurar la IP para que apunte al código de explotación y lo ejecute. Esto puede ser fácil, esto puede ser difícil, o esto puede ser virtualmente imposible. Todo es parte del análisis de las vulnerabilidades para crear un exploit exitoso. El objetivo aquí es conseguir que la máquina víctima inicie el código de shell.
Una vez que el exploit lanza el código de shell del atacante, el resto es historia. El código de shell es específico de la máquina en la que se está ejecutando. La mayoría de las veces, también se encuentra en instrucciones de máquinas binarias que se escriben a mano en un ensamblador, porque el búfer original que está siendo atacado generalmente tiene restricciones de tamaño. Una vulnerabilidad de desbordamiento de búfer no significa automáticamente que haya un búfer de tamaño infinito disponible para que el atacante pueda entregar una gran cantidad de código shell de una sola vez.
Una vez que el código de shell se está ejecutando, el atacante ha pulsado la máquina y puede controlarlo como quiera. Para comenzar, a menudo hará que el código de shell exponga un shell de comando nativo presente en la máquina víctima. Eso podría ser bash, un shell de comandos de Windows, PowerShell. Otras posibilidades incluyen descargar y ejecutar un agente de malware; permitiendo operaciones gestionadas de forma remota. Los nombres comunes para estas máquinas infectadas son "bots" o "zombies". Estos se ejecutan en un lenguaje de control y comando personalizado diseñado para operar miles de máquinas en una red de bots. Una vez que se ejecuta el código de shell, el atacante puede descargar más código para ejecutar sus comandos maliciosos.
Observe que todos los idiomas de exploits no están relacionados con el idioma en el que se entregó originalmente el ataque.
Lea otras preguntas en las etiquetas buffer-overflow shellcode