Algoritmo di scrambling delle password dispari

8

Sto facendo ricerche su un'applicazione che ha un algoritmo di scrambling delle password che non ho mai visto prima. Ho generato alcune password (la lunghezza massima consentita è di 8 caratteri) e ho ottenuto i seguenti risultati:

password:     0  0  0  0  0  0  0  3
scrambled:    W1 U6 W1 U6 W1 U6 W1 X2

password:     0  0  0  0  0  0  0  2
scrambled:    W1 U6 W1 U6 W1 U6 W1 M7

password:     0  0  0  0  0  0  0  1
scrambled:    W1 U6 W1 U6 W1 U6 W1 F2

password:     0  0  0  0  0  0  0  0
scrambled:    W1 U6 W1 U6 W1 U6 W1 U6

password:     1  2  3  4  5  6  7  8
scrambled:    H9 G6 B5 G3 F8 Q7 X8 O9

Lo scrambling è chiaramente reversibile. Sto pensando che il peggio peggiora, potrei generare una mappatura del dizionario, ma penso che ci sarebbe un modo più intelligente per farlo.

Qualcuno ha mai incontrato qualcosa del genere?

Aggiorna

Altri valori e annotati:

  • 0 si comporta in modo molto diverso dagli altri caratteri
  • @ è anche degno di nota (costante in ogni posizione)
  • L'algoritmo
  • non può o non elaborerà le password di meno di 3 caratteri
4  4  4  4  4  4  4  4
A2 S5 K9 G3 Y6 U0 M4 E8

3  3  3  3  3  3  3  3
L4 Z5 B5 R1 R5 F7 H6 X2

2  2  2  2  2  2  2  2
W6 G6 S0 C0 K4 U3 C8 M7

1  1  1  1  1  1  1  1
H9 N6 F6 J8 D3 J0 B0 F2

1  0  0  0  0  0  0  3
H9 U6 W1 U6 W1 U6 W1 X2

a  b  a  b  a  b  a  b
H1 E3 B8 W6 Z4 S0 X1 K4

b  b  b  b  b  b  b  b
S8 E3 O2 W6 G6 S0 C0 K4

a  a  a  a  a  a  a  a
H1 L3 B8 H5 Z4 D7 X1 Z8

A  B  C
N6 C0 L0

B  B  B  B  B  B  B  B
M7 Y1 I1 Q5 A5 I9 S8 E3

A  B  A  B  A  B  A  B
B0 Y1 V6 Q5 T3 I9 R0 E3

A  A  A  A  A  A  A  A
B0 F2 V6 B4 T3 X5 R0 T7

A  A  A  A  A  A  A
J0 B0 F2 V6 B4 T3 X5

A  A  A  A  A  A
D3 J0 B0 F2 V6 B4

A  A  A  A  A
J8 D3 J0 B0 F2

A  A  A  A
F6 J8 D3 J0

A  A  A
N6 F6 J8

@  @  @  @
M2 M2 M2 M2

#  #  #  #
P2 B9 F3 T4

*  *  *  *
A9 A1 U7 Q9

!  !  !  !
Z4 D7 X1 Z8

Regola generale per un approccio forza bruta per scomporre queste password:

In una stringa di lunghezza L, un dato char in posizione N avrà sempre lo stesso valore.

IE: con password lunghe 8 caratteri, se il primo carattere è A, sarà sempre codificato allo stesso modo.

NB: Ho scoperto il modo "brute-force" per decodificare questi elementi, ma mi piacerebbe conoscere l'algoritmo usato per rimescolare le password. Se qualcuno ha esperienza su come invertire questo tipo di cose mi piacerebbe qualche consiglio su come procedere da qui.

    
posta Juicy 21.06.2015 - 13:53
fonte

2 risposte

3

Molti dei suggerimenti che sto per suggerire richiedono un uso eccessivo dello scrambler. Non sono attacchi di dizionario, ma includono un sacco di rimescolanza di password allo scopo di raccogliere dati. Se il tuo obiettivo è quello di farlo senza troppi sonde di test contro la funzione, o non sei in grado di farlo, in realtà non ho molti suggerimenti.

Interi

I numeri interi sono facili da usare, e chiunque implementa una scomposizione di loro probabilmente opererebbe su interi, non su stringhe. Trovare una corrispondenza tra i due token simbolo ( J8 , D9 , ecc.) E interi potrebbe essere cruciale. Poiché tutti i numeri e le lettere sono rappresentati ci sono 26*20=260 diversi token con cui lavorare. 260 è comodamente vicino a 256 , il che potrebbe suggerire che i token sono solo una codifica per byte.

L'approccio intuitivo è interpretare Xn come 10*X+n , dove X è l'indice della lettera X e n un numero intero compreso tra 0 e 9. Questo è escluso dal token Z8 che corrisponderebbe al numero intero 258 , che è troppo grande per un byte. Analogamente, è possibile escludere diverse altre codifiche, almeno queste semplici combinazioni lineari:

b = 10*X + n
b = 10*(26-X) + n
b = (26-X) + 26*n
b = 10*(26-X) + (9-n)
b = (26-X) + 26*(9-n)

Per escludere le supposizioni per la codifica che facciamo, sapere quali sono i token visualizzati nelle scramble è molto utile. Se i token sono una codifica per byte, allora dovrebbero esserci% token di 260-256=4 che non appaiono mai. Trovare questi token potrebbe dare preziosi suggerimenti. Se tutti i token si verificano a un certo punto, sarebbe anche un suggerimento prezioso.

Scatole

Le scramble per le password ('AAA', 'AAAA', 'AAAAA' ...) ci danno informazioni utili. Possiamo osservare deducendo che la funzione di scrambling per un singolo simbolo è una funzione f(symbol, integer) -> token in cui il numero intero i è la somma della lunghezza della password e dell'indice del simbolo. Per esempio. %codice%. In generale f(A, 4+1) = f(A, 3+2) = J8 è costante per tutte le lunghezze e gli indici.

A  A  A  A
F6 J8 D3 J0

A  A  A
N6 F6 J8

Poiché la password è limitata a 8 simboli, abbiamo f(symbol, length + index) diverse funzioni di scrambling 8+8 = 16 da trovare. Se queste funzioni dipendono dall'intero 'n' (cioè g_n(symbol) -> token ) è difficile stabilire dai dati disponibili. Le funzioni length + index potrebbero essere implementate come tabelle di ricerca e non seguire alcun modello.

@

Il carattere g_n mi ha bloccato, ma forse è per riconoscere gli indirizzi e-mail criptati. Gli indirizzi email sono più lunghi di 8 simboli e potrebbero implicare che lo scrambling funzioni anche con input più lunghi, il che a sua volta suggerirebbe che le funzioni @ siano dipendenti da g_n (teorema della pigrizia, nessuno fa più di 16 tabelle di ricerca casuali)

Creazione delle tabelle di ricerca

Questo può essere fatto semplicemente rimescolando tutte le password n , aa...a ... bb...b e usando la relazione di lunghezza e posizione per decidere a quale funzione ^^...^ appartiene il risultato codificato. Questi dati aiuteranno anche a scoprire cosa e come i token codificano i dati.

Guardando le tabelle

Se abbiamo creato tabelle per tutte le password alfabetiche ripetute di lunghezza 8, vale a dire. g_n , aaaaaaaa , ecc. potremmo visualizzare i risultati codificati come un'immagine 8x26. Gli esseri umani sono bravi a guardare le immagini così le cose più semplici (come la linearità) sono facilmente visibili dall'immagine. La ricerca di artefatti orizzontali, verticali, quadrati o diagonali in un'immagine può dire molto sull'algoritmo utilizzato per codificare le password. Questo approccio è molto organico e richiede alcune abilità di scripting / programmazione.

Il mio approccio alla visualizzazione sarebbe il seguente:

  • genera scramble per tutte le password di 8 caratteri ASCII ripetuti (o byte, se possibile)
  • converte i token in byte usando uno schema semplice (ad esempio una combinazione lineare)
  • salva i byte come file binario bbbbbbb
  • usa la ImageMagick bytes.gray utility: convert
  • guarda l'immagine e prova a trovare i pattern
risposta data 22.06.2015 - 18:40
fonte
6

Questa sequenza:

a  b  a  b  a  b  a  b
H1 E3 B8 W6 Z4 S0 X1 K4

b  b  b  b  b  b  b  b
S8 E3 O2 W6 G6 S0 C0 K4

a  a  a  a  a  a  a  a
H1 L3 B8 H5 Z4 D7 X1 Z8

indica che c'è una chiave usata per codificare la password di input, in modo simile a XOR, tranne che la maggior parte degli usi di XOR verrebbe emessa in esadecimale mentre questa uscita è base36?

Questa sequenza

A  B  A  B  A  B  A  B
B0 Y1 V6 Q5 T3 I9 R0 E3

A  A  A  A  A  A  A  A
B0 F2 V6 B4 T3 X5 R0 T7

A  A  A  A  A  A  A
J0 B0 F2 V6 B4 T3 X5

A  A  A  A  A  A
D3 J0 B0 F2 V6 B4

mi fa pensare che ci siano chiavi diverse per stringhe di lunghezze diverse.

Quindi, suppongo che l'algoritmo prenda il testo in chiaro 'a', prenda il valore ascii di 'a' (97) lo converta in base36 (2P), lo XORs con il rispettivo valore nella chiave e fornisca la base36 valore di H1.

EDIT: non sembra essere base36. Qualunque sia lo schema di codifica in uso, sto ancora supponendo che usi XOR. Sarebbe utile spiegare il comportamento di zero poiché zero XORed con X è sempre X.

Se ciò è vero, il processo è reversibile e le chiavi possono essere trovate, eliminando la necessità di forzare la forza o creare tabelle di ricerca.

    
risposta data 22.06.2015 - 19:20
fonte

Leggi altre domande sui tag