Blogs

Complejidad del Fuzzing

na manera común de juzgar el potencial “Fuzzing” del software es determinar su complejidad. Por ejemplo, un servio Echo es menos complejo y potencialmente factible de Fuzzing, comparado con un servicio HTTP. El protocolo HTTP es en magnitud más complejo, lo cual también implica más código y funcionalidad. Esta complejidad usualmente introduce áreas grises, los cuales son más difíciles de comprender para los ingenieros, en cuyo caso las vulnerabilidades de seguridad pueden ser pasadas por alto.

Facilidad de Automatización para Fuzzing

La automatización para el proceso de pruebas puede ser muy simple o muy duro, dependiendo esto de la aplicación a evaluar. Algunas aplicaciones proporcionan diversos mecanismos, como funciones API exportadas, y capacidades de “scripting”, lo cual facilita la automatización. En casos donde tales capacidades no están disponibles, es posible utilizar herramientas dedicadas y especializadas en automatización de software. En diferentes escenarios, las herramientas específicas para automatización pueden simplificar el proceso de “Fuzzing”, haciéndolo más fácil de realizar.

Tipos de Entradas para Fuzzing

Una distinción importante entre los objetivos de evaluación, es la capacidad en lo referente a su interfaz, lo cual dicta la facilidad de automatización para el proceso de Fuzzing. Las interfaces simples, como pasar comandos sobre una línea de comandos, son más fáciles de utilizar y automatizar, comparado con aplicaciones las cuales únicamente aceptan comandos desde su interfaz gráfica de usuario.

Seleccionar un Objetivo para Fuzzing

El primer paso relacionado con un proyecto para realizar un “Fuzzing”, implica decidir cual será el objetivo de evaluación. En aquellos escenarios donde el objetivo puede ser elegido de manera arbitraria, es una buena idea el tratar de maximizar las probabilidades de encontrar una funcionalidad en donde sea factible realizar el procedimiento de “Fuzzing”.

Algo heurístico puede ser utilizado para realizar la evaluación de los objetivos basados en función de potencial “Fuzzing”. A continuación se detalla una lista de algunos temas heurísticos interesantes.

Introducción al Fuzzing

Una de las maneras más rápidas de entrar en la investigación de vulnerabilidades, es a través de las pruebas de software. Las pruebas tradicionales de software de tipo caja negra, son interesantes desde la perspectiva de investigación de vulnerabilidades, porque no requieren una comprensión de los mecanismos internos del software. El único requerimiento para empezar a buscar por vulnerabilidades, es conocer cuales interfaces permiten la interacción con el software, y generar los datos pasados a través de estas interfaces.

Herramientas Automáticas para Análisis Binario

Para auditar automáticamente un binario por potenciales vulnerabilidades, cualquier herramienta debe primero comprender el formato del archivo ejecutable utilizado por el binario, ser capaz de interpretar las instrucciones en lenguaje máquina contenidas dentro del binario, y finalmente determinar si el binario realiza algunas acciones probablemente explotables. Tales herramientas son mucho más especializadas comparadas con las herramientas para auditar el código fuente.

IDA

IDA es un desensamblador y depurador multi procesador para Windows, Linux o Mac OS X, el cual ofrece muchas características . IDA es un desensamblador interactivo, el cual permite a los usuarios tomar participación activa en el proceso de desensamblamiento. IDA no es un analizador automático de programas. IDA proporcionará sugerencias sobre instrucciones sospechosas, problemas no resueltos, etc. Es el trabajo del profesional informar a IDA como debe proceder. Todos los cambios hechos son guardados hacia el disco.

Desensambladores

Mientras la descompilación de un código compilado es una tarea extremadamente retadora, desensamblar el mismo código fuente no lo es. Para cualquier programa compilado se ejecute, este debe comunicar alguna información hacia el sistema operativo anfitrión. El sistema operativo necesitará conocer un punto de entada del programa (la primera instrucción la cual debe ser ejecutada cuando el programa sea iniciado); la disposición de memoria deseada del programa, incluyendo la ubicación del código y datos; y cuales librerías el programa necesitará acceder mientras se ejecuta.

Descompiladores

La descompilación es quizá el santo grial de la auditoria binaria. Con una verdadera descompilación, la noción de un producto de fuente cerrada se desvanece, y la auditoría binaria revierte hacia el código fuente. Sin embargo, la verdadera descompilación es una tarea excepcionalmente difícil. Algunos lenguajes se prestan muy bien para la descompilación, mientras otros no. Los lenguajes ofreciendo mejor esta oportunidad, son por lo general lenguajes híbridos compilados / interpretados, como Java o Python.

Auditoría Manual de Código Binario

Dos tipos de herramientas simplifican enormemente la tarea de realizar ingeniería inversa hacia una archivo, estos son los desensambladores y los descompiladores. El propósito de un desensamblador es generar lenguaje ensamblador desde un binario compilado, mientras el propósito de un descompilador es intentar generar código fuente desde un binario compilado. Cada tarea tiene sus propios desafíos, y ambos son de hecho difíciles, con la descompilación siendo la más difícil de las dos.

Pages

Sobre el Autor


Alonso Eduardo Caballero Quezada - ReYDeS
Instructor y Consultor en Hacking Ético, Forense Digital & GNU/Linux
Correo Electrónico: ReYDeS@gmail.com
Twitter: @Alonso_ReYDeS
LinkedIn: pe.linkedin.com/in/alonsocaballeroquezada
Facebook: https://www.facebook.com/alonsoreydes
Youtube: http://www.youtube.com/c/AlonsoCaballero
Resumen de mi CV: http://www.reydes.com/d/?q=node/1