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:





sábado, 28 de octubre de 2017

Lista de claves por defecto - UNMSM


Me tome el tiempo de ver cuantas cuentas aun continúan usando su clave por defecto y los resultados realmente me sorprendieron.  En total son alrededor de 7015 usuarios que sus cuentas han sido validadas, para no afectar a nadie he ocultado los últimos caracteres de los usuarios y de las contraseñas, por mi parte yo solo hice esto con la intención de informar.

Asumo que cada uno debe saber que la clave que esta usando, por si desean verificar si aparecen en la lista, puedes verificar aqui (presionen f3 e ingresen los primeros caracteres de su correo o dni).

Datos encontrados: 


Los datos encontrados user:password (Total: 7015)



Debo agregar que son cuentas de pre-grado que estudiaban hasta el 2015, probablemente si hubiera validado hasta los del estudiantes de pre-grado y demás personal dentro de la universidad en el 2017, los resultados hubieran sido aun mayores.

Entre los datos encontrados, decidí separar para obtener cuantas cuentas son por facultad:


  1. MEDICINA = 772
  2. DERECHO Y CIENCIA POLÍTICA = 715
  3. LETRAS Y CIENCIAS HUMANAS = 416
  4. FARMACIA Y BIOQUÍMICA = 146
  5. ODONTOLOGÍA = 136
  6. EDUCACIÓN = 429
  7. QUÍMICA E INGENIERÍA QUÍMICA = 309
  8. MEDICINA VETERINARIA = 79
  9. CIENCIAS ADMINISTRATIVAS = 427
  10. CIENCIAS BIOLÓGICAS = 167
  11. CIENCIAS CONTABLES = 500
  12. CIENCIAS ECONÓMICAS = 332
  13. CIENCIAS FÍSICAS = 202
  14. CIENCIAS MATEMÁTICAS = 278
  15. CIENCIAS SOCIALES = 550
  16. INGENIERÍA GEOLÓGICA = 428
  17. INGENIERÍA INDUSTRIAL = 363
  18. PSICOLOGÍA = 193
  19. INGENIERÍA ELECTRÓNICA = 330
  20. INGENIERÍA DE SISTEMAS E INFORMÁTICA = 243

    ----------------------------------------------------------------
    TOTAL = 7015

En primero lugar recomendarles que cambien su clave, probablemente muchos ni utilicen su cuenta, pero puede que haya personas que se aprovechen de esto, por mi parte solo ha sido para informarles, avisen y happy hack!.


Enlaces:



domingo, 22 de octubre de 2017

Escala de privilegios - Archivos con el bit SUID activo

El bit suid es un permiso que se puede conceder tanto a directorios como ficheros. El SUID en ficheros es un permiso muy especial, que permite a un usuario con permisos de ejecución para dicho fichero, tomar los permisos del dueño del fichero durante su ejecución.

Para el ejemplo de hoy primero haremos un pequeño programa en C que ejecuta comandos de la terminal (el ejecutable lo generara nuestro usuario root). Luego le daremos el permiso de SUID y veremos como varia al activar el bit.

Aplicación:


Bueno para generar nuestro programa en C es solo esta pequeña porción de código que pueden verlo aqui.

Luego compilamos y ejecutamos el programa:

  • $ gcc filesuid.c -o filesuid
  • $ ./filesuid



Lo cual luego solo debes ingresar el comando que realizamos ejecutar y listo. En este caso ejecutaremos primero el comando ls -l para ver la informacion de los archivos y luego el comando whoami que lo que hace es mostrar el nombre del usuario en el que estamos.

  • my_shell > ls -l
  • my_shell > whoami
-rwxr-xr-x : el primero hace referencia al tipo de archivo, los 3 siguientes rwx al usuario,
3 siguientes grupo, 3 siguientes al resto de usuarios. Un guion (-) indica que no esta activo el bit en esa posición.


Como resultado nos muestra los permisos que tiene el archivo "filesuid" que es nuestro ejecutable y aqui debemos ver el simbolo X resaltado, que hace referencia a que el archivo puede ser ejecutado por el usuario, ademas seguido del siguiente comando nos indica que somos el usuario root, pues en realidad es así.

Continuando con el ejemplo ahora desde otra terminal veamos lo mismo pero con otro usuario, en este caso mi usuario se llama paolo, ejecutamos:
  • $ ls -l
  • $ ./filesuid
  • my_shell > whoami

En este caso al ejecutar whoami nos indica que somos el usuario paolo. Para salir del programa escriban salir.


Ahora asignemos el bit SUID a nuestro ejecutable, desde la terminal del usuario root, ejecutamos los siguientes comandos:

  • $ chmod 4755 filesuid
    4: activa el bit suid; 7: activa los bits rwx para el usuario; 5: activa los bits r-x para el grupo; 5 activa los bits r-x para los demas miembros;
  • $ ls -l
    vemos los permisos del ejecutable y notaremos que en vez de un x, aparece una s ( esto indica que el bit suid esta activo)
