martes, 25 de febrero de 2014

Ingeniería reversa de firmware: Análisis de vulnerabilidad del router D-link DIR-300

Anteriormente se dio a conocer una vulnerabilidad sobre los routers D-link DIR-300 y DIR-600. En su momento, realicé un análisis sobre esta vulnerabilidad descubierta por Michael Messner en We Live Security, mostrando con ejemplos prácticos cuál podía ser el alcance de la misma. Sin embargo, en esta ocasión vamos a avanzar un poco más profundo aplicando ingeniería reversa sobre el firmware del router D-link DIR-300 para demostrar como analizar el mismo y ver en mayor detalle la vulnerabilidad a nivel de código.

Extracción del firmware

Una vez que se descargó el firmware del sitio web de D-link (versión vulnerable -  2.12 build 18.01.2012), se requiere un análisis previo ya que el mismo no puede legible por el formato que posee.

Cómo primer paso, se utiliza binwalk, una herramienta ampliamente utilizada a la hora de analizar diferentes tipos de firmware. Ejecutando binwalk sobre el archivo del firmware, se obtiene la siguiente respuesta:


La herramienta identificó diferentes tipos de cabeceras. En este caso, la que realmente nos importa es la última de ellas, la cual es un filesystem Squashfs (muy común en sistemas embebidos en routers). El paso siguiente es extraer la misma para luego analizarla. Para ello utilizaremos la herramienta dd, la cual es capaz de llevar adelante esta tarea.

A dd se le debe brindar cierta información para que realice la extracción correcta y no obtengamos un archivo corrupto (esto suele ser un dolor de cabeza en más de una ocasión). 


Expliquemos cada uno de los parámetros:

  • if: Archivo de origen.
  • bs: Cantidad de bytes que se leerán de forma simultánea.
  • skip: Establece el offset en cantidad de bytes. Este valor es el obtenido con binwalk.
  • of: Archivo de salida.
Si ahora revisamos el formato del archivo de salida, obtenemos un archivo del tipo Squashfs versión 4.0.


Se debe extraer este archivo en formato Squashfs. Para ello utilizaremos una gran herramienta conocida como firmware-mod-kit

Tal como aclaramos anteriormente, la versión del archivo Squashfs es la 4.0. Entonces tendremos que utilizar el comando unsquashfs.sh para tal versión. Es por esto que debemos compilar los archivos fuentes dentro de la carpeta /src/others/squashfs-4.0-lzma (lzma es un formato de compresiónmediante el comando make. Finalmente procedemos a ejecutar este comando.


Ahora ya estamos en condiciones de comenzar a analizar el firmware correspondiente al router. Para ello solo hace falta ingresar al directorio squashfs-root, donde está el árbol completo de directorios.

En este caso, para analizar la vulnerabilidad sobre el archivo command.php descubierta por Michael Messner, vamos al directorio /htdocs/web/ (en esta ubicación están la mayoría de los archivos públicos cuando el firmware está instalado). Allí está el código fuente de este archivo.


Tal como se puede observar, el archivo command.php (tal como se describe en la vulnerabilidad), no posee ningún tipo de control sobre la sesión, por lo que cualquier usuario que posea conocimiento de este archivo, puede ejecutar comandos libremente sobre el router que posea este firmware. Asimismo, es posible concatenar comandos, y es la sección del while la que se encarga de esta tarea.

El proceso de análisis de firmware es difícil y muy complejo. En este caso pudo obtenerse acceso al mismo para su posterior análisis. En ciertas circunstancias es más complicado llegar a estos resultados debido a que las cabeceras no corresponden a un formato estándar por lo que no es posible obtener los datos en plano tan sencillamente. De todas formas, un punto positivo es que existen muchas herramientas libres para llevar a cabo tareas de esta índole.

Espero que les haya interesado. ¡Nos vemos pronto!.

Abrazo!

Fernando Catoira

1 comentario: