Frases de contraseña similares a XKCD a la salida estándar

5

Estoy tratando de encontrar una manera de descifrar frases de contraseña similares a XKCD (correcthorsebatterystaple) de los diccionarios de palabras. Básicamente, concatene el número X de palabras de un archivo de diccionario. En este momento, honestamente, no parece que haya una manera fácil.

Después del cómic XKCD, se hicieron muchas herramientas como esta, y siempre podría crear mi propio archivo y crear un archivo de diccionario, pero creo que debería haber una mejor manera. Mi uso específico es John the Ripper en hashs MD5.

No parece que haya una manera de concatenar palabras completas en JtR, solo modificar las existentes. Consulte AQUÍ en la parte inferior

  

Un modo de craqueo de "frase de contraseña" de varias palabras, o una mejora de la   El modo de lista de palabras puede agregarse en una versión futura de JtR.

Esto fue en 2008, pero todavía no veo una referencia a algo como este cambio. Podría usar la técnica descrita en ese documento, pero se pone muy fea si necesita hacer más de dos frases de palabras o si su diccionario tiene una longitud significativa.

Mi segunda idea fue usar Crunch para canalizar las palabras, por ejemplo ... crunch 0 0 -p word1 word2 | john --pipe mypasswd* Podría modificar eso un poco y usar -q wordlist.txt y crunch usaría las palabras de ese archivo de texto. El problema aquí es que no hay manera (que he encontrado) de limitar el número de palabras utilizadas para una frase de contraseña. Por ejemplo, si su diccionario contenía 1,000 palabras, cada frase de contraseña sería una concatenación de las 1,000 palabras. Nuevamente, se pone muy feo si tu diccionario tiene una longitud significativa.

Editar: tenga en cuenta aquí para las personas que sugieren cambiar el comando de contracción anterior para especificar la longitud mínima y la longitud máxima. Esto no funciona con la opción -p o -q, sin embargo, los números aún deben especificarse (por lo tanto, los 0 marcadores de posición). referencia bajo el indicador -p

  

e ignora la longitud mínima y máxima, sin embargo, aún debe especificar dos números.

Eso deja mis requisitos en algo que se escribe en stdout, no un archivo debido al tamaño que tendría ese archivo, y le permite especificar el número de palabras a unir (frases de 2 palabras, 3 palabras, etc.). Preferiblemente, una herramienta de este tipo también le permitiría especificar caracteres de separación (correct.horse.battery.staple correct | horse | battery | staple) en caso de que se permitan otros caracteres o incluso espacios.

Espero que este sea el intercambio de pila correcto, alguien me avise si hay otro que debería probar.

Editar

Para cualquier otra persona que esté buscando este mismo tipo de cosas, aquí hay un fragmento de código de python que hace más o menos lo que quiero.

# iterable=['test','correct','horse','battery','staple']
## Change the file specified here to your dictionary file
iterable = [i.strip().split() for i in open("wordList.txt").readlines()]

def permutations(iterable, r=None, s=''):
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        #return
        r = n # Lets assume users want all permutations
    indices = range(n)
    cycles = range(n, n-r, -1)
    temp = tuple(pool[i] for i in indices[:r])
    for item in temp: # iterate through the current tuple and turn it into a string, to get rid of brackets and such
        print s.join([str(i[0]) for i in temp])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                temp = tuple(pool[i] for i in indices[:r])
                for item in temp:
                    print s.join([str(i[0]) for i in temp])
                break
        else:
            return

# The first value relates to our variable (dictionary file) at the top
# The second value is the number of words we want to combine, a 2 would indicate 2 
## word combinations, such as correct.horse, 3 would be correct.horse.staple
# The third value is the seperater, such as . in the example above, to create words
## that run together enter nothing, or ''
permutations(iterable, 2, '.')

Para usar esto con JtR, usarías python xkcd.py | john --pipe mypasswd*

El código se tomó de itertools de python por lo que debería devolver ...

  

tuplas de longitud r, todos los ordenamientos posibles, sin elementos repetidos

Quería todo esto, además de que no almacena la matriz en la memoria (se agotaría rápidamente con una larga lista) y no escribe en el disco (aunque puede redirigir la salida si lo desea).

Ahora, me he encontrado con errores (IOError: [Errno 32] Canalización rota) con tramos largos y JtR. El código es descuidado, etc. Entonces, no, esta no es una solución perfecta para el mundo real. Sin embargo, como se ha señalado, esto puede no ser práctico en el mundo real, incluso sin errores, debido al número de posibilidades. ¡A veces solo quiero saber si algo es posible!

Si alguien que está viendo esto sabe C y quiere agregar algo como esto directamente a JtR o Crunch que sería increíble, tengo la sensación de que aceleraría las cosas y haría esto mucho más confiable si se escribiera en un programa. diseñado para este tipo de tarea.

    
pregunta BeanBagKing 10.09.2014 - 19:19
fuente

2 respuestas

3

Hice esta solución usando BASH. En realidad, es algo divertido ... tienes que tener un archivo de salida ya existente. Ya que estás creando un script, agregar un comando touch output.txt no debería ser demasiado difícil.

shuf -n5 /usr/share/dict/words | tr -d '\n' >> output.txt; sed -i -e '$a\' output.txt

Entonces, lo que hace es

  1. Toma 5 palabras al azar del archivo de diccionario de Unix
  2. Tira eso a través de tr (traducir caracteres) para eliminar las nuevas líneas, y agrega la salida a un archivo de salida. Este también puede ser el paso para insertar caracteres de separación .
  3. Use sed para agregar un nueva línea al final del archivo

Script que en un bucle y tendrá un archivo de permutaciones de 5 palabras concatenadas juntas. Se puede modificar si realmente quieres que todo salga a la salida estándar.

Utilizando JtR para un intento de contraseña única:

shuf -n5 /usr/share/dict/words | tr -d '\n' | john --pipe mypasswd*

SHUF (hombre shuf)

shuf -n5 /usr/share/dict/words;

  

Genera permutaciones aleatorias de las líneas de entrada a la salida estándar.

Traducir caracteres (man tr)

tr -d '\n' >> output.txt

  

Traducir, comprimir y / o eliminar caracteres de la entrada estándar,   escribiendo en la salida estándar.

Usamos esto para eliminar los caracteres de nueva línea producidos por SHUF y concatenar el resultado en un archivo de salida.

    
respondido por el RoraΖ 10.09.2014 - 20:48
fuente
1

Solo hay una pista en esta respuesta de que existen herramientas. Sus observaciones:
"pero se pone muy feo si necesitas hacer frases de más de 2 palabras [....]" y
"De nuevo, se pone muy feo si tu diccionario tiene una longitud significativa"
me pregunto si estimó el tiempo para descifrar si la herramienta existiría e incluso si funcionaría a una tasa comparable a la descifrado de contraseñas en las GPU.

(Siguiendo tomado de mi herramienta de análisis de frase de contraseña). Supongamos que la frase de paso es:
wadi attack overt wire
y suponiendo un diccionario tipo Diceware de longitud moderada con 7776 palabras:

  • Cuando se usa como clave WiFi, la frase de contraseña podría recuperarse fuera de línea 1,2 siglos en promedio.
    Hardware de recuperación asumido, etc .: WiFi, 8 GPU, WPA / WPA2
  • Cuando se detecta como una contraseña NTLM en una red de Windows, la frase se puede recuperar en un promedio de 4.0 horas.
    Hardware de recuperación asumido, etc.: hash rápido / Prof Hw, 25 GPU
  • Cuando se usa como clave WiFi, las agencias que emplean una matriz de GPU con 128 GPU podrían recuperarse en: 7.5 años en promedio
    Hardware asumido: matriz de 128 GPU, 'estimación de extrapolación de 8 a 128'.

Cuando se realiza la recuperación en una CPU en lugar de una (s) GPU (s), tal vez tome un factor 50 * (número de GPU) más. Me parece que un enfoque de CPU no es factible.

    
respondido por el Dick99999 10.09.2014 - 22:43
fuente

Lea otras preguntas en las etiquetas