miércoles, mayo 17, 2017

Hacking Android: Ataques de "Directory Trasversal" con ficheros ZIP

En la BlackHat London 2015 el investigador Ryan Welton mostró cómo se podía hacer directory traversal a través de inyecciones ZIP en dispositivos Android. Mi compañero Fran Ramirez (@cyberhadesblog) y yo hemos estado ojeando esta técnica estos días. La idea es muy sencilla, un archivo ZIP creado de forma maliciosa puede permitir a un potencial atacante escribir un archivo arbitrario en secciones no controladas del sistema operativo Android. Y cuando decimos arbitrario, queremos decir en una ubicación para la cual la app que lo ejecuta no tendría acceso a priori.

Figura 1: Hacking Android. Ataques de "Directory Trasversal" con ficheros ZIP

Como se puede ver, la idea presentada por Ryan Welton es sencilla a la vez que interesante. Podemos generar un ZIP que extraiga los archivos subiendo varios niveles de la carpeta dónde se encuentra. Esto sería fácil a través de la sintaxis “../”. Si el fichero ZIP no es gestionado de forma adecuada, esto podría permitirnos escribir fuera del directorio de extracción, es decir, escribir un archivo en otra ubicación, incluida otra aplicación. Esta técnica no es nueva, y en el año 2010, en el blog Seguridad Apple, teníamos ejemplos de estos trucos en herramientas como ZipEg para MacOS.

Figura 2: Ejemplo de manipulación de fichero ZIP con nombres ../../../../

Cómo se explicó en la charla de BlackHat muchas apps descargan recursos en formato ZIP, por lo que un atacante podría intentar colocarse en medio de una comunicación en una red y obtener ventaja modificando el ZIP que se descarga la app legítima y sustituirlo por un ZIP malicioso. Hay que tener en cuenta siempre los permisos de la carpeta donde queremos ubicar los ficheros inyectados. Si las rutas son directorios de sistema, será necesario que la aplicación o proceso que descomprima el fichero ZIP tenga permisos necesarios.

Figura 3: Remotely Abusing Android [PDF]

En el ejemplo mostrado por Ryan Welton, éste inyecta un fichero en unos de los ZIP que se descarga una aplicación de la Google Play Store (“My Talking Tom”) y que luego se descomprime automáticamente al ejecutarse (desde el proceso “PackageInstaller” de Android) el fichero APK donde se encuentra la misma. De esta forma garantizamos que al menos en la carpeta donde se instala la aplicación podemos inyectar nuestro código modificado o incluso sustituir alguna librería o módulo del programa original como hemos mencionado antes.

Escenarios posibles

Los escenarios pueden ser distintos, por lo que vamos a ver distintos casos que se detallan en la charla de Ryan Welton:
El caso base: Aplicación vulnerable y que no comprueba nada en la extracción del ZIP. Ante este caso la escritura del archivo malicioso en la ubicación deseada es casi segura. 
Comprobación del hash del ZIP esperado: En algunas aplicaciones se descubrió que comprobaban el hash del ZIP a descargar, por lo que, si éste era manipulado en su descarga, no se procedía con la extracción. 
Figura 4: Validación de Hash en fichero descargado
Manifest: En algunas aplicaciones que comprobaban el hash del ZIP, se enviaba una especie de manifest, un archivo JSON, en el que se podía ver el hash esperado. Esta petición también se realizaba por HTTP, por lo que se podía llevar a cabo la modificación previa de dicho JSON.
Probando la inyección

En primer lugar, hablamos del entorno que se ha montado para llevar a cabo esta prueba.
• Máquina con Kali Linux 2.
• MITMProxy versión 0.18.2 para la inyección del ZIP manipulando el tráfico.
• Dispositivo móvil Android.
• 4 máquinas virtuales de Android, entre las que están la 7.1, 6.0, 5.1.0 Y 4.4.1.
• BusyBox 1.22 en las máquinas virtuales.
• BusyBox 1.26.2 en el dispositivo Android.
El procedimiento llevado a cabo es utilizar MITMProxy para ver el tráfico generado por la app. Nosotros hemos querido ejemplificar este hecho, para que se vea claro.

