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.