Recuperar clave en autenticación de mensajes HMAC-SHA256 [cerrado]

0

Estoy trabajando en una demostración de seguridad de cookies, donde se pasan algunos datos importantes al cliente junto con un resumen HMAC-SHA256 para evitar la modificación de los datos. Me gustaría poder mostrar que usar una tecla débil hace que esto sea fácil de descifrar.

Para generar el hash y los datos, aquí hay un simple script de python:

import hmac
from hashlib import sha256

message = "This is a long message that might be a little too long"
mkey = "password"
digest = hmac.new(mkey, message, sha256)
print(digest.hexdigest())
print(message.encode('hex'))

Produce estos datos:

e3762ae7f3bc6c9f8906e5f1f2cd19e80d3ebd281bdd31119a66adaef33d3b3c
546869732069732061206c6f6e67206d6573736167652074686174206d696768742062652061206c6974746c6520746f6f206c6f6e67

¿Hay alguna herramienta que pueda ayudarme a descifrar la clave de manera eficiente? No pude encontrar una manera de hacerlo en hashcat.

Podría lanzar mi propio ataque de diccionario, pero preferiría usar algo de la plataforma si existe.

    
pregunta Sid 04.02.2017 - 17:26
fuente

2 respuestas

1

Resulta que John the Ripper puede romper el compendio de HMAC (cuando se construye con una rama sangrante al menos), lo cual es genial. Simplemente no había mirado lo suficiente.

    
respondido por el Sid 05.02.2017 - 23:54
fuente
1

Si desea proteger el mensaje, tiene un problema grave, ya que puede decodificarse fácilmente con:

crypto = "546869732069732061206c6f6e67206d6573736167652074686174206d696768742062652061206c6974746c6520746f6f206c6f6e67"
print crypto
print crypto.decode('hex')

Pero como ha pedido recuperar la contraseña a través del ataque de diccionario, hice un script que decodifica el texto hexadecimal a simple que luego se usa como sal en HMAC junto con las contraseñas en el diccionario y SHA256 para producir hashes (imitando al original Función HMAC) que luego se comparan con la cadena de hash objetivo:

import hmac
from hashlib import sha256

hashd = 'e3762ae7f3bc6c9f8906e5f1f2cd19e80d3ebd281bdd31119a66adaef33d3b3c'
crypto = '546869732069732061206c6f6e67206d6573736167652074686174206d696768742062652061206c6974746c6520746f6f206c6f6e67'
decrypto = crypto.decode('hex')
keys = open('dictionary.txt').read().split() # Specifiy the path to the dictionary file

def mykey():
   for i in keys:
     digest=hmac.new(i, decrypto, sha256)
     digest.hexdigest()

     if digest.hexdigest()==hashd:
        print 'password:', i
        break

if mykey():
   print mykey()

Entonces, si la contraseña está en el diccionario, se imprimirá. Probado en python 2.7. También tenga en cuenta que las palabras deben ser una por línea en el diccionario para que esto funcione correctamente.

EDITAR: Aquí hay una versión más llamativa, en caso de que la necesites para la presentación:

import hmac
from hashlib import sha256
from datetime import datetime
startTime = datetime.now()

hashd = raw_input('SHA256: ')
crypto = raw_input('HEX: ')
decrypto = crypto.decode('hex')
keys = open('dictionary').read().split() # Specifiy the path to the dictionary file

def mykey():
   for i in keys:
      digest=hmac.new(i, decrypto, sha256)
      print digest.hexdigest(), '-', i

      if digest.hexdigest()==hashd:
         print 'Password found:', i
         break
   else:
      print 'Password not in the dictionary.'

if mykey():
   print mykey()

print 'Time Elapsed:', datetime.now() - startTime
    
respondido por el user633551 05.02.2017 - 01:01
fuente

Lea otras preguntas en las etiquetas