lunes, 12 de septiembre de 2016

¿Como actualizar un Gear S2 sin un dispositivo Android compatible?


La respuesta corta es: por cojones.

Antes de nada, decir que después de tanto tiempo sin escribir en el blog, me apetecía contar esto, aunque técnicamente no es demasiado complicado. Quizás a partir de ahora escriba con más frecuencia, ya que, al menos, tengo pensada otra entrada más sobre Yomvi (el nuevo Movistar+).

Empecemos con esta entrada!

Hace unas semanas Samsung lanzó su aplicación de administración de su smartwatch, el Gear S2, para iOS. Hacía mucho tiempo que la estaba esperando, así que en cuanto me enteré de que habían lanzado el programa de pruebas, me registré para probarla. Después de ser aceptado e instalar la aplicación, estuve durante un rato intentado sin éxito conectar mi reloj a la aplicación. Entonces, buscando por internet, me di cuenta de que la versión del firmware de mi reloj era demasiado antigua, tan antigua que no era posible actualizarlo por Wifi. Al parecer, el único modo de actualizarlo era utilizando la aplicación de Android, ya que al ser una versión antigua de firmware, esta no era compatible con la app de iOS.

En este punto, surgen los problemas, ya que no dispongo de ningún dispositivo "compatible" con la aplicación. Los requisitos de la aplicación son:


  1. Tener una versión de Android mayor o igual a la 4.4
  2. Tener un dispositivo con al menos 1.5GB de RAM

Podéis ver aquí una lista con los dispositivos compatibles.

Como podemos observar, hay una gran cantidad de dispositivos compatibles (notese la ironía).

Bien, como os imaginais, no tengo un dispositivo "compatible", pero si que dispongo de un Xperia M2, que estaba seguro que era igualmente suficiente para utilizar la app.

Visto lo visto, estaba claro que si quería actualizar mi reloj y que sirviese para algo tenía que buscarme la vida por mi cuenta, y eso hice. Lo primero que se me ocurrió fue obtener el APK de la aplicación. Ya que tenía la app instalada, la obtuve de mi dispositivo utilizando ADB. Los comandos necesario para ello son:

adb shell pm list packages

Con el obtendremos la lista de paquetes instalados en nuestro dispositivo. Podemos mejorar el comando si utilizamos: adb shell pm list packages | grep samsung. De esta forma nos aparecerá directamente el paquete que nos interesa, cuyo nombre es: com.samsung.android.app.watchmanager.

El siguiente comando: 

adb shell pm path com.samsung.android.app.watchmanager

Que nos devolverá la ruta de nuestro dispositivo en la que podemos encontrar el APK.

Y finalmente usaremos:

adb pull com.samsung.android.app.watchmanager.apk ./destino

Para descargar el APK en la carpeta "destino".

