AppSec: Mitos en Python sobre ofuscación y reversing

Python es un lenguaje de programación fácil y potente que nos permite escribir sofisticados programas, como por ejemplo Dropbox y BitTorrent. Es habitual que se entregue el código fuente de los programas en Python, aunque en algunos casos se aplican diversas técnicas como ofuscación y compilación para proteger el código de los ojos curiosos. Pero ¿realmente funcionan estas técnicas?

En este artículo veremos algunas herramientas que supuestamente nos ayudan a proteger nuestro código y lo fácil que es subvertirlas.

A continuación tenemos dos programas de ejemplo escritos en Python: el primero es una simple función que nos pide una contraseña y nos muestra un mensaje; el segundo ejemplo es igual, aunque en esta ocasión hemos utilizado una clase.


def main():

        a = "toomanysecrets"

        res = raw_input("Please enter your password: ")

        if res == a:
                print "ACCESS GRANTED"
        else:
                print "ACCESS DENIED"

if __name__ == "__main__":
    main()

secretapp1.py


class DoMain:

        def __init__(self):
                self.a = "toomanysecrets"

        def Ask(self):
                res = raw_input("Please enter your password: ")

                if res == self.a:
                        print "ACCESS GRANTED"
                else:
                        print "ACCESS DENIED"

if __name__ == "__main__":
    dm = DoMain()
    dm.Ask()

secretapp2.py

Supongamos que no quiero entregar el código de estos programas, por lo que tengo varias opciones. Nuestra primera opción será ofuscar el código, dificultando su lectura.

Pyobfuscate

Este programa nos permite ofuscar nuestro programa de forma totalmente válida para el intérprete Python. Veamos un ejemplo con SecretApp1 y SecretApp2.

simonroses_python_cap1
Fig. 1 – Secretapp1 ofuscado

simonroses_python_cap2
Fig. 2 – Secretapp2 ofuscado

A simple vista nuestro código no tiene sentido, pero si analizamos el resultado veremos cómo las cadenas de texto siguen en el código y podemos reconocer sintaxis de Python. No es demasiado difícil reconstruir el código ofuscado.

A pesar de sus limitaciones os invito a visitar la web de esta herramienta para ver sus posibilidades.

Htibctobf

Originalmente esta herramienta se escribió para resolver un reto en una competición de hacking en el congreso Hack in the Box. Os recomiendo leer este estupendo artículo.

A diferencia de la anterior herramienta, Htibctobf ofusca el código Python modificando los AST (Abstract Syntax Trees). Al ejecutar esta herramienta podemos ver nuestro código Python ofuscado en la Fig. 3 y Fig. 4.

simonroses_python_cap3
Fig. 3 – Secretapp1 ofuscado

simonroses_python_cap4
Fig. 4 – Secretapp2 ofuscado

Podemos observar el código ofuscado, incluso las cadenas de texto, sin embargo a pesar de todo no es demasiado difícil reconstruir el código original.

Sin duda un interesante concepto con amplias posibilidades pero que requiere de mejoras para ser útil.

En algunos casos quizás baste con ofuscar el código, pero busquemos otras opciones para proteger nuestro código de forma más efectiva: tendremos que recurrir a compilar el código Python creando un ejecutable.

Py2exe

Posiblemente una de las opciones más populares para convertir código Python en ejecutables Windows. Py2exe

En primer lugar tenemos que crear un fichero llamado setup.py que incluya una referencia a nuestro programa que queremos compilar. Ver código setup.


from distutils.core import setup
import py2exe

setup(console=['secretapp1.py'])

setup.py

Ya estamos listos para compilar nuestro código Python en un ejecutable Windows, para ello ejecutamos py2exe. Ver Fig. 5.

simonroses_python_cap5
Fig. 5 – Compilando secretapp1.exe

Una vez finalizado el proceso de compilación, py2exe nos creará un directorio llamado “dist” que incluye nuestro ejecutable y algunas librerías necesarias. En la Fig. 6 podemos ver que py2exe finaliza con éxito y ejecutamos nuestro programa en formato exe.

simonroses_python_cap6
Fig. 6 – Compilación completada

Ahora podríamos distribuir este binario sin miedo a entregar nuestro código o quizás no ¿?

Py2exe_extract

Esta herramienta nos permite extraer los objetos Python dentro de los ejecutables creados con py2exe, básicamente invertimos el proceso. Py2exe_extract

En la Fig. 7 podemos ver como utilizamos py2exe_extract para obtener el fichero objeto (el contenido de este fichero es independiente de la plataforma y se conoce como Bytecode) de nuestra aplicación secretapp1.exe (secretapp1.pyc)

simonroses_python_cap7
Fig. 7 – Extrayendo el fichero objeto

Ahora tenemos que ver cómo podemos obtener el código de este fichero objeto.

Unwind

Unwind es un desensamblador para Python Bytecode que podemos utilizar para analizar ficheros objetos “.pyc”. Para este ejemplo he escrito un simple script en Python, mytest.py, que importa el desensamblador y analiza el fichero pyc. Ver código a continuación.


import unwind

print(unwind.disassemble('secretapp1.pyc'))

mytest.py

Con este script podemos ejecutar el siguiente comando y obtener un desensamblado del fichero objeto. Ver Fig. 8.

simonroses_python_cap8
Fig. 8 – Python Bytecode

Para los amantes del bajo nivel esta será su opción favorita ;)

Uncompyle2

Otra opción es utilizar un decompilador como uncompyle2 para obtener el código directamente del fichero objeto “.pyc” sin tener que pasar por el desensamblador como vimos anteriormente.

Esta herramienta es potente y fácil de utilizar, como se puede observar en la Fig. 9 mediante un simple comando obtenemos el código fuente de secretapp1.pyc.

simonroses_python_cap9
Fig. 9 – Código de secretapp1 obtenido del fichero objeto

Wow, tenemos código fuente!

A lo largo del artículo hemos visto algunas técnicas de ofuscación y compilación de código Python para protegerlo, no obstante hemos podido subvertir todo el proceso de protección fácilmente 

La siguiente lista son otros compiladores Python que podemos utilizar para Windows, Linux o MacOS, pero tienen los mismos problemas.

También podríamos analizar y subvertir el binario utilizando herramientas como IDA PRO o Immunity Debugger, lo que dejaremos para un futuro post. Otra interesante herramienta que no he comentado es pyREtic, un potente framework para reversing de in-memory de Python Bytecode.

Que un atacante consiga el código Python es cuestión de tiempo, sin embargo para ponérselo realmente difícil desde un punto de vista defensivo se tienen que combinar diferentes técnicas.

¿Proteges tus programas en Python? ¿Qué métodos utilizas?

— Simon Roses Femerling

Publicado en Hacking, Hacking Etico, Privacidad, SDL, Seguridad, Tecnologia | Etiquetado , , , , , , | 6 comentarios

Reseña Libro: Mob Rules. What the Mafia Can Teach the Legitimate Businessman

Al leer la sinopsis del libro ya nos damos cuenta que este no es el típico libro de cómo triunfar en los negocios. Escrito por Louis Ferrante, ex mafioso de la familia Gambino y reconvertido a escritor, nos compara la estructura de la mafia y su peculiar estilo de hacer negocios para obtener el éxito en el mundo empresarial.

Mob Rules: What the Mafia Can Teach the Legitimate Businessman (ISBN: 978-1591843986) es una obra diferente y de fácil lectura que describe multitud de consejos básicos y lógicos para triunfar en los negocios y que muchos emprendedores y ejecutivos deberían leer y sobre todo aplicar.

A lo largo de sus tres secciones (soldado=empleado, capo=mandos intermedios y don=alta dirección) divididas en 88 lecciones, el libro nos detalla cómo la mafia aplica estos conceptos para triunfar en los negocios.

La obra está llena de referencias a casos reales de la mafia e historia antigua con ejemplos de cómo hacer o no las cosas. Todos estos casos reales han sido muy bien seleccionados y, además de interesantes, potencian el mensaje del autor.

Desde hace años se habla del Arte de la Guerra de Sun Tzu como una obra de referencia para aplicar a los negocios, pero sin duda Mob Rules es una obra a tener en cuenta para hacer negocios.

El punto negativo de la obra es que algunas lecciones son muy básicas y no aportan demasiado al lector.

Recomiendo el libro tanto como si queremos aplicar sus consejos a los negocios o simplemente por leer un libro curioso repleto de casos reales sobre la mafia.

Puntuación (1 rosa, muy malo / 5 rosas, muy bueno): 4 Rosas (Lectura Recomendada)

— Simon Roses Femerling

Publicado en Economia, Libro, Negocios | Etiquetado , | Deja un comentario

¡La App Libres no es tan libre!

El pasado julio el Ministerio de Sanidad, Servicios Sociales e Igualdad junto a Telefónica España presentaron una App social dirigida a las mujeres que sufren o han sufrido violencia de género para plataformas Android y iOS.

Esta App llamada Libres permite obtener información para ayudar a las mujeres a combatir esta lacra de nuestra sociedad y por ello he pensado que sería interesante realizar un análisis rápido para determinar la postura de seguridad y privacidad de la App.

Desconozco si esta App es realmente de ayuda a las mujeres que sufren violencia de género, sinceramente espero que sí, pero desde un punto de vista de seguridad la App tiene varios problemas. Solo he revisado la versión Android, aunque imagino que la versión iOS sufrirá problemas similares.

Este artículo no es ninguna crítica a la App o a sus desarrolladores sino todo lo contrario: es mi granito de arena para mejorar la seguridad y privacidad que se han descuidado un poco en una App que ayuda en un tema tan preocupante y sensible como la violencia de género.

Falsa sensación de seguridad

En la web del Ministerio podemos leer:

“Todo ello de un forma ágil, sencilla, intuitiva, gratuita y sobre todo confidencial ya que la aplicación se ha diseñado para que permanezca oculta en el menú del teléfono de tal manera que nadie más, salvo ella misma, sepa que dispone de una aplicación sobre violencia de género”.

Lo siento mucho, pero utilizar un icono falso similar a “Ajustes” en Android (ver Fig. 1) y que luego al ejecutar la App aparezca un falso menú (ver Fig. 2) que nos lleva a la auténtica aplicación al pulsar “Aplicación” (ver Fig. 3) no lo llamaría confidencial y diseñada para permanecer oculta como afirma el Ministerio.

libres_screen8
Fig. 1

libres_screen4
Fig. 2

libres_screen7
Fig. 3

¡Sin duda esta área se puede mejorar!

¡Comunicaciones en texto claro!

Otro problema de seguridad es que toda la comunicación entre la App y los servicios ofrecidos por el Ministerio es en texto claro. Aunque la App no contiene información sensible es siempre aconsejable cifrar las comunicaciones.

Un atacante podría estar espiando la red donde está conectado el dispositivo y ver que Libres está instalada. Además la App permite enviar comentarios / sugerencias al Ministerio que son enviadas sin cifrar.

¡Otra área más de mejora!

Recomendaciones de Seguridad

A continuación algunas recomendaciones para mejorar la seguridad y privacidad de esta App:

  • La App contiene otros fallos de seguridad, como Debug activado por defecto.
  • Toda comunicación debería estar cifrada mediante SSL.
  • La App debería detectar si el dispositivo puede estar comprometido (ver mi articulo sobre rooted).
  • Al diseñar una App siempre debemos realizar un modelo de amenazas que nos ayude a identificar los riesgos y cómo minimizarlos.
  • Sería conveniente mejorar sustancialmente el mecanismo de ocultación de la App.

¿Qué mejoras de seguridad incluirías en la App?

¡Desearos un feliz verano, hoy 1 de agosto!

— Simon Roses Femerling

Publicado en Hacking Etico | Etiquetado , , , | Comentarios desactivados en ¡La App Libres no es tan libre!