Classic exploiting I: Buffer Overflows
Buffer Overflow
Los ataques mediante los llamados Buffer Overflows se remontan al año 1988 cuando el gusano informático Morris infectó el 10% de internet.
Los ataques de buffer overflow se basan en la ejecución de código malicioso haciendo uso de un programa lícito que sufra esta vulnerabilidad. De esta forma el código malicioso pasa desapercibido ante los antivirus de archivos ya que se ejecuta de forma directa sin pasar por el disco.
Funcionamiento
Los programas que se ejecutan en un ordenador no son más que una serie de instrucciones codificadas en binario, las cuales el procesador interpreta y ejecuta de forma secuencial.
A veces estas instrucciones son las llamadas instrucciones de salto, estas indican al procesador la dirección de memória donde leer la siguiente instrucción.
Un atacante puede abusar de esta funcionalidad cambiando la dirección de salto a un destino donde se encuentre cargado el código malicioso. En el momento que el procesador ejecute la instrucción de salto, saltará al inicio del código malicioso.
Explotación
Un ejemplo de vunlerabilidad que se puede encontrar son los programas de línea de comandos en los que se guarda un paràmetro del comando sin hacer ningún tipo de comprobación sobre su tamaño.
Normalmente los programas se estructuran por funcione, siendo una función una parte del código que puede ser reutilizada. Las funciones de código acaban siempre con una instrucción de retorno, la cual es un salto hacia la parte del código que ha llamado la función.
Analizando el código de la aplicación a explotar (directamente desde memoria) podemos pasar un parámetro de línea de comandos que contiene lo siguiente:
- Código malicioso en hexadecimal
- Datos de relleno
- Instrucción de salto al inicio del código malicioso
El programa asigna un espacio de memoria donde guardar el parámetro y escribe en el mismo. Este espacio de memoria, el cual llamaremos buffer, tiene un tamaño prefijado que se especifica en el momento de pedir la memoria al sitema operativo.
Si se da el caso que el programa asigna un buffer de tamaño arbitrario y el parámetro es más largo que el buffer, se dará un buffer overflow. En un buffer overflow se escriben datos fuera del buffer asignado y por tanto se pueden sobreescribir otros datos e instrucciones del programa.
Con un parámtero malicioso, escribimos el código malicioso en la memória del programa, llenamos el resto del buffer con datos de relleno (cualquier valor) hasta causar un buffer overflow. Seguimos escribiendo datos de relleno hasta llegar a la instrucción de retorno y en esta instrucción sobreescribimos el valor de retorno hacia el que apunta al código malicioso.
Hay otras formas de explotar una vulnerabilidad de este tipo, como ahora pipes o sockets. De esta forma se podria explotar un buffer overflow remotamente creando una vulnerabilidad RCE (Remote Code Execution).
Protégete!
Mantener el entorno empresarial seguro se ha convertido en un requisito esencial ante la creciente aparición de amenazas.
Si creeís que podeís ser atacados o necesitaís asesoramiento en ciberseguridad…