Con esto, ya tendremos en nuestro PC el APK de la aplicación. El siguiente paso es utilizar una herramienta para descompilar el APK y obtener los ficheros de código Smali. Para ello, yo he utilizado apktool, en su versión 2.0.3 (podéis descargar su última versión en: https://ibotpeaches.github.io/Apktool/). Para descompilar simplemente es necesario utilizar el siguiente comando:

java -jar apktool.jar d com.samsung.android.app.watchmanager.apk

Una vez ejecutado, nos generará una carpeta con todos los recursos de la aplicación, incluyendo lo que nos interesa, el código Smali. 

Después de un rato mirando el código, nos daremos cuenta que existe una clase llamada "HostManagerUtils", que contiene un método que parece interesante: isSupportedInHostDevice. Efectivamente, este método devuelve true o false (1 ó 0) en función de si el dispositivo es compatible o no, es decir, si cumple los requisitos anteriormente indicados. 

Llegados a este punto, existen dos opciones en función de las posibilidades de vuestro dispositivo:

  1. Si está rooteado, utilizar alguna herramienta que permita hookear funciones, de modo que podamos modificar durante la ejecución el resultado de esta función. En mi caso he utilizado Frida (http://frida.re/)
  2. Si no está rooteado, modificar el código Smali para que siempre devuelva verdadero.

Yo utilicé Frida, puesto que mi dispositivo estaba rooteado y es más rápido que compilar la aplicación e instalarla, sobretodo la primera vez, cuando lo que queremos es comprobar si realmente esa función hace lo que parece. El script de Frida que he utilizado lo dejo aquí. Podéis utilizar la documentación de Frida para ver como se instala y como utilizar Frida en vuestro dispositivo (http://frida.re/docs).

Para la segunda opción, necesitaremos modificar el código, compilar e instalar de nuevo la aplicación. Como podemos observar en el código de la función "isSupportedInHostDevice", esta es bastante extensa, puesto que comprueba la cantidad de RAM y versión del sistema operativo. Nuestra modificación será realmente simple, al comienzo devolveremos directamente verdadero, y ya está.



Como vemos en la imagen, al inicio he modificado la inicialización de v0, para que en lugar de inicializarse a 0 (false) se inicialice a 1 (true), e inmediatamente después devuelvo v0. Con esto siempre se devuelve verdadero.

Ahora solamente resta compilar, firmar e instalar. Para compilar, utilizaremos de nuevo apktool, en este caso utilizaremos el comando (en el directorio en el que nos ha descompilado la app):

java -jar apktool.jar b -f -d .

Con esto nos construirá un nuevo APK en el directorio "dist". Antes de instalar ese APK, necesitaremos firmarlo. Para ello, usaremos la herramienta signapk (disponible aquí), con el siguiente comando:

signapk.jar testkey.x509.pem testkey.pk8 dist/com.samsung.android.app.watchmanager-1.apk dist/com.samsung.android.app.watchmanager-1.signed.apk

Como vemos, se pasan como parámetro los dos ficheros de clave para firmar el APK. Estos ficheros son los que lleva para probar signapk, recomiendo utilizarlos por simplicidad.

Con esto, tendremos un APK firmado y listo para usar. A continuación instalamos con el siguiente comando:

adb install dist/com.samsung.android.app.watchmanager-1.signed.apk

Y una vez instalado tendremos la aplicación en nuestro dispositivo, lista para iniciar y actualizar nuestro reloj.

En mi caso, funcionó así sin problemas, pero existe una función llamada "isSamsungDeviceWithCustomBinary" que comprueba si la aplicación ha sido modificada. En principio no detecta esta modificación, pero por si acaso, se puede modificar de igual forma que hemos hecho con la que comprueba si el dispositivo es compatible. En este caso nos interesa que siempre devuelva 0 (false), que significa que la aplicación no ha sido modificada. Por tanto, introduciremos al comienzo de la función lo mismo que antes excepto el valor de v0, que será 0 en este caso:

const/4 v0, 0x0
return v0


Y después de todo esto, ya podremos utilizar nuestro Gear S2 con nuestro dispositivo Android.

ADVERTENCIA: No me hago responsable de cualquier daño sufrido por vuestro teléfono o reloj. Haz esto bajo tu propia responsabilidad.

No es nada complicado, ni muy técnico, pero me parecía interesante compartirlo, puesto que seguramente haya alguien al que le pueda resultar útil.

Con esto me despido hasta la próxima, que espero sea pronto y sea explicando algunas curiosidades de la app de Yomvi (ahora Movistar+) ;)

sábado, 10 de mayo de 2014

Vulnerabilidad Hostinger [0Day?]

Después de mucho tiempo sin escribir nada, hoy he sacado un hueco. Por que creo que lo que voy a contar hoy puede ser muy interesante.

Como bien dice el título, hoy vamos a hablar sobre Hostinger y una vulnerabilidad de seguridad (probablemente un 0day) presente en la mayoría de webs alojadas en este hosting.
La vulnerabilidad es muy fácil de aprovechar, de hecho, me parece un fail tremendo, una chapuza..

El caso es que mientras miraba un par de cosas en una web para pruebas que tengo en este hosting, me pregunté, ¿Como funciona el FileManager? Si habéis usado algún hosting, sabréis que permiten subir, modificar y borrar archivos desde una interfaz web, generalmente llamada FileManager o Administrador de Archivos en español.
El caso es que si nos fijamos en como funciona, podemos ver que no son más que peticiones GET o POST, pero, ¿a donde? Pues depende del FileManager que usemos.. Con Hostinger puedes usar dos FileManager distintos, si usas el que te ponen como principal, eres vulnerable, aunque solo lo hayas usado una vez. ¿Por que? Por que el filemanager se "instala" en tu carpeta de hosting web, como los archivos que subes para tu web.
Como podemos ver en la siguiente imagen, es una carpeta como cualquier otra en nuestro hosting (Imagen obtenida con el Filemanager 2)

Con esto, ya os imagináis como funciona el FileManager.. Básicamente se realizan peticiones a los scripts de esta carpeta para crear, modificar o borrar ficheros de nuestro hosting.
Lo bonito es que no hay ningún tipo de control sobre estas peticiones, es decir, no se usan cookies, ni nada que puedas imaginar para controlar que el que realiza la petición para gestinar el hosting sea realmente el dueño.

Algunas de las peticiones son:
Para abrir directorios:
http://domain/_file-manager/php/connector.php?cmd=open&target=l1_Lw

Para ver contenido de archivos:
http://domain/_file-manager/php/connector.php?cmd=get&target=l1_Lw

Para editar archivos:
Petición POST a: http://domain/_file-manager/php/connector.php
Con parámetros por POST:
cmd=put
target=archivo
content=<?php echo "Modifico!"; ?>

Las variables son bastante intuitivas, cmd es el comando, es decir, lo que quieres hacer (abrir, obtener o modificar). Por otro lado tenemos la variable content, que sirve para indicar el nuevo contenido del archivo que vamos a modificar. Y por último, target, que indica el archivo que vamos a modificar.
Target si tiene algo más de complicación, pues no es un path ni un nombre de archivo el valor que debe tomar, sino que es un hash. Cada archivo tendrá su hash y usaremos este para modificarlo o para abrir el directorio. ¿Como conseguimos el hash? Muy sencillo, el hash de la raiz todos los hostings es l1_Lw, y usando la petición con cmd=open, nos devuelve el listado de archivos con toda la información necesaria, incluido el hash. De este modo podemos ir listando cualquier directorio al mas puro estilo "ls" de Linux.


Y si necesitamos ver los archivos pues usamos cmd=get y listo.

Y por mi parte, creo que no es necesario explicar nada más. La vulnerabilidad, como pueden ver es muy simple.

Si tienen un hosting con hostinger pueden protegerse eliminando la carpeta de instalación del filemanager usando el segundo filemanager que tiene hostinger o usando algún software para acceder por FTP.

Espero que les haya gustado. Nos leemos!

PD: NO ME HAGO RESPONSABLE DEL USO QUE SE LE DE A LA INFORMACIÓN PUBLICADA.

viernes, 6 de septiembre de 2013

Facebook te regala una base de datos con los emails de tus amigos

Buenos días!
El otro día os enseñe como modificar la base de datos de triviados para ganar siempre en un dispositivo iOS.
Pues he seguido trasteando con otras apps, entre ella facebook. Y me he dado cuenta de que en la base de datos que guarda en nuestro dispositivo, guarda también los emails de nuestros amigos de facebook! Sí, los emails que usan para acceder a su cuenta!
Esto podría facilitar que se realizase phishing enviando un email..

Pero donde esta la base de datos? Como la obtengo? Si leiste la entrada de triviados ya sabrás como conseguir la base de datos de facebook de tu iPhone.

Por tanto, necesitaremos iTools 2013 para acceder a los archivos de las apps de nuestro dispositivo. Accedemos a los archivos de Facebook (como ya se dijo en el post de Triviados). Una vez dentro, la base de datos que nos interesa se encuentra en: "/Library/Caches". Y es el archivo llamado "fbsyncstore.db". Para poder abrirlo, ya sabéis, arrastramos al escritorio y lo abrimos con SQLite Manager (extensión de Firefox).

Una vez abierto, la tabla que nos interesa, es la llamada "contact_points". En esta tabla tenemos los emails de nuestros contactos e incluso los teléfonos móviles. Como podréis ver, en la  tabla no hay columna de nombre o apellidos, solo de ID, así que nos es fácil ver a quien pertenece cada email.. Pero tenemos una tabla llamada "people" que si tiene relacionados los IDs y los nombres y apellidos.. Así que con una simple consulta SQL podemos ver fácilmente a quien corresponde cada email. Esta consulta, por ejemplo:
SELECT first, last, value FROM contact_points E, people P where contact_point_id like '%contact_email%' and P.person_id=E.person_id

Y nos dará un resultado como este:

Y esto es todo! Me parecía curioso e interesante publicar esto :)

Espero les haya gustado!
Un saludo y hasta la próxima!

domingo, 1 de septiembre de 2013

Ganando SIEMPRE a Atriviate (Triviados) en iOS (iPhone/iPad/iPod)

Buenas tardes a todos! Después de tanto tiempo sin escribir nada, hoy os voy a enseñar como ganar siempre en Atriviate(Triviados) para iOS. Aunque puede aplicarse a cualquier las app de iOS.

Para hacer esto necesitaremos usar Windows, el programa para gestión de dispositivos iOS iTools 2013 y SQLite Manager (plugin para Firefox).

Lo primero es conectar por USB nuestro dispositivo iOS. Una vez conectado cerramos iTunes si se ha abierto e iniciamos el iTools.
En el menu de la izquierda nos vamos al apartado "Applications", y nos aparecera una lista con las apps que tenemos instaladas.

Buscamos Atriviate, hacemos click sobre ella y despues hacemos click sobre el boton "Browse".
A continuación se nos abre una ventana dentro del iTools con la carpeta en la que esta instalada la app. Debeis saber que las bases de datos que usan las apps están en "/Documents" y son archivos .sqlite. En esta entrada nos vamos a centrar en la base de datos, pero podéis mirar mas archivos de otros directorios según lo que busquéis (otro archivo interesante es el de preferencias, que se encuentra en "/Library/Preferences", es el único .plist que te dejará abrir)



Como se puede ver en la imagen, el archivo de base de datos que buscamos es "Model.sqlite". Ahora lo arrastramos al escritorio, para poder modificarlo con SQLite Manager. Para abrir la base de datos con SQLite Manager. Abrimos SQLite Manager y vamos a: "Archivo->Conectar Base de Datos" y abrimos el archivo Model.sqlite que guardamos en el escritorio. Ahora podemos ir viendo las tablas que forman la base de datos. Nos centraremos en la tabla "ZPREGUNTAS", en esta tabla se guardan todas las preguntas que se van solicitando al servidor. ¿Por qué? Porque la app funciona de manera que la primera vez que jugamos pide las preguntas de la categoría que nos ha tocado jugar, y este nos envía unas 20 preguntas de esa categoría. De este modo, las preguntas se guardan, y conforme se van contestando esas 20 preguntas se van eliminando, cuando no quedan mas se piden nuevas. Ya podéis ir intuyendo que es lo que vamos a hacer.. Si, lo que vamos a hacer es rellenar la tabla de preguntas con preguntas que tengan la misma respuesta como correcta. Pues como veis, en esta tabla se guarda el enunciado, las respuestas, la respuesta correcta (un numero del 1 al 4) y el id de pregunta en el servidor, entre otras cosas..
Ya sabéis lo que vamos a hacer, así que si no sabeis SQL lo mas sencillo es jugar una partida y obtener preguntas con ids validos.

Despues podéis cambiar la categoria haciendo doble click en la columna, para no tener que jugar todas las categorias de preguntas.

Una vez que tenemos al menos 1 pregunta de cada categoria(son 7 categorias, la columna categoria puede tomar valores del 1 al 7, dependiendo de la categoria), hacemos que todas las respuestas correctas sean la misma, por ejemplo, que todas sean la primera opción. Esto lo podemos hacer facilmente haciendo click en "Ejecutar SQL" y ejecutando lo siguiente:
UPDATE ZPREGUNTAS SET ZCORRECTA='1'

Y damos en "Ejecutar SQL". Una vez hecho esto todas las preguntas que tengamos en la base de datos tendrán como opción correcta la primera respuesta.
Pero hay un problema.. Si tenemos pocas preguntas en la base de datos, en cuanto se acaben se pedirán mas al servidor ... :S
Por este motivo, debemos insertar mas preguntas "personalizadas". La manera mas sencilla es usar las que ya tenemos, para repetirlas en la base de datos. Así que simplemente usamos la siguiente instrucción SQL:
INSERT INTO ZPREGUNTAS(Z_ENT ,Z_OPT, ZCATEGORIA , ZCORRECTA , ZIDPREGUNTA , ZIDIOMA , ZPREGUNTA , ZRES1 , ZRES2 , ZRES3 , ZRES4 ) SELECT Z_ENT ,Z_OPT, ZCATEGORIA , ZCORRECTA , ZIDPREGUNTA , ZIDIOMA , ZPREGUNTA , ZRES1 , ZRES2 , ZRES3 , ZRES4 FROM ZPREGUNTAS

Lo que hace es simplemente insertar en la tabla preguntas, preguntas con esas columnas (las que van entre parentesis), usando las filas (preguntas) que ya existen en la tabla. Para los que sepan de SQL, como veréis, "duplicamos" las preguntas con todos los campos excepto el campo "Z_PK", ya que este campo es la clave primaria, que como sabréis no puede ser la misma para mas de una fila.
Una vez hecho esto se nos duplican todas las preguntas, si lo repetimos varias veces tendremos mas preguntas. No os paséis porque si creáis demasiadas preguntas, la app luego irá muy lenta, pues tiene que cargar demasiadas preguntas de la base de datos.
Bien, pues ahora queda usar la nueva base de datos en la app.. pero este archivo esta protegido, así que no bastará con arrastrarlo a la capeta "/Documents" de la app y reemplazar la antigua (si lo probáis veréis que da error). El único modo es  crear un backup de la app usando iTools.



Usando la opción que veis en la imagen "Backup program and documents". Esto nos generará un archivo IPA en nuestro escritorio. Lo que haremos será abrirlo con WinRar y entrar en la carpeta "/Container/Documents" y ahora arrastramos nuestra nueva base de datos con nuestras preguntas al archivo, lo que reemplazará la base de datos que se guardo en el backup. Y ya simplemente eliminamos nuestra app del dispositivo y despues instalamos el backup en nuestro dispositivo, arrastrando el archivo IPA a iTools.

Una vez se haya instalado la app, podremos usarla como siempre y podremos ganar siempre respondiendo con la primera opción :)

