SOLUCIONARIO WEB CHALLENGE CTF Juan AndrĂŠs Bedoya Gonzalez @killr00t groupidp@gmail.com intercepteam@gmail.com 2013
Para esta ocasión tenemos un reto web en donde debemos lograr tener acceso a un mensaje oculto en el sistema entre dos personas, para esto trataré de detallar los pasos a continuación siendo lo mas detallado y directo en la solución del ejercicio
Identificación de Objetivo
Tenemos 3 irecciones IP Up una es la nuestra (192.168.1.67) otra de nuestro objetivo (192.168.1.70) y otra que es nuestro Gateway (192.168.1.254). Recolección de información El aplicativo web nos muestra un upload y no mucha información que nos ayude a identificar vulnerabilidades, dentro de la información que nos puede servir es la siguiente • •
drunkadmin@pwnlab.localdomain => correo del admin o webmaster el cual puede ser el mismo http://192.168.1.70:8880/myphp.php?id=102 tenemos en la url una variable id que recibe un numero y muestra una información en este caso nos muestra
โ ข
y al darle click a PHP Credits nos muestra eso Creditos :D , ahora la idea es testear ese parametro ID enviandole numeros al azar o en secuencia o como queramos para ver que otra informaciรณn podemos encontrar http://192.168.1.70:8880/myphp.php?id=100
para automatizar esta tarea desarrolle el siguiente script en perl =======================================COPY HERE=========================================== #!/usr/bin/perl # Este archivo me va a testiar los parametros # de myphp.php?id= use LWP::UserAgent; use HTTP::Request; my $ua = new LWP::UserAgent; $ua->agent(" Mozilla/5.0 (X11; U; Linux i686; es-CL; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3"); $ua->timeout(1) || die "Conecction faield"; my $url = "http://192.168.1.70:8880/"; my $param = "myphp.php?id="; @data; system("clear"); for($i=-2000;$i<=2000;$i++){ $pagina = $url.$param.$i; $busqueda = new HTTP::Request GET => $pagina; $resultado = $ua->request($busqueda); $result = $resultado->content(); $long = length($result); print "Testiando $pagina\n"; if($result!~/harder/g){push @data,$pagina;} } system("clear"); foreach $line(@data){print "[+] $line\n"} =======================================COPY END============================================
según el rango del ciclo el me lo va testiar y al final me mostrara los links que sean diferentes al mensaje “Try harder, you might find something here. Or not? Who knows.” El resultado de la ejecución del script es el siguiente:
revisando la información en cada link podemos obtener configuraciones sobre el servidor y sobre todo sobre el PHP , entre la información mas importante tenemos: • • • • •
drunkadm.localdomain:8880 => ya lo teniamos en el correo encontrado Server Root => /etc/apache2 Directorio Web => /var/www Usuario => www-data Funciones Deshabilitadas en el php system, passthru, popen, proc_open, pcntl_exec, shell_exec, fsockopen, python_eval, perl->system
Esto es importante , las funciones deshabilitadas en el php con esta información sabemos que no podemos utilizar comandos de sistema operativo por medio de dichas funciones, pero tambien podemos saber cuales si , por ejemplo tenemos la funcion exec() y eval() de php las cuales no estan en esa lista asi que debemos trabjar con ellas. Dentro el aplicativo no hay mas información relevante que nos sirva para identificar vulnerabilidades dentro del aplicativo web y solo con el upload creo que lo mas evidente es hacer un bypass al upload y subir una shell para ejecutar comandos de S.O Scanning de puertos
En el scanning solo tenemos dos servicios el 22 que es el SSH y el 8880 que es nuestro aplicativo web otro vector de ataque seria coger el usuario del correo encontrado en el aplicativo web y hacer un bruteforce haber que se encuentra, este vector no lo utilizaré
Análisis de Vulnerabilidades para analizar las vulnerabilidades en este caso para tratar de hacer bypass al upload nos centraremos en la logica de los filtrados que se utilizan para estas funciones de upload y especialmente nos vamos a centrar en una que trataré de explicar y que se entienda xD Uno de los metodos de los desarrolladores o que yo como tal en ese rol he probado es que para poder filtrar por extenciones de archivos y asi evitar que suban cualquier tipo de arvhivo es separar con la funcion explode() de php el archivo que me envian por los puntos ejemplo, tenemos file.php entonces seria de la siguiente forma la logica de algun desarrollador que apenas este aprendiendo o que no tenga buenas practicas en programación =========================================CODE EXAMPLE====================================== $file=”imagen.jpg”; $array = explode(“.”,$file); $nombre = $array[0]; $extencion = $array[1]; if($extencion !='jpg' or $extencion!='png' or $extencion!='bmp'){ echo “Extencion invalida, selecciona un archivo correcto <br>”; echo “Solo se permiten extenciones jpg , png, bmp<br>”; }else{ //Realizo operación de guardado en el servidor } ========================================= FIN EXAMPLE ======================================= el problema de la validación anterior es que si hay mas de 1 punto el array contendra mucha mas información y si el programador no tiene en cuenta esa información dentro de las validaciones se puede bypassear el upload . Ejemplo: tengo un archivo generado maliciosamente con un comando de sistema operativo y para testear la logica de la programación del upload en especial el filtro que acabe de explicar tendriamos el archivo formado asi:
imagen.jgp.php Tenemos en negro la extencion que leer谩 la logica de filtrado y en rojo tenemos otra extensi贸n cualquiera en este caso un php entonces dentro del codigo php quedaria $array[0] => image $array[1]=>jpg $nombre = $array[0]; $extencion = $array[1]; y como el nombre posee 3 puntos en $array[2]=>php si en la logica no se tiene encuenta esa otra informaci贸n lo que se guardaria en el servidor seria una bonita shell xD image.jpg.php Para testiar esto vamos inicialmente a subir una imagen cualquiera para ver como se guarda y ella plicativo funciona imagen => ninja.jpg nos la sube correctamente pero le aplica una funcion de cifrado
tenemos que para ninja.jpg nos genera un hash 1012ca6b363dea182f651321fbd66d45.jpg ahora tenemos que ver si le hace función hash sin nada adicional y si lo realiza al nombre de la imagen o al nombre con la extensión
Hash Generado => 1012ca6b363dea182f651321fbd66d45 md5('ninja') => 3899dcbab79f92af727c2190bbd8abc5 md5('ninja.jpg') => 1012ca6b363dea182f651321fbd66d45 resulta que lo realiza al nombre junto con la extensión y lo mueve dentro de la carpeta images/hash.extensión
Explotación de Vulnerabilidad Antes de crear nuestra prueba debemos recordar que si subimos un archivo php con funciones system() para ejecutar comandos de sistema operativo no nos va a funcionar por lo encontrado con anterioridad entonces para crear la PoC insertaremos una de las dos funciones que no esta deshabilitada en el php.ini, para esto crearemos un archivo con el contenido <?php echo exec('whoami');?> el codigo anterior nos debe mostrar el usuario utilizado por ella plicativo web que como ya lo sabemos es el www-data, la imagen se llamara: z.jpg.php => f5f078e6795238e8bfdc0bad2b413b09 al subirla la encontraremos en images/f5f078e6795238e8bfdc0bad2b413b09.php y al abrirla encontramos:
Como vemos se nos ejecuto el comando, si trataramos de subir un archivo con la funcion system() no ejecutaria nada pues simplemente esa función esta deshabilitada ahora el aplicativo tiene otro filtro y es que al subir la imagen lee el contenido de la misma y busca palabras claves de ejecución de código utilizados para obtener una shell reversa como lo es socket, /bin/bash, perl entre otras y nos mostraria el siguiente mensaje al subir algo con esas caracteristicas
otra caracteristica que posee el objetivo remoto es que tiene ya instalado un netcat entonces podriamos perfectamente tener un reverse shell sin complicaciones, esto si lo quieren comprobar simplemente ejecuten un reverse shell con netcat utilizando exec(). En mi caso y solo para la soluci贸n del ejercicio solo utilizare comandos desde la url <?php echo exec($_REQUEST['c']);?> Este code me permite ejecutar por parametro get comandos de sistema operativo, al ser la funcion exec() quien me ejecuta los comandos, una de las complicaciones es que no muestra toda la informaci贸n que sale del comando esto se puede solucionar con un foreach osea recorriendo la informaci贸n salida por el comando y printearla, yo solo utilizare esa shell minima y redireccionare los comandos a un archivo :D Obteniendo /etc/passwd
ahora tenemos que recordar lo que dec铆a en la pagina de sec-track sobre el reto La informaci贸n precisa a identificar es un mensaje oculto entre dos personas. Precisamente la informaci贸n sobre una cita entre ambas.
La palabra clave dentro de esa frase es Oculto as铆 que realizaremos un ls recursivo sobre el directorio web para ver que hay de oculto
tenemos dos archivos ocultos el .htacces que donde se hacen configuraciones y el .proof que si no se me parece a nada, leamoslo para ver que contiene:
leyendo el archivo .proof dentro del directorio web obtenemos
esto si tiene cara de algo oculto , lo importante de este texto es el secret code que al parecer es base_64 TgglMUxecjJDSDclN1Ej => Lh%1L^r2CH7%7Q# tal vez sea la contraseña de algo o tal vez de nada , otra cosa importante es que nos lo dice un tal bob puede ser un usuario en el sistema , verificando en el /etc/passwd efectivamente es un usuario valido bob:x:1000:1000:bob,,,:/home/bob:/bin/bash
esto confirma que posiblemente se pueda realizar un bruteforce utilizando los usuarios del /etc/passwd para tener una shell mas amigable que la mia por get ¬¬
otra vulnerabilidad que puedo observar y que se me olvido hablar de ella es que el apache esta mal conigurado permitiendo leer información de otros usuarios en sus directorios sin ser los nuestros.
ayudandonos de la mala configuraci贸n de apache ahora leemos el home de bob obteniendo lo siguiente
hay un public_html dentro de bob esto nos hace suponer que tambien que esta asociado al servicio de apache por ende podriamos ver el home de bob desde la url osea el index.php con los includes y el encrypt.php esto lo realizamos abriendo desde la url asi:
esto nos hace suponer que bob tiene un aplicativo para cifrar mensajes y que lo que encontramos en ella rchivo oculto nos sirve para sacar esos mensajes, a continuaci贸n lo que realice es hacer un backup del directorio de bob colocando ese aplicativo localmente para ver como funciona
colocandolo desde nuestro servidor local nos aprece lo mismo y comprobamos que es para cifrar mensajes utilizando el script encrypt.php vemos como es el proceso de cifrado
Como vemos el aplicativo cifra el mensaje y nos da un base_64 que es parecido a lo que encontramos y pasandolo al index del aplicativo de bobo tenemos lo siguiente:
:D obtenemos el mensaje en claro :D nos aparecen unos numeros parecidos a coordenadas, buscandola en google maps obtenemos la ubicaci贸n
es de esta forma como cumplimos con nuestro objetivo :D
saludos a todos @killr00t groupidp@gmail.com intercepteam@gmail.com