Otro Capture The Flag como todos en el mundillo conocemos o "Reto de Ciberseguridad" de esta serie de CTF con el Nivel 5 el cual es el Level 3 de "Boinas Negras".
Podéis bajaros el html de este CTH pinchando en la imagen:
Resolución CTF - Nivel 5 : Boinas Negras Level 3
No estás destinado a hacer lo que es fácil, estás destinado a desafiarte a ti mismo. - Justin Timberlake
Este nivel 3 de Boinas Negras, sin duda, fue el más divertido. Nos encontramos con el siguiente código fuente:

Una página protegida con un software llamado Atrise HTMLock. En aquel momento era la primera vez que lo veía.
Y como os podreis imaginar, no existía ni Google Chrome ni plugins mágicos que hicieran esto que vais a ver ahora mismo, cargamos la página en vuestro navegador favorito (en todos se puede hacer algo similar):

Os vais a la opción de “View Generated Source”:

Y ya tenéis la página “descifrada”:

Por arte de magia, aparece una serie de funciones:

Ahí es donde se realiza las comprobaciones sobre la contraseña introducida.


Pero, claro, estamos hablando de 2002. ¿Cómo lo saqué yo?
Lo normal suele ser instalar el software para ver como funciona.

Vemos que aparecen 2 opciones:

Página para bloquear y otra para hacer backup de la misma para futuras modificaciones. Me creo una página html:

Y la añado al programa.

Lo siguiente que me pide es una password:

Si os fijasteis en el código de la página original, venía algo familiar:

var pw='default';
Parece que va a utilizar esta contraseña para el descifrado. Pues lo dejo tal cual.

Después aparecen 3 opciones. Elegimos “Source Hide Protection”.

Y la creamos.

Vemos como nos ha generdo una nueva página.
El resultado es este:

Una página parecida a la del reto.
Me imaginé que la rutina de descifrado del HTMLock estaría por una parte y la página por otro. Cojo esta parte del código del nivel 3.

Copio y pego en el mío, quedando:

Lo abro y veo que ha funcionado perfectamente.

Por lo tanto, la página está en esa parte. Vale, entendiendo como funciona el software y ver que no hay opción de descifrado conociendo la contraseña original (“default”), pasamos a la acción, al fin y al cabo es Javascript, nosotros tendremos el control sobre él, ocurre en nuestro navegador y tenemos acceso al código.
Hay muchas formas de resolver esto, os pongo una. La zona que va escribiendo según el algoritmo implementado por la herramienta está aquí:

Así que añado una variable que me vaya guardando el contenido de lo que vaya “descifrando”. La declaro antes para que no dé problemas.

Y añado al final esto otro:

Para verlo mejor, como diría el lobo de “Caperurita Roja” :P
Si lo abrimos con el navegador veremos un textarea con el contenido del código fuente original descifrado.

Y vemos el siguiente código.

Esta es la función que realiza la comprobación de la contraseña.

Si le gusta la contraseña, nos llevará a una página con el mismo nombre de la misma y terminada en “.asp”, en lo que estaba programado el reto.
Que hice entonces, traducir ese código javascript a otro que compilado fuese rápido.
Lo primero que saqué son los valores del array “f”.

Valores del array f[36]:
f[0]=1
f[1]=16974593
f[2]=135005697
f[3]=454756609
f[4]=1076890625
f[5]=2102071041
f[6]=3630961153
f[7]=1469256960
f[8]=12589055
f[9]=3656588031
f[10]=3911982590
f[11]=879436028
f[12]=3249546235
f[13]=2533041913
f[14]=3125553655
f[15]=832777460
f[16]=50343921
f[17]=878916334
f[18]=3419157995
f[19]=3476764903
f[20]=1152400354
f[21]=841694941
f[22]=2645311960
f[23]=2368947410
f[24]=113264587
f[25]=273894084
f[26]=2951499197
f[27]=3951775925
f[28]=3375387564
f[29]=1322997410
f[30]=2190236056
f[31]=1782799501
f[32]=201351041
f[33]=1841521269
f[34]=2509006184
f[35]=2304469082
Finalmente creamos un programa en el lenguaje que más os guste, este está en C, yo lo hice además en Pascal, Perl y no me acuerdo qué más :-D
He puesto una serie de for encadenados para obtener una contraseña de hasta 5 caracteres. En su día era mayor, la puse hasta 8, lo he quitado. En el programa traté de llamarlo todo según estaba el original en Javascript, fue como una traducción, más bien.



Para ir al grano y como sé que tiene 5, se puede comentar “validapass(pw);” y dejarlo únicamente en el correspondiente a 5 caracteres, es decir, el último.

El resultado:

Mira por donde, las posibles soluciones son 2. ¿Qué me pasó en su día?
Que puse un “exit()” cuando diera positivo, salió 5hb1q y cuando fui acceder me decía 404 “Not Found”, y dije, ¿pero cómo que no?
Así que pensé, ¿y si hay más de una? Así que quité el “exit()” y lo dejé terminar saliendo el otro resultado y ese sí que existía la página de acceso al siguiente nivel.
Espero que os haya gustado. By Rafa