viernes, 27 de junio de 2014

Grails "Groovy on Rails" para un desarrollo web fácil en Java

Grails es un framework para desarrollo fácil de aplicaciones web en Java desarrollado sobre el lenguaje Groovy. Fue adquirido por Spring en 2008 y  es conocido como "Groovy on Rails" ya que incluye un sistema creación de proyectos con scaffolding o andamiaje siguiendo la idea del framework Ruby on Rails en el que muchos otros frameworks han seguido su ejemplo como Symfony, Yii, CakePHP o Code Igniter.

En este caso, Grails permite la creación de un proyecto inicial con un andamiaje predefinido y de forma muy rápida usando tecnología POJO con Hibernate y Spring. Otra funcionalidad destacable es el potencial de métodos dinámicos para búsquedas en entindades persistentes. Incluye también el framework de Javascript jQuery para la creación de los elementos de la vista.

Instalación

Para la instalación es necesario descargar Grails y crear las variables de entorno de JAVA_HOME, GRAILS_HOME y añadirlas a la variable PATH. También es posible realizar la instalación de forma automática con herramientas como Gvmtool.

Incluir la variable de entorno JAVA_HOME.

~$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
~$ export PATH="$PATH:$JAVA_HOME/bin"

No olvidar añadir en el .bashrc del usuario las dos líneas para que quede persistente.

Descargar y descomprimir la última versión de Grails.

~$ wget http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/grails-2.4.2.zip
~$ unzip grails-2.4.2.zip 

Incluir la variable de entorno GRAILS_HOME con la ruta completa a la ubicación de Grails.

~$ export GRAILS_HOME=/home/user/grails-2.4.2
~$ export PATH="$PATH:$GRAILS_HOME/bin" 

Comprobar que Grails funciona en línea de comandos

 ~$ grails -version 

Creación de un proyecto

~$ grails create-app MyFirstProject 
Acceder al shell de Grails del proyecto creado

~$ cd MyFirstProject
~$ grails grails> help 



El shell de Grails incluye funcionalidades de tabulación para autocompletado.

Crear un ejemplo de hola mundo

Desde el proyecto se puede acceder a los datos del mismo y crear los elementos MVC fácilmente con el script de Grails.

grails> create-controller hello 


Esto creará el fichero grails-app/controllers/myfirstproject/HelloController.groovy

Ejecutar la aplicación

Para ejecutar la aplicación el comando run-app lanza por defecto la aplicación en el puerto 8080.

grails> run-app 



Con el parámetro -Dserver.port se puede indicar otro puerto.

grails> run-app -Dserver.port=9090 

Para parar la aplicación se ejecuta el comando stop-app en el shell de Grails.

grails> stop-app 

Testing

Los comandos que empiezan con create-* en Grails crean automáticamente pruebas unitarias y de integridad en las ubicaciones test/unit y test/integration.

Para ejecutar las pruebas ejecutar el siguiente comando.

 grails> test-app

Generar una aplicación

Grails permite crear aplicaciones base rápidamente con la característica de scaffolding o andamiaje, generando el controlador y vistas CRUD a partir de un esqueleto predefinido.

Para ello está el comando generate-all generando un controlador y las vistas asociadas.

Primero es necesario crear una entidad llamada Artifact en Grails.

 grails> create-domain-class user


El comando crea automáticamente la clase en grails-app/domain/myfirstproject/User.groovy. Se debe editar para indicar los atributos de la entidad, por ejemplo nombre y fecha de nacimiento.

package myfirstproject

class User {
  static constraints = {}
  String name
  Date birthDate
}


Con el comando generate-all User se crea automáticamente el controlador, las pruebas de unidad y la vista de la entidad User.

~$ grails generate-all User
| Finished generation for domain class myfirstproject.User 


Por último se ejecuta la aplicación con el comando grails run-app desde la línea de comandos.

~$ grails run-app

En la url http://localhost:8080/MyFirstProject/user/ se accede a la lista de la entidad User con las vistas CRUD, i18n y el estilo por defecto de Grails.

Vista Create de User.

Vista listado con el usuario creado.

jueves, 26 de junio de 2014

Reversing sencillo en Android

Realizar ingeniería inversa en Java es relativamente sencillo. El código fuente se pre-compila en el pseudocódigo Java Bytecode preparado para ser interpretado por la máquina virtual de Java ó JVM.

El formato Apk (Aplication PacKage file) de Android es un contenedor, en un formato zip, para la instalación de aplicaciones. Contiene ficheros como el contenedor de ejecutables classes.dex, los recursos en la ubicación res, los recursos compilados en resources.arsc y el fichero AndroidManifest.xml.

Archivo apk abierto como un compresor zip.


