Brute force in PHP

Attenzione: lo scopo di questo articolo è solamente didattico e l’autore non si assume nessuna responsabilità di ogni suo uso illecito.

Il brute force è una tecnica per trovare una password tentando tutte le combinazioni possibili di certi caratteri.

Ne avevo già parlato di come scriverne uno ma non era fatto molto bene.

Questo qui invece è completamente personalizzabile, ma vi lascio il codice che parla da sé:

<?php
/**
 * Questa funzione è eseguita quando hai una password completa.
 * Ovvero è un collback di esempio, nonché quello di default.
 *
 * @param string $stringa: La password
 * @return boolean: La password va bene?
 **/
function callback($stringa) {
}

/**
 * Questa funzione serve per annidare dei cicli for che provano le
 * varie possibilità di caratteri.
 *
 * @param string $stringa: La stringa di partenza
 * @param array $chars: I caratteri da provare
 * @param integer $lunghezza: Lunghezza a cui si vuole arrivare
 * @param mixed $callback: Il callback per verificare la password
 * @return string: La password, altrimenti se fallisce il booleano false
 */
function for_annidato($stringa, $chars, $lunghezza=1, $callback='callback') {
	$stringa_originale=$stringa;
	$found=false;

	for($i=0; $i<count($chars); $i++) {
		$stringa=$stringa_originale.$chars[$i];

		if(strlen($stringa)==$lunghezza) {
			$found=call_user_func($callback, $stringa) ? $stringa : false;
		} else {
			$found=for_annidato($stringa, $chars, $lunghezza, $callback);
		}

		if($found!==false) {
			break;
		}

	}

	return $found===false ? false : $found;

}

Plugin Anti Brute Force (v1.0) [Flatpress]

Ho scritto un plugin per flatpress per bloccare gli attacchi di brute force.

Viene automaticamente chiamato alla pagina di login, ma sappiate che è utile anche per il mio plugin di backup, basta che nel vostro file di autenticazione richiamate la classe antibruteforce_plugin ma potete vedere nel codice, altrimenti se siete interessati potete chiedere spiegazioni e le metto qui.

Per default blocca il login dopo 5 tentativi per 1 ora (3600 secondi).

Potete impostarlo modificando le due costanti in cima al file.

ATTENZIONE: non garantisco niente per la sicurezza del vostro blog, perciò vi consiglio di fare altri test.

Se dovesse succedere che non riuscite più a fare il login, eliminate i cookie dal vostro sito (o andate in modalità anonima del browser) e eliminate il file fp-content/%%anti_bruteforce.txt con l’accesso FTP. Poi andate nel pannello di amministrazione e disabilitate il plugin. Quindi venite qui e lasciatemi un commento.

Licenza: GNU GPL v2.0

Download: antibruteforce_v1.0.tar.gz

Creare tutte le possibili combinazioni di un array di caratteri

Non so se avete letto il mio post di prima…

Comunque lo sfizio di creare un generatore di dizionario per brute-force me lo volevo togliere…

Ed eccolo qua:

<?php
$z=explode(' ',microtime());
$z=$z[0]+$z[1];
$l=8;
$a=array('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',0,1,2,3,4,5,6,7,8,9);
$b=count($a);
$u=fopen("dizionario.txt", "w+");
for($c=0; $c<$b; $c++) {  ## 1
	$m=$a[$c];
	for($d=0; $d<$b; $d++) { ## 2
		$n=$a[$d];
		for($e=0; $e<$b; $e++) { ## 3
			$o=$a[$e];
			for($f=0; $f<$b; $f++) { ## 4
				$p=$a[$f];
				for($g=0; $g<$b; $g++) { ## 5
					$q=$a[$g];
					for($h=0; $h<$b; $h++) { ## 6
						$r=$a[$h];
						for($i=0; $i<$b; $i++) { ## 7
							$s=$a[$i];
							for($j=0; $j<$b; $j++) { ## 8
								$w=$m.$n.$o.$p.$q.$r.$s.$a[$j];
								fwrite($u, $w."n");
							}
						}
					}
				}
			}
		}
	}
}
$x="#";
$y=explode(' ',microtime());
$y=$y[0]+$y[1];
$v=$y-$z;
fwrite($u, "$x Generated in $v");
fclose($u);

Se non siete pazzi come me non fatelo girare, a meno che non abbiate 23,092060626TiB di spazio libero e tanto tempo da sprecare…

Infatti, questo script crea un documento di testo con tutte le combinazioni alfanumeriche (caratteri latini minuscoli solo, per fortuna) di 8 caratteri…

Ma facciamo un po’ di calcoli alla mano…

Numero di combinazioni: 368=2821109907456
Vale a dire 22568879259648 caratteri senza gli a capo
Quindi 25389989167104 byte il file con gli a capo
Ovvero 24794911296 KiB
Perciò 24213780,5625 MiB
Che equivale a 23646,270080566GiB
Come dire 23,092060626TiB

In pratica, è impossibile farlo…

Se prima finiva la memoria, adesso uno dei due processori è sempre al 100%…

Io dopo un bel po’ di minuti di elaborazione sono arrivato a aacou58n e a 1,2GiB.

Più precisamente a 1308793590byte…

Vedete un po’ voi…

Creando un dizionario per un attacco di forza bruta

Volevo creare un dizionario con tutte le possibili combinazioni alfanumeriche di 8 caratteri in PHP perché era il modo più veloce che avevo…

Il codice che ho scritto è un po’ una cosa buttata lì… Se siete esperti mi direte che è una pazzia… Eccolo qui:

<?php
function potenzaFor($s, $n) {
	$m=count($n);
	$o=count($s);
	for($j=0; $j<$m; $j++) {
		for($k=0; $k<$o; $k++) {
			$n[]=$n[$j].$s[$k];
		}
	}
	return $n;
}
$t=explode(' ',microtime());
$t=$t[0]+$t[1];
$g=8;
#$a=array('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',0,1,2,3,4,5,6,7,8,9);
$a=array(0,1,2,3,4,5,6,7,8,9);
$l=count($a);
$f=fopen("dizionario.txt", "w+");
$p=$a;
for($i=0; $i<$g; $i++) {
	$p=potenzaFor($a, $p);
}
if(count($p)) {
	foreach($p as $e) {
		fwrite($f, $e."n");
	}
}
$c="#";
$u=explode(' ',microtime());
$u=$u[0]+$u[1];
$v=$u-$t;
fwrite($f, "$c Generated in $v");
fclose($f);

NON eseguitelo…

Io l’ho fatto su una macchina con 2GiB di ram + 1 GiB di swap e ecco cosa è successo al monitor di sistema:

Prima.png
Quando ho cominciato… Dovevo farla prima la foto, così avreste visto meglio… ero a circa il 10% della ram in realtà…

Killed.png
Ad un certo punto… Notare la scritta killed

Come ho scritto sopra, notare la scritta killed…

Ho finito tutta la Ram e tutto lo swap 😊

Mi sa che devo alleggerire il codice…

P. S.: Se sapete uno sputo di PHP mi direte che ho fatto la descrizione sbagliata… Era solo per vedere se cambiava qualcosa…