El pasado 31 de Enero se publicaba el siguiente artículo: «Security Advisory: Remote Command Execution in binwalk» en el blog de los germanos ONEKEY, ésta publicación contenía el detalle técnico de una vulnerabilidad nueva identificada en la herramienta Binwalk, que fue reportada al fabricante y registrada con el código CVE-2022-4510, a continuación la ficha técnica del reporte y demás detalles publicados:
En mi afán por validar todas las vulnerabilidades posibles en un entorno acondicionado para esta finalidad y controlado (este año estoy intentando priorizar con esto), he decidido realizar mis pruebas de laboratorio y por ello hoy les traigo esta pequeña entrada.
Por supuesto que quedan más que invitados a revisar el documento de origen de la vulnerabilidad para interiorizarse con la misma, pero para poner cierto contexto diremos que Binwalk es esta herramienta ligera que nos apoya de forma rápida y práctica para cuando estamos analizando firmware y muestras durante una etapa de RE (Ingeniería Inversa).
Pues lo que identificó la buena gente de ONEKEY fue la posibilidad de mediante un fichero PFS malicioso y especialmente diseñado, mediante técnica de Path Traversal conseguir escribir fuera del directorio de extracción base (que normalmente y como veremos más adelante, suele generarse uno con el nombre del fichero origen acompañado de algunos caracteres prefijos y sufijos, ejemplo: _file-X.extracted). Logrando llevar estratégicamente al apartado (directorio) de plugins del usuario, un fichero arbitrario cuyo contenido será ejecutado posteriormente por la herramienta, propiciando la ejecución de comandos en el sistema, también conocido como el deseable RCE. A continuación la estructura detrás del directorio .config
Tomando en cuenta en rango de las versiones vulnerables, en mi caso y sobre docker me he montado la versión 2.2.1:
Para los que no estén habituados a la herramienta por aquí les dejo el menú de ayuda, marcando simplemente las opciones (banderas) que pondremos en marcha a continuación:
Bien, arrancaremos poniendo en marcha la PoC que el investigador Quentin Kaiser (@qkaiser) diseñó inicialmente, esta puede ser descargada desde aquí: https://github.com/ReFirmLabs/binwalk/files/9873311/poc.zip.
Al ponerla en marcha evidenciamos rápidamente como un mensaje de prueba se ve presentado justo después de la ejecución «normalizada» de la herramienta. Algo ha ocurrido evidentemente:
Pues revisemos el fichero pfs (malicious.pfs) contenido en el recurso comprimido poc.zip:
Aquí se evidencia la estrategia vía Path Traversal de «colar» un script malintencionado en python como plugin de la herramienta. Aunque siendo una PoC, este script apenas tiene la intención de pintarnos en pantalla el mensaje que reseñábamos anteriormente. A continuación como queda colocado en el destino el script en python:
Evidentemente el script en python es funcional y cumple con el propósito de la PoC, pero pensemos en ir un poco más allá: Qué tal si, ahora sabiendo que tenemos la posibilidad de dejar un script en python que posteriormente será ejecutado por la herramienta ejecutamos comando en el sistema? Para ello haremos una leve modificación al fichero PFS:
Al llevarlo al objetivo y al ponerlo en marcha a través de Binwalk, conseguimos el siguiente resultado alentador:
Y hasta aquí bien, pero: ¿Qué tal si aumentamos la ambición y pretendemos establecer una reverse shell y por tanto conseguir acceso remoto al objetivo? Pues nada, modificaremos otra vez el fichero PFS en origen haciendo los siguientes cambios:
Al ejecutarlo, lamentablemente parece que no ha marchado del todo bien:
Obtenemos algunos mensajes de error, que pueda estar relacionado con la integridad del script en python. Veamos lo que tenemos con el directorio de plugin:
Observamos que el script trasladado está incompleto. En ese momento nos podremos como Mauricio Colmenero y nos preguntaremos:
…Y bueno, después de algunas pruebas y errores, asumo que tal vez tenemos limitación de espacio, esto puede resultar intencionado, por si acaso me ajustaré el cinturón:
En este caso prescindiré del fichero base de la PoC inicial y priorizare con mi código en python que me establezca la conexión reversa:
Listo, el tamaño parece ser el apropiado, vamos con la ejecución final (como diría mi amigo Jason: «sin miedo al éxito!«):
Yeah! El resultado fue el esperado. Veamos ahora el script en python resultante que se ubicó en el directorio de plugins:
Efectivamente, es un script totalmente funcional y que se ejecutará cada vez que trabajemos con este zip especialmente preparado.
Llega el momento de acabar con la analogía y que mejor manera que esta: