Página 1 de 1

[Solución] ~ Reto SW #2 | Indetectables.net ~

Publicado: 15 Sep 2012, 10:53
por $DoC
Bueno, damos por solucionado el reto. Aquí la solución:

Bien, el escenario que nos encontramos es una simple web que muestra un index y dos apartados (Generar y Leeme). Lo primero que hacemos es clickar sobre "Leeme" y se nos descarga un archivo (reto.txt) en el explica algunas cosas que tenemos que tener en cuenta para realizar el deface... Ya sabemos el procedimiento:

Tenemos que, generar el index del deface desde la opción "Generar", localizar ese archivo, y encontrar alguna vulnerabilidad para realizar el deface...

¿Por donde empezamos?, pues comprobaremos la seguridad que tiene la opción de "Leeme", ya que está descargando un archivo y con eso podríamos jugar un poco. Vemos a que dirección apunta y:

[Enlace externo eliminado para invitados]

Tenemos dos variables GET... s y d, si nos damos cuenta s está siendo usada también en la opción generar (?s=generar), así que podemos deducir que esa variable se está usando para identificar el apartado... Pero, ¿y la variable d?, tiene el valor leeme, así que, podría ser el archivo a descargar, y luego lo descarga como "reto.txt"... Así que intentamos cambiar el valor por cualquier cosa:

[Enlace externo eliminado para invitados]

Y obtenemos como respuesta:

Imagen


Y no se descarga el archivo, así que podría ser el nombre del archivo... entonces probamos a auto-descargarnos, osea, a descargar index.php que es el script del reto... así que probamos:

[Enlace externo eliminado para invitados]

Pero de nuevo, el puto error:
Imagen


En este caso podemos rompernos la cabeza pensando que error está ocurriendo... Pero podrían ser varias cosas como; el archivo no existe, esa extensión no está permitida etc etc. ¿Pero, y si el archivo leeme está en una carpeta, por ejemplo "files"?, bien, podemos probar lo siguiente:

[Enlace externo eliminado para invitados]

De esta forma con "../" antes del nombre del archivo, estamos retrocediendo a un directorio anterior suponiendo que el archivo "leeme" está en una carpeta "files" por ejemplo. Sin embargo el puto error sigue xD:
Imagen
. Entonces, por que no, probamos retrocediendo diferentes directorios sumando "../", ejemplo: "../../../index.php" pero nada, ya podemos probar dos, tres, o cuatro, sigue saliendo el error.

Destapemos el secreto xD, efectivamente la variable (d=leeme) contiene el nombre del archivo que es "leeme", sin embargo cambiándolo por index.php o ../index.php no descarga el archivo php. Esto tiene una explicación... El troll de $DoC programo la parte de descarga de tal forma, que si se detectaba una barra (/) estaríamos trabajando desde el directorio "reto", y claro, estamos retrocediendo un directorio con "../", así que nos situaríamos en el directorio principal de [Enlace externo eliminado para invitados] , sin embargo si no se detectaba dicha barra, estariamos trabajando desde el directorio "archivos", que está dentro de "reto" (directorio habilitado para el reto), y ahí estaba el archivo "leeme"... Entonces, claro, SI estabamos haciendo bien intentando descargar el index.php con "../index.php" por que estabamos retrocediendo un directorio... Sin embargo el filtro que apliqué hizo que el archivo no se encontrara por que estabamos en el directorio equivocado. Por lo tanto, la forma de descargar el index.php sería retrocediendo y VOLVIENDO a entrar en el directorio "reto", de la siguiente forma:

[Enlace externo eliminado para invitados]

Y listo!!, se nos descargó el "index.php" y podremos ver todo el code del reto

Hay que leer el código para entender el funcionamiento, quien no sabía PHP no tenía excusas, el código no hera dificil ni ilegible, y buscando para que servia X función se podía deducir , veamos las partes importantes;

Imagen


Como podemos ver, tenemos una conexión a una base de datos, después, se comprueba que la variable GET "s" no esté presente, (así que ya sabemos que esa parte del código es la parte del index del reto) y como último se está obteniendo el valor de la columna "index" de la tabla "archivo", y si existe, se usa la función file_get_contents concatenado con el resultado... Por lo que ya sabemos que el contenido obtenido es el nombre del archivo del index...

Entonces, para solucionar el reto, tendríamos que conseguir aprobechar alguna vulnerabilidad que nos de acceso a la base de datos, y actualizar el contenido de "index" por el nombre de nuestro archivo que hemos generado... Pero, dos cosas ¿Como vamos a entrar a la base de datos?, y, ¿Como vamos a localizar el archivo que generemos?, bien, puesto que podemos leer el código, vayamos a la última pregunta:

Imagen


Como vemos, esta es la parte que genera nuestro HTML del deface... Si nos fijamos, vuelvo a jugar con las sesiones, y obtengo los últimos 16 dígitos del id de la sesión actual... Acto seguido, con una expresión regular, elimino todos los caracteres que no sean números... Y ese será el nombre de nuestro archivo, que estará en el directorio "archivos" con extensión .html . Ahora podremos comprobar que existe el archivo en la dirección:

[Enlace externo eliminado para invitados] (ejemplo)

Si todo a ido bien, debería de mostrarse el index que nosotros hemos generado...

Y bien, ya localizado nuestro archivo, hay que colocarlo en el index del reto (¡defacear el reto!) y para ello, recordamos como trabajaba el index... Se consulta en una bd el nombre del archivo a mostrar, así que lo que tenemos que hacer es cambiar el nombre del archivo a mostrar, ¡por el de nuestro index!. Claro que para ello tendremos que acceder a la base de datos, y hemos leido el corto código y no existe ninguna inyección SQL. Así que, ya que tenemos los datos de conexión, vamos a intentar conectarnos remotamente a la base de datos xD:

¡está habilitada la conexión remota!, veamos el contenido de la tabla;

Imagen


y bien, ahora solo tenemos que ejecutar el comando para actualizar el contenido, y metemos el nombre de nuestro archivo html:

Imagen


Y listo... Vamos al reto y actualizamos, y nuestro bonito deface está a la vista de todos.

Espero que les haya gustado, y hayan aprendido de la solución... Ya que se solucionó muy pronto
, al parecer lo hice muy fácil... Pero el próximo sera mucho mas complicado xD

EL GANADOR DEL RETO ES: s7evin

Un saludo!