
Cryptohack Challenges: Introduction
Cryptohack es un portal dónde se puede aprender criptografía y programación (en Python principalmente). En ese portal hay dos secciones principales, uno de cursos, y otro de retos dónde se pueden poner en práctica lo aprendido en los cursos.
En esta serie de artículos espero poder describir la solución de varios de los ejercicios de ese portal, mientras aprendo sobre criptografía aplicada con Python.
En este artículo se agrupan los tres primeros ejercicios, los dos primeros son anecdóticos, y los siguientes que son de dificultad baja. ¡Allá vamos!
Finding Flags
Raso y al pie: introduce la bandera que aparece en la descripción del ejercicio.
Great Snakes
Tampoco mucho más complicado, descarga el script Python y ejecútalo para obtener la bandera.
Network Attacks
El propósito de este reto es tener lista la librería de pwntools
(la documentación de esta librería la podéis encontrar en el siguiente enlace), asegurarse que tenemos las herramientas listas, y crearnos una plantilla para siguientes ejercicios.
Para preparar el entorno para resolver cualquier reto, crearemos un entorno virtual de Python, y será allí dónde instalaremos las librerías que nos haga falta.
Para eso, primero crearemos el entorno de trabajo en el directorio que veamos más conveniente. Crearemos una carpeta nueva con el nombre del reto:
mkdir great_snakes
Crearemos el entorno virtual y accederemos a él:
python -m venv .venv/
source .venv/bin/activate
Una vez en este entorno, todas las instalaciones de paquetes se realizarán dentro de este pequeño sistema virtual, sin afectar a la instalación de la máquina local.
Ahora toca instalar pwntools
:
pip install pwntools
Y ahora creamos un script sencillo con la recién instalada librería, lo que deberá hacer este script:
- Conectar con un servidor remoto.
- Enviar un json.
- Recoger y mostrar la respuesta del servidor.
una posible solución, que nos guardaremos para siguientes ejercicios:
#!/bin/env python
from pwn import *
import json
# Configura la conexión al servidor
host='socket.cryptohack.org'
port='11112'
# Crea un diccionario con la información a enviar
data={'buy': 'flag'}
# Convierte el diccionario a JSON, y se convierte a bytes
databytes=(json.dumps(data)).encode()
# Crea la conexión remota
conn = remote(host, port)
# Muestra la información que se va a enviar por pantalla, para
# revisión
print(f"\n---\nTrying to send: {databytes}\n---\n")
# Envia la información
conn.sendline(databytes)
# Recibe y decodifica la información del servidor, y se muestra por
# pantalla.
response=conn.recvall()
print(response.decode())
# Cierra la conexión
conn.close()
Una vez ejecutado el script mostrará la bandera para la resolución del reto.
[+] Opening connection to socket.cryptohack.org on port 11112: Done
---
Trying to send: b'{"buy": "flag"}'
---
[+] Receiving all data: Done (136B)
[*] Closed connection to socket.cryptohack.org port 11112
Welcome to netcat's flag shop!
What would you like to buy?
I only speak JSON, I hope that's ok.
{"flag": "crypto{xxxxxxxx_xxx_xxxxx}"}
Para desactivar el entorno virtual, tan sólo ejecutar deactivate
.