En esta entrada la solución a uno de los retos de la categoría 'Web' de la edición de 2018 de CyberOlympics, competición en modalidad 'on-line', estilo 'Capture the Flag' y formato 'Jeopardy', dirigida a centros educativos y organizada por el Instituto Nacional de Ciberseguridad (INCIBE) en el marco de la actividad llamada CyberCamp.Este desafío, en mi opinión, presenta un nivel de dificultad bajo (★★☆☆☆).
Enunciado: Un alumno de un instituto harto de que un compañero se ría de él quiere crear una web para vengarse, un profesor lo descubre antes de que pueda terminar su labor, pero solo consigue acceder a un fichero de login de la web del alumno. Deberás descubrir qué pretendía decir este alumno de su compañero para poner paz entre ambos.
Enunciado: Un alumno de un instituto harto de que un compañero se ría de él quiere crear una web para vengarse, un profesor lo descubre antes de que pueda terminar su labor, pero solo consigue acceder a un fichero de login de la web del alumno. Deberás descubrir qué pretendía decir este alumno de su compañero para poner paz entre ambos.
Recursos asociados al reto: archivo 12_Medium-20181015T184711Z-001.zip.
Solución: como recurso asociado al reto se proporciona un archivo comprimido que, a su vez, contiene un archivo (hulio.html). Lo Ejecuto en el navegador:
Hago clic en el botón derecho del ratón sobre el botón "Try it" y después pulso sobre “Inspeccionar” :
En la pestaña 'Sources' veo que hay código javascript ofuscado, lo que se hace con la intención de que sea difícil de entender y, por tanto, de aplicar ingeniería inversa:
Voy ahora a ver este mismo código en la pestaña 'Application' y la función 'check()' aparece desofuscada, que es donde se validan el usuario y contraseña que se introducen:
Copio todo ese código y creo un archivo con él, 'hulio.html_2'.
Copio todo ese código y creo un archivo con él, 'hulio.html_2'.
Cierro en el navegador 'hulio.html' y ejecuto el que acabo de crear ('hulio.html_2'). Ahora en la pestaña 'Sources' el código aparece desofuscado y ya puedo hacer algo de depuración (en inglés, 'debugging').
Pongo algunos puntos de ruptura (en inglés, 'breakpoints'), los que se muestran en la figura siguiente, para inspeccionar el código paso a paso, introduzco "a" y "b" en los campos 'user' y 'pass' del formulario de login, respectivamente, y pulso el botón 'Try it':
Como se ve en la figura anterior:_0x3d44x3 contiene "a", el valor del campo 'user' que he introducido en el formulario de login.
_0x3d44x4 contiene "b", el valor del campo 'pass' que he introducido en el formulario de login.
_0x3d44x5 contiene una lista con los caracteres introducidos en el campo 'pass'.
_0x3d44x6 contiene 0, el valor con el que se inicializa la suma que se realizará en el bucle siguiente.
En el bucle (hasta tratar todos los caracteres introducidos en el campo 'pass') se va sumando a _0x3d44x6 el valor ASCII en decimal correspondiente a cada uno de ellos. En este caso, como he introducido "b" en el campo 'pass' y su longitud es 1, al final del bucle, _0x3d44x6 tiene el valor 98, que es el código ASCII en decimal de "b".
En la sentencia 'if' se valida que el valor introducido en el campo 'user' sea "admin" (no se ve en la figura anterior, pero es la segunda parte de esta sentencia), es decir, que los valores del código ASCII en decimal de los caracteres incluidos en dicho campo se correspondan con: 97 ("a"), 100 ("d"), 109 ("m"), 105 ("i") y 110 ("n"), y que el resto de dividir el valor obtenido anteriormente en _0x3d44x6 (en este caso 98) entre la longitud del 'placeholder' del campo 'user', es decir: 7 ("Usuario"), sea igual que la longitud de lo introducido en el campo 'user', es decir, 5 ("admin").
Como los valores introducidos en el campo 'user' y 'pass' no satisfacen la validación realizada en la sentencia 'if', se muestra "Status: No autorizado" en el formulario de login y el script finaliza.
Por tanto, me queda claro que para pasar la validación del usuario y contraseña debo introducir "admin" en el primer campo y en el segundo un carácter o caracteres cuya suma de sus códigos ASCII dividido entre 7 (longitud de "Usuario", 'placehoder' del campo 'user') sea igual a 5 (longitud de "admin"), por ejemplo: "6" (código ASCII en decimal 54), es decir, resto(54/7)=5:
Ahora en 'Status' se muestra una cadena de caracteres que podría ser un código o un criptograma, pero con lo pista que nos dan ("César") e incluso por el nombre del archivo que se proporciona con el reto (hulio.html), no me cabe ninguna duda de que se trata de un criptograma cifrado con el cifrado César consistente, en este caso, en sustituir cada carácter del texto en claro por aquel que se encuentra cuatro (IV) posiciones delante de él en el alfabeto español ('Ñ' incluida, es decir, 27 caracteres).
Y aunque lo puedo hacer de forma manual sin gran esfuerzo, sustituyendo cada letra del criptograma por aquella que se encuentra cuatro posiciones detrás de él ("JulioNo..."), como hoy estoy un poco vago utilizo una herramienta 'online' para descifrarlo:
Por lo que la solución a este reto es: JulioNoSabeJavaScript.
Comentarios
Publicar un comentario