February 24, 2018 · Algoritmi Math

Smettila di fare bruteforce a vanvera

Ok sarò schietto tutto è nato da un messaggio su whatsapp nel gruppo dell'uni. Dove c'era un ragazzo che ha postato la seguente immagine:

3896d3ba-d530-42e4-8a2a-005323a6b245
La prima cosa che mi è venuta in mente è stato un semplice... perchè?!?

Non riuscivo a capire del perchè sia stato 19 ore a guardare kali linux che gli macinava i calcoli senza nemmeno farsi due calcoli a mano... cioè seriamente 19 ore?

1x7fn8-1

Ma come si poteva evitare tutto ciò? ora spiego !

Dall'immagine si possono intuire 2 cose:

  1. La password attuale catturata con lo screen
  2. Il numero delle righe

Ci metti subito a fare 2+2 e capire che il numero di righe è il risultato della combinazione delle 26 lettere dell'alfabeto e dei 10 numeri, lo notiamo anche dalla password catturata nello screen che contiene solo lettere minuscole e numeri e che ha lunghezza fissa. Da ciò si deduce che il comando sia stato:

crunch 8 8 0123456789abcdefghijklmnopqrstuvwxyz

dove i due 8 sono la grandezza min/max della password in termini di lunghezza di caratteri.

Dunque ricaviamoci le righe che crunch ha generato. Sommiamo il totale dei caratteri a quello dei numeri dunque:

26 + 10 = 36

Ora gli diamo come esponente la lunghezza massima della password:

36^8 = 2821109907456

Che guardacaso coincide con il numero delle righe in foto. Dunque ora usando crunch cerchiamo di ricavarci la dimensione della wordlist:

wordlist

Come vedete la dimensione delle righe combacia con quella sua in foto dunque la dimensione della wordlist sarà di ben 23TB e già uno qua dovrebbe farsi due domande sul perchè mai continuare... comunque andiamo avanti verso l'infinito e oltre.

Ora sempre basandosi sulla sua immagine riusciamo a sapere quante chiavi al secondo (k/s) riesce ad elaborare nel suo caso sono: 4632.56 k/s

Una volta avuta anche questa variabile possiamo calcolarci il tempo che ci impiegherà il suo computer a creare quella wordlist di 23TB tramite la seguente formula:

maths

Ora ricaviamoci i secondi,minuti,ore,giorni,anni.

tempo

dunque per completare il dizionario il suo computer ci impiegherà circa 20 anni. Questo solo per completarlo, ok mettiamo caso che lui lo stia applicando e lo abbia già completato o magari ereditato, per comodità useremo le stesse variabili di prima. Fatto ciò dopo aver usato un qualunque tool online che calcola una password random con i nostri parametri, il risultato è: 3uxba0l0

Ora la domanda è!, in che posizione sarà questa word nella lista di ben 36^8 righe?
per fare ciò dobbiamo prima numerarci ogni posizione di ogni carattere e mettere tutto in base 36. Gli elementi posizionati sono nel seguente ordine

lista

e ci calcoliamo anche la posizione della lettera negli 8 spazi:

posizine

e ci calcoliamo la posizione tramite il seguente calcolo:

ccc

Il tutto viene: 304708003956

Ovviamente è inferiore a 36^8, ora usando la formula precedente con la stessa k/s possiamo sapere che per bucare questa password ci metteremo:

69846626.60337 Secondi
1164110.44339 Minuti
19401.8407232 Ore
808.410030132 Giorni
2.21482200036 Anni

Una volta fatto ciò, uno trova naturale chiedersi del perchè ha voluto aspettare ben 19:11:14 ore e passa, ma la domanda è! ci avrà rinunciato o lo lascera ancora accesso il pc?.

Forse dovremmo calcolargli anche il consumo elettrico... (to be continued)

Stupido codice che calcola il tempo in base alla password, la password può essere come nel seguente articolo, cioè solo lettere minuscole e numeri.

  • Ex: ./time_psw -k/s -password

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(int argc, char const *argv[]){

	char word[8];

	float ks = atof(argv[1]);

	char list[] = {'0','1','2','3','4','5','6','7','8','9',
		       'a','b','c','d','e','f','g','h','i','j',
			'k','l','m','n','o','p','q','r','s','t',
			'u','v','w','x','y','z'};

	int v[8] = {0};

	strcpy(word, argv[2]); 
	
	for(int cw = 0; cw < 8; cw++){
		for(int cnt = 0; cnt < 36; cnt++){
			if(word[cw] == list[cnt]){
				v[cw] = cnt;
			}
		}
	}

	unsigned long long lenght = 0;

	int cs = 0;
	for(int c = 7; c >= 0; c--){
		lenght += v[cs] * pow(36,c);
		cs++;
	}
	
		
	unsigned long long secondi 	= lenght * (1/ks);
	unsigned long long minuti 	= secondi / 60;
	unsigned long long ore 		=  minuti / 60;
	unsigned long long giorni 	= ore / 24;
	unsigned long long anni 	= giorni / 365;

	puts(" ");

	printf("NUMERO SECONDI\t\t %llu \n", secondi);
	printf("NUMERO MINUTI\t\t %llu \n", minuti);
	printf("NUMERO ORE\t\t %llu \n", ore);
	printf("NUMERO GIORNI\t\t %llu \n", giorni);
	printf("NUMERO ANNI\t\t %llu \n", anni);

return 0;

}


  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket
Comments powered by Disqus