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:
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_001.jpg)
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):
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_002.jpg)
Os vais a la opción de “View Generated Source”:
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_003.jpg)
Y ya tenéis la página “descifrada”:
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_004.jpg)
Por arte de magia, aparece una serie de funciones:
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_005.jpg)
Ahí es donde se realiza las comprobaciones sobre la contraseña introducida.
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_006.jpg)
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_007.jpg)
Pero, claro, estamos hablando de 2002. ¿Cómo lo saqué yo?
Lo normal suele ser instalar el software para ver como funciona.
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_008.jpg)
Vemos que aparecen 2 opciones:
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_009.jpg)
Página para bloquear y otra para hacer backup de la misma para futuras modificaciones. Me creo una página html:
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_010.png)
Y la añado al programa.
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_012.jpg)
Lo siguiente que me pide es una password:
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_013.jpg)
Si os fijasteis en el código de la página original, venía algo familiar:
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_014.png)
var pw='default';
Parece que va a utilizar esta contraseña para el descifrado. Pues lo dejo tal cual.
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_015.png)
Después aparecen 3 opciones. Elegimos “Source Hide Protection”.
![](https://ciberseguridad.blog/content/images/2019/06/CTF5_BOINASNEGRAS_016.png)
Y la creamos.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_017.png)
Vemos como nos ha generdo una nueva página.
El resultado es este:
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_018.png)
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.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_019.png)
Copio y pego en el mío, quedando:
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_020.png)
Lo abro y veo que ha funcionado perfectamente.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_021.png)
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í:
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_022.png)
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.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_023.png)
Y añado al final esto otro:
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_024.png)
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.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_025.png)
Y vemos el siguiente código.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_026.png)
Esta es la función que realiza la comprobación de la contraseña.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_027.png)
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”.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_028.png)
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.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_029.png)
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_030.png)
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_031.png)
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.
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_032.png)
El resultado:
![](https://ciberseguridad.blog/content/images/2019/06/CFT5_BOINASNEGRAS_033.png)
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