Figura 5: Interceptando el tráfico con MITMProxy

En el siguiente video se puede ver MITMProxy mostrando las peticiones que se realizan, y en el instante en el que se quiere descargar un ZIP de una ubicación X, se lleva a cabo la modificación o inyección del ZIP malicioso por el legítimo.

Figura 6: Vídeo de manipulación de ZIP con MITMProxy

Viendo esto está claro que se puede manipular de forma sencilla este tráfico. Una vez la aplicación descarga el archivo ZIP modificado, depende de los permisos o mecanismos de seguridad que se tengan para proteger la extracción y la ubicación dónde se pondrán los ficheros que se encuentran en el interior del ZIP.

Para esta PoC hemos utilizado el código publicado en la artículo de We Live Security cambiando solamente el formato de decodificación de UTF-8 a ISO-8859-1 y el “payload”. Este script de mitmproxy detecta el tráfico de red, en concreto analiza las cabeceras GET de http/https y cuando detecta un fichero con los caracteres “PK” en los primeros dos bytes (cualquier fichero en formato ZIP) activa inyección.

Figura 7: Script para hacer inyección de ZIP en MITMProxy

La rutina “response” se encarga de detectar los ficheros y también es aquí donde definimos las rutas de inyección. La rutina “injectIntoZip” por otro lado, se encarga de insertar el fichero con nuestro payload (en nuestro caso el fichero “zipizape”) dentro del fichero ZIP interceptado. En vez de utilizar directamente mitmproxy hemos optado por la versión mitmdump, para poder mostrar los mensajes de salida (“Found ZIP” y “Zip injected”) una vez se ha realizado la inyección como puede observarse en la imagen anterior. El funcionamiento de mitmproxy y mitmdump es idéntico, sólo tienen como diferencia la información que muestran en pantalla.

Unzip en BusyBox

En todos los sistemas Android donde hemos realizado las pruebas se ha utilizado el programa “unzip” integrado en Busybox. Éste es básicamente un paquete de aplicaciones que reúne las utilidades y comandos más comunes de UNIX (como por ejemplo el mencionado “unzip”) en un único fichero binario. Muchos sistemas GNU/Linux llevan por defecto una versión de este paquete debido a su gran utilidad.

Figura 8: PoC de inyección de fichero ZIP en Android con Busybox 1.22

La primera curiosidad que nos encontramos es que en función de la versión de Busybox que se esté utilizando, la inyección a través del ZIP funciona o no lo hace. En estos videos se pueden ver las diferentes posibilidades, con la versión 1.22 y con la versión 1.26.2.

Figura 9: PoC de inyección de fichero ZIP en Android con BusyBox 1.26.2

Interesante charla y concepto de inyección a través de los ficheros ZIP. La posibilidad de tener o aprovechar un Directory Traversal en sistemas como Android es un concepto interesante. Por supuesto, hay sistemas parcheados y otros muchos Android que están expuestos a este tipo de ataques o técnicas, y, lógicamente, dependiendo de las medidas de seguridad que pongan las apps para descargar los ZIP serán vulnerables o no a estos ataques. Además, estos trucos podrían empezar a ser utilizados por el malware para Android para ocultarse mejor en el sistema.

Autores: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths y Fran Ramirez (@cyberhadesblog) escritor de libro "Microhistorias: anécdotas y curiosidades de la historia de la informática" e investigador en ElevenPaths

No hay comentarios:

Entrada destacada

Nuevo libro "Máxima Seguridad en Windows: Secretos Técnicos 4ª Edición" de @0xWord

Desde 0xWord se ha acelerado para tener a tiempo antes del verano la 4ª Edición del libro "Máxima Seguridad en Windows: Secretos Técn...

Entradas populares