He escrito un poco a prisa y corriendo esta entrada, así que espero que sea entendible para todos. Si tienen algún problema diganlo por comentarios. No sean malos!! :P

miércoles, 24 de julio de 2013

phpTuenti API

Buenos días!
Después de bastante tiempo si escribir nada, hoy escribo para compartir con vosotros una pequeña API no oficial en PHP para Tuenti hecha por mi.

El enlace a GitHub: https://github.com/segura2010/phpTuenti

Ahí tienen la API y para cada función una breve descripción.
Espero que les sea útil :)

Si alguien quiere añadir algo a la API o modificar algo para mejorarla puede decirlo y colaborar :)

Por cierto, como alguno me comentó cuando hice la API para Python que por que no le ponía una licencia, he decidido añadirle una licencia Creative Commons a la API !

Intentaré escribir con mas frecuencia!! Hasta la próxima! :)

jueves, 30 de mayo de 2013

Vulnerabilidad XSS en el Nuevo Minijuegos

Hola a todos! Llevo tiempo sin escribir, ya que estoy algo liado con examenes y prácticas.. Pero saco algo de hueco para relajarme un momento y contaros una nueva vulnerabilidad que acabo de encontrar en Minijuegos.com

Como sabréis, han rediseñado toda su web, y con los cambios que han realizado se han dejado un XSS! ¿Donde está el XSS? Donde suelen estar todos! En el buscador!! El vector utuilizado es uno que me gusta bastante:
";alert('XSS');</script>

