martes, 18 de diciembre de 2018

¿LFI en sesiones? Vamos a elevar privilegios

El otro día en el trabajo me pidieron que comprobara si era seguro añadir el directorio /var/lib/php5/sessions a la directiva open_basedir y como me pareció algo interesante pensé en escribir un poquito sobre esto.

Para saber si esto es seguro o no primero tenemos que tener claro que son estas dos cosas.

- El directorio /var/lib/php5/sessions es el directorio donde se guardan las sesiones de PHP.

- La directiva open_basedir indica en que directorios se podrán abrir ficheros con las funciones fopen(), include(), etc...

Normalmente esta directiva se usa para evitar ataques de tipo LFI, por lo que vamos a empezar a mirar por ahí a ver como podemos hackear.

Preparación del entorno

Vamos a empezar a preparar nuestro entorno, para ver que se podría hacer. Lo primero que vamos a necesitar es un panel de login sencillito 'login.php' (que nos permita crear sesiones).

  1. <?php
  2.         $user = $_POST['user'];
  3.         $password= $_POST['password'];
  4.         if($user == "usuario" && $password == "usuario"){
  5.                 session_start();
  6.                 $_SESSION["usuario"]=$user;
  7.                 $_SESSION["password"]=$password;
  8.                 $_SESSION["admin"]=0;
  9.                 header('Location: index.php');
  10.         }
  11. ?>
  12. <html>
  13. <head>
  14. <title>Login</title>
  15. </head>
  16. <body>
  17. <form action="login.php" method="POST">
  18. <p>Usuario:</p><input name="user">
  19. <p>Password:</p><input name="password">
  20. <button type="submit">Submit</button>
  21. </form>
  22. </body>
  23. </html>

Por otra parte tendremos la página vulnerable 'index.php', la cual tendrá dos vulnerabilidades diferentes, la primera nos permitirá leer ficheros y la segunda nos permitirá escribir en ficheros, además de esto tiene una parte de código que nos ayudará a identificar si somos administradores o no.

  1. <html>
  2. <head>
  3. <title>Inicio</title>
  4. </head>
  5. <body>
  6. <form action="index.php" method="GET">
  7. <p>URL: </p><input name="url">
  8. <p>Escribir[w]  leer[r]</p><input name="accion"></br>
  9. <textarea name="content" rows="4" cols="50">Introducir texto</textarea>
  10. <button type="submit">SUBMIT</button>
  11. </form>
  12. <?php
  13.         session_start();
  14.         if($_SESSION["admin"] == 1){
  15.                 echo '<h1>ADMINISTRADOR</h1>';
  16.         }
  17.         $accion = $_GET["accion"];
  18.         $pagina = $_GET["url"];
  19.         $content = $_GET["content"];
  20.         if ($accion == "r"){
  21.                 $file = fopen($pagina, "r");
  22.                 $content = fread($file, filesize($pagina));
  23.                 echo $content;
  24.                 fclose($file);
  25.         }else if($accion == "w"){
  26.                 $blacklist = array(".php", ".phtml", ".php3", ".php4" , ".html", "htaccess", "js");
  27.                 foreach ($blacklist as $item) {
  28.                         if(preg_match("/$item\$/i", $pagina)) {
  29.                                 echo '</h1>Extension de fichero no permitida</h1>';
  30.                                 exit;
  31.                         }
  32.                 }
  33.                 $file = fopen($pagina, "w");
  34.                 fwrite($file, $content);
  35.                 fclose($file);
  36.         }
  37. ?>
  38. </body>
  39. </html>

Ya que tenemos nuestro entorno preparado podemos empezar a hackear, así que lo primero que vamos a hacer es dirigirnos a 'login.php' y ahí vamos a introducir usuario y contraseña para que se nos genere un usuario  "usuario - usuario" en este caso.


Una vez que tenemos la sesión creada podemos acceder al sitio vulnerable 'index.php', aquí tenemos dos acciones disponibles, la primera es la de leer ficheros y la segunda es la de escribir ficheros, veamos que se podría hacer en cada uno de los casos.

Lectura de ficheros

En este caso, al contener el servidor de Apache la directiva open_basedir en un principio la explotación de esta vulnerabilidad, aunque sea posible, no es tan peligrosa como en otros casos, vemos que en caso de intentar leer ficheros que no esten dentro de la directiva como '/etc/passwd' no será posible y la página no nos mostrará nada.


Ahora intentemos leer el fichero de alguna sesión, un buen ejemplo sería la nuestra, las sesiones son ficheros con el formato sess_cookie, y están dentro del directorio que habíamos comentado /var/lib/php5/sessions, así que vamos a hacer la prueba con esto.


Aquí podríamos ver toda la información que tiene almacenada el servidor sobre nuestra sesión, en este caso como PoC hemos guardado usuario y contraseña, por lo que podríamos ver esta información sobre cualquier usuario que hubiera iniciado una sesión, si se guardara otra información sobre la sesión también podríamos verla sobre cualquier usuario.

Escritura de ficheros

Por otra parte también podemos escribir ficheros, sin embargo podemos ver que en el código hay una blacklist de extensiones, por lo que no podremos subir una shell (la blacklist de extensiones es muy vaga, seguramente falten extensiones, ya que esto es solo una prueba de concepto).

Además de esto, en la anterior imagen vemos que, en las sesiones guardaba un parámetro llamado "admin", lo que vamos a hacer ahora es modificar este valor de 0 a 1 escribiendo el fichero de nuestra sesión para que el servidor nos reconozca como un administrador y así elevar privilegios, además como las sesiones no tienen extensión esto no será detectado por la blacklist.


Como podemos ver con esto nos habríamos saltado la blacklist elevando privilegios y pudiendo acceder como administradores de la plataforma.

Yo he acabado por hoy, espero que os haya gustado la entrada.

Saluti.

cuidao con el deo poderoso 

No hay comentarios: