Sto cercando di trovare un modo per decifrare le passphrase di tipo XKCD (correcthorsebatterystaple) dai dizionari di parole. Fondamentalmente concatenare il numero X di parole da un file di dizionario. In questo momento, onestamente, non sembra che ci sia un modo semplice.
Dopo il fumetto XKCD ci sono stati un sacco di strumenti come questo, e ho sempre potuto girare il mio e creare un file dizionario, ma sento che dovrebbe esserci un modo migliore. Il mio uso specifico è John the Ripper sugli hash MD5.
Non sembra che ci sia un modo per concatenare intere parole in JtR, modificare solo quelle esistenti. Riferimento QUI in fondo
A multi-word "passphrase" cracking mode, or an enhancement to the wordlist mode, might be added in a future version of JtR.
Questo era il 2008, ma continuo a non vedere un riferimento a qualcosa di simile a questo cambiamento. Potrei usare la tecnica descritta in quel documento, ma diventa davvero brutto se devi fare più di 2 frasi di parole o se il tuo dizionario ha una lunghezza significativa.
La mia seconda idea era usare Crunch per inserire le parole, ad esempio ... crunch 0 0 -p word1 word2 | john --pipe mypasswd*
Potrei modificarlo un po 'e usare -q wordlist.txt e crunch userebbero le parole da quel file di testo. Il problema qui è che non c'è modo (che ho trovato) di limitare il numero di parole usate per una passphrase. Ad esempio, se il dizionario contiene 1000 parole, ogni passphrase sarebbe una concatenazione di tutte le 1.000 parole. Di nuovo, diventa davvero brutto se il tuo dizionario ha una lunghezza significativa.
Modifica: nota qui per le persone che suggeriscono di modificare il comando crunch sopra per specificare la lunghezza minima e la lunghezza massima. Questo non funziona con l'opzione -p o -q, tuttavia i numeri devono essere ancora specificati (quindi i 0 segnaposto). riferimento sotto -p flag
and it ignores min and max length however you must still specify two numbers.
Questo lascia i miei requisiti a qualcosa che scrive su stdout, non su un file a causa della dimensione di un tale file, e consente di specificare il numero di parole da unire (2 frasi di parole, 3 parole, ecc.). Preferibilmente, un tale strumento consente anche di specificare caratteri di separazione (correct.horse.battery.staple correct | horse | battery | staple) nel caso siano consentiti altri caratteri o spazi pari.
Spero che questo sia lo scambio di stack corretto, qualcuno mi faccia sapere se c'è un altro che dovrei provare.
Modifica
Per chiunque altro sia alla ricerca di questo stesso genere di cose, ecco uno snippit di codice Python che fa più o meno quello che voglio.
# 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, '.')
Per usarlo con JtR devi usare python xkcd.py | john --pipe mypasswd*
Il codice è stato preso da itertools di python quindi dovrebbe tornare ...
r-length tuples, all possible orderings, no repeated elements
Volevo tutto questo, in più non memorizza l'array in memoria (si esaurirebbe rapidamente con una lunga lista) e non scrive sul disco (anche se puoi reindirizzare l'output se lo desideri).
Ora ho incontrato errori (IOError: [Errno 32] Broken pipe) con long run e JtR. Il codice è sciatto, ecc. Quindi no, questa non è una soluzione perfetta per il mondo reale. Tuttavia, come è stato sottolineato, questo potrebbe non essere pratico nel mondo reale anche senza errori, a causa del numero di possibilità. A volte voglio solo sapere se qualcosa è possibile però!
Se qualcuno là fuori a guardare questo sa C e vuole aggiungere qualcosa di simile direttamente a JtR o Crunch sarebbe fantastico, ho la sensazione che accelererebbe le cose e renderebbe questo molto più affidabile se fosse stato scritto in un programma progettato per questo tipo di compito.