Como veis, lo que ocurre es que al añadir nuestra url de búsqueda en un script y no filtrar comillas ni nada pues podemos cerrar la inicialización de la variable y colocar nuestro código JavaScript! Después de añadir nuestro código, simplemente cerramos el script para evitar de manera fácil y rápida errores de sintaxis en nuestro código que produzcan que no se ejecute.

El fallo ha sido reportado a Minijuegos.com y arreglado.. Link con el ejemplo:(http://goo.gl/4uVUU) (Ya no funciona)

Actualización: Ya se ha corregido el fallo. Muy simpatico el chico que contestó al email! Me han regalado gemas de Minijuegos!! :D

Espero les haya resultado interesante!
Hasta la próxima!!

sábado, 13 de abril de 2013

XSS en Tuenti. Capitulo 5: Mensajes Privados.

Muy buenas a todos! Hace muchisimo que no escribo.. Perdonad por dejar abandonadillo el blog.. espero ir escribiendo mas a menudo ! :)

Hoy os voy a hablar de un nuevo XSS en Tuenti! Empezamos!

La vulnerabilidad XSS a tratar se encuentra en el sistema de Mensajes
Privados.
Como bien sabemos los los mensajes privados permiten añadir enlaces a otras
webs. Si aprovechamos esta funcionalidad podemos obtener una vulnerabilidad
del tipo XSS. Como se puede ver en la imagen de abajo podemos ejecutar
código malicioso usando el siguiente vector de ataque:

http://cualquierDominio/algoPorAqui"onmouseover="alert(/XSS/);"


Como vemos usamos las comillas para cerrar la propiedad “href” y a
continuación poder añadir el código malicioso deseado..
Puede parecer una vulnerabilidad no muy peligrosa, pero como ya se vio en el
XSS en MySpace (http://elladodelnovato.blogspot.com.es/2013/01/vulnerabilidad-xss-en-el-nuevo-myspace.html) pueden modificarse los estilos del enlace usando la propiedad “style” para
modificar el texto y colocarlo al comienzo, con una letra mucho mas grande y
transparente, de manera que sea mucho mas fácil que el usuario pase por
encima del enlace, sin darse ni cuenta.

Además tenemos una restricción, si en algún momento colocamos un espacio,
la url se corta y el sistema no lo añade al enlace, por lo que hay que poner todo
seguido, sin espacios. Aunque esto no debería ser un gran problema :)

Esta vulnerabilidad la he encontrado hoy mismo! He enviado un email informando del problema y no he recibido respueta, aunque si que han reparado ya la vulnerabilidad.. Así que desde aquí decir que me ha encantado su forma de agradecer, y no solo eso, sino que me parece lamentable que ni siquiera hayan respondido para decir que iban a mirarlo..

Así que un poco enfadado he decidido no solo publicarlo ya (ya que esta "solucionado"), sino publicar la forma de volver a explotar el XSS, ya que esta arreglado de forma CHAPUCERA..

Lo único que hay que hacer es usar el mismo vector pero con la siguiente modificación:

http://cualquierDominio/algoPorAqui"onmouseover=alert(/XSS/)//
Como vemos ahora la propiedad "href" no es la que falla, sino que es la propiedad "data-on-click-label" , que además nos añade una dificultad (por la cual tenemos que añadir las "//" al final de nuestro vector de ataque), esta dificultad como podéis ver es que nos deja las comillas de cierre de la propiedad.. Como veis, poniendo las dos barritas (//) evitamos que no se ejecute el javascript por error.. ya que lo que hacemos es usar las barritas para que tome como comentario las comillas y no haya errores. Y ya tenemos nuestro XSS funcionando de nuevo! ;)

Me parece muy lamentable que no hayan comprobado que se filtraba bien y que no había otra propiedad que fallaba..

ACTUALIZACIÓN: Acabo de recibir un email de respuesta de un trabajador de Tuenti agradeciendo la colaboración y explicandome lo ocurrido.. Debo decir que por una parte comprendo que no respondiesen, ya que era sábado por la mañana.. es más, pensé que ni siquiera lo arreglarían y pensaba no publicarlo hasta el martes para darles tiempo, pues entendía que siendo fin de semana sería más complicado. Pero sigo pensando que si se preocuparon de arreglarlo también podrían haber enviado un email en el que simplemente informasen de que iban a mirarlo, no pido nada mas.. Para yo saber si realmente les ha llegado el email (ya me ha pasado en otra ocasión que no les llegó). Así que entiendo que en fin de semana estuviesen justos de tiempo y tal, pero si te pones arreglarlo lo primero (en mi opinión) es arreglarlo bien, no a medias.. y avisar de que has recibido el email y vas a mirarlo.. En todo caso, decir que me parece bien que hayan sacado tiempo para arreglarlo antes que nada, preocupandose de la seguridad de sus usuarios.

Espero volver pronto a escribir una nueva entrada y no volver a dejar abandonado el blog!! Un saludo y hasta la proxima!! :)