PDF de programación - Solución al "hackcontest" de Balearikus Party 2009

Imágen de pdf Solución al "hackcontest" de Balearikus Party 2009

Solución al "hackcontest" de Balearikus Party 2009gráfica de visualizaciones

Actualizado el 6 de Mayo del 2018 (Publicado el 12 de Noviembre del 2017)
666 visualizaciones desde el 12 de Noviembre del 2017
656,7 KB
11 paginas
Creado hace 14a (01/11/2009)
Solución al “hackcontest” de Balearikus Party 2009

Noviembre 2009 © Daniel Kachakil



Introducción

Este documento describe una solución al hackcontest, una competición de
seguridad informática desarrollada por Miguel Gesteiro que ha sufrido varios cambios
desde su primera edición (agosto de 2008).

Este concurso ha estado presente en más de una Party, con desafíos que han ido

variando a lo largo del tiempo, pero se publica de forma online por primera vez para la
Balearikus Party de 2009 en la siguiente dirección web:


http://hackcontest.org:666/tour-party/




El reto consta de 10 desafíos de dificultad variada que podremos ir superando en




cualquier orden, tras habernos dado de alta como usuarios registrados.





1

Solución al “hackcontest” de Balearikus Party 2009



© Daniel Kachakil

Desafío 01: “Supera este sencillo formulario” (4 puntos)

literalmente que “la clave es muy fácil”.


Nos aparece un formulario con un campo de texto y una pista que nos indica

Su resolución es tan simple como pulsar el botón “acceder” tras introducir en el
campo de texto la cadena “muy fácil” (sin comillas, en minúsculas y respetando la tilde)



Otro formulario similar al del primer desafío, pero en esta ocasión la pista nos

Desafío 02: “Otro formulario sencillo” (5 puntos)

dice que “no siempre hay que hacer caso al webmaster...”.


En esta ocasión revisamos el código fuente de la página y comprobamos que el
envío del formulario está condicionado al valor que devuelve la función “chk()”, cuyo
código se encuentra unas líneas más abajo:


<form name="acceso" onsubmit="return chk()" method="post">



<script>
var campoClave = document.getElementById("clave");
campoClave.focus();

function chk() {
if(campoClave.value.length < 1) {
alert('Clave vacía');
campoClave.focus();
return false;
} else return true;
}
</script>



Lo único que hace esta función es comprobar si se ha introducido algún texto en
el campo clave, mostrándonos una alerta y evitando que se envíe el formulario en caso
de que se haya dejado la clave en blanco.


Parece que el webmaster ha delegado esta comprobación para que se verifique
en el lado cliente mediante JavaScript, así que intentaremos enviar una clave vacía. Para
ello podemos proceder de varias formas. Una de ellas consiste en redefinir la función
“chk” para que ejecute otro código (o incluso podría estar vacía), introduciendo esta
cadena en la URL de nuestro navegador, seguida de un retorno de carro:


javascript:function chk() {};


Puesto que hemos anulado la función de validación, ahora bastaría con pulsar el

botón y tendríamos el desafío superado. Lo mejor de esta solución, además de su
sencillez, es que no requiere de ninguna herramienta adicional.


Como solución alternativa, también podríamos haber utilizado un proxy para
interceptar una petición válida del navegador (introduciendo cualquier clave) y editar el
campo “clave”, dejándolo en blanco. O si lo preferimos, incluso podríamos construir y
lanzar una petición POST directamente sobre el servidor, lo que nos resulte más fácil.





2

Solución al “hackcontest” de Balearikus Party 2009



© Daniel Kachakil

Desafío 03: “Uno de base de datos SQL” (10 puntos)

En esta ocasión tenemos dos campos (usuario y contraseña) sin pistas, así que
haremos caso al título de la prueba y asumiremos que detrás del formulario hay una
base de datos SQL.


Lo primero que se nos tiene que pasar por la cabeza al hablar de formularios y
bases de datos es la inyección SQL, así que empezaremos probando con una comilla
simple en el campo del usuario, pero también tendremos que introducir algún valor en el
de la contraseña para pasar la primera barrera, que comprueba que ninguno de los
campos esté vacío. Así obtendremos el siguiente error descriptivo, que nos revela la
instrucción completa (y también que el gestor de bases de datos es un SQLite):


ERROR SQL: SELECT * FROM usuarios WHERE usuario=''' AND clave='a'::SQL logic
error or missing database



Puesto que no se ha filtrado la entrada de datos, podemos superar esta prueba
con la clásica inyección de bypass que fuerza a las dos condiciones a tomar un valor
verdadero, por lo que la consulta devolverá todos los registros de la tabla. Al estar
limitado el máximo de caracteres de los campos del formulario, usaremos la versión
minimalista de la inyección de bypass, tanto en el usuario como en la contraseña:


' or ''='

También podemos terminar la instrucción en la primera comprobación (con el



punto y coma), introduciendo cualquier cadena en la contraseña y esta como usuario:


' or 1=1;



Como curiosidad, comentar que se podría haber extraído el usuario y la
contraseña usando técnicas de inyección a ciegas: “admin” y “al45!34j”. En la práctica
esto no tiene ninguna utilidad para el reto, pero en un escenario real tal vez esa misma
contraseña nos podría dar acceso a otros servicios interesantes...



Desafío 04: “Un formulario un tanto enrevesado” (20 puntos)

Nos encontramos de nuevo con un formulario con un solo campo y sin pistas,
por lo que comenzaremos analizando el código fuente de la página. Lo primero que
llama la atención es un comentario HTML con el texto “zona encriptada no disponible”,
seguido de 200 saltos de línea en blanco. Se trata de un intento para despistarnos, ya que
el código útil está justo debajo de esa zona:


<script src="desafios/04/protect.js" type="text/javascript"></script>
<script type="text/javascript">
<!-- inpdata="CF575862E6E195C3D094F0BB ... ";document.writeln(dp()); //-->
</script>



Por una parte se está incluyendo un fichero JavaScript que contiene algunas
funciones para la ofuscación de código y, por otra parte, se inicializa una variable con el
código ofuscado y se escribe dinámicamente en la página. Puesto que no queremos
entretenernos con el “cómo”, vayamos directamente a por el “qué” y para ello no



3

Solución al “hackcontest” de Balearikus Party 2009



© Daniel Kachakil

tenemos más que mostrar lo que devuelve de la función “dp” tecleando lo siguiente en
la barra del navegador (al igual que hicimos en el desafío 2):


javascript:alert(dp())



Esta acción nos mostrará una ventana de alerta con el fragmento de código
HTML que nos falta para completar la página. Se trata precisamente del código que
compone el formulario, destacando las siguientes partes:


<form name="acceso" onsubmit="return autenticar(clave)" method="POST">
...
<script type="text/javascript" src="none">
...
function autenticar(clave){
if(clave.value=="xachoveu!") return true;
msjAviso('te equivocaste...');
return false;
}
</script>



Tras leer este código, parece evidente que la clave que buscamos es
“xachoveu!”, pero curiosamente no resulta ser así (y todo tiene su explicación). Hemos
pasado por alto un pequeño detalle y es el atributo “src” de la etiqueta “script”, que
sirve para indicar que la ubicación de un fichero externo. El nombre del fichero elegido
(“none”) no hace más que confundirnos, puesto que a primera vista cualquiera pensaría
que no se ha especificado ningún fichero, pero estaría equivocado, porque este fichero
existe y está siendo utilizado por nuestro formulario. Podemos descargarlo desde aquí:


http://hackcontest.org:666/tour-party/none



En cualquier caso, a igualdad de nombres, debería prevalecer siempre la última
definición de la función, tal y como establece esta sección del W3C (“All SCRIPT
elements are evaluated in order as the document is loaded”), así que alguno podría
pensar que no importa lo que se haya definido con anterioridad. Ese planteamiento sería
totalmente correcto, pero tampoco podemos olvidar que en esta otra sección del mismo
documento (“If the src has a URI value, user agents must ignore the element's contents
and retrieve the script via the URI”), se establece que si la etiqueta “script” tiene un
valor en “scr”, se debe ignorar el contenido del elemento y obtener el script del fichero
indicado, que es exactamente lo que está pasando en nuestro caso, así que tendremos
que centrarnos en el contenido del fichero.


Observamos que el fichero “none” contiene una línea de código bastante larga,
que evalúa y ejecuta una función creada para ofuscar el código (“function(p,a,c,k,e,r)”).
Podemos ver lo que hace esa función si sustituimos el “eval” inicial por un “alert” y lo
ejecutamos en la barra de navegación, destacando el siguiente fragmento de código:


function autenticar(x){
if(x.value=="\u0061c\u0068\u0074\165ng\u0021") return true
... }



Si decodificamos estos códigos (lo más rápido es pasarle la cadena a la función
“alert” y ejecutarlo en la barra de direcciones del navegador), vemos que la clave que
esconde es “achtung!”, pero eso tampoco funcionará...




4

Solución al “hackcontest” de Balearikus Party 2009



© Daniel Kachakil

Bueno, el truco está en que cuando decía que el fichero “none” contiene una
línea de código, es lo que el autor quería que viéramos, puesto que si nos fijamos bien,
unas líneas más abajo nos encontramos con otra función con el mismo nombre, de
código muy parecido pero no por ello dejan de ser totalmente diferentes (y recordemos
que prevalecerá ésta última). Si repetimos el procedimiento anterior (sustituir la función
“eval” por “alert”), e
  • Links de descarga
http://lwp-l.com/pdf7468

Comentarios de: Solución al "hackcontest" de Balearikus Party 2009 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad