Un honeyclient para CVE-2015-2865

Recientemente se ha publicado una vulnerabilidad (CVE-2015-2865) que afecta a varios modelos de móviles Samsung Galaxy, y que permite la ejecución remota de código como usuario system siempre que sea posible montar un ataque MitM entre el terminal y los servidores de Samsung (normalmente utilizando técnicas como ARP cache poisoning o similares sobre redes wifi de hoteles, restaurantes, etc. a las que estén conectados el atacante y la víctima).

Estos terminales vienen preinstalados con el teclado virtual Swift, de Samsung. Cuando el usuario instala un language pack adicional para este teclado, o cuando se actualiza uno de los existentes, en primer lugar la aplicación descarga el catálogo de packs en formato JSON desde la URL correspondiente:

http://skslm.swiftkey.net/samsung/downloads/v1.3-USA/languagePacks.json

Por ejemplo, en el caso del language pack para portugués, el trozo relevante del fichero sería similar al siguiente:

{"name":"Português (PT)","language":"pt","country":"PT","sha1":"80d5d77e9155a386b2af2c34f5054eb1643ca08d",
 "version":0,"archive":"http://skslm.swiftkey.net/samsung/downloads/v1.3-USA/pt_PT.zip",
 "live":{"sha1":"2ffe82ac539697e898d0d6f9a021e81b1801fe90","version":1187,
 "archive":"http://skslm.swiftkey.net/samsung/downloads/v1.3-USA/ll_pt_PT.zip"}}

A continuación, el terminal descarga el language pack en sí, contenido en el fichero ZIP indicado en el catálogo:

http://skslm.swiftkey.net/samsung/downloads/v1.3-USA/pt_PT.zip

La vulnerabilidad queda por lo tanto clara: aunque la aplicación sí que verifica que el SHA1 del fichero descargado coincida con el del catálogo, la primera descarga se lleva a cabo por HTTP, y no por HTTPS, por lo que montando un ataque MitM es posible falsificar tanto el SHA1 como el fichero ZIP. Si se introducen rutas relativas en los ficheros incluidos en este ZIP malicioso (path traversal), como el teclado virtual se ejecuta como usuario system es posible (salvando algunas dificultades técnicas detalladas en el informe de la vulnerabilidad) instalar ficheros en rutas clave del dispositivo que permitirán la ejecución de código arbitrario, posibilitando la contaminación del terminal.

Cabe destacar que el teclado virtual Swift no es desinstalable en las condiciones habituales, y que la vulnerabilidad es explotable aunque este teclado no sea el utilizado por defecto, por lo que de momento no se conoce ningún workaround, y es de esperar que la vulnerabilidad se convierta rápidamente en «un clásico» para pentesters y atacantes en general; el módulo para Metasploit debe estar (a fecha del presente) ya en camino, y durante los próximos días se irán conociendo detalles sobre el impacto de la vulnerabilidad en el parque de móviles Samsung español.

Más allá de aprovechar la vulnerabilidad para atacar a nuestros clientes en futuros pentests, sobretodo cuando detectemos móviles Samsung sobre la mesa durante la reunión de arranque de proyecto (en ese momento ya empezaba la fase de reconocimiento, ¿no? :) Estas ocasiones siempre son buenas para tratar de atacar también a los propios atacantes, e intentar aprender de ellos implementando un sencillo honeyclient :)

En este caso, en principio bastaría con tener presente el SHA1 «bueno» actual, descargar el catálogo desde el honeyclient, y comparar los valores:

#!/usr/bin/env python

import urllib2
import json
import time
import re

GOOD_SHA1 = "80d5d77e9155a386b2af2c34f5054eb1643ca08d"
CATALOG_URL = "http://skslm.swiftkey.net/samsung/downloads/v1.3-USA/languagePacks.json"

opener = urllib2.build_opener()
opener.addheaders = [(
    "User-agent",
    # somos un androide :)
    # modificar teniendo en cuenta modelos utilizados en ES
    "Dalvik/1.6.0 (Linux; U; Android 4.4.2; SM-G900T Build/KOT49H)"
)]

catalog = json.loads(opener.open(CATALOG_URL).read())
sha1, zip_url = [(d["sha1"], d["archive"])
                 for d in catalog if d["country"] == "PT"][0]

if sha1 == GOOD_SHA1:
    print "Limpio"
else:
    if not re.match(r"http://skslm.swiftkey.net/samsung/downloads/v1.3-USA/[a-zA-Z_]+?.zip", zip_url):
        print "WTF!? %s" % zip_url
        exit(1)
    filename = "%s.zip" % int(time.time())
    print "Sucio: malware -> %s" % filename
    req = opener.open(zip_url)
    CHUNK = 16 * 1024
    with open(filename, "wb") as f:
        while True:
            chunk = req.read(CHUNK)
            if not chunk:
                break
            f.write(chunk)

Si el SHA1 «bueno» no coincide con el que hemos obtenido descargando el catálogo a través de la red a la que estamos conectados, significa que hay alguien más on the air, cazando :) y descargaremos el ZIP que nos presenta, que contendrá el malware con el que nos está intentando infectar; con suerte y paciencia, podríamos conseguir un malware diferente al típico meterpreter o cualquier otro artefacto ya trillado, y pasaríamos a analizarlo debidamente en un entorno de laboratorio.

Por supuesto, el SHA1 «bueno» irá cambiando, y sería deseable automatizar su actualización desde una fuente fiable. Además, aunque siempre podemos desplegar el script sobre una red wifi aparentemente vulnerable, dispuesta con un fake AP (en forma de honeypot), lo ideal sería podernos llevar el honeyclient «puesto», sin necesidad de cargar con el portátil con la Kali, para probarlo cómodamente (y tratar de cazar) cuando visitemos nuevas redes wifi poco confiables :) Podríamos desarrollar el honeyclient como una app con el SDK de Java para Android, generando el correspondiente APK, pero para una prueba de concepto rápida podemos reutilizar el anterior código Python sin apenas modificaciones con ayuda de QPython, un port del intérprete de Python (más algunas librerías extra) en forma de app directamente instalable desde Google Play:

La aplicación nos permite abrir una consola con el intérprete de Python, y también dispone de un editor, con el que podemos abrir, modificar o ejecutar nuestros propios scripts.

En el caso del intérprete, vemos que podemos importar los módulos habituales de la librería estándar:

Copiando el anterior script en Python a la tarjeta SD de nuestro terminal, podemos modificarlo con el editor de QPython. Tan sólo es necesario cambiar la ruta donde guardaremos el fichero ZIP con el malware en caso de que hayamos detectado un ataque (por ejemplo, /storage/sdcard1/ para la tarjeta SD).

Y ya podemos ejecutar el honeyclient desde nuestro terminal. Ésta sería la salida en caso de que no se detecte un ataque:

Y ésta en caso de ataque:

Efectivamente, va guardando los ficheros con el malware en la tarjeta SD:

Además, utilizando la API de Android en nuestro script, podríamos programar la comprobación cuando detectemos conexiones a redes wifi no conocidas hasta el momento, ejecutar el honeyclient como un servicio en segundo plano, y todo lo que se nos pueda ocurrir… Lo interesante, independientemente de que utilicemos el SDK para Java, Python o cualquier otra alternativa, es que podemos añadir más vulnerabilidades (de Android o no) y comprobaciones a nuestro honeyclient «portátil», lo que nos permitirá acumular información y artefactos a nuestro paso por diferentes redes.