Mostrando entradas con la etiqueta python. Mostrar todas las entradas
Mostrando entradas con la etiqueta python. Mostrar todas las entradas

lunes, 9 de agosto de 2021

CTF Crypto - I


 

Hace poco me encontre con unos cuantos retos de captura la bandera, estos estaban orientados a criptografía. Aunque no son los retos mas dificiles que hay fueron bastante interesantes para los que recien se enfrentan a este tipo de retos.


RETO 1: 


Este trataba de como trabaja los propiedades del la compuerta XOR.

El problema era el siguiente, te daban una serie de llaves que te ayudaran a encontrar la bandera la pista esta en los nombres de las llaves.

KEY1 = ...

KEY2^KEY1 = ...

KEY2^KEY3 = ...

FLAG^KEY2^KEY3^KEY1 = ...


La solucion esta en la pista y en las propiedades de la compuerta XOR, del siguente modo para obtener la segunda llave:

c =  a ^  b

b = a ^ c

KEY2 = KEY1  ^  KEY2^KEY1   

Asi se podra obtener la segunda llave xoreando las primeras 2 llaves. Del mismo modo se puede hallar la tercer llave y la bandera.

flag = k1  ^  k2  ^  k3  ^  f_k2_k3_k1

El truco es que como ya teniamos xoreado una de las llaves simplificaba la operacion y obtener la bandera.

flag = k1  ^  k2^k3  ^  f_k2_k3_k1
 

 

RETO 2: 

En este reto, te dan una larga cadena en hexadecimal que dentro de esta se halla la bandera y la unica pista que se dio fue que el formato de la bandera podria ayudar a solucionar el reto.

En realidad funciono bastante bien al xorear la misma cantidad de datos de la cadena encriptada con la longitud del formato, mostrando la clave con la que lo habian cifrado. Al intentar xorear toda la cadena con la llave que encontre, no funciono. 

flag = cadena ^ ( formatformat...)

Agregando una llave abierta ({) al formato, que es el siguiente caracter conocido, xorear toda la cadena, solo esta primer parte mostraba que habia funcionado. Asi que por fuerza bruta intente obtener el siguiente caracter, obteneniendo algunas opciones viables para ser la llave.

flag = cadena ^ ( format{format{...)

Al xorear el primer intento, note que tenia la longitud correcta de la llave y solo faltaba dar con el caracter correcto.

flag = cadena ^ ( format{cformat{c...)


RETO 3:

 En este reto dieron la cadena, la unica pista era que se habia xoreado con un solo byte. Asi que teniendo encunta que un byte tiene 128 valores diferentes, es factible obtener la bandera a travez de fuerza bruta, xoreando cada bite la cadena por el valor con el que se estaba probando.


NOTA: Algunos ctfs tienen prohibido publicar la solucion de los retos, por este motivo algunos aspectos fueron modificados para dar solo una vision ilustrativa del reto...



martes, 18 de mayo de 2021

Python y Message Broker - RabbitMQ I

INSTALACION:

RabbitMQ tiene soporte para varios sistemas operativos entre ellos Windows, Mac, Linux, BSD, UNIX, tambien se puede encontrar en repositorios Debian(apt) y RPM(Yum). Desde el lado de la nube, se puede encontrar varios proveedores especializados en SAAS, es muy compatible con kubernetes y ademas se puede encontrar una imagen en Dockerhub que en este caso voy a utlizar.


Lo primero sera descargar la imagen de RabbitMQ con el comando, eligiendo el plugin management que desplegara una interfaz que permite controlar y un monitorear lo relacionado a rabbitmq.

 docker pull rabbitmq:3-management

 

Para desplegar el contenedo uso el comando

 docker run -d --hostname bf-rabbit --name some-bf-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

Lo que se ejecuto es lo siguiente 

run docker va a ejecutar una imagen 

-d la ejecucion sera en background

--hostname: le dara un hostname que sera importante a la hora de subirlo a un proveedor cloud

--name: sera el nombre que se le dara al contenedor

-p publicara un servicio, en este caso en el puerto 15672 estara corriendo la interfaz grafica y 5672 esta el servicio de cliente de rabbitmq.

Y para finalizar la imagen de rabbitmq y especifica que se requiere tambien el plugin management.


Bueno ya que el entorno esta corriendo, se puede ingresar a la interfaz a travez del navegador en el puerto 15672, en donde ingresar con usuario y contraseña que por defecto es guest/guest.


En este espacio, se puede hacer seguimiento de las colas, crear usuario,  muchas opciones que se abordaran en un proxymo post.


Ejemplos

RabbitMQ cuenta con soporte para distintos lenguajes, ya sea java,python,c#,js, entre otros, en este ejemplo se utilizara la libreria de python "pyka".

Productor.py


Primero importa la libreria pika.

Crea una conexion que recibe un parametro de conexion con una ip.

Crea un canal de conexion.

Declara un cola, dandole un nombre si no existe previamente.

Publicar un mensaje, usando un exchange por defecto, la ruta key que por el momento usara el nombre de la cola y el mensaje que se quiere enviar.

Cerrar una conexion.


 Consumidor.py

De manera muy similar al productor, importa la libreria, crea una conexion, crea un canal y una cola si no existia previamente. Luego crea una funcion que se utilizara por el momento para imprimir por pantalla el mensaje recibido, despues se define la cola en la que se enlazara, se llama la funcion que se creo anteriormente y los acuses de recepcion por defecto son manuales, el auto-ack facilita este flag .


Robin-Round Dispach

Imagina que estas haciendo muchas peticiones y que cada operacion se demora entre 2 - 3 segundos, de repente llegan 30 peticiones, esto representaria un retraso de cercano a un minuto y medio, la solucion es bastante sencilla,  colocar mas instancias de consumidores, permitiendo escalar

Productor.py

Modificando un poco el ejemplo anterior, para hacer enviar un numero arbitrario de peticiones.

Para probarlo, es tan sencillo como abrir una nueva ventana y ejecutar otro Consumidor.py, por defecto RabbitMQ enviará mensajes a los consumidor de forma secuencial, esta distribucion de mensajes le llaman round-robin. 

 

Message acknowledgment

Siguiendo el ejemplo, digamos que durante todo este proceso, uno de los consumidores muere, RabbitMQ lo marca para ser eliminado. 

Para evitar que ese mensaje pre procesado muera, RabbitMQ implemente el ack, es enviado de vuelta por el consumidor para decirle a RabbitMQ que un determinado mensaje ha sido recibido, procesado y que RabbitMQ es libre de borrarlo. 

Consumidor.py


 Con esta peqeña modificacion, no se perdera nada , los mensajes se volveran a entregar

 

El ack debe ser enviado en el mismo canal que recibió la entrega. Los intentos de acuse de recibo utilizando un canal diferente darán lugar a una excepción de protocolo a nivel de canal.


Message durability

 Que pasaria si por el contrario, es RabbitMQ el que se para o bloquea, hay que asegurar la cola o se perderan todos los mensajes. Para esto en la configuracion de la cola debe declararse como durable y aplicarse tanto a productor como a consumidor. Para evitar que la cola actual devuelva un error por pasarle otros parametros, se creara una nueva cola con otro nombre.

 channel.queue_declare(queue='nuevo_saludo', durable=True)  

Productor.py


Con esta modificacion marca como persistentes los mensajes, aunque no es una garantia muy fuerte, es suficiente para estas pruebas. Si posblemente les  genera un error en los consumidores, posiblemente sea porque no se ha modificado la cola del basic consume.

 channel.basic_consume(queue='nuevo_saludo'...)

 

Fair dispatch

RabbitQM distribuye los mensajes de manera uniforme, pero esto trae consigo de que alguno de los consumidores va a tener una sobre carga de trabajo. Para solucionar esto hay que decirle a RabbitMQ que no envie mas mensajes hasta que termine la operacion. 

Consumidor.py


La pequeña modificacion dice a RabbitMQ que no le envie mas de un mensaje a la vez a los consumidores.

 

ref: https://www.rabbitmq.com/

viernes, 9 de octubre de 2020

Como configurar entornos virtuales en Python3

 


Los entornso virtuales, son mecanismos utilizados en para trabajar en distintos entornos separados de los directorios del sistema.Cada entorno funciona independiente de los demas, una vez activos puede tener conjuntos independientes de las librerias sin importar las versiones, solucionando multiples problemas de compatibilidad.

 

PYTHON3

PASO 1: Instalar python3-venv

Primero como buena practica siempre actualizar los paquetes del sistema antes de instalar cualquier paquete:

sudo apt-get update -y

Ahora instalar python3-venv

sudo apt-get install python3-venv

 

PASO 2: Crear el entorno virtual de python

Despues instalado, es hora de crear el directorio donde se almacenara el entorno virtual

mkdir byte_fate cd byte_fate

Ahora se crea el entorno virtual para en la carpeta del proyecto.

python3 -m venv bytefate_env

Si quieres comprobarlo te mostrar una carpeta nueva con el nombre que le diste al entorno

ls -l
 

PASO 3: Activar el entorno

Es hora de trabajar, para activar el entorno es necesario utilizar el siguiente comando

source bytefate_env/bin/activate

Una vez activado se podra ver el nombre del entorno virtual en la barra antes de la informacion del sistema, algo asi..

(bytefate_env) user@host:~/byte_fate#
 

PASO 4: Instalar paquetes

Ya tienes un entorno en limpio para jugar con diferentes versiones, sin ningun inconveniente al momento de agregar un nuevo paquete. Prueba instalando este paquete.

pip install requests
 

Paso 5: Cerrar el entorno Virtual

Para cerrarlo es muy sencillo, es ubicar la terminal que esta ejecutando el entorno virtual y ejecutar el siguiente comando
deactivate
 
 

Ahora que ya estas listo para crear, sus propios entornos con paquetes independientes.