El bit suid es el que esta resaltado, donde la s minúscula indica que esta activo.

Por ultimo en nuestra terminal de otro usuario (no root) ejecutamos nuestro archivo que ya esta activado el bit suid:
  • $ ls -l
  • $ ./filesuid
  • my_shell > whoami


En el cual nos muestra que somos root cuando estamos como usuario paolo. Pues una vez aqui y con los permisos de root existen las vulnerabilidades por tener archivos -como en el ejemplo- con el bit SUID activo.

Enlaces:




Referencias:



domingo, 15 de octubre de 2017

Logran vulnerar el protocolo WPA2 - Key Reinstallation Attack

Es probable que tu Wi-Fi en tu casa no sea tan seguro como crees, recientemente ha salido la noticia de una severas vulnerabilidades en el protocolo Wi-Fi Protected Access II que permiten a los atacantes escuchar a escondidas el tráfico de Wi-Fi que pasa entre las computadoras y los puntos de acceso.




El exploit de prueba de concepto se llama KRACK (Key Reinstallation AtaCK), abreviatura de Ataques de re-instalación de claves. La investigación ha sido un secreto muy vigilado durante semanas antes de una divulgación coordinada programada para hoy Lunes 16-08-2017.

Una advertencia que el US-CERT distribuyó recientemente, describió la investigación de esta manera (traducción al español) :
" US-CERT se ha dado cuenta de varias vulnerabilidades de administración clave en el protocolo de seguridad Wi-Fi Protected Access II (WPA2) de 4 vías. El impacto de la explotación de estas vulnerabilidades incluye descifrado, repetición de paquetes, secuestro de conexión TCP, inyección de contenido HTTP y otros. Tenga en cuenta que, como problemas de nivel de protocolo, la mayoría o todas las implementaciones correctas del estándar se verán afectadas. El CERT / CC y el investigador informante KU Leuven publicarán públicamente estas vulnerabilidades el 16 de octubre de 2017. "

En una pagina Github perteneciente a uno de los investigadores, se utilizaron las siguientes etiquetas:

  • WPA2
  • KRACK
  • key reinstallation
  • security protocols
  • network security, attacks
  • nonce reuse
  • handshake
  • packet number
  • initialization vector

Es probable que la gran mayoría de los puntos de acceso existentes no se parcheen rápidamente, y algunos no se paren en absoluto. Si los informes iniciales son precisos de que los ataques de derivación de cifrado son fáciles y confiables en el protocolo WPA2, es probable que los atacantes puedan espiar el tráfico de Wi-Fi cercano a medida que pasa entre las computadoras y los puntos de acceso.


Hasta el momento no hay información de la gravedad que ocasionaría. Recordar que el  Wi-Fi ofrece una cantidad limitada de seguridad física: un ataque debe estar cerca. Entonces, de repente no eres vulnerable a todos en Internet. Es una protección muy débil, pero esto es importante cuando se revisa su nivel de amenaza.

Además, es probable que no tenga demasiados protocolos que confíen en la seguridad de WPA2. Cada vez que accede a un sitio https, como este, el navegador está negociando una capa separada de cifrado.

Comprometer servidor FTP - HackLab #1 de gf0s



 En mi búsqueda de algún reto de Hacking básico, he encontrado los HackLabs de GF0S que decía que eran para los que recién iniciamos en Seguridad Informática y pues soy uno de ellos así que decidí probar a ver que tal me iba.

En este caso, se trata del HackLab #1 - Comprometer un servidor FTP, pueden encontrar los demás retos aqui.

http://labs.gf0s.com/

 

 

Objetivo: 

 

- Intentar obtener el diseño del prototipo del dron.
- Dejar una evidencia (subir un archivo .txt)


Reglas:

 

- Esta prohibido todo ataque DoS / DDoS. En caso de identificar este comportamiento, el servidor será dado de baja.
- Cuando logres acceder al sistema, deberás dejar una evidencia. Dicha evidencia deberá ser exclusivamente un archivo .txt con el nick del usuario.
- El contenido del archivo puede ser lo que tú quieras. Recomiendan poner un ascii art.
- El servidor estará activo durante 1 semana. Por favor, no publicar durante este tiempo la manera en la que accediste. ( El reto es del 2015, así que ya paso tiempo).


Recolectando información


La información que nos brindan es: 

-Nombre del administrador: Alejandro Quero 
-Facebook del administrador: https://www.facebook.com/profile.php?id=100010301916909

Revisando el perfil del administrador, logre encontrar la siguiente información:

- Fecha de nacimiento del administrador: 11/08/1980
- Falta limpiar los metadatos a sus archivos
- El servidor ftp al que se conecta: 52.10.103.130
- El usuario que utiliza para acceder al servidor ftp: aquero
- Otro posible usuario: Pedro
- 2 archivos .pdf 'Diagrama de red WAN'  y 'Diagrama de red LAN' (enlace aqui)


