domingo, 1 de abril de 2018

Módulos de sistema en Python - OS

Python nos tiene en su librería estándar algunos módulos de sistema de lo cuales podemos destacar tres: os, sys y subprocess.

Estos módulos nos permiten acceder a funcionalidades para conocer el entorno en el que nos encontramos, manejar los directorios, información sobre el interprete, ordenes del sistemas operativo. Para el día de hoy hare unos ejemplos sobre el modulo OS.

Módulo OS

El módulo os nos permite acceder a funcionalidades dependientes del Sistema Operativo. Sobre todo, aquellas que nos refieren información sobre el entorno del mismo y nos permiten manipular la estructura de directorios.

Archivos y directorios

En este modulo tenemos funcionalidades para manejar archivos y obtener información sobre ello, aqui un ejemplo que contiene algunas funciones principales (para mas información pueden ver la documentación aqui).

Pueden ver el código completo en github, hice un ejemplo en el cual el programa realiza lo siguiente:


  1. Obtengo el directorio actual.
  2. Luego creo un nuevo directorio con permisos solo de lectura y escritura.
  3. El programa intenta cambiar al nuevo directorio creado.
  4. Por ultimo como no puede cambiar su ubicación, le da al directorio creado los permisos de ejecución para de nuevo intentar cambiar con éxito al nuevo directorio.

Veamos:





cambiar_ubicacion(path_rel): cambia al directorio pasado como parametro, utiliza las siguientes funciones.

  •  os.access(path, permisos) : nos permite saber si un archivo o directorio tiene el permiso indicado. El primer parámetro es la ubicación del directorio o archivo, el segundo parámetro pueden ser las siguientes variables:

    - os.F_OK (devuelve True si existe)
    - os.R_OK (devuelve True si tiene permiso de lectura)
    - os.W_OK (devuelve True si tiene permiso de escritura)
    - os.X_OK (devuelve True si tiene permiso de ejecución)
  • os.chdir(path): nos permite cambiar al directorio que se le pasa como parámetro, retorna error en caso que no exista o no se puede cambiar a dicho directorio.
mostrar_permisos(path_rel): evalúa los diferentes permisos mencionados anteriormente.

Ademas se utilizan otras funciones como:

os.getcwd(): retorna el directorio actual.

os.path.abspath(path): retorna la ruta absoluta de la ubicación indicada como parámetro. Si le pasas un ".", indica que es el directorio actual.

os.mkdir(path,permisos): crea un directorio en la ruta indicada como primer parámetro, esta ruta puede ser relativa o absoluta, es decir, puede indicar la ruta desde la raíz o desde la ubicación actual. Los permisos se indican de forma octal (0600 indica permisos de lectura y escritura para el usuario actual).

os.chmod(path, permisos): modifica los permisos del archivo o directorio indicado en el primer parámetro, los permisos se pueden indicar con el modulo stat, el parametro S_IXUSR indica permisos de ejecución para el usuario actual, para mas información pueden ver aqui.

Variables de entorno

El módulo os también nos provee de un diccionario con las variables de entorno relativas al sistema. Se trata del diccionario environ:

import os

for variable, valor in os.environ.iteritems():

    print "%s: %s" % (variable, valor)

Path

El módulo os también nos provee del submódulo path (os.path) el cual nos permite acceder a ciertas funcionalidades relacionadas con los nombres de las rutas de archivos y directorios.

Entre las que mas destacan las podemos ver en esta imagen:


Para mas información pueden ver la propia documentación de Python en este enlace. Luego haré un ejemplo de los otros 2 módulos SYS y SUBPROCESS.

Enlaces:


domingo, 11 de febrero de 2018

Archivos Batch - Como extraer todos los perfiles y claves Wifi almacenadas

Los archivos Batch son archivos de procesamiento por lotes, en Windows tienen la extensión .bat y dentro del archivo contiene un conjunto de instrucciones, cualquiera comando que nosotros ejecutamos en consola puede ser utilizado en un archivo Batch ( tener en cuenta que hago referencia a los comandos de MS-DOS ). El uso de archivos batch tiene sus limitaciones a diferencia de Bash en Linux que tiene un uso aun mas robusto, en todo caso Windows a mejorado con Powershell, pero ese es otro tema.

Para el ejemplo del día de hoy, he generado una "herramienta" por decirlo, que realizara algunas funcionalidades como ejemplo en este caso como primer ejemplo será "Extraer perfiles con sus claves almacenados en nuestro adaptador de red" y como segundo caso será "Crear una red hospedada".

Si desean información o aprender sobre archivos Batch pueden encontrar guías y manuales al respecto en este enlace, en la sección Batch-Bash.

Cree un repositorio en GitHub para subir los archivos, pueden verlo aqui.

Creando un menú de opciones:

Lo primero que hice fue en crear un menú de opciones para cuestiones de orden y pues darle una apariencia a las herramientas que se utilizan actualmente.  Para realizarla solo es necesario saber algo de lógica de programación y algunos comandos como:

- title : cambia el titulo del programa
- echo : imprimir en pantalla
- rem : añadir un comentario
- if : condicional, se le puede añadir else
- pause : detiene el programa hasta una pulsación de tecla, luego continua su ejecución
- goto : salta hacia un bloque de instrucciones donde se inicializó (ejm: goto menu)
- exit : finaliza el archivo de procesamiento por lotes
- call : inicia un programa o comando y espera a que finalize para continuar con su ejecución
- start : inicia un programa o comando y continua su ejecución
- set : define una variable y su valor o se le puede asignar un valor ingresado por el usuario con /p





Para realizar el nombre tengo un programa realizado en C que me genera un AsciiArt ( texto a AsciiArt) que en algún momento lo subiré.

Bueno esta parte del programa lo que hace es obtener la variable de entrada que es la opción que seleccionas y rederigir a un bloque de instrucciones donde llamará al archivo que utilizaremos para realizar dicha opción seleccionada.


Iniciar Red Hospedada:

Cuando nosotros queremos iniciar otra red wifi, podemos utilizar una red hospeda, incluso podemos compartir nuestro internet a travez de ella, para mas detalles y de como funciona pueden ver este enlace. Lo que hice fue pasar los comandos que generalmente se ejecutan para iniciar la red hospedada a un archivo Batch: 

@echo off
title OldToolKit - Iniciar Red Hospedada
echo ----------------------------------------
set /p ssid=nombre de la red:
set /p clave=clave:
netsh wlan set hostednetwork mode=allow ssid=%ssid% key=%clave% keyUsage=persistent
echo Actualizando nuevos datos
netsh wlan start hostednetwork

Lo que hace estas instrucciones, es pedir como entrada un nombre para nuestra red Wifi y el segundo parámetro la clave de nuestra red wifi (recuerda que tiene que ser 8 caracteres o mas). Luego lo que hace es actualizar los datos de la red hospedada e inicializarla, para realizar estas instrucciones es necesario tener privilegios de administrador.

Extraer perfiles y claves :

La segunda funcionalidad que tendrá nuestra herramienta es para poder extraer todos los perfiles de red inalambrica a las que nos hemos conectado, con privilegios de administrador podemos extraer las claves, en caso de no tener privilegios de administrador, las claves se mostrara su respectiva codificación. Veamos:

echo Creando Directorio
if not exist \PROFILES-RED mkdir PROFILES-RED
cd PROFILES-RED
echo exportando...
netsh wlan export profile key=clear

En esta parte de instrucciones utilizamos if not exist (ejecuta la instrucción si no existe el archivo indicado) luego solo nos desplazamos a la carpeta creada y allí importaremos los perfiles de red que obtengamos, el parámetro key=clear es para indicar que nos muestre la clave del perfil de red.

Y bueno eso sería todo por hoy, en otra publicación veremos algunas funcionalidades que también sean algo mas elaboradas y complejas, esta de mas decir que el tema de los archivos batch es algo ya antiguo y que antes eran utilizados hasta para realizar pequeñas bromas y virus, que en ese entonces eran los inicios, pues ahora ya existe otras formas de elaborarlas y con algun lenguaje de programación, pero siempre es bueno saber algunas de las cosas que eran antes, saludos y Happy Hack. 


Enlaces:

https://github.com/phaoliop/OldToolKit

domingo, 21 de enero de 2018

Como alguien puede robar tu sesión de Facebook en 10 segundos

Por lo general los sitios webs manejan una Cookie para mantener la conexión entre el cliente-servidor (sesiones) de esta manera el cliente solo tiene que enviar el token de la sesión y el servidor pueda identificar los datos de la sesión actual. Para el ejemplo de hoy veremos como en unos segundos con acceso físico a un ordenador te pueden robar tu sesión, en este caso de Facebook.

Una de las formas en que alguien pueda tener acceso a tu cuenta es cuando te descuidas por un momento y dejas tu ordenador con tu sesión abierta, en ese momento una persona solo necesita ir a tu navegador, abrir el modo desarrollador y tomar una foto a la informacion de las cookies de algún sitio web al cual hayas dejado una sesión abierta y luego con un editor de cookies utilizar utilizar esos datos en tu navegador y listo.



Un atacante con acceso a tu maquina solo debe realizar los siguientes pasos:

Paso 1 - Obtener las cookies:

Lo primero que debería hacer ver el navegador y acceder al modo desarrollador, por lo general es la tecla F12, para realizar el ejemplo me he dado la molestia de crearme una cuenta en Facebook, veamos: 



Aqui vemos varias cookies, pero nosotros solo necesitamos 2, la cookie llamada "c_user" y "xs", donde:
  • c_user: es el identificador de usuario, esto la podemos obtener con solo saber el usuario del que estamos obteniendo la sesión.
  • xs: es el token de la sesión.

Paso 2 - Editar las cookies:

Luego obtenidas las cookies, solo necesitamos ir a nuestro ordenador y utilizar un editor de cookies, en este caso yo he utilizado una extension para Google Chrome llamada EditThisCookie, el cual me permite agregar, modificar, eliminar cookies.

Entonces abrimos en nuestro navegador la pagina ( en este caso de Facebook) y luego abrimos nuestro editor de cookies:



Como vemos nos aparece una cookies que ya tiene Facebook, pero para acceder a la sesión que hemos obtenido, eliminamos todas las cookies que hay en Facebook en ese momento:



Nos quedara una ventana asi, ahora solo seleccionamos la opción de agregar ( el símbolo + ) y agregamos los datos ( solo deben rellenar el nombre y valor) y guardar, les deberia quedar algo asi:




Y por ultimo deben actualizar la pagina y listo! aparecerá la sesión que hemos obtenido.
Foto de la prueba de la sesión con el mismo token ( la sesión la abrí desde una maquina virtual solo para probar pero en realidad pude haberla realizado utilizando otro navegador simplemente).



Anotaciones:


Debo agregar que por Javascript existe una forma de llamar a las cookies que existen, pero la cookie "xs" no aparece en ella (lo se porque lo intente agregando una función javascript y al solicitar esa cookie retorna vacio). Por otro lado se puede acceder a las cookies del sitio web actual en el que te encuentras, de otro modo tienes que ser un sitio web confiable pero eso ya es otro tema.

Recomendaciones:

Como recomendación es no dejar tu sesión de tu ordenador sin descuido, puede que tus compañeros al ver esto simplemente publiquen algo en tu Facebook y ya, pero hay otros que pueden verlo desde este punto, ademas con un simple "cerrar sesión" se evita que alguien mantenga esa sesión aun activa, por eso no intenten con los datos mostrados en las imágenes, pues esa sesión ya ha finalizado.

Ademas debo agregar que si abres tu sesión desde un navegador de incógnito, probablemente tu sesión queda abierta y perdida para alguien que probablemente te la pueda haber robado, eso es todo.



Enlaces:



domingo, 7 de enero de 2018

Esteganografia - Analizando imagenes con Exiftool

La Esteganografía trata el estudio y aplicación sobre las técnicas que permiten ocultar mensajes u objetos dentro de otro, llamados portadores, de modo que su existencia de los mensajes pasen desapercibidos. En resumen la Esteganografía procura ocultar los mensajes dentro de otros objetos (archivos) que por lo general son archivos de audio, imagen, videos o PDF, para así establecer un canal de comunicación de modo que otras entidades no se den cuenta de ello.

Para el primer ejemplo del año, hoy les mostrare como ejemplo un desafío de Seguridad relacionado a la Esteganografía de la plataforma ATENEA, el cual vamos a intentar resolver con la herramienta Exiftool.


El reto


El reto se llama "Juegos de Guerra" , como descripción solo nos menciona que en la siguiente imagen de alguna manera se encuentra escondida una contraseña y pues nuestro deber sera ubicarla.

Para los que quieren resolverlo por su cuenta, pues aquí les dejo el link Juegos de Guerra, primero tienen que registrarse y loguearse, luego pueden acceder, el reto esta en la categoría Esteganografía y Criptografía, ya después de intentarlo si aun no lo han logrado continúan leyendo.


Exiftool

Exiftool es una herramienta un programa de software libre y de codigo abierto para leer, escribir y manipular metadatos de archivos de imagen, audio, video o PDF. Su uso es por linea de comandos y la forma basica de utilizarlo es ejecutar el comando:

exiftool [nombre_archivo]


Para los que usando Kali, exiftool ya viene instalado. En todo caso para los que no tengan, lo instalan ejecutando:

sudo apt-get install libimage-exiftool-perl

Ahora descargamos la imagen que nos dan (en este caso es un archivo con extension jpg) pueden descargarla sino aqui y ejecutamos para ver que datos nos muestra:




Desafío Juegos de Guerra

Analizando la imagen, como dato mas importante nos indica que dentro de la primera imagen que hemos analizado existe data "Thumbnail Image" y para extraerla ejecutemos Exiftool con el parámetro -b. Estos datos lo guardaremos en un archivo y veremos que ademas de los datos que ya habiamos visualizado estan los datos del "Thumbnaail Imagen", para entender esto es necesario saber los encabezados de los archivos JPEG, que en este caso es FF D8 FF E0.

Yo lo he visualizado con un editor hexadecimal llamado Ghex, pero pueden hacerlo desde la terminal con la herramienta Hexdump:


hexdump -C -n 512 salida1



Entonces editamos el archivo salida1, primero eliminamos todo lo que esta antes de la cabecera (FF D8 FF E0) y luego guardamos en otro archivo con la extension jpg. Esto nos mostrara otra imagen que volveremos a analizar con Exiftool:




Tenemos otra imagen de la película Juegos de Guerra y como en la primera imagen, nos muestra que existe un "Thumbnail Image" que tiene menor tamaño y ademas nos muestra otros datos relacionados al GPS:

GPS Version ID                  : 2.3.0.0
GPS Latitude Ref                : North
GPS Latitude                    : 37 deg 29' 6.00" N


Esto parece ser la ubicación de algo, pero solo tenemos la Latitude, entonces seguimos extrayendo la demas data con el parametro -b en exiftool. Al realizar esto y viendo los resultados nos daremos cuenta que es otra imagen, entonces realizamos lo anterior, eliminamos el contenido anterior a la cabecera JPEG y luego lo guardamos en otro archivo con extension jpg:




Nos muestra la imagen que pertenece a la misma película de Juegos de Guerra y si analizamos la imagen otra vez con Exiftool obtenemos mas datos relacionados con GPS:

GPS Version ID                  : 2.3.0.0
GPS Longitude Ref               : West
GPS Longitude                   : 122 deg 8' 53.40" W


Localizando


Ya que no había mas datos para extraer relevantes, tratemos de ver que hay en esa ubicación con las coordenadas obtenidas, para esto simplemente buscando alguna pagina que nos indique:

GPS Latitude                    : 37 deg 29' 6.00" N
GPS Longitude                   : 122 deg 8' 53.40" W


Visualizando el mapa en modo Satélite, logramos ver la palabra "HACK" y hemos conseguido la clave, desafío resuelto.



Enlaces:

Plataforma

domingo, 24 de diciembre de 2017

Santa trajo muchos libros y tutoriales para compartir, +75 GB de informacion

La navidad ya llega y hace poco estuve subiendo mis archivos que he recolectado desde el 2015, son unos 75 GB en libros, tutoriales, videocursos, etc.



Los he separado por carpetas como las he ido juntando y no necesariamente la informacion pertenece a la carpeta que indica, pues algunos libros tienen informacion de temas variados pero he tratado de que sea lo mas aproximado a eso. 



Aun me faltan subir la mitad de los archivos pero en el transcurso de los dias espero completarlo.




Sin mas que decir, pueden ver los archivos desde las opciones de "Descargas" en el menú de navegación o en el siguiente enlace:



Feliz navidad y happy hack :D 



domingo, 17 de diciembre de 2017

Enviar un e-mail desde Python

Veamos como podemos enviar un correo electrónico desde Python utilizando la librería smtplib. Para el ejemplo de hoy usaremos la librería smtplib de Python para enviar un correo electrónico desde una cuenta Gmail, como recomendación usen una cuenta que no les sirva para enviar los correos.



Antes de todo debemos configurar nuestra cuenta, para que permita el acceso de aplicaciones menos seguras, es decir, que nos permita autenticar nuestra cuenta desde nuestro script en python.

Para ello nos dirigimos a nuestra cuenta de Gmail y habilitamos la opción "Permitir el acceso de aplicaciones menos seguras":




Ahora si podemos loguearnos, luego necesitaremos crear un archivo que contendrá el mensaje que vamos a enviar, en mi caso yo cree un archivo llamado "body.txt"  que contiene el siguiente mensaje:



El cual debemos indicar la ubicacion en nuestro script:

import time, datetime
import smtplib

file_log = '/home/paolo/Escritorio/body.txt'

def SendEmail(user, pwd, recipient, subject, body):
  
  gmail_user= user
  gmail_pass = pwd
  FROM = user
  TO = recipient if type(recipient) is list else [recipient]
  SUBJECT = subject
  TEXT = body
  
  message = """\From: %s\nTo: %s\nSubject: %s\n\n%s
  """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
  try:
    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.ehlo()
    print server.ehlo()
    server.starttls()
    server.ehlo()
    print server.ehlo()
    server.login(gmail_user, gmail_pass)
    print("logueado")
    server.sendmail(FROM, TO, TEXT)
    print("enviando")
    server.close()
    print ('Correo enviado satisfactoriamente!')
  except Exception as e:
    print(e)

def FormatAndSendLogEmail():
  with open(file_log, 'r+') as f:
    actualdate = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    data = f.read().replace('\n', '')
    data = 'Log capturado a las: '+ actualdate + '\n' + data
    print(data)
    SendEmail('unacuentafake@gmail.com', 'clavedelacuenta', 'correoamandar@gmail.com',
              'Nuevo log - '+actualdate, data)
    f.seek(0)
    f.truncate()
    


FormatAndSendLogEmail()
print("fin")


Enviando un e-mail


En nuestro script tenemos 2 funciones (una para pasarle los datos que requiere: FormatAndSendLoEmail y otra la funcion en si que envia el e-mail: SendEmail).

Lo primero que debemos hacer es modificar la variable de nuestro archivo que contiene el mensaje a enviar:

file_log = 'ruta/body.txt'


Luego debemos modificar los datos que pasamos a la funcion SendEmail:

SendEmail('unacuentafake@gmail.com', 'clavedelacuenta', 'correoamandar@gmail.com',
              'Nuevo log - '+actualdate, data)


Ademas si deseamos hacerlo con otro servidor de correo, debemos configurar esta parte
del código, en el caso de Gmail es asi:

server = smtplib.SMTP("smtp.gmail.com", 587)

Y por ultimo correr nuestro Script:




Si no tenemos ningún error, significa que todo ha salido bien.
Ahora veamos al correo enviado:




Y pues eso es todo, así de sencillo. Si no les aparece el correo en la bandeja
de entrada, revisen en Spam, por lo general aparece ahí.

domingo, 10 de diciembre de 2017

Hilos en Python - Brute force

El trabajo con threads se lleva a cabo en Python mediante el módulo thread. Este módulo es opcional y dependiente de la plataforma. 

Pero además de thread, también contamos con el módulo threading que se apoya en el primero para proporcionarnos una API de más alto nivel, más completa, y orientada a objetos y es el que utilizaré para el ejemplo de hoy, un programa que realizará fuerza bruta utilizando un diccionario para encontrar la clave de algunos usuarios utilizando hilos (para mas informacion de hilos en python click aqui). 


Para el ejemplo primero he montado un servidor utilizando el framework web Django, el cual contiene un formulario de login con el siguiente html:


En una publicación anterior ya explique como realizar un login con Python (
ver aqui) , así que ahora cree mi propio login, uno sencillo para poder hacer el ejemplo en donde solo requiere 3 datos por método POST (user, clave, ingresar).

Aplicando fuerza bruta


Bueno para realizar el ataque por fuerza bruta, he creado algunos usuarios:


Ademas de un diccionario con las posibles claves de estos usuarios, para el ejemplo solo he creado 11 claves como prueba de las cuales entre ella están la de los usuarios que probare:



El código lo pueden ver desde el repositorio ver aqui. Podemos ver que se utilizan los 3 parámetros mencionados que son enviados por método POST:

payload = {
"user":user,
"clave":clave,
"ingresar":"Ingresar"
}
response = requests.post(url, data=payload)

Nuestro formulario se vería así:



Donde una vez que accedimos, nos mostrara un mensaje en un etiqueta <p> con id="info":


A lo cual debemos evaluar en nuestro programa para saber si los datos ingresados han sido correctos o no. Eso lo evaluaremos usando BeautifulSoup, en donde obtendremos el código en la etiqueta <p id="info"> de no existir significa que no logramos acceder y por lo tanto nuestra clave es incorrecta:




Utilizando hilos para validar múltiples cuentas:


Como ultimo paso, he utilizado 2 hilos para a la vez ir buscando las claves de 2 de los usuarios creados, esto se puede hacer para muchos mas usuarios o dividir en hilos las posibles claves de un usuario:



Para empezar a ejecutar un hilo, se utiliza su metodo hilo.start() y una vez realizado todo, probamos el programa:



Bueno, el programa te muestra tanto las claves incorrectas como la clave correcta. Los usuarios a probar son "prueba" -> "micontra123" y "unusuario" -> "clave123". 




Enlaces:











domingo, 19 de noviembre de 2017

Sockets en Python - Chat local


La comunicación entre distintas entidades en una red se basa en Python en el clásico concepto de sockets. Los programas utilizan sockets para comunicarse con otros programas, que pueden estar situados en computadoras distintas. Los tipos y funciones necesarios para trabajar con sockets se encuentran en Python en el módulo socket , como no podría ser de otra forma.

Un socket queda definido por la dirección IP de la máquina, el puerto en el que escucha, y el protocolo que utiliza. Para el ejemplo de hoy he realizado un pequeño programa en Python para intercambiar mensajes al cual he llamado PyChatLocal en el cual podremos "mensajear" con otro ordenador que este en red local.

Creando un Socket [Servidor]

Para realizar nuestro ejemplo primero debemos crear un socket para lo que sera el servidor, que estara a la escucha de las conexiones.

Creamos un objeto socket:

escucha = socket.socket()

Con el metodo bind(()) indicaremos el puerto por la cual estará en la escucha, en este caso será el 1234 y el host podemos poner localhost o dejarlo vacío:

escucha.bind(('',1234))

Luego le indicaremos el numero de conexiones que pueden estar a la espera en nuestro socket servidor:

escucha.listen(3)

Para este ejemplo, la conexión se realizara entre 2 clientes, por lo cual lo he realizado así. Nuestro socket servidor acepta las conexiones de los 2 clientes que se comunicaran:

conn, addr = escucha.accept()

La funcion accept() nos retorna 2 variables, una es la conexion y otro es una tupla que contiene (direccion,puerto) del cliente que se ha conectado.


Por ultimo, se encarga de enviar los mensajes entre el cliente 1 y 2:

while True:
#Intercambio de mensajes entre clientes
recibido = conn.recv(1024)
conn2.send(addr[0]+">"+recibido)
recibido2 = conn2.recv(1024)
conn.send(addr2[0]+">"+recibido2)

Con la función send() enviara el mensaje al cliente que ha realizado esa conexión con nuestro socket servidor. Por ultimo cierras las conexiones con close() para liberarlas.

Creando un Socket [Cliente]

Una vez creado nuestro socket servidor, ahora crearemos nuestro socket cliente. He realizado 2 puesto que para realizar la prueba en uno tenia Python 2.7 y en la otra maquina tenia Python 3.5 ambos archivos estan el repositorio PyChatLocal.

El programa recibe como parámetro la direccion IP en el cual esta ejecutándose nuestro socket servidor. Con la función connect(()) le pasamos como parámetro la dirección IP y el puerto por el cual esta escuchando, en este caso 1234, veamos:

host = sys.argv[1]
try:
#Conectar
sock = socket.socket()
sock.connect((host,1234))

Luego enviamos el contenido del mensaje que obtenemos de entrada y leemos los datos si es que existe alguna entrada con sock.recv(1024) el cual recibe como parámetro la cantidad de bytes a leer:

while True:
#Intercambio de mensajes
mensaje = raw_input()
sock.send(mensaje+"\n")
data = sock.recv(1024)
print data

Por ultimo cerramos la conexion para liberarla y ya tenemos un sencillo programa para intercambiar mensajes, probablemente mas adelante lo mejore para una próxima publicación.

Para las pruebas lo hice desde una maquina Ubuntu como servidor, ademas un cliente y una maquina Windows como el otro cliente:


Enlaces:


domingo, 12 de noviembre de 2017

Web Scraping con Python - Buscando letra de canciones Lyrics.py

Web scraping es una técnica utilizada mediante algún programa de software para extraer informacion de sitios web. Para el ejemplo de hoy veremos un pequeño proyecto hecho en python el cual he nombrado Lyrics_py y el como podemos "analizar" y extraer contenido de una pagina web para obtener la letra de alguna canción pasada como parámetro.

Hace un tiempo mencione en una de mis publicaciones un programa realizado en Java y en como este analizaba el contenido del HTML de Instagram para visualizar la foto de un perfil el cual el algoritmo para analizar el HTML lo habia hecho yo mismo, para este ejemplo de hoy realizado en Python he utilizado una librería llamada BeautifulSoup del paquete bs4 el cual nos da mucha facilidad para extraer contenido especifico.


Extrayendo datos con BeautifulSoup:

En primer lugar debemos tener el codigo HTML de donde vamos a extraer datos, en este caso sera el HTML de una búsqueda realizada en Google. Entonces primero hacemos una petición GET con los parámetros de busqueda para esto utilizaremos la librería requests, por ejemplo:

response = requests.get("https://www.google.com.pe/search?q=lyrics+shape+of+you")

