Passphrase simil-XKCD allo stdout

5

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.

    
posta BeanBagKing 10.09.2014 - 19:19
fonte

2 risposte

3

Ho fatto questa soluzione usando BASH. È divertente in realtà ... devi avere già un file di output esistente. Dal momento che stai creando script, aggiungere un comando touch output.txt non dovrebbe essere troppo difficile.

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

Quindi quello che fa è

  1. Prendi 5 parole a caso dal file del dizionario Unix
  2. Getta ciò attraverso tr (traduci caratteri) per rimuovere le nuove linee e aggiungi l'output a un file di output. Questo può anche essere il passaggio per inserire caratteri di separazione .
  3. Usa sed per aggiungere un newline alla fine del file

Script questo in un ciclo e avrai un file di permutazioni di 5 parole concatenate insieme. Può essere modificato se vuoi davvero che tutto venga stampato su stdout.

Utilizzo di JtR per un singolo tentativo di password:

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

SHUF (man shuf)

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

Generates random permutations of input lines to standard output.

Traduci personaggi (man tr)

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

Translate, squeeze, and/or delete characters from standard input, writing to standard output.

Usiamo questo per eliminare i caratteri di nuova riga prodotti da SHUF e concateniamo il risultato in un file di output.

    
risposta data 10.09.2014 - 20:48
fonte
1

C'è solo un suggerimento a questa risposta che esistono strumenti. Le tue osservazioni:
"ma diventa davvero brutto se devi fare più di 2 frasi di parole [....]" e
"Di nuovo, diventa davvero brutto se il tuo dizionario ha una lunghezza significativa"
mi chiedo se hai valutato il tempo di decifrare se lo strumento esistesse e anche se avrebbe funzionato ad un ritmo paragonabile al cracking delle password sulle GPU.

(Seguito tratto dallo strumento di analisi della passphrase). Supponiamo che la passphrase sia:
wadi attack overt wire
e supponendo un dizionario simile a Diceware di media lunghezza con 7776 parole:

  • Se utilizzato come chiave WiFi, la passphrase potrebbe essere ripristinata offline 1,2 secoli in media.
    Hardware di ripristino presunto ecc .: WiFi, 8 GPU, WPA / WPA2
  • Quando si annota come password NTLM su una rete Windows, la frase può essere recuperata in media in 4 ore.
    Hardware di ripristino presunto ecc .: hash veloce / Prof Hw, 25 GPU
  • Se utilizzato come chiave WiFi, le agenzie che impiegano un array GPU con 128 GPU potrebbero recuperare in: 7,5 anni in media
    Hardware presunto: 128 array GPU, "stima dell'estrapolazione da 8 a 128".

Quando si esegue il ripristino su una CPU al posto di una GPU (s), ci vuole forse un fattore 50 * (numero di GPU) più lungo. Mi sembra che un approccio alla CPU non sia fattibile.

    
risposta data 10.09.2014 - 22:43
fonte

Leggi altre domande sui tag