Generazione lista password

7

Durante i recenti pen-test ho scoperto che le aziende useranno password come

c0mp4ny@b(

per un'azienda chiamata "company abc"

C'è un modo semplice e veloce per generare un elenco di password basate su quante più lettere possibili di "leet speak"?

Quindi l'input sarebbe

company abc

e l'uscita sarebbe

c0mpanyabc

c0mpany4bc

C0mpany4bc1

etc....

Dove vengono generati permutazioni di maiuscole, trattini bassi, numeri addizionali / caratteri speciali alla fine ecc?

    
posta NULLZ 09.05.2013 - 05:46
fonte

3 risposte

2

Il primo strumento nella mia casella degli strumenti per generare elenchi di parole permutati è RSMangler . Finora, non ero in grado di trovare uno strumento migliore.

È scritto in Ruby, è open source, super facile da modificare ed estendere, ha un sacco di opzioni ed è sotto licenza CC BY-SA UK .

Potresti estendere facilmente l'array leet_swap . Ad esempio

leet_swap = {
  'a' => '@',
  'C' => '(',
}

Aggiunge automaticamente i numeri prima e dopo ogni stringa, dà persino la possibilità di aggiungere alcune parole comuni alla tua lista di parole nell'array common_words .

Tutte le opzioni sono abilitate per impostazione predefinita, quindi quando imposti l'opzione --common sei disabilitando la funzione di parole comuni. Lo stesso vale per le altre opzioni.

Consiglio vivamente di disabilitare l'opzione --perms , in quanto crea una lista di permutazioni estremamente esaustiva. Quando dico "estremamente esaustivo" non lo esagero. Il mio vocabolario non mutato è stato esteso a quasi 900 GB .

.

    
risposta data 09.05.2013 - 09:25
fonte
4

Ho creato una risposta usando Javascript, perché è ciò a cui sono abituato e non viene specificata alcuna lingua. Sono fiducioso che tu possa trovare / creare un analogo in qualunque altra lingua tu voglia.

Innanzitutto, ho rubato una funzione da questa risposta per creare un prodotto cartesiano. La spiegazione dei prodotti cartesiani non rientra proprio nello scopo di questa domanda, ma è sufficiente dire che combina array di possibili caratteri in matrici di stringhe possibili (molto semplificate).

OK, quindi la funzione di ckozl è:

function cartProd(paramArray) {

  function addTo(curr, args) {

    var i, copy, 
        rest = args.slice(1),
        last = !rest.length,
        result = [];

    for (i = 0; i < args[0].length; i++) {

      copy = curr.slice();
      copy.push(args[0][i]);

      if (last) {
        result.push(copy);

      } else {
        result = result.concat(addTo(copy, rest));
      }
    }

    return result;
  }


  return addTo([], Array.prototype.slice.call(paramArray));
}

e il mio è:

function findSubs(string) {
        //create a linked list of sub characters
        //expect lower case input
        subs={
                "p":["p","P"],
                "a":["a","A","4","@"],
                "s":["s","S","$","5"]
        }
        //create an (initially empty) array to store possible characters in each position
        result=[]
        for (var i=0;i<string.length;i++) {
                result[i]=subs[string.charAt(i)]; //Would be more robust if you added logic here to handle it not being a key in the subs object. 
        }
        /*
        so result might look like:
        [
                ["p","P"],
                ["a","A","4","@"],
                ["s","S","$","5"],
                ["s","S","$","5"]
        ]
        for an input of "pass"
        */
        return cartProd(result)
}

Onestamente, la funzione di ckzol fa tutto il lavoro pesante qui. Prima di usarlo dovresti inserire l'array subs e questo non gestisce l'aggiunta di caratteri alla fine della stringa (perché sembra un po 'arbitrario).

Nota anche che ho modificato leggermente la funzione cartProd, in modo tale che possiamo distribuirla come array di parametri anziché come array multipli che sovraccaricano gli argomenti.

Modifica: notate anche che il valore restituito è una matrice di matrici, quindi dovreste scorrere iterarlo e per ogni elemento e do e.join("") .

Modifica di nuovo: si noti inoltre che è possibile estenderlo facilmente per applicare altre mutazioni alla password. Ad esempio, se si desidera aggiungere un numero compreso tra 0 e 99 alla fine della stringa, è possibile inserire una matrice aggiuntiva alla fine del risultato, contenente ["0","1","2",...,"99"] . È possibile includere un elemento vuoto ( "" ) in questo array per generare anche possibilità che non includono il suffisso numerico. La stessa logica potrebbe essere utilizzata per aggiungere un prefisso. Essenzialmente stai costruendo una serie di matrici di possibili caratteri nell'array dei risultati, quindi puoi includere qualsiasi mutazione a cui puoi pensare.

    
risposta data 09.05.2013 - 08:10
fonte
0

Ho creato uno strumento chiamato PassGen che farà ciò di cui stai parlando. Puoi dare un'occhiata a questo qui .

L'idea è che puoi passare una parola target e generare un elenco di password usando le sostituzioni comuni. Se hai voglia di diventare un po 'più avanzato, puoi anche utilizzare lo strumento per attivare le richieste HTTP per vedere se funziona una qualsiasi delle password.

Per il tuo esempio inserirai qualcosa del tipo:

python passgen.py -f companyabc

Tieni presente che gli elenchi di password possono diventare grandi rapidamente. L'esempio precedente genera 147456 password.

    
risposta data 03.09.2014 - 05:31
fonte

Leggi altre domande sui tag