Luego una vez realizada la petición, ya tenemos el HTML de respuesta con:

response.content

Ahora para extraer contenido con BeautifulSoup, existen diferentes formas, para el programa realizado utilizaremos 2:

#Utilizamos para extraer el contenido después de realizar una petición con requests

soup = BeautifulSoup(contenido,"lxml")


#Utilizamos para extraer el contenido de una porción de html

soup = BeautifulSoup(cadena,"html.parser")

Ahora para buscar algún contenido especifico o etiquetas en general, podemos hacerlo de la siguiente manera:

resultados = soup.find_all("div",{"class":"nombre_clase"})


resultados2 = soup.find_all("nav",{"id":"nombre_id"})
Como resultado nos devuelve una lista donde cada elemento es un resultado de nuestra búsqueda, si no queremos especificar alguno de los 2 parámetros ponemos True. Ademas esta libreria nos permite acceder al contenido de alguno de sus atributos como si fuera un diccionario, por ejemplo si queremos acceder al atributo href lo hacemos así:

elemento['href']

Esto son algunos ejemplos en especifico de como he utilizado BeautifulSoup para lo que va en el ejemplo realizado, para mas información sobre esta librería y como utilizar, pueden ver en este enlace.

Buscando la letra de una canción:

En general para buscar una letra de una canción, voy a Google y le ingresamos lyrics nombre_cancion, pues para el ejemplo realizado haremos lo mismo pero mediante python a travez de una petición get como mencionamos anteriormente. Ahora una vez obtenido los resultados de la búsqueda, que manualmente seria algo así:


En caso de que Google play music tenga resultados de tu búsqueda, Google te la mostrará primero y luego estarán otros 10 resultados en donde puede visualizar la letra de la canción. Para una primera version (0.1) nos basamos en que todas las letras las tiene Google play music (aunque sabemos que no es asi), pero primero debemos extraer los enlaces a los cuales nos redireccionaria para visualizar la letra completa y los enlaces de los otros 10 resultados de búsqueda:



Extrayendo datos de resultados de búsqueda:

Para obtener los resultados,existen 2 posibles opciones, cuando solo están los 10 resultados de búsqueda y cuando ademas también existe resultado en Google play music. Luego de eso necesitamos obtener el enlace a donde nos redireccionaria si hiciéramos click, es decir, si lo hiciéramos de forma manual.

Veamos como extraer los datos:


Almacenamos en un diccionario "nombre_pagina": "enlace" , para tener las posibles paginas en donde debe buscar nuestro programa y mejorar sus opciones de búsqueda mas adelante.

Una vez obtenido todos los enlaces de redireccionamiento, podemos analizar estos resultados, para ello debemos realizar otra petición get si es posible. Para la búsqueda en Google play music acceder a los datos que buscamos seria así:

#Obtenemos el contenedor de los datos en general

datos = soup.find_all("div", {"class": "content-container lyrics"})



#Obtenemos el titulo y nombre del artista

titulo = soup.find_all("div", {"class": "title fade-out"})

artista = soup.find_all("div", {"class": "album-artist fade-out"})



Por ultimo para extraer la letra de la canción seria así:

encode('utf-8') para los contenidos con caracteres especiales.
Donde la variable datos es una lista que tenia el contenido de la letra de la canción por párrafos para este ejemplo en especifico.

Para ver el proyecto pueden ver en el GitHub del proyecto.

Lyrics.py

Bueno el programa es facil de usar, lo indica en el mismo README.md del proyecto. Dependencias:
  • BeautifulSoup
  • requests
  • lxml
Para instalar dependencias con pip:

pip install -r requirements.txt

Luego ejecutan:

python lyrics.py "nombre_cancion"

Les dejo un ejemplo para buscar la letra de la canción "Shadow of the day": 



Enlaces:

domingo, 5 de noviembre de 2017

Tu Facebook tiene 3 contraseñas y probablemente no sabias


Hace un tiempo leí una publicación de Chema Alonso sobre las 3 contraseñas que una cuenta de Facebook puede tener, lo cual muchas personas no sabían al respecto.


Facebook admite hasta otras 2 contraseñas ademas de la que tu ingresaste como contraseña, ¿como es posible esto? , pues para superar los problemas mas comunes por las que se rechazan los inicios de sesión validos, Facebook admite otras 2 contraseñas:

  • Si el usuario tiene activado el Bloq+Mays activado. Es decir, si un usuario no se ha percatado que tiene activado o no el bloqueo de mayúsculas, Facebook acepta tu contraseña invertida (las minúsculas a mayúsculas y las mayúsculas a minúsculas), por ejemplo si tu contraseña es abCDfg12 entonces también tu contraseña es ABcdFG12.
  • Si el dispositivo móvil activa automáticamente el primer carácter de la contraseña. En este caso nos hace referencia a nuestros dispositivos móviles donde muchos de ellos, el primer carácter que ingresamos es mayúscula, del ejemplo anterior siendo la contraseña abCDfg12 entonces también tu contraseña es AbCDfg12.