Ademas información muy importante sobre las contraseñas:

- Para contraseñas que se utilizan para acceder vía red ( telnet, ftp o red de windows) , se utilizan contraseñas de solo dígitos y son solamente de 7 dígitos.
- Para contraseñas locales ( como documentos .pdf .doc o .zip ), se utilizan contraseñas con unicamente letras minúsculas y números, ademas deberán ser de 6 dígitos.


Accediendo al servidor ftp

 

Según la información que hemos obtenido, ya tenemos el nombre del usuario, que es aquero, luego probé algunas claves utilizadas frecuentemente y al no dar resultado, pues cree un diccionario para luego acceder con fuerza bruta.


Generando diccionario:


La opción menos viable pero que resultaría era generar un diccionario un diccionario con todas las posibles opciones que podía haber, para ello utilice la herramienta Crunch, que tiene el siguiente formato:

  • $  crunch <min> <max> <texto> -o <archivo_de_salida>Donde:
    min: mínimo de caracteres
    max: máximo de caracteres
    texto: contiene los caracteres posibles
    archivo_de_salida: nombre del archivo de salida


Ahora ejecutamos el siguiente comando:

  • $  crunch 7 7 0123456789 -o pwd.txt

Pero esto me iba a demorar mucho, así que antes de ir por todo a lo bruto, decidí hacer un diccionario algo mas especial, ya que tenemos su fecha de nacimiento, pues utilicemos eso:

  •   $  crunch 7 7 1980 -o pwd.txt


*Nota: ponemos minimo(7) y maximo(7) por la informacion que obtuvimos previamente.
*Nota 2: nuestro texto es 1980, pues de la cadena 11/08/1980, sin repetir digitos es 1,0,8,9.

 

 Utilizando fuerza bruta para obtener la contraseña:


Ahora para acceder al servidor ftp, utilizaremos la herramienta Hydra:

  • $  hydra -l aquero -P pwd.txt ftp://52.10.103.130Donde los siguientes parametros son para:
    -l: usuario para acceder al servidor ftp
    -P: archivo que contiene el diccionario

*Nota: Con este diccionario que creamos anteriormente, demore menos tiempo en encontrar la clave.

Después de unos minutos, he logrado conseguir la clave con el diccionario anteriormente generado. La clave es: 0019808

Entonces ahora ya podemos acceder al servidor ftp:

Usuario: aquero
Contraseña: 0019808


Conectándonos al servidor ftp:


Ahora para conectarnos al servidor ftp, utilizamos lo siguiente:
  •  $  ftp 52.10.103.130
Donde luego nos pedirá el usuario, luego la contraseña:



Uno de los objetivos es subir una evidencia, en mi caso es un archivo .txt (paoloprogrammer.txt). Ejecutamos lo siguiente ahí mismo:
  •  ftp> send paoloprogrammer.txt paoloprogrammer.txt  

Si todo ha salido correcto, visualizamos nuestro archivo subido y los de otros que ya han dejado su evidencia tambien:
  •  ftp>  ls -a

En donde podemos visualizar nuestro archivo subido (paoloprogrammer.txt) y ademas un directo llamado privado. Para la siguiente parte accederemos desde la web.





Obteniendo el diseño del prototipo del dron


Bueno aun nos falta encontrar el diseño del drone, así que accediendo desde web podemos ver también la carpeta privado y en donde encontramos un archivo .zip (PrototipoPrivado6.zip) .




Una vez descargado el archivo, vemos que contiene una imagen, pero esta protegido por contraseña. Para esto utilicé una herramienta para obtener la clave, pues de la información obtenida anteriormente nos dice que los archivos .pdf .doc o .zip sus claves son caracteres y números, ademas tiene una longitud de 6 dígitos, veamos.



Obteniendo clave para el archivo .zip :


Utilice la herramienta fcrackzip, la cual tambien esta en Kali, ejecutamos lo siguiente:


  •  $  fcrackzip -b -c a1 -l 6-6 -v -u PrototipoPrivado6.zip

    Donde:
    -b:
    utiliza el algoritmo para fuerza bruta
    -c: indicamos caracteres alfanuméricos (a1)
    -l: longitud mínima - longitud máxima (6-6)





Después de unos minutos, ha encontrado la clave:




Y pues ahora solo nos queda, descomprimir y obtener la imagen del prototipo:




Y listo, hemos completado el reto, es un reto ya de mas de 2 años, pero fue entretenido, la imagen obtenida es la siguiente:







Bueno eso ha sido todo, si desean ver el archivo .txt que deje como muestra, pueden verlo aquí:
http://labs.gf0s.com/website/paoloprogrammer.txt


Enlaces:


http://labs.gf0s.com/

http://labs.gf0s.com/R1cde3/r1-index.html