Los ficheros xml contenidos en el apk se encuentran en formato XML binario y por lo tanto no serán legibles si se abren directamente. Por otra parte, el fichero classes.dex es el código compilado en formato Dex (Dalvik EXecutable) e interpretado por la máquina virtual Dalvik en Android.

Existen múltiples herramientas para realizar ingeniería inversa de los fichero .dex y hacer legibles los xml.

XML-Apk-parser es un parser escrito en Java que permite convertir los XML binarios a XML en formato texto.

android-apktool es una herramienta escrita en Java y de software libre que decodifica los recursos a su formato original. Incluye además capacidad de depuración de código con smali.

Para decodificar el contenido apk solo es necesario ejecutar desde un terminal la siguiente línea:

~$: java -jar apktool.jar decode file.apk path_destination

Ejemplo decodificando apk con apktool.
El resultado obtenido no siempre es igual al original. Por ejemplo, los identificadores de elementos de Layout no incluyen el símbolo "+".

El código compilado en classes.dex también se puede decodificar. dex2jar traduce un fichero en formato Dex a formato Jar (Java ARchive). Una obtenido el fichero Jar se puede decompilar el código con JD-GUI.

Otra opción también válida y mucho más cómoda es decompilar directamente el fichero Dex con Jadx.

Su instalación es bastante sencilla:

~$: sudo apt-get install git
~$: git clone https://github.com/skylot/jadx.git
~$: cd jadx
~$: ./gradlew dist


Se puede abrir un fichero dex directamente con la interfaz gráfica de Jadx:

~$: ./jadx/build/jadx/bin/jadx-gui classes.dex &

Desensamblando el código de classes.dex con Jadx-GUI.

Radare2 ó r2 es un conjunto de herramientas y scripts en línea de comandos para realizar desensamblado con soporte para múltiples arquitecturas como el Motorola 68000, Mips, i386, x86-64, dalvik entre otros y soporte de varios formatos de ficheros como el dex.

En el blog de Sebastián Guerrero hay un artículo muy interesante sobre el uso de r2 con aplicaciones Android.

Recordad que el objetivo de esta entrada no es fomentar la piratería de aplicaciones ni tirar abajo el duro trabajo de los desarrolladores.

Para evitar que nuestras aplicaciones puedan ser interpretadas fácilmente hay herramientas como ProGuard que permiten ofuscar el código fuente.

domingo, 22 de junio de 2014

Creación de un clúster de Hadoop con Cloudera

Apache Hadoop es un framework para soluciones Big Data creado por Doug Cutting y utilizado por organizaciones como Yahoo, Amazon, Microsoft o Google.

Hadoop incluye un sistema de ficheros distribuido llamado HDFS (Hadoop Distributed File System) y un motor de trabajos en batch MapReduce. El framework está escrito en Java y los trabajos MapReduce pueden ser lanzados vía Streaming a través de cualquier lenguaje. La principal ventaja es que es un sistema escalable que utiliza hardware básico, commodity hardware, con alta disponibilidad y redundancia de datos, por defecto replica 3 bloques de datos.

Está orientado grandes volúmenes de datos, donde cada fichero es dividido en bloques de 64 o 128 Megas. Cada nodo de datos almacena bloques distintos y permite ejecutar trabajos en forma de batch, ya sean Map o Reduce, sobre esos datos. Al dividir el fichero en bloques, la lectura y trabajo sobre los datos se realizan mucho más rápido y con una programación bastante sencilla aplicando el concepto MapReduce.

Hadoop además incluye multitud de aplicaciones que facilitan mucho diferentes tareas: Flume, Sqoop, Hive, Pig, Mahout o HBase, etc. HBase es una base de datos NoSQL que permite almacenar en HDFS datos más pequeños en tablas.

Cloudera es una organización que facilita soporte y servicios sobre Apache Hadoop además de ofrecer cursos y certificaciones. El producto de software libre CDH, Cloudera Distribution Hadoop, incluye los paquetes de Hadoop compilados para varias versiones de GNU/Linux como Red Hat o Debian. A principios de año 2014 la consultora de IT Gartner ha incluido a Cloudera en su cuadrante mágico dentro del nicho de mercado.

Aquí os dejo un trabajo sobre Hadoop y todos sus elementos y aplicaciones donde además se explican los pasos para la instalación en modo nodo pseudo-distribuido y creación de un clúster de Hadoop con 4 nodos y alta disponibilidad para la versión CDH 4.5.



Para la configuración del clúster se han utilizado máquinas virtuales a partir de la imagen que Cloudera ofrece en su sitio web.
Además, incluyo la memoria adicional para realizar pruebas con las herramientas de Hadoop y para lanzar trabajos MapReduce. En el caso práctico planteado se trata de un trabajo para obtener traducciones más similares en textos en dos idiomas distintos por el número de palabras coincidentes. En github está disponible el ejemplo del proyecto para Eclipse y Maven. Sqoop facilita la importación de tablas de una base de datos en MySQL hacia HDFS. Por último, herramientas como Hive, Pig e Impala permiten lanzar consultas contra el clúster, como trabajos MapReduce, de forma rápida y sencilla.


Seguridad en Android

Cada vez surgen más problemas de seguridad en los dispositivos móviles. En los sistemas Android no iba a ser menos y hay muchos motivos de interés en encontrar y explotar los problemas de seguridad:
  • El aumento de usuarios con un smarthphone Android.
  • Almacenamiento de todo tipo de información personal, desde fotografías hasta datos bancarios.
  • La capacidad de los dispositivos es equivalente a la de un ordenador de hace unos cuantos años.
  • La mayoría de estos dispositivos está conectado a internet la mayor parte del tiempo desde redes 3G, 4G o Wifi.
  • La facilidad de localizar geográficamente un dispositivo gracias a los servicios de posicionamiento de Google Play Services.
  • Permisos de acceso a los que, a veces, el usuario no presta atención.
La nueva actualización de Android 4.4.3  permite que las aplicaciones instaladas con actualizaciones automáticas habilitadas cambien sus permisos sin notificar al usuario. Por otra parte, se ha descubierto el primer móvil, de marca china, que incluía malware de fábrica para espiar al usuario.

Hace poco hice un trabajo en el que se abordan varios de los problemas de seguridad que fueron apareciendo en versiones Android, principales vulnerabilidades como Master Key, las aplicaciones malware más conocidas y hacia donde están evolucionando, como aplicaciones que incluyen software de minado de criptomonedas oculto.

También incluyo algunos trabajos de varios expertos en seguridad como el estudio para la creación de un Rootkit, aprovechando el LKM habilitado, de Sebastián Guerrero o los trabajos de Jaime Sánchez sobre los problemas de seguridad en mensajería instantánea. Artículos de Alejandro Ramos del blog de SecurityByDefault para recuperar mensajes de WhatsApp y el artículo sobre el fraude de la Linterna Molona por Chema Alonso. Por último incluye una introducción breve sobre los problemas de espionaje actuales en móviles y una la solución, o no, propuesta por José Luis Verdeguer y Víctor Seva con SecureCall.


Herramientas y Técnicas de Inyección SQL

Hace poco realicé un trabajo optativo sobre las diferentes herramientas y técnicas de inyección SQL.

Un ataque de inyección SQL consiste en la inyección de una sentencia SQL no autorizada y ligeramente adaptada a través de un canal de entrada de datos desde el cliente para obtener un resultado distinto al original de la aplicación, por ejemplo desde el parámetro de url donde se indica el identificador de un producto.

Es un problema de seguridad muy grave cuyo origen está en la implementación del modelo con acceso a la base de datos y la ausencia de validación en los parámetros de entrada enviados desde el cliente. Existen distintas técnicas de inyección en función del canal del ataque, de si podemos ver los resultados o si la consulta enviada nos devuelve un mensaje que indique si ha tenido éxito o no.

Los ataques de inyección están clasificados en primera posición en el Top 10 de OWASP, documento centrado en las principales vulnerabilidades de aplicaciones web. La fundación OWASP, acrónimo en inglés de "Proyecto Abierto de Seguridad en Aplicaciones Web", es un organismo que apoya, gestiona y divulga documentación y metodologías para la seguridad de la información.

El motivo de que los ataques de inyección estén en el Top 10 de OWASP es que suelen ser la causa de fuga de información importante. Permiten realizar OS fingerprinting para conocer el sistema operativo o la versión del gestor de bases de datos, obtener esquemas de la base de datos, conocer el usuario utilizado en la conexión e incluso acceder a las tablas de una base de datos y obtener sus registros, por ejemplo la tabla de usuarios de la aplicación con todas sus contraseñas (normalmente hasheadas y con salt). Un ataque de inyección SQL podría incluso realizar un ataque de denegación de servicio.

Existen herramientas que automatizan todo el proceso de inyección SQL, detectando y probando diferentes técnicas de ataque. La mayoría están escritos en algún lenguaje de scripting como Pyton o Perl y son fáciles de instalar, algunas herramientas de inyección SQL interesantes son SQLMap, TheMole o SQLNinja, este último para ataques contra SQL Server.

Por último, no se debe olvidar que las bases de datos NoSQL también pueden ser susceptibles de ataques de inyección SQL, aunque no de la misma forma.

A continuación os dejo la memoria del trabajo práctico explicando las diferentes técnicas de inyección SQL y la instalación y uso de varias de las herramientas para automatizar el proceso del ataque. Para realizar las pruebas he utilizado la aplicación de OWASP Bricks en un sistema GNU/Linux Debian con Apache Web Server, PHP y MySQL.

Espero que os guste el trabajo y sirva para entender el funcionamiento básico de un ataque de inyección SQL.