Entonces teniendo en cuenta esto, al momento de loguearte a Facebook, lo que hace es comparar con estas 3 posibles contraseñas, por lo tanto de tener 1 contraseña puedes pasar a tener 3. Todo esto es indicado por la misma compañía de Facebook, donde lo mencionan como uno de los falsos positivos enviados comúnmente, en el punto numero 5.  Donde nos mencionan que aceptan tres formas de la contraseña del usuario para ayudar a superar las razones más comunes por las que se rechazan los inicios de sesión auténticos e indican que esto no afecta significativamente la seguridad de la contraseña del usuario o su cuenta.


Una vez mas las opciones de usabilidad ha ganado frente a la seguridad, de esta forma reducen problemas de soporte frente a usuarios que tienen problemas con el bloqueo de mayúsculas o el primer carácter en mayúscula por defecto. A todo esto Chema nos deja una imagen para reflexionar: 

http://www.elladodelmal.com/2014/05/tu-cuenta-de-facebook-tiene-3-passwords.html

Adicionalmente uno se puede preguntar que tanto afecta esto a la seguridad, pues tratándose de Facebook no es algo a tomar en cuenta, pero si lo vemos desde el punto de vista por ejemplo de un ataque de fuerza bruta, el numero de contraseñas en un diccionario se puede reducir a la mitad. Es decir, si como ejemplo tenemos contraseñas con caracteres del alfabeto [a-zA-Z] siendo una clave de 
longitud 4 caracteres, tendremos un diccionario de:

 52^4 = 7311616

Ahora tomando en cuenta que el primer carácter acepta en solo mayúsculas, esto reduce para este caso el numero de contraseñas a la mitad:
26 * 52^3 = 3655808

Enlaces:

domingo, 29 de octubre de 2017

Loguearse a una web con python


Existen diferentes formas de hacer un login a una pagina web, en esta ocasión decidí poner una parte del código utilizado anteriormente para loguearse a una web en Python.

Para este ejemplo el login ha sido realizado mediante una petición POST de la librería requests de Python, los datos enviados mediante esta petición depende de la url en donde realizará el login.

Para el ejemplo se envían los siguientes datos:

payload {
       "Usuario":user,
       "Password":clave,
       "btnEntrar":"Entrar",
}



Para saber que datos son enviados mediante el método POST pueden descargarse la pagina html del login y en la etiqueta form cambiarle el método POST por GET y ademas la dirección url donde se realizará la acción para que no te direccione a la pagina descargada, pueden editar la pagina con cualquier editor de texto. Para el ejemplo descargue el login de esta pagina. Veamos como hacerlo en la imagen:



Datos editados: action="datos.html" method="get" (donde datos.html es una copia de la pagina login.html descargada)

Los datos enviados aparentemente son miusuario y miclave, pero veamos en la siguiente imagen que todos los datos enviados son:

username=miusuario&password=miclave&return=&61523a137fcedfbcb0f2faa936635de7=1

En nuestro payload mencionado anteriormente para este login probablemente seria:

payload = {
       "username":"miusuario",
       "password":"miclave",
       "return":"",
       "61523a137fcedfbcb0f2faa936635de7"="1",
}

Por lo general son los datos que debería tener nuestra variable payload.

Una vez que sabemos los datos que se envían, el siguiente paso es analizar el resultado que retorna. Pues esto depende de cada pagina, es mas fácil cuando tienes una cuenta valida para saber que resultado esperas cuando los datos ingresados son correctos y a la vez saber que datos retorna cuando tu contraseña o usuario son incorrectos. En esta parte depende de la pagina y de uno mismo como analizar el contenido que retorna.

Aquí un ejemplo de como seria analizar el contenido que retorna:


Esto es asumiendo que retorna un id="mensaje-respuesta" con contenido que indica "Cuenta correcta"


Los demás como ya lo he mencionado depende del login y el contenido que retorna la petición, ademas de un poco de ingenio para hacer peticiones seguidas u otra cosa que se te pueda ocurrir. Para ver todo el contenido del código pueden ingresar aqui donde ademas hay una variable proxies por si quieren acceder mediante un proxy, saludos y happy hack.


Enlaces: