Este reto tiene el título "Hash breaker" y mi valoración sobre su dificultad es: ★★★☆☆.
Su enunciado dice lo siguiente:
You have 3 seconds to break this hash.
Send the answer back using: https://ringzer0team.com/challenges/56/[clear_text]
Solución: ¿Qué tiene de diferente este reto frente al anterior, y cuya solución puse en este mismo blog?. Pues creo que es muy similar, pero en este caso entiendo que hay que dar un paso previo y por eso lo califico como un poco más difícil.
Me explico, en principio, un hash no se puede revertir, es decir, a partir del resumen no puede obtenerse el texto en claro que lo generó, pero existen diferentes servicios on-line que, contando con bases de datos de gran cantidad de estos resúmenes (pares de 'texto en claro' y 'hash'), pueden indicar si el hash introducido, siempre y cuando figure en su base de datos, coincide con algún texto en claro concreto.
Por tanto, el primer paso que dí consistió en utilizar un servicio de esa clase para intentar averiguar qué tipo de hash se emplea en este reto y, además, si existe algún patrón en el texto en claro utilizado.
Pues bien, descubrí que el tipo de hash usado en este reto es 'sha1' y que el texto en claro es siempre un número de 4 dígitos.
Por tanto, es fácil obtener la solución del reto empleando un poco de fuerza bruta, para lo que utilizo el siguiente script de Python.
import requests
import hashlib
import re
s = requests.session()
url = 'https://ringzer0team.com'
payload = {'username': 'tu usuario', 'password': 'tu contraseña'}
s.post(url+'/login',payload)
r2 = s.get(url+'/challenges/56')
#Obtener el hash
hash = re.findall('----- BEGIN HASH -----< br />\r\n\t\t(.*?)< br />\r\n\t\t----- END HASH -----', r2.text, re.DOTALL)
hash = hash[0]
print('Hash = ', hash)
#revertir el hash (el tipo de hash es sha1 y el texto en claro es siempre un numero de 4 digitos. Ataque por fuerza bruta)
i = 1000
while i <= 9999:
hash_i = hashlib.sha1(str.encode(str(i)))
if hash_i.hexdigest() == hash:
hash_decode = i
i = 10000
else:
i= i+1
print ('Hash decode =', hash_decode)
#Obtener la solucion
r3 = s.get(url+'/challenges/56/'+str(hash_decode))
flag = re.findall('< div class="alert alert-info">(.*?)< /div>', r3.text, re.DOTALL)
print(flag)
Ejecuto este script:
Y obtengo la solución: FLAG-G1095M88Tk837G9AC0EA6q3N.
Comentarios
Publicar un comentario