Hemos explicado anteriormente por este mismo medio sobre la detección de vulnerabilidades de software mediante fuzzing. Esto puede ser de gran utilidad a la hora de auditorías sobre aplicaciones desarrolladas o destinadas dentro de un sistema crítico. En este caso se profundizará más en los tipos de herramientas y en el funcionamiento de las mismas.
¿Qué tipo de herramientas existen?
Las herramientas para realizar fuzzing, comúnmente llamadas fuzzers, apuntan a diferentes tipos de objetivos. Existen herramientas que realizan pruebas contra distintos tipos de datos de entrada. Generalmente, los análisis se llevan a cabo con combinación de números, caracteres, metadata o incluso secuencias de binarios. Se suele tener en cuenta, además, los vectores conocidos que suelen provocar problemas de validación. Un ejemplo claro es cuando el dato de entrada es un número entero, siendo en este caso el número cero el vector o incluso un número negativo. En el caso de cadenas de texto, se utiliza la inserción de instrucciones a partir del texto de entrada, entre otros.
El fuzzing abarca incluso el análisis sobre la interfaz gráfica de una aplicación. Suponiendo que se está trabajando con una aplicación de escritorio, se puede realizar, por ejemplo, pruebas correlativas sobre diferentes secuencias de los distintos botones con los que cuenta la aplicación. También es posible extender las pruebas a las funcionalidades de importación o exportación, entre otras. Otro tipo de fuzzing que suele practicarse es el vinculado a la comunicación de red. Se puede someter el protocolo a diferentes pruebas para observar la reacción frente a protocolos inválidos o no reconocidos por la propia aplicación.
Es importante aclarar que el fuzzing puede extenderse al punto de que sea posible descubrir cualquier tipo de vulnerabilidad referente a la manipulación de datos y las funcionalidades que brinda la propia aplicación.
Simulación de escenario y aplicacación de fuzzing
A modo de demostración y con la aclaración pertinente de que no se trata de un escenario real sino de un simple ejemplo de cómo implementar un fuzzer específico simple, se implementó un pequeño código en PHP que simula ser un panel de administración web. La particularidad de este panel radica en que el formulario de ingreso está oculto de tal forma que todos los días se genera con una clave de un parámetro diferente que solo posee conocimiento el administrador. A continuación se muestra una captura del mensaje de error si se intenta ingresar directamente a admin.php:
Si se ingresa estableciendo el parámetro id con un valor erróneo:
De la misma forma se incluye, además, el código de la aplicación web y el algoritmo generado para ocultar:
Suponiendo que no se tiene conocimiento de este algoritmo por parte de quien está auditando la aplicación, se procedió a generar el fuzzer correspondiente que permita encontrar el formulario del panel de administración. Sabiendo que la aplicación utiliza el parámetro id para validar, se programó el fuzzer para que genere números sobre dicho parámetro en búsqueda de un mensaje diferente al de “You are not supposed to be here!” para que de esa forma se pueda encontrar el panel. En otras palabras, cuando se encuentre un resultado diferente al antes especificado, el fuzzer encontrará que esa es la clave del día del parámetro para visualizar el formulario. A continuación se puede visualizar el código completo correspondiente al fuzzer:
Si ahora se ejecuta el fuzzer sobre el servidor donde se aloja nuestra aplicación web de prueba obtenemos el siguiente resultado:
Con el id especificado por el fuzzer ahora es posible ingresar al formulario del panel de administración. Se realiza la comprobación para corroborar que realmente se puede visualizar:
El ejemplo tuvo como finalidad conocer lo que es posible lograr a través de un fuzzer. En este caso se desarrolló el fuzzer específicamente para la aplicación web del ejemplo, pero existen herramientas muy potentes que son ampliamente configurables y pueden adaptarse a distintas aplicaciones web. La finalidad del fuzzing es someter a pruebas de estrés a las aplicaciones para poder encontrar posibles vulnerabilidades y mejorar el nivel de seguridad.
Fernando Catoira
Analista de Seguridad