¿Qué intentan lograr los atacantes cuando atacan programas locales, como los desbordamientos de búfer?

4

En los ataques a programas, como los desbordamientos de búfer de pila, ¿cuál es el objetivo del atacante? Estoy teniendo problemas para aprender los detalles técnicos del ataque (como sobrescribir la dirección de retorno de la función) porque no está claro qué se pretende lograr con esos ataques. Por ejemplo, en la inyección SQL, generalmente se hace para obtener información confidencial o hacer que el servidor ejecute el código. Parece que el requisito previo para un ataque de desbordamiento de búfer es que el atacante ya tenga la capacidad de ejecutar código en la máquina, así que, ¿qué más quieren?

¿Es usualmente un programa en una computadora remota que está siendo atacado en estas situaciones? Por cierto, estoy más familiarizado con C ++ que con C.

    
pregunta Celeritas 14.12.2015 - 12:07
fuente

5 respuestas

6

Un aspecto que aún no se ha mencionado muy claramente: suponga que tiene un sistema multiusuario (como lo son todos los sistemas operativos de PC modernos como Windows, Linux, Unix, etc.), y suponga que es un usuario normal (no usuario privilegiado) que puede ejecutar aplicaciones "normales". Ahora desea hacer algo malicioso en su PC (como instalar un keylogger para obtener todas las contraseñas que los otros usuarios de la PC están escribiendo o leer los correos electrónicos de otros usuarios). Pero no puede hacerlo porque es un usuario normal, no tiene derechos administrativos, no puede instalar software y no puede ver los datos de otros usuarios.

Entonces, su objetivo es convertirse en un usuario con derechos administrativos (administrador en Windows, root en Linux / Unix, etc.). Además de engañar al administrador para que le brinde su contraseña, otra forma de lograrlo es atacar un programa vulnerable que ya se está ejecutando con derechos administrativos. Si pudiera hacer que un programa de este tipo ejecute su código (por ejemplo, al abusar de un desbordamiento del búfer), entonces este código también se ejecutará con privilegios administrativos, y -bang- podría hacer lo que quiera con la máquina.

Esto se denomina escalada de privilegios . Tenga en cuenta que (debido a razones técnicas que no se pueden explicar aquí en detalle) prácticamente todos los sistemas tienen muchos procesos (servidor) con privilegios de root ejecutándose en segundo plano, por lo que este es un escenario real (en realidad, estimo que la mayoría de los ataques contra programas locales se realizan para la escalada de privilegios).

Entonces, el factor clave es: cuando usted (un usuario normal) ejecuta un programa, este programa se ejecuta con sus propios privilegios y restricciones de acceso, pero cuando puede hacer que un programa que ya se está ejecutando con privilegios administrativos ejecute su propio código al abusando de los desbordamientos de búfer y técnicas similares, su código también se ejecuta con privilegios administrativos.

Tenga en cuenta que esta explicación está muy simplificada (por ejemplo, en Linux / Unix hay programas SUID, etc.), pero espero que exprese la idea subyacente.

Una última cosa: la escalada de privilegios es a menudo la meta si el ataque se realiza local o remotamente. Con suficiente frecuencia, los ataques funcionan en dos pasos:

  1. Primero, el atacante obtiene la contraseña de un usuario ingenuo (por ejemplo, porque es demasiado débil, es el cumpleaños de su esposa o el nombre de su perro) y luego usa estas credenciales para ingresar a la máquina respectiva de forma remota .

  2. Luego, como segundo paso, siendo ese usuario, el atacante escanea la máquina respectiva en busca de software vulnerable y privilegiado y, por ejemplo, al abusar de los desbordamientos de búfer en ese software, permite que el software ejecute su código malicioso que se ejecuta con los mismos privilegios que el software vulnerable, lo que hace que el atacante sea un administrador.

Por supuesto, también hay muchos casos en los que un atacante abusa directamente del software privilegiado que se ejecuta en un sistema remoto (por ejemplo, los procesos del servidor web que se ejecutan en Linux bajo la raíz). Pero como en primer lugar ha solicitado el sentido de los ataques locales, lo dejaremos por ahora.

    
respondido por el Binarus 17.12.2015 - 12:50
fuente
3

La mayoría de las vulnerabilidades que aprovechan la vulnerabilidad de desbordamiento de búfer hace Ejecución de código en la máquina de la víctima, y esta es la intención principal del atacante, tomar el control de otras computadoras de forma remota o local.

    
respondido por el dossi 14.12.2015 - 13:16
fuente
2

Los errores que causan desbordamientos de búfer a menudo se manifiestan cuando un programa opera con datos mal formados, que recibe de un mensaje de red o de un archivo que intenta abrir.

El potencial de explotación del primero es obvio: permite al atacante ejecutar código en un sistema remoto.

El segundo puede ser explotado enviando un archivo malicioso al usuario y engañándolo para que lo abra con el software vulnerable. Si bien la mayoría de los usuarios saben que ejecutar programas desde una fuente no confiable es una muy mala idea, muchos usuarios tienen mucho menos cuidado al abrir archivos desde fuentes no confiables.

    
respondido por el Philipp 14.12.2015 - 14:26
fuente
1
  

En los ataques a programas, como los desbordamientos de búfer de pila, ¿cuál es el objetivo del atacante? Estoy teniendo problemas para aprender los detalles técnicos del ataque (como sobrescribir la dirección de retorno de la función) porque no está claro qué se pretende lograr con esos ataques.

Están destinados a lograr la ejecución remota de código. Esto significa que quieren ejecutar código en su programa desbordando la entrada esperada. Siempre desea comprobar que su entrada corresponde a la longitud correcta.

Veamos desde una perspectiva diferente: control mental . ¿Qué pasaría si pudieras controlar la mente de alguien para hacer lo que quieras que haga?

Digamos que hay una vulnerabilidad en el cerebro de alguien donde solo pueden tomar comandos de 8 caracteres. Cualquier cosa fuera de eso se ejecuta porque no está revisada.

Tú: Hola. Responda con "Hola ..." ["Hello..." is 8 characters]

Víctima: Uhm, está bien. Hola ... [brain is only capable of processing 8 characters]

Tú : responde con "Pastel".

Víctima: Uh, "Cake".

Tú: ¿Qué te parece "Hola ... <shellcode to make them say "Buffalo!", beyond the original 8 character limit> "

Víctima: ¡Hola ... Buffalo!

Víctima: espera, ¿qué acabas de hacerme?

Tú : ¡Cómo están, caballeros! Todos tus búfalos son de nosotros.

Y ahora si "Buffalo" ¿Shellcode fue diseñado para ejecutar cualquier tipo de código que desee, como la descarga de un RAT ?

  

Por ejemplo, en la inyección SQL, generalmente se hace para obtener información confidencial o hacer que el servidor ejecute el código. Parece que el requisito previo para un ataque de desbordamiento de búfer es que el atacante ya tenga la capacidad de ejecutar código en la máquina, ¿qué más quieren?

Debido a que los desbordamientos de búfer, como cualquier tipo de explotación que permite la ejecución remota de código, suelen ser el resultado de una falla en el código de otra persona. Al igual que la inyección SQL, está intentando que la máquina remota ejecute el código.

Esto podría ser algo tan simple como enviar un comando mal formado a un programa normal. También podrías implementar vulnerabilidades intencionales en tus propios programas. Algunos individuos menos escrupulosos pueden hacer eso.

Hay muchas vulnerabilidades de RCE en varios idiomas. El truco consiste en encontrar algo, cualquier cosa, que le permita ejecutar código / comandos en el objetivo en cuestión que abre nuevas oportunidades para obtener acceso adicional.

    
respondido por el Mark Buffalo 17.12.2015 - 15:42
fuente
0

El objetivo general de un desbordamiento del búfer es apoderarse del flujo del programa y ejecutar el código su (malicioso).

Lo que quiere controlar en primer lugar es la llamada 'dirección de retorno' de una función. Antes de llamar a una función, la dirección actual se empuja en la pila, por lo que una vez finalizada la función, el programa sabe dónde estaba antes y continúa la ejecución. Así que si consideramos un ejemplo muy básico:

void test() {
  char array[4];
  gets(array);
  printf("%s\n", array);
}

entonces la pila probablemente se vería así:

0000000n:  array[0]
00000n+1:  array[1]
00000n+2:  array[2]
00000n+3:  array[3]
00000n+4:  address where *test* was called

Entonces, dado que obtiene no comprueba si su entrada se ajusta al búfer que proporcionó, escribirá y escribirá y escribirá en la pila, incluso si es más grande que su búfer. Por lo tanto, un atacante puede manipular la dirección de retorno y hacer que el programa salte a donde quiera después de que prueba haya finalizado (además, insertaría un código de máquina después de la dirección de retorno y se movería a esa área en algún lugar).

Tenga en cuenta que este ejemplo es muy abstracto y solo aquí para obtener la idea básica de este ataque. Para obtener más información, visite sitios como esto , o esta explicación más sencilla

    
respondido por el Sebastian 14.12.2015 - 12:53
fuente

Lea otras preguntas en las etiquetas